基于AT89S52和DS18B20的数字温度计设计_第1页
基于AT89S52和DS18B20的数字温度计设计_第2页
基于AT89S52和DS18B20的数字温度计设计_第3页
基于AT89S52和DS18B20的数字温度计设计_第4页
基于AT89S52和DS18B20的数字温度计设计_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题目:基于AT89S52和DS18B20的数字温度计设计一 、设计要求数字式温度计要求测温范围为55125°C,精度误差在±0.5°C以内,液晶显示。二 、方案确定根据系统的设计要求,选择DS18B20作为本系统的温度传感器,选择单片机AT89S52为测控系统的核心来完成数据采集、处理、显示功能。选用数字温度传感器DS18B20,省却了采样/保持电路、运放、数/模转换电路以及进行长距离传输时的串/并转换电路,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。该系统的总体设计思路如下:温度传感器DS18B20把所测得的温度信号发送到AT89S52单片机上,经过

2、单片机处理,然后在1602LCD上进行显示。其温度测量及显示电路原理图如下:220V转5V电路原理图如下:2.1 元器件的介绍2.1.1 单片机的选择AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52单片机结构见图2.1:图2.1 AT89S52结构图

3、2.2.2 传感器的选择DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式,DQ 为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。2.2.3 LCD的选择此设计中采用1602

4、LCD对温度进行显示。图2.2 1602LCD实物示意图2.2 温度检测电路DS18B20 最大的特点是单总线数据传输方式,DS18B20 的数据I/O 均由同一条线来完成。DS18B20 的电源供电方式有2 种: 外部供电方式和寄生电源方式。工作于寄生电源方式时, VDD 和GND 均接地, 他在需要远程温度探测和空间受限的场合特别有用, 原理是当1 W ire 总线的信号线DQ 为高电平时, 窃取信号能量给DS18B20 供电, 同时一部分能量给内部电容充电, 当DQ为低电平时释放能量为DS18B20 供电。但寄生电源方式需要强上拉电路, 软件控制变得复杂(特别是在完成温度转换和拷贝数据到

5、E2PROM 时) , 同时芯片的性能也有所降低。因此, 在条件允许的场合, 尽量采用外供电方式。无论是内部寄生电源还是外部供电,I/O口线要接5K左右的上拉电。外部电源供电方式是DS18B20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电路也比较简单,可以开发出稳定可靠的多点温度监控系统。在开发中使用外部电源供电方式,毕竟比寄生电源方式只多接一根VCC引线。在外接电源方式下,可以充分发挥DS18B20宽电源电压范围的优点,即使电源电压VCC 降到3V 时,依然能够保证温度量精度。由于DS18B20 只有一根数据线,因此它和主机(单片机)通信是需要串行通信,而AT89S51 有两个串行端口

6、,所以可以不用软件来模拟实现。经过单线接口访问DC18B20 必须遵循如下协议:初始化、ROM 操作命令、存储器操作命令和控制操作。要使传感器工作,一切处理均严格按照时序。三 、软件设计3.1 概述整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。每一个执行软件是一个小的功能执行模块。这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。各执行模块

7、规划好后,就可以规划监控程序了。首先要根据系统的总体功能选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。3.2 程序模块主程序需要调用2子程序,各模块程序功能如下:LCD显示程序:向LCD的显示送数,控制系统的显示部分。温度测试及处理程序:对温度芯片送过来的数据进行处理和显示。主程序流程见图3.1。 图3.1主程序流程图 图3.2 DS18B20初始化流程3.3 各模块流程设计下面对主要子程序的流程图做介绍。3.3.1温度检测流程DS18B20在单片机控制下分三个阶段:18B20 初始化:初始化流程图见图 3.2;读18B20时序:读DS18B

8、20流程见图 3.3;写18B20时序:写DS18B20流程见图 3.4; 图3.3 读18B20流程图 图3.4 写18B20流程图3.3.2 液晶显示的设置显示模式的设置:写入指令码WriteInstruction(0x38),设置功能16*2显示,5*7点阵,8位数据接口;显示/开关及光标设置:写入指令码WriteInstruction (0x0c),设置开显示,不显示光标,光标不闪烁;写入指令码WriteInstruction(0x06),设置:光标右移,字符不移;写入指令码WriteInstruction(0x01),清屏幕指令,将以前的显示内容清除;写入指令码函数WriteInst

