1、Keywords:Temperature measurement,AT89C52 microcontroller,DS18B20 temperature sensor,LCD1602 1 引言温度传感器将环境温度数据转换成数字信号发送给单片机,单片机通过程序内部的运算将转换好的温度数值发送给显示器出来。初步确定设计系统由单片机主控、测温、显示、警示、手动控制,共5个模块组成。使用两个温度传感器,可以用于测试家庭中不同房间的温度并集中监视。2 设计方案及原理2.1 设计方案首先,由DS18B20温度传感器芯片测量当前的温度,并将结果送入单片机。然后,通过AT89C52单片机芯片对送来的测量温度读
2、数结果进行处理,并将此结果送入显示模块。其次,LCD1602芯片将送来的值显示于显示屏上。同时LED会通过量不同的灯来提示当前的温度是不是在设定的范围之内,还可以在显示屏上看出是哪个房间的温度超出了范围。最后,采取升降温措施。设计方案框图如图1所示。图1 设计框图2.2 设计原理电路主要由晶振电路、复位电路、测温电路、显示电路、报警提示电路以及温度控制电路组成。DSI8B20温度传感器芯片采用“一线制”与单片机相连,它独立地完成温度测量以及将温度测量结果送到单片机的工作。而单片机对传送来的结果有计算、转换等进一步处理的功能。然后,输出到显示器显示。3 硬件设计3.1 芯片选择主要选用DSl88
3、20温度传感器芯片、LCD1602显示芯片和AT89C52单片机芯片。3.2 硬件电路晶振电路是保证单片机能运行的所必须电路,而测温电路、显示电路、报警提示电路以及温度控制电路是为了完成设计中的各功能而设计的。硬件电路如图2所示。图 2 硬件电路图4 软件设计程序主要由主程序和各个子程序构成,主程序主要完成是调用LCD液晶显示器的初始化及18b20初始化,对温度的采集、转化并显示以及对相应温度的控制处理。主程序相当于一条主线,将各个子程序模块组合在一起,以实现功能要求,将当前温度值显示在液晶显示器上。其中传感器DS18B20的软件设计是一个很重要环节。对各个芯片的初始化、初值设定、温控门限设置
4、、延时时间等都是软件设计所要考虑的必要因素。系统源程序见附录一,程序流程图如图3所示。图3程序流程图5 系统仿真当传感器的温度都在范围之内时,蓝灯亮,表示正常。仿真图如图4所示。图 4 正常时的仿真图其中任一个的温度超出范围,红灯都会亮,表示报警。若第一个温度传感器的温度过高,可以按下降温装置的开关,此时绿灯亮,表示降温。仿真图如图5所示。图 5 温度过高且降温时的仿真图若第二个温度过低,则可以按下升温装置的开关,此时黄灯亮,表示升温。仿真图如图6所示。图 6 温度过低且升温时的仿真图6 总结该温度控制器自动测温、显示、警示、手动控温等功能,可以在监控室里同时监视多个房间的温度,并且可以根据报
5、警和显示器的显示具体定位是哪个房间的温度超出了正常范围(15.020.0),然后可根据具体情况采取升温或降温等措施。在温控模块,由于知识的限制还不能做到智能化控制,造成了该设计的一大缺陷。所以该温度控制器属于一套简易的温控系统。参考文献1 彭伟.单片机C语言程序设计实训100例M.电子工业出版社,20092 王思明.单片机原理及应用系统设计M.科学出版社,20123 潘晓宁.单片机程序设计实践教程M.清华大学出版社,20094 高峰.单片微型计算机与接口技术M.科学出版社,1990附录一 系统源程序#include#define uchar unsigned char#define uint
6、unsigned intsbit DQ=P10;/ds18b20与单片机连接口sbit DQ1=P11;/ds18b201与单片机连接口sbit P20=P20;sbit P21=P21;sbit RS=P25;sbit RW=P26;sbit EN=P27;sbit P36 = P36;sbit P37 = P37;unsigned char code str1=1:;unsigned char code str2=H:unsigned char code str3=2:unsigned char code str4=L:unsigned char code str5=15.0/最低温门限u
7、nsigned char code str6=20.0/最高温门制uchar data disdata4;uchar data disdata14;uint temp,temp1,tempL=15.0,tempH=20.0;uint tvalue,tvalue1;/温度值uchar tflag,tflag1;/温度正负标志/*lcd1602程序*/void lcd_init()/初始化设置/delay1ms(15);wr_com(0x38);delay1ms(5); wr_com(0x08); wr_com(0x01); wr_com(0x06); wr_com(0x0c);void dela
8、y_18B20(unsigned int i)/延时1微秒 while(i-);void ds1820rst() DQ = 1; /DQ复位 delay_18B20(4); /延时 DQ = 0;/DQ拉低 delay_18B20(100); /精确延时大于480us /拉高 delay_18B20(40);void ds1820rst1() DQ1= 1; DQ1= 0; /DQ拉低 uchar ds1820rd() unsigned char i=0; unsigned char dat = 0; for (i=8;i0;i-) DQ = 0; /给脉冲信号 dat=1; DQ = 1;
9、if(DQ) dat|=0x80; delay_18B20(10); return(dat);uchar ds1820rd1() /读第二个温度传感器/unsigned char j=0; unsigned char dat1 = 0; for (j=8;jj-) DQ1= 0; dat1 if(DQ1) dat1|=0x80; delay_18B20(10); return(dat1);void ds1820wr(uchar wdata) unsigned char i=0; i i-) DQ = 0; DQ = wdata&0x01; wdatavoid ds1820wr1(uchar w
10、data1) /写第二个温度传感器/ unsigned char j=0; j j-) DQ1= wdata1& wdata1read_temp()/读取温度值并转换/uchar a,b;ds1820rst();ds1820wr(0xcc);/跳过读序列号/ds1820wr(0x44);/启动温度转换/跳过读序列号/ ds1820wr(0xbe);/读取温度/ a=ds1820rd();b=ds1820rd();tvalue=b;tvalue=8;tvalue=tvalue|a; if(tvalue0x0fff) tflag=0; else tvalue=tvalue+1;tflag=1;tv
11、alue=tvalue*(0.625);/温度值扩大10倍,精确到1位小数return(tvalue);read_temp1() /读第二个温度传感器/uchar c,d;ds1820rst1();ds1820wr1(0xcc);ds1820wr1(0x44);ds1820wr1(0xbe);c=ds1820rd1(); /温度2进制低8位d=ds1820rd1(); /温度2进制高8位tvalue1=d;tvalue1tvalue1=tvalue1|c; /合并高低位 if(tvalue1 tflag1=0; tvalue1=tvalue1+1; tflag1=1; tvalue1=tval
12、ue1*(0.625);return(tvalue1); void ds1820disp()/温度值显示uchar flagdat; disdata0=tvalue/1000+0x30;/百位数 disdata1=tvalue%1000/100+0x30;/十位数 disdata2=tvalue%100/10+0x30;/个位数 disdata3=tvalue%10+0x30;/小数位 temp=tvalue/10+tvalue%10; if(tflag=0) flagdat=0x20;/正温度不显示符号 flagdat=0x2d;/负温度显示负号:- if(disdata0=0x30) di
13、sdata0=0x20;/如果百位为0,不显示 if(disdata1=0x30)disdata1=0x20;/如果百位为0,十位为0也不显示 wr_com(0x82); wr_dat(flagdat);/显示符号位 wr_com(0x83); wr_dat(disdata0);/显示百位 wr_com(0x84); wr_dat(disdata1);/显示十位 wr_com(0x85); wr_dat(disdata2);/显示个位 wr_com(0x86);void ds1820disp1()/温度值显示 uchar flagdat1; disdata10=tvalue1/1000+0x3
14、0; disdata11=tvalue1%1000/100+0x30; disdata12=tvalue1%100/10+0x30; disdata13=tvalue1%10+0x30; temp1=tvalue1/10+tvalue1%10; if(tflag1=0) flagdat1=0x20; flagdat1=0x2d; if(disdata10=0x30) disdata10=0x20; if(disdata11=0x30) disdata11=0x20; wr_com1(0xc0+0x02); wr_dat1(flagdat1); wr_com1(0xc0+0x03); wr_da
15、t1(disdata10); wr_com1(0xc0+0x04); wr_dat1(disdata11); wr_com1(0xc0+0x05); wr_dat1(disdata12); wr_com1(0xc0+0x06); wr_dat1(0x2e);/显示小数点 wr_com1(0xc0+0x07); wr_dat1(disdata13);/显示小数位/*报警程序*/ main() P37=1; init_play();/初始化显示 while(1) delay1ms(400); read_temp1();/读取温度 ds1820disp1();/显示 read_temp(); ds1820disp(); wr_com(0xcb); display(str5); wr_com(0x8b); display(str6);if(temptempH)|(temp1tempH) unsigned char i; for(i=20; P37=0; P36=1; delay1ms(100); P36=0; else P37=1; return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1