基于C51单片机数字温度计设计制作毕业设计.doc
摘 要随着时代的进步和发展,单片机技术基本已经普及到我们的生活中,越来越多的工作,科研和各个领域都涉及到单片机的应用,单片机已经成为了一项比较成熟的技术。在此我将为大家介绍一项基于C51单片机的设计数字温度计,这种温度计是一种新型产品,它具有多种功能,例如它可以设置上下报警温度,当温度不在设置范围内时,它就会发出报警信号随着人们生活水平不断的提高,单片机控制无疑是人们追求的目标之一,它给人生活上带来的方便也是不可否认的,其中数字温度计就是一个典型的例子,但人们对它的要求也越来越高,要为现代人生活,工作,科研提供更好更方便的设施就需要从单片机技术入手,一切向着数字化,智能化控制方向发展。本设计所介绍的数字温度计和传统温度计相比,具有度数方便,测数范围广,测温更准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用等该设计控制器使用单片机AT89C51,测温传感器使用DS18B20,采用3位共阳极LED数码管以串行口传送数据,实现温度显示和准确度要求。关 键 词: 数字温度计 AT89C51 DS18B20 报警AbstractWith the arrival of the "information age", as a means of obtaining information sensor technology had been significant progress, its application field, more and more widely, the demand is higher and higher. This paper USES singlechip combined with the sensor technology development and design, this paper the sensor theory and single-chip microcomputer application organically, and detailed description of the temperature sensor DS18B20 measurement environment temperature, at the same time, 51 SCM in modern electronic products is widely used and its technology has very mature, can be read out directly measured DS18B20 temperature, and the use of three wire and single-chip microcomputer is linked together, reduce the external hardware circuit, with low cost and easy to use features. Specific using single chip computer AT89C51 as a controller, and temperature sensor DS18B20 as temperature collector, design a kind of digital thermometer. The thermometer can measure-55.5-+ 125 temperature between. Good upper button, after 18 B20 directly read temperature being measured, data transfer, real time monitoring the current temperature is beyond the set range, and realize the alarm function. With a total of three Yang digital tube to serial data transmission, and realize the temperature display.KEY WORD :digital thermometer DS18B20 AT89C51 alarm目 录第一章 绪言1第一节 前言1第二章 总体设计方案2第一节 数字温度计方案2第二节 总体设计方案及框图2第三章 系统组成及工作原理4第一节 单片机的选择4第二节 数字温度传感器DS18B206第三节 复位电路的设计8第四节 功能键9第五节 数码管串口显示9第四章 系统软件设计12第一节 软件设计流程12结 论14参考文献15附录A 源程序16附录B 简易数字温度计原理总图22第一章 绪言第一节 前言现代社会对各种信息参数的准确度和精确度的要求都有了几何级的增长,而如何准确而又迅速的获得这些参数就需要受制于现代信息基础的发展水平。在三大信息信息采集(即传感器技术)、信息传输(通信技术)和信息处理(计算机技术)中,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域已经引用的非常广泛,可以说是渗透到社会的每一个领域,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:传统的分立式温度传感器模拟集成温度传感器智能集成温度传感器。目前的智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,本文将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,89S51单片机为控制器构成的数字温度测量装置的工作原理及程序设计作了详细的介绍。与传统的温度计相比,其具有读数方便,测温范围广,测温准确,输出温度采用数字显示,主要用于对测温要求比较准确的场所,或科研实验室使用。第二章 总体设计方案第一节 数字温度计方案本实验系统主要由温度采集、按键设置、温度报警、温度显示四部分电路组成。其中温度采集实现的方法有很多种,以下列出一种在日常生活中和工农业生产中经常用到的实现方案。采用数字温度芯片DS18B20 测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。在0100摄氏度时,最大线形偏差小于1摄氏度,测温范围 55+125,固有测温分辨率0.5。DS18B20 的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C51构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。既可以单独对多DS18B20控制工作,还可以与PC 机通信上传数据。另外AT89S51 在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。第二节 总体设计方案及框图该系统利用AT89S51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。该系统扩展性非常强,它可以在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同时显示时间,并可以利用AT24C16芯片作为存储器件,以此来对某些时间点的温度数据进行存储,利用键盘来进行调时和温度查询,获得的数据可以通过MAX232芯片与计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据。系统总体设计方框图如图2.1所示,控制器采用单片机AT89C51,温度传感器采用DS18B20,利用按键进行温度的上下限范围设置,范围可设置位-99.999.9数码管以串口传送数据并进行显示,当设置错误时,即上限温度小于下限温度,黄色Led发光进行警告。按下确定键后,数码管显示当前温度,当温度超出设定范围时,红色Led发光进行报警。图2.1 总体设计方框图第三章 系统组成及工作原理第一节 单片机的选择对于单片机的选择,可以考虑使用8031与8051系列,由于8031没有内部RAM,系统又需要大量内存存储数据,因而不适用。AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。一、 AT89C51主要特性:与MCS-51 兼容;4K字节可编程闪烁存储器;寿命:1000写/擦循环;数据保留时间:10年;全静态工作:0Hz-24MHz;三级程序存储器锁定;128×8位内部RAM;32可编程I/O线;两个16位定时器/计数器;5个中断源。二、 AT89C51引脚功能介绍其引脚排列如图3.1所示:各引脚功能简单介绍如下:VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:表3-1 P3口特殊功能介绍口管脚备选功能P3.0 RXD串行输入口P3.1 TXD串行输出口P3.2 /INT0外部中断0P3.3 /INT1外部中断1P3.4 T0记时器0外部输入P3.5 T1记时器1外部输入P3.6 /WR外部数据存储器写选通P3.7 /RD外部数据存储器读选通P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。第二节 数字温度传感器DS18B20一、DS18B20的主要特性适应电压范围更宽,电压范围为3.05.5V,在寄生电源方式下可由数据线供电。独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。DS18B20在使用中不需要任何外围元件,全部 传感元件及转换电路集成在形如一只三极管的集成电路内。温范围55125,在-10+85时精度为±0.5。可编程 的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温。在9位分辨率时最多在 93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。二、DS18B20的内部结构图3-2为DS18B20的内部结构图,表示出了 DS1820 的主要部件。DS1820 有三个主要数字部件:1)64 位激光 ROM,2)温度传感器,3)非易失性温度报警触发器 TH 和 TL。器件用如下方式从单线通讯线上汲取能量:在信号线处于高电平期间把能量储存在内部电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。DS1820 也可用外部 5V 电源供电源供电。三、DS18B20工作原理低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在55所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。第三节 复位电路的设计单片机的复位电路如图3-3所示。该复位电路采用手动复位与上电复位相结合的方式。当按下按键S1时,VCC通过R2电阻给复位输入端口一个高电平,实现复位功能,即手动复位。上电复位就是VCC通过电阻R2和电容C构成回路,该回路是一个对电容C1充电和放电的电路,所以复位端口得到一个周期性变化的电压值,并且有一定时间的电压值高于CPU复位电压,实现上电复位功能。图3-3单片机的复位电路第四节 功能键上电后,进入上限值设置,此时D4灯发光,通过加减、切换位和负号键可以设置温度值,设置好后按确定键进入下限设置,下限设置好之后按下确定键进入温度采集部分,并显示当前温度,此过程中,再次按下确定键可进入设置环境。功能键部分连接图如图3-4所示:图3-4 功能键部分连接图第五节 数码管串口显示此次的设计要求数码管采用串口进行数据传输,所以使单片机串口工作在方式0,即8位移位寄存器输入输出方式,外接移位寄存器74LS164以扩展IO端口。方式 0的输出是8位串行数据,通过移位寄存器可将8位串行数据变成8位并行数据输出,引脚RXDP30和TXDP31分别作74ls164的数据输入端和同步时钟脉冲输入端。每一个时钟信号的上升沿加到74LS164的CP端时,移位寄存器将串口输出的数据移入一位,8个时钟脉冲过后串口输出的8位二进制数全部移入第一片74LS164,通过Q0-Q7并行输出。使用这种方法单片机中CPU的开销小。通过串口外接串并转换器74LS164,扩展并行的IO口。需要几个数码管就扩展几个并行接口,74L164的13(Q7)接下一位移位寄存器的数据输入端即可。管脚数码管直接接在74LS164的输出脚上,单片机通过串口将要显示数据的字形码逐一的串行移出至74LS164的输出脚上数码管就可以显示相应的数字。对于单片机,当发送完一个字节后,TI会置位,开始发送下一个字节必须将TI清零。部分程序如下:/* 名称 : void Display(uchar *T,uchar N)* 功能 : 串口发送并显示* 输入 : *T:所要显示的数据数组;N:所要显示的数据符号位* 输出 : 无*/void Display(uchar *T,uchar N)uchar Num;Num=0;while(Num<=2) /连续发送3个字节 if(N=1) SBUF=tabTNum&0x7f; /负值显示负号 else SBUF=tabTNum; while (!TI); /没发送完一个字节,则清中断标志 Num+;TI=0; ; TI=0;/发送完毕,清中断标志74LS164硬件连接图如图3-5所示:图3-5 74LS164硬件连接图第四章 系统软件设计第一节 软件设计流程程序开始对串口和单片机各个端口等进行设置,之后进入温度上下限设置,并进行判断是否设置正确,若正确则进行温度采集,并进行判断是否超出设置范围,若超出则红色LED发光报警。具体流程图如图4-1所示:图4-1软件设计流程图硬件实物连接图如图5-3所示:图5-3 硬件实物连接图结 论本次毕业设计基于MCS-51系列的单片机芯片STC89C51来设计一个数字温度计,该设计充分利用了温度传感器DS18B20功能强大的优点,如DS18B20可以直接读出被测温度值,进行转换;而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本与易使用的特点,大大减少了硬件电路,也使得该数字温度计具有结构简单、成本低廉、精确度较高、反应速度较快、数字化显示和不易损坏等特点,而且性能稳定,适用范围广,因此特别适用于对测温要求比较准确的场所。参考文献1 李建忠单片机原理及应用第二版M 西安:西安电子科技大学出版社 ,2008.5。2 何立民单片机应用技术大全M 北京:北京航空航天大学出版社,1994。3 袁希光传感器技术手册M 北京:国防工业出版社,1986。4 冯英传感器电路原理与制作M 成都:成都科技大学出版社,1997。5 张有德,赵志英.单片微型机原理、应用于实验.复旦大学出版社,2000.4。6 赵新民,王祁.智能仪器设计基础.哈尔滨:哈尔滨工业大学出版社,1999。7 黄亮基于AT89C2051串口的LED数码管显示电路J电子制作,2006,第08期。8truelmz,DS18B20工作原理9 yh3099 ,DS18B20,附录A 源程序#include<reg52.h>#include<intrins.h> #define uchar unsigned char #define uint unsigned int#include"18B20.h"#include"1602.h"unsigned char code digit10="0123456789" /定义字符数组显示数字 unsigned char code Str="Test by DS18B20" /说明显示的是温度unsigned char code Error="Error!Check!" /说明没有检测到DS18B20unsigned char code Temp="Temp:" /说明显示的是温度unsigned char code Cent="Cent" /温度单位uchar time;/*函数功能:显示没有检测到DS18B20*/void display_error(void) uchar i; WriteAddress(0x00);/显示的数据是在第一行第一列 i = 0; while(Errori != '0') lcd_wdat(Errori); i+; delay_ms(100); while(1) ;/*函数功能:显示说明信息*/void display_explain(void) uchar i; WriteAddress(0x00);/显示的数据是在第一行第一列 i = 0; while(Stri != '0') lcd_wdat(Stri); i+; delay_ms(100); /*显示温度Temp符号*/void display_symbol(void)uchar i; WriteAddress(0x40); /写显示地址,将在第2行第1列开始显示i = 0 ;while(Tempi != '0') lcd_wdat(Tempi); i+; delay_ms(50); /*显示小数点符号*/void display_dot(void) WriteAddress(0x49);/写显示地址,将在第二行第十列显示lcd_wdat('.');delay_ms(50);/*温度单位函数功能:显示温度的单位(Cent)*/void display_cent (void)uchar i;WriteAddress(0x4c);/显示地址从第二行的第十三列开始i = 0 ;while(Centi != '0') lcd_wdat(Centi); i+; delay_ms(50);/*函数功能:显示温度的整数部分*/void display_temp1(unsigned char x)unsigned char j,k,l; /j,k,l分别储存温度的百位、十位和个位j=x/100; /取百位k=(x%100)/10; /取十位l=x%10; /取个位 WriteAddress(0x46); /写显示地址,将在第2行第7列开始显示 lcd_wdat(digitj); /将百位数字的字符常量写入LCDWriteAddress(0x47);lcd_wdat(digitk); /将十位数字的字符常量写入LCDWriteAddress(0x48);lcd_wdat(digitl); /将个位数字的字符常量写入LCDdelay_ms(50); /延时1ms给硬件一点反应时间 /*函数功能:显示温度的小数数部分*/ void display_temp2(unsigned char x) WriteAddress(0x4a); /写显示地址,将在第2行第11列开始显示 lcd_wdat(digitx); /将小数部分的第一位数字字符常量写入LCDdelay_ms(50); /延时1ms给硬件一点反应时间void ReadyReadTemp(void)Init_DS18B20(); /将DS18B20初始化WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换 for(time=0;time<100;time+); /温度转换需要一点时间Init_DS18B20(); /将DS18B20初始化WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器,前两个分别是温度的低位和高位void main(void)uchar TL; /存储温度的低位uchar TH; /温度的高位uchar TN; /温度的整数部分uchar TD; /温度的小数部分lcd_init();delay_ms(5); if(Init_DS18B20()=1) display_error(); display_explain(); display_symbol(); display_dot(); display_cent(); while(1) ReadyReadTemp();TL = ReadOneChar();TH = ReadOneChar();TN=TH*16+TL/16; /实际温度值=(TH*256+TL)/16,即:TH*16+TL/16 /这样得出的是温度的整数部分,小数部分被丢弃了 TD=(TL%16)*10/16; /计算温度的小数部分,将余数乘以10再除以16取整, /这样得到的是温度小数部分的第一位数字(保留1位小数) display_temp1(TN); /显示温度的整数部分 display_temp2(TD); /显示温度的小数部分 delay_ms(10); 附录B 简易数字温度计原理总图