9、ruction( ),写指令过程:输入:RS=0,D0-D7=指令码,E=高脉冲;写入数据函数WriteData( ), 写指令过程:输入:RS=1,D0-D7=数据,E=高脉冲;数据指针设置: 指令码80H+地址码(0-27H)显示第一行的字符,指令码80H+地址码(40H-67H)显示的第二行字符。四、硬件的调试完成的硬件焊接电路见附录。在硬件调试过程中,出现了许多问题。在设计电源电路中使用了整流桥进行整流,但是在硬件焊接完毕后,测得的输出电压不正常。后来利用四个二极管搭建一个整流桥接入电路,输出的电压就正常。此外,电路中使用了78L05稳压管将从整流桥出来的电压稳在5V,可是78L05输

10、出的电压不是5V,因此自己加了了1K的可调电阻将输出的电压进行转换来给单片机供电。在焊接外围电路(1602LCD显示电路和18B20数字测温电路)之前,通过在单片的P2.7口接入一个发光二极管,来调试单片机的最小系统是否能正常工作。单片机中烧入的程序来控制LED的亮和灭。一步调试很成功。接下来自己将外围电路焊接进去,可是1602LCD不显示。经过自己对各个接口端功能的认真分析,发现自己将背光电压调的太高导致1602LCD亮度太高,所以显示的字符看不见,就误认成电路连接有误。在调低背光电压后,正常显示。最后出现的问题是在一切正常的情况下1602LCD上显示的是没有找到DS18B20传感器,请检查

11、电路。经过认真仔细检查电路后,没有发现任何错误。硬件检查没问题,只能是软件程序编写有错,经过认真查看所编程序,发现里面对DS18B20的信号输入接口设置错了。改正后,重新编译烧进单片机,电源打开后,能正常显示温度了。经过以上过程,自己设计的电路达到了开始设想的功能,课程设计圆满结束。总结和体会本设计利用AT89S52 芯片控制温度传感器DS18B20,再辅之以部分外围电路实现对环境温度的测控,性能稳定,精度教高,而且扩展性能很强大。由于DS18B20的测量精度只有±0.5 度,往往很多场合需要更加精确的温度,在所测温度精度不变的基础上必须对数据进行校正。由于DS18B20 是基于带隙

12、结构的数字式温度传感器,PN 结增量电压正比于IC 绝对温度(PTAT),它的测温精度较高,但存在着一定的误差.不过,其误差在时间和外部环境变化的条件下,保持相当高的稳定性。它充分利用监控计算机的处理能力,在监控计算机上用线性插补的数学方法对其进行误差校正补偿,能轻易地将其提高其精度。在本次设计的过程中,我发现很多的问题,这次设计真的让我长进了很多,单片机C语言课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,这一次,我全部用的都是16进制的数直接加减,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握。五、元件清单(名称、型号、数量)元件名称型号数量单片机芯片AT89S

13、521温度传感器DS18B201晶振12MHz1220V转7.5V变压器1电容100pF222uF、0.01uF各110421000uF/25V1220uF/25VLCD16021电阻1K、4.7K各110K24701万能板1IC插座1导线若干稳压块78L051发光二极管1二极管IN40075开关1附录:程序:/DS18B20温度检测及其液晶显示#include<reg51.h> /包含单片机寄存器的头文件#include<intrins.h> /包含_nop_()函数定义的头文件unsigned char code digit10="0123456789&q

14、uot; /定义字符数组显示数字unsigned char code Str="Test by DS18B20" /说明显示的是温度unsigned char code Error="Error!Check!" /说明没有检测到DS18B20unsigned char code Temp="Temp:" /说明显示的是温度unsigned char code Cent="Cent" /温度单位/*以下是对液晶模块的操作程序*/sbit RS=P20; /寄存器选择位,将RS位定义为P2.0引脚sbit RW=P21

