单片机大作业------温度控制系统设计班级:1302041学号:13020410024姓名:陈串串1设计要求项目简介:温度的测量和控制对人类日常生活、工业生产、气象预报、物资仓储等都起着极其重要的作用。在许多场合,及时准确获得目标的温度、湿度信息是十分重要的,近年来,温湿度测控领域发展迅速,并且随着数字技术的发展,温湿度的测控芯片也相应的登上历史的舞台,能够在工业、农业等各领域中广泛使用。鉴于此,本文对基于单片机的温湿度计系统进行了相关研究。本系统是通过单片机控制来实现对周围环境的温湿度进行测量。本系统是以AT89C52单片机为控制单元、温度传感器DS18B20为主要检测器件,实现温度、湿度的测量、显示、控制,并利用单片机之间的通信功能,将所采集到的温度和湿度值在液晶屏中显示出来。温度测量范围为测温范围-40℃~+70℃,精度±0.0625℃。(1)温度高于28℃启动制冷开关,从而使制冷压缩机工作;(2)温度低于15℃启动加热开关,从而使加热丝导通工作;(3)以上设定通过用户从键盘上输入实现;(4)温度需要用八段式LED显示(温度显示范围-40℃~70℃);(5)制冷和制热需要LED灯显示其工作。2电路设计硬件电路的设计运用51单片机、七段数码管、LED灯、晶振、电解电容、DS18B20、电阻、排阻、电源等组成全部系统。DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS18B20的性能是新一代产品中最好的!性能价格比也非常出色!DS1822与DS18B20软件兼容,是DS18B20的简化版本。省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。设计框图如下:项目视图图2-1温度控制系统原理总图单片机运用单片机处理温度转化成的串行数字信号,实现信号处理。将获得的结果通过输出装置输出显示在七段数码管上,并且在最后的处理部分也借用了P2和P3口的三个引脚,来点亮所需要点亮的LED灯。89C52单片机组成结构中包含运算器、控制器、片内存储器、并行I/O口、串行I/O口、定时/计数器、中断系统、振荡器等功能部件。图2.1.1单片机控制部分电路温度采集部分运用一个DS18B20温度传感器作为外部温度的检测部分,并将采集好的串行数字信号供单片机处理。图2.1.2DS18B20传感器获取外界温度电路温度显示部分六个七段数码管组成显示部分。图2.1.3温度显示部分温度状态指示电路温度高于指定温度(28℃)时,LED-RED亮(代表制冷工作);温度在指定温度(15℃~28℃)之间时,LED-GREEN亮;温度低于指定温度(15℃)时,LED-BLUE亮(代表制热工作)。图2.1.4状态指示部分软件的设计#includereg52.h#defineW_IOP1//片选线从左往右分别与P1.0-P1.4相连#defineS_IOP0//段选线从A-DP,分别与P0.0-p0.7相连#defineucharunsignedchar#defineulongunsignedlong#defineuintunsignedintintt,a;uinttemp,flag;floatftemp;sbitLED1=P2^0;sbitLED2=P2^4;sbitLED3=P3^1;sbitds=P3^4;ucharTime[5];//数码管要显示的4位数字和温度正负intcodeS_Data[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};intcodeW_Data[5]={0x01,0x02,0x04,0x08,0x10};voiddelayms(inttime)//延时函数{inti,j;for(i=time;i0;i--)for(j=110;j0;j--);}voidLED(ucharData[5],uintdp,uintflag)//七段数码管上的显示程序{inti=0,j=0;P0=0XFF;for(i=0;i5;i++){if(i==0){W_IO=W_Data[i];if(flag==0)S_IO=0xff;elseS_IO=0xbf;delayms(5);}else{if(dp!=i){W_IO=W_Data[i];S_IO=S_Data[Data[i]];}else{W_IO=W_Data[i];S_IO=S_Data[Data[i]]&0x7f;}delayms(5);}}}voidinit18b20()//DS18B20复位,初始化函数{uinti;ds=0;i=103;while(i0)i--;ds=1;i=4;while(i0)i--;}bitdu1wei()//读一位数据{uinti;bitdat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i0)i--;return(dat);}uchardu1zijie()//读一字节数据{uchari,j,dat;dat=0;for(i=1;i=8;i++){j=du1wei();dat=(j7)|(dat1);}return(dat);}voidxie1wei(uchardat)//写一字节{uinti;ucharj;bittest;for(j=1;j=8;j++){test=dat&0x01;dat=dat1;if(test){ds=0;i++;i++;ds=1;i=8;while(i0)i--;}else{ds=0;i=8;while(i0)i--;ds=1;i++;i++;}}}voidxie_temp_zhuanhuan()//开始获取温度并转换{init18b20();delayms(1);xie1wei(0xcc);xie1wei(0x44);}uintdu_temp_flag()//读存储器中存储的温度,标记正负{uchara,b;uintc;init18b20();delayms(1);xie1wei(0xcc);xie1wei(0xbe);a=du1zijie();b=du1zijie();temp=b;temp=8;temp=temp|a;c=0;if(temp0xf000)c=1;returnc;}uintdu_temp_cunchuqi(uintflag)//读存储器中存储的温度,转换{uchara,b;init18b20();delayms(1);xie1wei(0xcc);xie1wei(0xbe);a=du1zijie();b=du1zijie();temp=b;temp=8;temp=temp|a;if(flag==1){temp=~temp;temp=temp+1;}ftemp=temp*0.0625;temp=ftemp*100+0.5;returntemp;}voidbaojin(uintflag)//温度状态处理{if(flag==1){LED1=0;LED2=1;LED3=0;}elseif(flag==0){if(temp1500){LED1=0;LED2=1;LED3=0;}elseif(temp=1500&&temp=2800){LED1=0;LED2=0;LED3=1;}elseif(temp2800){LED1=1;LED2=0;LED3=0;}}}voidmain()//主函数{while(1){xie_temp_zhuanhuan();flag=du_temp_flag();t=du_temp_cunchuqi(flag);Time[0]=flag;Time[1]=t/1000;Time[2]=t%1000/100;Time[3]=t/10%10;Time[4]=t%10;LED(Time,2,flag);baojin(flag);}}部分代码说明1.代码全程引入一关键(全局)变量flag,代表温度正负,当温度在零上时,flag为0,温度在零下时,flag为1,作为影响多个子函数的重要参数。2.voidLED(ucharData[5],uintdp,uintflag)//八段数码管上的显示程序{inti=0,j=0;P0=0XFF;for(i=0;i5;i++){if(i==0){W_IO=W_Data[i];if(flag==0)S_IO=0xff;elseS_IO=0xbf;delayms(5);}else{if(dp!=i){W_IO=W_Data[i];S_IO=S_Data[Data[i]];}else{W_IO=W_Data[i];S_IO=S_Data[Data[i]]&0x7f;}delayms(5);}}数码管的显示是另一关键,结合主函数可知,该子函数中i=0-4代表六联数码管上2-6即后五个的对应处理情况,即i=0对应符号位,i=1-4对应数字位。符号位与数字位处理方式不同,故有了for循环内第一层if-else条件判断区分参数dp关系小数点位设定,主函数中取dp=2,对应i=2时的小数点特殊处理,故有了第一层if-else中else下的又一层3测试结果仿真结果温度信号模拟,仿真结果如图。温度大于28度时,系统开启制冷措施(红灯亮)温度小于15度时,系统开启取暖措施(蓝灯亮)温度在指定范围15-28之间时,系统不采取任何措施(绿灯亮)温度低于测量下限时,系统发出警报(蓝灯亮)温度高于测量上限时,系统发出警报(红灯亮)4总结本次单片机课程设计,不仅要求设计者能熟练使用单片机来实现温度的采集与读数,熟练编写程序,还要求对单片机的电路连接结构,对数码管芯片有明确清晰的了解与认识。刚开始拿到老师给的题目,我们就开始分析应该需要用到哪些知识,我们发现首先应该了解Keil和protel软件的使用,其次就是DS18B20的数据采集和编程问题。由于汇编程序是非常晦涩难懂的,所以我们决定采用C语言进行编程,而我们本身学的是汇编,所以我就在网上下载了一个郭天祥的基于C的单片机教学视频,开始前几天我基本就在看视频学习。在学习过程中,我学到了很多编程技巧,对我之后写编程序有很大的帮助。本次课程设计中不断翻阅资料,提高了我的分析能力,也让我体会到了动手实践的快乐,当看到电路仿真成功时,内心十分欣喜。参考文献:[1]李广弟、朱月秀、冷祖祁.单片机基础[M].北京:北京航空航天大学出版社,2007[2]张俊谟、张迎新.单片机教程[M].北京:单片机教程,2008[3]马斌.单片机原理及应用[M].北京:人民邮电出版社,2009[4]于帆、赵妮.程序设计基础[M].北京:清华大学出版社,2006[5]郭天祥单片机教程