单片机设计关于ds18b20的温度控制系统.docx
- 文档编号:28982916
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:28
- 大小:840.90KB
单片机设计关于ds18b20的温度控制系统.docx
《单片机设计关于ds18b20的温度控制系统.docx》由会员分享,可在线阅读,更多相关《单片机设计关于ds18b20的温度控制系统.docx(28页珍藏版)》请在冰豆网上搜索。
单片机设计关于ds18b20的温度控制系统
一、系统设计
1.1项目概要
温度控制系统无论是工业生产过程,还是日常生活都起着非常重要的作用,过低或过高的温度环境不仅是一种资源的浪费,同时也会对机器和工作人员的寿命产生严重影响,极有可能造成严重的经济财产损失,给生活生产带来许多利的因素,基于AT89S52的单片机温度控制系统与传统的温度控制相比具有操作方便、价价格便宜、精确度高和开展容易等优点,因此市场前景好。
1.2设计任务和要求:
采用DS18B20作为温度传感器进行温度检测。
对采集温度进行显示(显示温度分辨率0.1℃);采集温度数值应采用数字滤波措施,保证显示数据稳定。
设计相应的温度控制电路,根据测得的温度情况对加热器进行控制,将温度保持在设定温度。
通过按键设置温度上下限,超限通过LED、蜂鸣器报警。
二、硬件设计
2.1硬件设计概要
根据需求,我们将系统分为五个模块,信息处理模块,温度采集模块、控制调节模块、报警电路模块,显示模块。
2.2信息处理模块
AT89S52是ATMEL公司的以8031核构成的8位Flash单片机系列。
这个系列单片机的最大特点就是在片内含有Flash存储器,AT89S52单片机是一种低功耗高性能的CMOS8位微控制器,内置8KB可在线编程闪存。
该器件采用Atmel公司的高密度非易失性存储技术生产,其指令与工业标准的80C51指令集兼容。
片内程序存储器允许重复在线编程,允许程序存储器在系统内通过SPI串行口改写或用同用的非易失性存储器改写。
通过把通用的8位CPU与可在线下载的Flash集成在一个芯片上,AT89S52便成为一个高效的微型计算机。
它的应用范围广,可用于解决复杂的控制问题,且成本较低。
单片机模块如图
(1)所示。
图
(1)单片机模块
2.3温度采集模块
2.3.1传感器DS18b20简介
DALLAS最新单线数字温度传感器DS18b20简介新的“一线器件”,体积更小、适用电压更宽、更经济。
Dallas半导体公司的数字化温度传感器DS18b20是世界上第一片支持“一线总线”接口温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新的概念。
DS18b20、DS1822“一线总线”数字化温度传感器同DS1820一样,DS18b20也支持“一线总线”接口,测量温度范围为-55℃~+125℃,在-10℃~+85℃范围内,精度为
0.5℃。
DS18b20的精度较差为
2℃。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或过程控制、测量类消费电子产品等。
与前一代产品不同,新的产品支持3V~5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18b20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18b20的实验板原理接线图如图
(2):
图
(2)DS18b20的实验板接线图
其中:
DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)
2.3.2实验模拟电路图
温度检测控制模拟电路图ds18b20原件及其连线如图(3)温度此传感器上显示的温度同步显示到LED显示器上,并有加温,减温按钮。
图(3)温度检测控制模拟电路图
2.3.3程序流程图
图(4)主程序流程图
图(5)初始化子程序流程图
图(6)读按键的程序流程图
2.4控制调节模块
2.4.1升温调节系统
通过继电器的开合来控制加热片电路的通断,来达到设温效果,我们预设温度为25度,当温度低于25度时,单片机P3.6引脚输出高电平,继电器导通,对温度传感器加热,加热模块如图(7)所示。
图(7)加温控制电路
2.4.2温度上下限调节系统
通过按键控制键选着调节对象,通过上升下降调节值大小,模拟电路图如图(78主控电路:
我们设定温度为0--30度,为表示方便,这里让,控制开关,升温开关,降温开关分别为,k1,k2,k3,开始显示的是当前温度,K1主控开关,用来控制进入的是当前温度,温度上限,下限的调节界面。
按k1,一次进入三个界面。
按K2为加1开关,按一下,加1,k3减1开关,按一下,减1.
例如:
开始时显示的是当前温度界面,按下k1进入高温设定界面,显示器上显示当前温度和温度上限,按k2,上限加1,按k3,上限减1,再按k1进入显现设定界面,显示器显示当前温度,和温度下限,按k2,下限加1,按k3,下限减1,再按k1,进入显示当前温度界面。
如图(8)
2.4.3报警电路系统
通过led灯的闪烁以及蜂鸣器的鸣叫实现报警,如果温度超过上限灯D4亮,蜂鸣器鸣叫,低于下限灯D2亮,蜂鸣器鸣叫。
常温D1亮如图(9)(10)。
图(8)温度设定开关
图(9)报警模块
图(9)P3.7接蜂鸣器
2.5显示模块
通过采集ds18b20的温度,同步显示到LED显示器上,精确到小数点后第一位。
如下图
图(9)显示电路
三、仿真后,部分显示成果
图(10)开始启动时,显示学号
图(11)显示当前温度
图(12)温度低于低温下限,低温报警灯亮,蜂鸣器鸣叫
图(13)温度高于温度上限,高温报警灯亮,蜂鸣器鸣叫
四、两周实习总结
这次单片机实习我们小组做的是温度检测。
之前老师给了3个题目,让选择,但为了避免大家不撞车,按学号来,我是02号,分到了做温度检测的题目,刚开始接触到题目,一头雾水,因为我们组的成员都是大三才接触到单片机,都是菜鸟级的任务,第一周,我从网上下载了,《基于8051+PROTEUS仿真100实例》这个文档,从最简单的点亮一个流水灯,让数码管显示数字开始,第一周就做了这些简单的例子,100例做了20多个。
刚开始很慢,仿真模型里的原器件都不会找,编的程序编译时总出现报警、错误。
一遇到错误我们就慌了神了,所以起步很难。
后来在老师和同学的帮助下,慢慢积累,知道了常见的报警和错误的解决方法,编完调试成功20个例子后,算是对单片机有了一定的基础。
但这时一周已经过去了,别的小组已经仿真通过,开始实际运行了,而我们这组才开始。
第二周开始了,第一天我们没做设计,把各个小组的程序,电路图都拿来看,不懂得就请他们帮忙讲解。
由于前面有了知识,一些模块都看得懂,学得很快了。
发现主要是把各个模块融合到一起,头文件写到最前面,通过函数的调用!
给单片机接口高低电平,来实现功能。
这正好是我们的强项,一星期20个例子的功劳。
第二天我们开始自己编程,但是融合的过程中总出现错误,要嘛是变量没定义,要嘛是头文件重复!
还有一个,报警电路的数码管总是不亮,但单片机对应的接口有高低电平的变化,实际电路板上也成功,这个问题困扰了我们很久,怎么办都不亮,当时有想砸电脑的冲动,后来还是解决了,原来,是标号标错了位置,一点小问题,困扰了我们2天。
当解决这个问题时,那心灵的喜悦是这辈子都忘不了的!
通过两周的实习,我们从一个小白成长为一个对单片机入了门,并能实现简单的编程,还能解决实际问题的小人物了!
虽然过程很苦,每天对着电脑,就吃饭和上洗手间离开板凳!
一直盯着屏幕看!
不过2周熬过来了,收获蛮大的!
例如后来我又在我们的程序中加入了降温程序!
温度高,调动电动机吹风降温!
感觉无论做什么事都要吃得了苦受得了罪,天下没有什么事是难的,只有懒惰的人,只要用心去做,什么事都能成功!
五、致谢
两周的实习中,我遇到了许许多多的困难,但我能走过来,这和我组成员共同研究,共同讨论问题的辛勤是分不开的,灰心时我们相互鼓励,相互打气,。
感谢同组成员。
开始接触单片机,我是一个小白级人物,谢谢把我领入门的同班同学们,当我有问题请教时,他们会放下手头的工作,倾心为我解答,程序编译错误时,他们会帮我一起看提示,该错误!
谢谢同班同学们!
当然,我们实习时,老师一直陪伴着我们,尽管我没有问过老师问题,老师也没有帮我调试程序,但还是要谢谢刘老师,吕老师,你和我们在一起,无形中给了我们莫大的动力!
同时也起到了监督我们的作用,使我们不能够偷懒,不会出现有一组同学完成了,那么全班都完成了的情况!
正由于你们的严格的要求,我们这次实习才能圆满的完成,同学们都做出了想要的结果。
六、参考文献
[1]郭天祥.新概念51单片机C语音教程——入门提高开发拓展攻略[M].北京:
北京:
电子工业出版社,2009.
[2]韩广兴.电子元器件与实用电路基础[M].北京:
电子工业出版社,2005.
[3]方大千,朱丽.电子控制系统装置制作入门[M].北京:
国防出版社,2006.
[4]刘向举,刘丽娜.[J].齐齐哈尔大学学报(自然科学版).2012(03)
[5]黄文力,邓小磊.[J].仪器仪表用户.2011(06)
[6]黄晓林.[J].自动化技术与应用.
2011(11)
[7]王文,王直.[J].电子设计工程.2011(20)
[8]陈锡华,贾磊磊.[J].单片机与嵌入式系统应用.2011(09)
七、附录
7.1原理图
7.2参考程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^3;//ds18b20与单片机连接口
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;
sbitkeyadd=P1^4;
sbitkeydel=P1^5;
sbitkeyok=P1^6;
sbitled_green=P2^3;
sbitled_yellow=P2^4;
sbitled_red=P2^5;
sbitshengwen=P3^6;
sbitjiangwen=P3^5;
sbitBEEP=P3^7;
ucharcodestr1[]={"Temperatureis"};
ucharcodestr2[]={""};
ucharcodestr3[]={"set_hightemp:
"};
ucharcodestr4[]={"set_lowtemp:
"};
ucharcodestr5[]={"studentN0:
"};
ucharcodestr6[]={"322091029104"};
uchardatadisdata[5];
ucharset_hightemp=33,set_lowtemp=0;
ucharp=0;
ucharaa[2];
uinttvalue;//温度值
uchartflag;//温度正负标志
//*************************lcd1602程序**************************/
voiddelay1ms(uintms)//延时1毫秒
{
uinti,j;
for(i=0;i for(j=0;j<114;j++); } voiddelay1s(uints) { uinti; for(i=0;i delay1ms(1000); } //////////////////////111111*********1111111111111111111111报警程序 voidbaojing(void) { unsignedintj; for(j=49;j>0;j--)//响30ms { BEEP=~BEEP;//输出频率800HzP0=0x7E;//点亮D00和D07 delay1ms(10);//延时310us delay1ms(10);//延时310us } } /////////////////////1111111111111111111111111111111111111报警程序 voidwr_com(ucharcom)//写指令// { delay1ms (1); RS=0; RW=0; EN=0; P0=com;// delay1ms (1); EN=1; delay1ms (1); EN=0; } voidwr_dat(uchardat)//写数据// { delay1ms (1); RS=1; RW=0; EN=0; P0=dat; delay1ms (1); EN=1; delay1ms (1); EN=0; } voidlcd_init()//初始化设置// { delay1ms(15); wr_com(0x38);delay1ms(5); wr_com(0x08);delay1ms(5); wr_com(0x01);delay1ms(5); wr_com(0x06);delay1ms(5); wr_com(0x0c);delay1ms(5); } voiddisplay(uchar*p)//显示// { while(*p! ='\0') { wr_dat(*p); p++; delay1ms (1); } } voidinit_play()//初始化显示 { lcd_init(); wr_com(0x80); display(str5); wr_com(0xc0); display(str6); delay1s(3); lcd_init(); wr_com(0x80); display(str1); wr_com(0xc0); display(str2); } /***************************ds18b20程序****************************/ voiddelay_18B20(uinti)//延时1微秒 { while(i--); } voidds1820rst()/*ds1820复位*/ { ucharx=0; DQ=1;//DQ复位 delay_18B20(4);//延时 DQ=0;//DQ拉低 delay_18B20(100);//精确延时大于480us DQ=1;//拉高 delay_18B20(40); } uchards1820rd()/*读数据*/ { uchari=0; uchardat=0; for(i=8;i>0;i--) { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } voidds1820wr(ucharwdata)/*写数据*/ { uchari=0; for(i=8;i>0;i--) { DQ=0; DQ=wdata&0x01; delay_18B20(10); DQ=1; wdata>>=1; } } read_temp()/*读取温度值并转换*/ { uchara,b; ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0x44);//*启动温度转换*/ ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else { tvalue=~tvalue+1; tflag=1; } tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue); } /*******************************************************************/ voidds1820disp()//温度值显示 { ucharflagdat; disdata[0]=tvalue/1000+0x30;//百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30;//个位数 disdata[3]=tvalue%10+0x30;//小数位 if(tflag==0) flagdat=0x20;//正温度不显示符号 else flagdat=0x2d;//负温度显示负号: - if(disdata[0]==0x30) { disdata[0]=0x20;//如果百位为0,不显示 if(disdata[1]==0x30) { disdata[1]=0x20;//如果百位为0,十位为0也不显示 } } wr_com(0xc0+4); wr_dat(flagdat);//显示符号位 wr_com(0xc1+4); wr_dat(disdata[0]);//显示百位 wr_com(0xc2+4); wr_dat(disdata[1]);//显示十位 wr_com(0xc3+4); wr_dat(disdata[2]);//显示个位 wr_com(0xc4+4); wr_dat(0x2e);//显示小数点 wr_com(0xc5+4); wr_dat(disdata[3]);//显示小数位 } voidkey_count(uintok) { wr_com(0x80); if(ok==1)display(str3);elsedisplay(str4); wr_com(0x8d); wr_dat(aa[0]); wr_com(0x8e); wr_dat(aa[1]); if(keyadd==0) { delay1ms(5); if(keyadd==0) { if(ok==1)set_hightemp++;elseset_lowtemp++; while(! keyadd); } } elseif(keydel==0) { delay1ms(5); if(keydel==0) { if(ok==1)set_hightemp--;elseset_lowtemp--; while(! keydel); } } } voidkeyboard() { charok=0; //if(p==0)set_hightemp=tvalue/10,set_lowtemp=tvalue/10; if(keyok==0) { delay1ms(5); if(keyok==0) { ok++; while(! keyok); p=1; while(ok==1) { aa[0]=set_hightemp/10+0x30; aa[1]=set_hightemp%10+0x30; key_count (1); if(keyok==0) { delay1ms(5); if(keyok==0) { ok++; while(! keyok); delay1ms(10); while(ok==2) { aa[0]=set_lowtemp/10+0x30; aa[1]=set_lowtemp%10+0x30; key_count (2); if(keyok==0) { delay1ms(5); if(keyok==0) { ok=0; while(! keyok); delay1ms(10); wr_com(0x80); display(str1); } } } } } } } } } ///////////////////**********************///////////////////////升温程序 voidled_shengwen(void) { uchari; shengwen=0; if(tvalue/10<=20) { for(i=0;i<10;i++) { shengwen=1; delay1ms(100); } } } //////////////////***********************/////////////////////////升温程序 voidled_temp() {if(tvalue/10 { led_red=1; led_green=1; led_yellow=0; delay1ms(10); baojing(); } elseif(tvalue/10>set_hightemp) { led_red=0; led_green=1; led_yellow=1; delay1ms(10); baojing(); } elseif((set_lowtemp<(tvalue/10))&&(tvalue/10) { led_red=1; led_green=0; led_yellow=1; delay1ms(10); } } //********************主程序***********************************// voidmain() { P2=0xff; init_play();//初始化显示 while (1) { read_temp();//读取温度 ds1820disp();//显示 keyboard(); led_temp(); if(tvalue/10<=20) led_shengwen(); if(tvalue/10>=30) led_jiangwen(); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 设计 关于 ds18b20 温度 控制系统