基于DS18B20温度计 AT24C02存储温度上下限值 LCD显示_第1页
基于DS18B20温度计 AT24C02存储温度上下限值 LCD显示_第2页
基于DS18B20温度计 AT24C02存储温度上下限值 LCD显示_第3页
基于DS18B20温度计 AT24C02存储温度上下限值 LCD显示_第4页
基于DS18B20温度计 AT24C02存储温度上下限值 LCD显示_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、该程序实现DS18B20 温度计在LCD上显示并通过按键设定温度上下限值 AT24C02存储设定值本例程还可实现直流电机的调速 驱动风扇根据温度实现不用的转速程序已通过验证,可完全复制使用。例程中E2PROM DS18B20 LCD的接口定义需要根据各位的硬件自己定义。 实物图片/ 主函数 /#include<reg52.h>#include"lcd.h"#include"18b20.h"#include"at24c02.h"sbit key_ok = P10;sbit key_up = P11;sbit key_do =

2、 P12;sbit speak = P13;sbit mot = P14;uint temp_value;uchar key_num,up_num,do_num;uchar mot_sel;/uchar flag;uchar rate;uchar rate_value;/void sys_init(void);void key_scan(void);void delays(uchar z);void compare(uint temp_com);void mot_pwm(uchar rate_value);void delays(uchar z)uchar x,y;for(x=0;x<z

3、;x+) for(y=0;y<50;y+);void main()LCD_init();I2c_init();key_num=0;/up_num=30;do_num=24;up_num = read_add_24c02(0);delays(50);do_num = read_add_24c02(1);delays(50);LCD_add(4); /初始化温度上限值LCD_dat(up_num/10+0x30);LCD_dat(up_num%10+0x30);delays(100);LCD_add(16); /初始化温度下限值LCD_dat(do_num/10+0x30);LCD_dat(

4、do_num%10+0x30);while(1)temp_value = readtemperature();display(temp_value);key_scan();compare(temp_value);mot_pwm(mot_sel);void key_scan(void)if(!key_ok)delays(10);if(!key_ok)key_num+;while(!key_ok);if(key_num=1)if(!key_up)delays(10);if(!key_up)up_num+;if(up_num>=99) up_num = 0;LCD_add(4);/LCD_co

5、m(0x0f);LCD_dat(up_num/10+0x30);LCD_dat(up_num%10+0x30);while(!key_up);if(!key_do)delays(10);if(!key_do)up_num-;if(do_num=0) up_num = 99;LCD_add(4);LCD_dat(up_num/10+0x30);LCD_dat(up_num%10+0x30);while(!key_do);if(key_num=2)if(!key_up)delays(10);if(!key_up)do_num+;if(do_num>=99) up_num = 0;LCD_ad

6、d(16);/LCD_com(0x0f);LCD_dat(do_num/10+0x30);LCD_dat(do_num%10+0x30);while(!key_up);if(!key_do)delays(10);if(!key_do)do_num-;if(do_num=0) do_num = 99;LCD_add(16);/LCD_com(0x0f);LCD_dat(do_num/10+0x30);LCD_dat(do_num%10+0x30);while(!key_do);if(key_num=3)LCD_com(0x0c);key_num = 0;write_add_24c02(0,up_

7、num);delays(50);write_add_24c02(1,do_num);delays(50);void compare(uint temp_com)uchar temp_z;/temp_x;uchar temp_h,temp_l; /*温度转换*/temp_h = (uchar)(temp_com>>8)&0x00ff);temp_l = (uchar)(temp_com&0x00f0);temp_z = (temp_h<<4)|(temp_l>>4);/temp_x = (uchar)(temp&0x0000f)*0.6

8、25*10; /-/if(temp_z<do_num)|(temp_z>up_num)speak = 0;else speak = 1;if(temp_z<=27) mot_sel = 180;else if(28>=temp_z>27) mot_sel = 170;else if(29>=temp_z>28) mot_sel = 160;else mot_sel = 0;void mot_pwm(uchar rate_value)if(rate+) > 200) rate-;if(rate-)=0) rate+;if(rate<rate_

9、value) mot = 0;else mot = 1;/ LCD 驱动函数部分 /#include"lcd.h"uchar i,s,g;uchar code table1="T_H: C T_L: C"uchar code table2="temperature: "uchar data temp0="0x00,0x00,0x00,0x00,0x00,0x00"void delayms(uint x)while(x-);/*LCD 写指令*/void LCD_com(uchar com)LCDRS = 0;del