15、; /读写选择位,将RW位定义为P2.1引脚sbit E=P22; /使能信号位,将E位定义为P2.2引脚sbit BF=P07; /忙碌标志位,将BF位定义为P0.7引脚/*函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒*/void delay1ms() unsigned char i,j; for(i=0;i<4;i+) for(j=0;j<33;j+) ; /*函数功能:延时若干毫秒入口参数:n*/ void delaynms(unsigned char n) unsigned char i;for(i=0

16、;i<n;i+) delay1ms(); /*函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙*/bit BusyTest(void) bit result;RS=0; /根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; /E=1,才允许读写 _nop_(); /空操作 _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 result=BF; /将忙碌标志电平赋给result E=0; /将E恢复低电平 return result; /*函数功能:将模式设置指令或显示地址写

17、入液晶模块入口参数:dictate*/void WriteInstruction (unsigned char dictate) while(BusyTest()=1); /如果忙就等待 RS=0; /根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0; /E置低电平(根据表8-6,写指令时,E为高脉冲, / 就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_(); /空操作两个机器周期,给硬件反应时间 P0=dictate; /将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(

18、); /空操作四个机器周期,给硬件反应时间 E=1; /E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 E=0; /当E由高电平跳变成低电平时,液晶模块开始执行命令 /*函数功能:指定字符显示的实际地址入口参数:x*/ void WriteAddress(unsigned char x) WriteInstruction(x|0x80); /显示位置的确定方法规定为"80H+地址码x" /*函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)*/ void WriteDat

19、a(unsigned char y) while(BusyTest()=1); RS=1; /RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0; /E置低电平(根据表8-6,写指令时,E为高脉冲, / 就是让E从0到1发生正跳变,所以应先置"0" P0=y; /将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 E=1; /E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 E=0; /当E由高

20、电平跳变成低电平时,液晶模块开始执行命令 /*函数功能:对LCD的显示模式进行初始化设置*/void LcdInitiate(void) delaynms(15); /延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38); /显示模式设置:16×2显示,5×7点阵,8位数据接口delaynms(5); /延时5ms,给硬件一点反应时间 WriteInstruction(0x38);delaynms(5); /延时5ms,给硬件一点反应时间WriteInstruction(0x38); /连续三次,确保初始化成功delaynms

21、(5); /延时5ms,给硬件一点反应时间WriteInstruction(0x0c); /显示模式设置:显示开,无光标,光标不闪烁delaynms(5); /延时5ms,给硬件一点反应时间WriteInstruction(0x06); /显示模式设置:光标右移,字符不移delaynms(5); /延时5ms,给硬件一点反应时间WriteInstruction(0x01); /清屏幕指令,将以前的显示内容清除delaynms(5); /延时5ms,给硬件一点反应时间 /*以下是DS18B20的操作程序 */ sbit DQ=P23;unsigned char time; /设置全局变量,专门用

22、于严格延时/*函数功能:将DS18B20传感器初始化,读取应答信号出口参数:flag */bit Init_DS18B20(void) bit flag; /储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在 DQ = 1; /先将数据线拉高 for(time=0;time<2;time+) /略微延时约6微秒 ; DQ = 0; /再将数据线从高拉低,要求保持480960us for(time=0;time<200;time+) /略微延时约600微秒 ; /以向DS18B20发出一持续480960us的低电平复位脉冲 DQ = 1; /释放数据线

23、(将数据线拉高) for(time=0;time<10;time+) ; /延时约30us(释放总线后需等待1560us让DS18B20输出存在脉冲) flag=DQ; /让单片机检测是否输出了存在脉冲(DQ=0表示存在) for(time=0;time<200;time+) /延时足够长时间,等待存在脉冲输出完毕 ; return (flag); /返回检测成功标志/*函数功能:从DS18B20读取一个字节数据出口参数:dat*/ unsigned char ReadOneChar(void) unsigned char i=0;unsigned char dat; /储存读出的

24、一个字节数据for (i=0;i<8;i+) DQ =1; / 先将数据线拉高 _nop_(); /等待一个机器周期 DQ = 0; /单片机从DS18B20读书据时,将数据线从高拉低即启动读时序dat>>=1; _nop_(); /等待一个机器周期 DQ = 1; /将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time+) ; /延时约6us,使主机在15us内采样 if(DQ=1) dat|=0x80; /如果读到的数据是1,则将1存入datelsedat|=0x00;/如果读到的数据是0

