1、摘要温度的检测与控制是工业生产过程中比较典型的应用。本设计以 AT89C52单片机为核心,采用 DS18B20温度传感器检测温度,由温度采集、温度显示,温度报警等功能模块组成。基于题目基本要求,本系统对温度采集和温度显示系统行了重点设计。本系统大部分功能能由软件实现,吸收了硬件软件化的思想。实际操作时,各功能在开发板上也能完美实现。本系统实现了要求的基本功能,其余发挥部分也能实现。关键字:AT89C52 单片机、DS18B20 温度传感器、数码管显示、温度采集目录一绪论 .二设计目的 三设计要求 四设计思路 五系统的硬件构成及功能 .5.1 主控制器 .5.2 显示电路 .5.3 温度传感器
2、.六系统整体硬件电路 .七系统程序设计 .八测量及其结果分析 .九设计心得体会 十参考文献 附录 1 源程序附录 2 元件清单及 PCB 图一绪论随着时代的发展,控制智能化,仪器小型化,功耗微量化得到广泛关注。单片机控制系统无疑在这些忙面起到了举足轻重的作用。单片机的应用系统设计业已成为新的技术热点,其中数字温度计就是一个典型的例子。人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:传统的分立式温度传感器模拟集成温度传感器智能集成温度传感器
3、。目前的智能温度传感器(亦称数字温度传感器)是在 20 世纪 90 年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,与传统的温度计相比,其具有读数方便,测温范围广,测温准确,输出温度采用数字显示,主要用于对测温要求比较准确的场所,或科研实验室使用。
4、该设计控制器使用 ATMEL 公司的 AT89C52 单片机,测温传感器使用DALLAS 公司 DS18B20,用数码管来实现温度显示。二设计目的1.理解掌握 MCS-51系列单片机的功能和实际应用。2.掌握仿真开发软件的使用。3.掌握数字式温度计电路的设计、组装与调试方法。三设计要求1.以 MCS-51系列单片机为核心器件,组成一个数字式温度计。2.采用数字式温度传感器为检测器件,进行单点温度检测,检测精度为0.5 C3.温度显示采用 4位 LED数码管显示,三位整数,一位小数。4.具有键盘输入上下限功能,超过上下限温度时,进行声音报警。四设计思路1根据设计要求,选择 AT89C52 单片机
5、为核心器件。2.温度检测器件采用 DS18B20 数字式温度传感器。与单片机的接口为P3.6 引脚。3.键盘采用独立式按键,由三个按键组成,分别是:设置键(SET ),加一建(+1 ),确认键(RET)。SET 键(上下限温度设置键):当该键按下时,进入上下限温度设置功能。通过 P3.1 引脚接入。+1 键(加一调整键):在输入上下限温度时,该键按下一次,被调整位加一。通过 P3.2 引脚接入。RET 键(确认键):当该键按下时,指向下一个要调整的位。通过 P3.3引脚接入。4.声音报警蜂鸣器通过 P1.7 引脚接入。硬件电路设计总体框图为图 4.1:图 4.1五、系统的硬件构成及功能1.主控
6、制器单片机 AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,使 用 Atmel 公 司 高 密 度 非 易 失 性 存 储 器 技 术 制造 , 与 工 业 80C51 产 品 指 令 和 引 脚 完 全 兼 容 。 片 上 Flash 允 许 程 序 存 储 器在 系 统 可 编 程 , 亦 适 于 常 规 编 程 器 。 很适合便携手持式产品的设计使用。AT89S52在仿真软件中的图像为图 5.1按键输入电路时钟电路复位电路蜂鸣器电路单片机LED 显示器驱动电路3 位 LED显示器温度检测图 5.12.显示电路显示电路采用四位共阳 LED数码管,
7、从 P3口 RXD,TXD串口输出段码。LED数码管在仿真软件中如图 5.2图 5.23.温度传感器DS18B20 是美国 DALLAS 半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现位的数字值读数方式。DS18B20 的性能特点如下: 独特的单线接口仅需一个端口引脚进行通讯 简单的多点分布应用 无需外部器件 可通过数据线供电 零待机功耗 测温范围-55+125,以0.5递增。华氏器件-67+2570F,以0.90F 递增 温度以9 位数字量读出 温度数字量转换时间200ms(典型值) 用户可定义的非易失
8、性温度报警设置 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件。DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式如图 3.3.1所示,DQ 为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。其电路图如图5.3.1所示.。 图5.3.1 外部封装形式 在仿真软件中如图5.3.2所示图5.3.2DS18B20的测温原理如图 5.3.3所示,图中低温度系数晶振的振荡频
9、率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器 1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器 2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20 就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 所对应的基数分别置入减法计数器 1和温度寄存器中,减法计数器 1和温度寄存器被预置在-55 所对应的一个基数值。减法计数器 1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器 1的预置值减到 0时温度寄存器的值将加 1,减法计数器 1的预置将重新被装入,减法
10、计数器 1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器 2计数到 0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图 5.3.3中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是 DS18B20的测温原理。另外,由于 DS18B20单线通信功能是分时完成的,有严格的时隙概念,因此读写时序很重要。系统对 DS18B20的各种操作必须按协议进行。操作协议为:初始化 DS18B20(发复位脉冲)发 ROM功能命令发存储器操作命令处理数据。预 置低 温 度 系
11、 数 振 荡 器高 温 度 系 数 振 荡 器斜 率 增 加 器计 数 器 1比 较预 置= 0温 度 寄 存 器计 数 器 2= 0Tx加 1停 止 1 2图 5.3.3 在正常测温情况下,DS1820 的测温分辨力为 0.5,可采用下述方法获得高分辨率的温度测量结果:首先用 DS1820提供的读暂存器指令(BEH)读出以0.5为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB) ,得到所测实际温度的整数部分 Tz,然后再用 BEH指令取计数器 1的计数剩余值 Cs和每度计数值 CD。考虑到 DS1820测量温度的整数部分以 0.25、0.75为进位界限的关系,实际温度 Ts可用
12、下式计算:CDs-25.0) ( )( Tzs表 1.部分温度值对应的二进制温度数据。温度/ 二进制表示 十六进制表示+125 0000 0111 1101 000007D0H+85 0000 0101 0101 00000550H+25.0625 0000 0001 1001 00000191H+10.125 0000 0000 1010 000100A2H+0.5 0000 0000 0000 00100008H0 0000 0000 0000 10000000H-0.5 1111 1111 1111 0000FFF8H-10.125 1111 1111 0101 1110FF5EH-25
13、.0625 1111 1110 0110 1111FE6FH-55 1111 1100 1001 0000FC90H六系统整体硬件电路根据设计要求与设计思路,硬件电路设计框图如图 6.1 所示,在仿真软件Proteus 上完成。其中 LED 数码管以动态扫描法实现温度显示,由四个 PNP 型晶体管 Q2,Q3,Q4,Q5 和八个电阻组成,基极与单片机的 P1.0,P1.1,P1.2 连接。DS18B20 的数据 I/O 端与单片机 P3.6 引脚连接。外部晶振为 12MHz。蜂鸣器通过 Q1 放大后与引脚 P1.7 相连。图中有三个独立式按键可以分别调整温度计的上下限报警设置,图中蜂鸣器可以在
14、被测温度不在上下限范围内时,发出报警鸣叫声音,同时 LED数码管将没有被测温度值显示,这时可以调整报警上下限,从而测出被测的温度值。图中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。图 6.1 系统总体硬件电路七系统程序设计数字式温度计的应用程序主要包括主程序,温度检测程序,温度转换程序,LED显示程序等。系统的主程序主要用来初始化一些系统参数,对 DS18B20的配置数据进行一系列的设定。温度检测程序是对 DS18B20的状态不断地查询,读出 RAM 中的 9 字节,在读出时需进行 CRC 校验,校验有错时不进行温度
15、数据的改写,读取当前的温度值后,进行温度转化程序,对温度符号处理和温度值的 BCD码处理,进行温度值正负的判定,将其段码送至显示缓冲区,以备定时扫描服务程序处理。LED 显示程序主要对显示缓冲器中的显示数据进行刷新操作,当最高显示位为 0时,将符号显示位移入下一位。总程序程序代码见附录一显示缓冲区初始化开始复位 DS18B20发跳过 ROM 命令发温度转换命令延时更新显示缓冲区复位 DS18B20将温度转换为 BCD 码发跳过 ROM 命令发读存储器命令读温度数据温度符号判定八测量及其结果分析1.Proteus 仿真结果软件方面,在 Proteus编译下进行,源程序编译及仿真调试。在软件中选定
16、传感器后可对其进行环境温度设置,如图 8.1.1,将环境温度设为 34.9。图 8.1.1然后点击软件执行键,按操作步骤实施后,观察 LED 数码管示数,此时示数如图 8.1.2。图 8.1.2可见本次软件测试结果良好。2硬件测试结果在硬件测试方面,检查电路板及焊接的质量情况,在检查无误后通电检查LED显示器。其中 DS18B20 实物图为 8.2.1在室温下,LED 显示器示数如图 8.2.2,为 26.4摄氏度图 8.2.2用手盖住温度传感器后,LED 显示器示数如图 8.2.3,为 29.7摄氏度。比较可知,硬件调试结果也达到了要求。九设计心得体会本次课设对我来说是一次难得的经历,首先是
17、第一次接触了仿真软件Proteus,在使用时经历了很多次失败,因为这款软件与以前使用的各种软件有很多不同,使用时不停出错,接线时由于元件放置不合理而接的杂乱无章;输入源程序时还较为顺利,显示结果比较满意。其次是程序设计,我们在参考别人成功先例的基础上根据自己设计的需要编制程序,其中历经不少曲折,最后我的收获是,编程一定要细心,针对每一个细节,稍有疏忽,程序就不能正常工作。最后是单片机实践操作,由于我自己已买了一块开发板,所以硬件调试比较顺利,效果也不错,就是 DS18B20 温度传感器灵敏度不太高,示数变化不大。另外,我前期花了一些时间专门学习这块芯片,了解了 DS18B20 的工作原理的时序
18、图。在这次的实践与学习中,尽管期间困难重重,但我还是从中学习了不少新的知识与技能和解决困难的方法,也终于体验到了经历困难到最终获得成功的那种无以言表的喜悦之情,总之,本次课设是我收获最多的一次,也希望自己在以后的各项研究活动中能坚持这种精神。十参考文献1单片机原理与接口技术(第二版)牛昱光 李晓林 电子工业出版社. 2010.72单片机系统设计与应用实例. 韩志军 机械工业出版社. 2009.103DS18B20 数据手册附录一 源程序#include #include “DS18B20.h“ #define uint unsigned int#define uchar unsigned ch
19、ar /宏定义#define SET P3_1 /定义调整键#define DEC P3_2 /定义减少键#define ADD P3_3 /定义增加键#define BEEP P3_7 /定义蜂鸣器bit shanshuo_st; /闪烁间隔标志bit beep_st; /蜂鸣器间隔标志sbit DIAN = P27; /小数点uchar x=0; /计数器signed char m; /温度值全局变量uchar n; /温度值全局变量uchar set_st=0; /状态标志signed char shangxian=38; /上限报警温度,默认值为 38signed char xiaxi
20、an=15; /下限报警温度,默认值为 5uchar code LEDData=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/*延时子程序 */void Delay(uint num)while( -num );/*初始化定时器 0*/void InitTimer(void)TMOD=0x1;TH0=0x4c;TL0=0x00; /50ms(晶振 12M)/*定时器 0 中断服务程序*/void timer0(void) interrupt 1TH0=0x4c;TL0=0x00;x+;/*外部中断 0 服务程序*/void int0(vo
21、id) interrupt 0EX0=0; /关外部中断 0if(DEC=0if(shangxian99)shangxian=99;else if(ADD=0if(xiaxianshangxian)xiaxian=shangxian; /*读取温度 */void check_wendu(void)uint a,b,c;c=ReadTemperature()-5; /获取温度值并减去 DS18B20 的温漂误差a=c/100; /计算得到十位数字b=c/10-a*10; /计算得到个位数字m=c/10; /计算得到整数位n=c-a*100-b*10; /计算得到小数位if(m99)m=99;n=
22、9; /设置温度显示上限 /*显示开机初始化等待画面*/Disp_init()P2=0xbf; P1=0xfe;Delay(200);P2=0xbf;P1=0xfd;Delay(200);P2=0xbf;P1=0xfb;Delay(200);P2=0xbf; P1=0xf7; /第四Delay(200);P1=0xff; / 关闭显示/*显示温度子程序 */Disp_Temperature() /显示温度P2=0xc6; /显示 CP1=0xf7; /Delay(300);P2=LEDDatan; /显示个位P1=0xfb; /Delay(300);P2=LEDDatam%10; /显示小数点
23、DIAN=0;P1=0xfd;Delay(300);P2=LEDDatam/10; /显示百位P1=0xfe;Delay(300);P1=0xff; /关闭显示/*显示报警温度子程序*/Disp_alarm(uchar baojing)P2=0xc6; /显示 CP1=0xf7;Delay(200);P2=LEDDatabaojing%10; /显示十位P1=0xfb;Delay(200);P2=LEDDatabaojing/10; /显示百位P1=0xfd;Delay(200);if(set_st=1)P2=0x89;else if(set_st=2)P2=0xc7; /上限 H、下限 L
24、标示P1=0xfe;Delay(200);P1=0xff;/*报警子程序 */void Alarm()if(x=10)beep_st=beep_st;x=0;if(m=shangxianif(set_st=0)EX0=0; /关闭外部中断 0EX1=0; /关闭外部中断 1check_wendu();Disp_Temperature();Alarm(); /报警检测else if(set_st=1)BEEP=1; /关闭蜂鸣器EX0=1; /开启外部中断 0EX1=1; /开启外部中断 1if(x=10)shanshuo_st=shanshuo_st;x=0;if(shanshuo_st) D
25、isp_alarm(shangxian);else if(set_st=2)BEEP=1; /关闭蜂鸣器EX0=1; /开启外部中断 0EX1=1; /开启外部中断 1if(x=10)shanshuo_st=shanshuo_st;x=0;if(shanshuo_st) Disp_alarm(xiaxian);/*END*/DS18B20.h:#include #define DQ P3_6 /定义 DS18B20 总线 I/O/*延时子程序 */void Delay_DS18B20(int num)while(num-) ;/*初始化 DS18B20*/void Init_DS18B20(v
26、oid)unsigned char x=0;DQ = 1; /DQ 复位Delay_DS18B20(8); /稍做延时DQ = 0; /单片机将 DQ 拉低Delay_DS18B20(80); /精确延时,大于 480usDQ = 1; /拉高总线Delay_DS18B20(14);x = DQ; /稍做延时后,如果 x=0 则初始化成功,x=1 则初始化失败Delay_DS18B20(20);/*读一个字节 */unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-)DQ =
27、0; / 给脉冲信号dat=1;DQ = 1; / 给脉冲信号if(DQ)dat|=0x80;Delay_DS18B20(4);return(dat);/*写一个字节 */void WriteOneChar(unsigned char dat)unsigned char i=0;for (i=8; i0; i-)DQ = 0;DQ = datDelay_DS18B20(5);DQ = 1;dat=1;/*读取温度 */int ReadTemperature(void)unsigned char a=0;unsigned char b=0;int t=0;float tt=0;Init_DS18
28、B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0x44); /启动温度转换Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器a=ReadOneChar(); /读低 8 位b=ReadOneChar(); /读高 8 位t=b;t=8;t=t|a;tt=t*0.0625;t= tt*10+0.5; /放大 10 倍输出并四舍五入return(t);/*END*/附录二 元件清单及 PCB 图数字温度计电路元器件清单元器件名称 参数 数量 元器件名称 参数 数量单片机 89C52 1 数码管 1晶体振荡器 12MHz 1 蜂鸣器 1电容 3 温度传感器 DS18B20 1电阻 19PCB图