10、ayms(100);P0 = com;delayms(100);LCDEN = 1;delayms(100);LCDEN = 0;delayms(100);/*LCD 写数据*/void LCD_dat(uchar dat)LCDRS = 1;delayms(100);P0 = dat;delayms(100);LCDEN = 1;delayms(100);LCDEN = 0;delayms(100);/*LCD地址*/void LCD_add(uchar add)LCD_com(add|0x80) ; /*LCD初始化*/void LCD_init()uchar i;LCDRS = 0;LC

11、DRW = 0;LCDEN = 0;LCD_com(0x38);LCD_com(0x38);LCD_com(0x38);LCD_com(0x0c);LCD_com(0x06);LCD_com(0x01);LCD_add(0x00);for(i=0;i<20;i+)LCD_dat(table1i);delayms(50);LCD_add(0x40);for(i=0;i<20;i+)LCD_dat(table2i);delayms(50);void display(uint temp)uchar temp_z,temp_x;uchar temp_h,temp_l; /*温度转换*/te

12、mp_h = (uchar)(temp>>8)&0x00ff);temp_l = (uchar)(temp&0x00f0);temp_z = (temp_h<<4)|(temp_l>>4);temp_x = (uchar)(temp&0x0000f)*0.625*10; /-/s = temp_z/10;g = temp_z%10;temp00 = s+0x30;temp01 = g+0x30;LCD_add(0x4c);for(i=0;i<2;i+) /写入温度整数位LCD_dat(temp0i);delayms(1000);

13、LCD_add(0x4e);LCD_dat(0x2e);/写入小数点LCD_add(0x4f);LCD_dat(temp_x/10+0x30);/写入温度小数位LCD_add(0x40+16); /在LCD第二行第16位置写入“口”LCD_dat(0xdf);LCD_add(0x40+17); /在LCD第二行第17位置写入“C”LCD_dat(0x43);/ DS18B20 驱动部分 /#include"18b20.h"uchar a,b;void delay_18b20(uchar z)while(z-);uchar init_18b20(void)uchar n;DQ

14、 = 1;delay_18b20(8); / 59usDQ = 0;delay_18b20(80); /491usDQ=1;delay_18b20(4);n = DQ; delay_18b20(15);return n;/返回值,判断是否有器件,n=1,有器件,n=0,没有器件/*DS18B20 的读写字节 都是从低位开始的*/void write_byte_18b20(uchar dat)uchar i;for(i=0;i<8;i+)DQ=0;DQ=dat&0x01;delay_18b20(4);DQ=1;/总线拉高,为下一次数据做准备dat>>=1;delay_1

15、8b20(4);uchar read_byte_18b20(void)uchar i,value;DQ = 1;for(i=0;i<8;i+)DQ=0;value>>=1;DQ=1;if(DQ=1)value|=0x80;delay_18b20(20);DQ = 1;return value;uint readtemperature(void)uchar flag;uint temp;flag = init_18b20();init_18b20();write_byte_18b20(0xcc);/跳过ROMwrite_byte_18b20(0x44);/启动温度测量delay

16、_18b20(50);/等待总线稳定init_18b20();write_byte_18b20(0xcc);write_byte_18b20(0xbe);a=read_byte_18b20();/读温度的低八位b=read_byte_18b20();/读温度的高八位if(flag) /检测是否有DS18B20,a = 0x00;b = 0x00;/*temp = (b<<4)|(a>>4);/整数部分temp_xs = (a&0x0f)*0.625*10;*/temp = (b<<8)|a;return temp;/ E2PROM 驱动部分 /#in

17、clude"at24c02.h"void delayus_24c02()_nop_();_nop_();_nop_();_nop_();_nop_();/*void delay_24c02(uchar z)uchar x,y;for(x=0;x<z;x+) for(y=0;y<100;y+); */void I2c_init(void)sda = 1;scl = 1;void start(void)sda = 1;scl = 1;delayus_24c02();sda = 0;delayus_24c02();scl = 0;delayus_24c02();voi

18、d stop(void)sda = 0;scl = 1;delayus_24c02();sda = 1;delayus_24c02();/*应答信号:在SCL由"0"变为"1"的期间,SDA=0;或者在数据读取完成后一定时间SDA没有变为"1" 这个过程被视为应答*/void ack(void)uchar i;scl=1; delayus_24c02();if(sda=1) && (i<250) i+;scl=0;delayus_24c02();void no_ack(void)sda = 1;delayus_24c02();scl = 1;delayus_24c02();scl = 0;delayus_24c02();void write_byte_24c02(uchar date)uchar i;scl = 0;delayus_24c02();for(i=0;i<8;i+)if(date&0x80) sda = 1;else sda = 0;date <<= 1;delayus_24c02();scl = 1;delayus

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论