25、,则将0存入dat /将单片机检测到的电平信号DQ存入ri for(time=0;time<8;time+) ; /延时3us,两个读时序之间必须有大于1us的恢复期 return(dat); /返回读出的十进制数据/*函数功能:向DS18B20写入一个字节数据入口参数:dat*/ WriteOneChar(unsigned char dat)unsigned char i=0;for (i=0; i<8; i+) DQ =1; / 先将数据线拉高 _nop_(); /等待一个机器周期 DQ=0; /将数据线从高拉低时即启动写时序 DQ=dat&0x01; /利用与运算取出

26、要写的某位二进制数据, /并将其送到数据线上等待DS18B20采样 for(time=0;time<10;time+) ;/延时约30us,DS18B20在拉低后的约1560us期间从数据线上采样 DQ=1; /释放数据线 for(time=0;time<1;time+) ;/延时3us,两个写时序间至少需要1us的恢复期 dat>>=1; /将dat中的各二进制位数据右移1位 for(time=0;time<4;time+) ; /稍作延时,给硬件一点反应时间/*以下是与温度有关的显示设置 */ /*函数功能:显示没有检测到DS18B20*/ void disp

27、lay_error(void) unsigned char i; WriteAddress(0x00); /写显示地址,将在第1行第1列开始显示 i = 0; /从第一个字符开始显示while(Errori != '0') /只要没有写到结束标志,就继续写WriteData(Errori); /将字符常量写入LCDi+; /指向下一个字符delaynms(100); /延时100ms较长时间,以看清关于显示的说明while(1) /进入死循环,等待查明原因 ;/*函数功能:显示说明信息*/ void display_explain(void) unsigned char i;

28、WriteAddress(0x00); /写显示地址,将在第1行第1列开始显示 i = 0; /从第一个字符开始显示while(Stri != '0') /只要没有写到结束标志,就继续写WriteData(Stri); /将字符常量写入LCDi+; /指向下一个字符delaynms(100); /延时100ms较长时间,以看清关于显示的说明/*函数功能:显示温度符号*/ void display_symbol(void) unsigned char i; WriteAddress(0x40); /写显示地址,将在第2行第1列开始显示 i = 0; /从第一个字符开始显示whil

29、e(Tempi != '0') /只要没有写到结束标志,就继续写WriteData(Tempi); /将字符常量写入LCDi+; /指向下一个字符delaynms(50); /延时1ms给硬件一点反应时间/*函数功能:显示温度的小数点*/ void display_dot(void) WriteAddress(0x49); /写显示地址,将在第2行第10列开始显示 WriteData('.'); /将小数点的字符常量写入LCD delaynms(50); /延时1ms给硬件一点反应时间/*函数功能:显示温度的单位(Cent)*/ void display_cen

30、t(void) unsigned char i; WriteAddress(0x4c); /写显示地址,将在第2行第13列开始显示 i = 0; /从第一个字符开始显示 while(Centi != '0') /只要没有写到结束标志,就继续写WriteData(Centi); /将字符常量写入LCDi+; /指向下一个字符delaynms(50); /延时1ms给硬件一点反应时间/*函数功能:显示温度的整数部分入口参数:x*/ 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列开始显示WriteData(digitj); /将百位数字的字符常量写入LCDWriteData(digitk); /将十位数字的字符常量写入LCDWriteData(digitl); /将个位数字的字符常量写入LCDdelaynms(50); /延时1ms给硬件一点反应时间 /*函数功能:显示温度的小数数部分入口参数:x*/ void display_temp2(unsigned char x) WriteAddre

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论