1、基于AT89C51单片机的多点温度测量系统设计单片机应用系统设计课 题:基于AT89C51单片机的多点温度测量系统设计 姓 名: 班 级: 学 号: 指导老师: 日 期: 一、绪论 1二、总体方案设计1三、硬件系统设计1 1主控制器12 显示模块23温度采集模块33.1 DSl8B20的外部管脚及特点43.2 DS18B20的内部结构43.3 DS18B20的内存结构5 3.4 DS18B20的测温功能及原理5 3.5 DS18B20温度传感器与单片机的连接63.6提高DS18B20测温精度的方法6四、系统软件设计6五、系统仿真9六、设计总结10参考文献11附 录12一、绪论典型的温度测控系统
2、是由模拟温度传感器、A/D 转换电路和单片机组成。但是由于模拟温度传感器输出为模拟信号,必须经过A/ D 转换环节获得数字信号后才能与单片机等微处理器接口,使得硬件电路结构复杂,成本较高。近年来,由于以DS18B20为代表的新型单总线数字式温度传感器的突出优点使得它得到充分利。DS18B20 集温度测量和A/ D转换于一体,直接输出数字量,接口几乎不需要外围元件,硬件电路结构简单,传输距离远,可以很方便的实现多点测量;与单片机接口几乎不需要外围元件,使得硬件电路结构简单,广泛使用于距离远,节点分布多的场合。二、系统总体方案设计本设计完成的任务是设计基于AT89C51单片机的多点温度测量系统,此
3、系统能连续测量多点温度,测量精确度为0.1度,并在LCD显示器上完成显示。系统总体方案设计具体如下: 图1总的来说,本系统有四大部分组成:单片机控制部分,温度显示部分,温度传感器组和测点选择开关部分。温度采集可以利用温度传感器测量目标物体的温度,该温度经处理成数字信号传送给单片机,单片机可以很高效的采集外部传送过来的数字信号,在其内部经软件算法处理,转化为相应的温度值经显示模块显示出所测得的温度。三、硬件系统设计1、主控制器(单片机) 基于设计的要求要使用AT89C51单片机作为本系统设计的核心器件。 由于 AT89C51 单片机是一种带 4K 字节闪烁可编程可擦除只读存储器的低电压,高性能c
4、MOS8 位微处理器。该器件采用 ATMEL 高密度非易失存储器制造技术制造,与工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存储器组合在单个芯片中,ATMEL 的 AT89C51 是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案,所以本系统采用 AT89C51 单片机作为系统的主控制器。其特点如下: 4K 字节可编程闪速程序存储器:1000 次循环写/擦 全静态工作:OHz-24MHz 三级程序存储器锁定 128 X 8 位内部数据存储器,32 条可编程 I/0 线 两个十六位定时器/计数器,六个中断源 可编程串行通道,低功耗闲置
5、和掉电模式2. 显示模块本设计要求用LCD 显示器来显示测出的温度。LCD系列中LM016L型号的为2行16列液晶,可显示2行16列英文字符,有8位数据总线D0-D7,RS,R/W,EN三个控制端口(共14线),工作电压为5V。没背光,和常用的1602B功能和引脚一样(除了调背光的二个线脚)。可以完全实现本设计的显示功能。3.温度采集模块本设计用的是DS18B20温度传感器,它是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。3.1 DSl8B20的外部管脚及特点D
6、S18B20的性能特点如下: 独特的单线接口方式:DS18B20 与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 在使用中不需要任何外围元件。 可用数据线供电,电压范围:+3.0V+5.5 V。 测温范围:-55 +125 。固有测温分辨率为 0.5 。 通过编程可实现 912 位的数字读数方式。 用户可自设定非易失性的报警上下限值。 支持多点组网功能,多个 DS18B20 可以并联在惟一的三线上,实现多点测温。 负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。3.2 DS18B20的内部结构 DS18B20内部功能模块如图所示,主要由4部分组成:
7、64位光刻R0M、温度传感器、非易失性的温度报警触发器TH和TL、配置寄存器。R0M 中的64位序列号是出厂前被光刻好的,他可以看作是该DSISB20的地址序列码,每个DSI8B20的64位序列号均不相同。高低温报警触发器TH 和TL,配置寄存器均由一个字节的E2PROM组成,使用一个存储器功能命令可对 TH,TL或配置寄存器写入。配置寄存器中R1,R0决定温度转换的精度位数:R1R000,9位精度,最大转换时间为93.75 ms;R1R0 = 01,10位精度,最大转换时间为187.5 ms;R1R0 = 10,11位精度,最大转换时间为375 ms;R1R0 =11,12位精度,最大转换时
8、间为750 ms;未编程时默认为12位精度。本系统采用的也是12位的精度。 图23.3 DS18B20的内存结构 DSI8B20温度传感器的内部存储器包括一个高速暂存RAM (便笺式的内部存储器)和一个非易失性的可电擦除的EEPROM,后者存放高温和低温触发器TH,TL和结构寄存器。便笺存储器包含了9个连续字节(08),前两个字节是测得的温度信息,字节0的内容是温度的低8位,字节1是温度的高8位,字节2是TH(温度上限报警),字节3是TL(温度下限报警),字节4是配置寄存器,用于确定输出分辨率9到12位。第5、6、7个字节是预留寄存器,用于内部计算。字节8是冗余检验字节,校验前面所有8个字节的
9、CRC码,可用来保证通信正确。 3.4 DS18B20的测温功能及原理当DSI8B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0062 5LSB形式表示。 DS18B20 的测温原理如图 3所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20 就对低温度系数振荡器产生的时钟
10、脉冲进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55所对应的基数分别置入减法计数器1、温度寄存器中,减法计数器1和温度寄存器被预置在-55所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1 的预置值减到0 时,温度寄存器的值将加1,减法计数器1 的预置将重新被装入,减计数器1 重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2 计数到0 时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要
11、计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值。另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)发ROM 功能命令发存储器操作命令处理数据。各种操作的时序图与DS1820 相同。图33.5 DS18B20温度传感器与单片机的连接以MCS-51 单片机为例,可采用寄生电源供电方式,P1.1 口接单线总线为保证在有效的DS18B20 时钟周期内提供足够的电流,可用一个M O S F E T 管和89C51 的P1.0来完成对总线的上拉。当DS18B20
12、 处于写存储器操作和温度A/D 变换操作时,总线上必须有强的上拉,上拉开启时间最大为10 s。采用寄生电源供电方式时VDD 和GND 端均接地。由于单线制只有一根线,因此发送接收口必须是三态的。主机控制S18B20 完成温度转换必须经过初始化、ROM 操作指令、存储器操作指令三个步骤,假设单片机系统所用的晶振频率为12MHz,根据DS18B20 的初始化时序、写时序和读时序,分别编写INIT 为初始化子程序,WRITE 为写(命令或数据)子程序,READ 为读数据子程序3 个子程序。所有的数据读写均由最低位开始。3.6 提高DS18B20测温精度的方法DS18B20正常使用时的测温分辨率为0.
13、5。如果采取直接读取DS18B20内部暂存器的方法,可将DS18B20的测温分辨率提高到0.1 0.01。DS18B20内部暂存器分布如表1所示,其中第7字节存放的是当温度寄存器停止加1时,计数门关闭后保留在计数器1中的值,第8字节存放的是每度所对应的计数值,然后,可通过以下方法获得高精度测温的结果。首先用DS18B20提供的暫存器指令(BEH)读出温度结果,然后转化成0.5/LSB(最底有效位),得到所测实际温度整数部分,记为TEMP.READ。随后再用BEH指令读取计数门关闭后保留在计数器1中的值COUNT.REMAIN和每度所对应的计数值COUNT.PER.C,由于DS18B20测温整数
14、部分以0.25为进界限关系,所以用下面公式直接计算,可得到高精度实测温度。实际温度TEMP.READ-0.25+( COUNT.PER.C四、系统软件设计1. 主程序部分(图4)。2. LCD的初始化(图5)。下为指令寄存器写入的流程图,向数据寄存器写入数据,即显示的数字符号,只需将RS=1即可。3、查询按键子程序设计(图6)。图4 图5 图64. 当单总线上接有多个个DS18B20的初始化(图7)。 图7 图8 图9 图105. 检测芯片(图8)。6.写数据(图9)。7.读数据(图10)。五系统仿真 Proteus软件是Labcenter公司的一款电路设计与仿真软件,它包括ISIS、ARES
15、等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的绘制与仿真。Proteus的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。通过Proteus软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验环境8。 本设计的核心部分为多点温度数据的快速准确读取,完成电路设计和软件编程后,将程序在Keil下编译,装入单片机,进行仿真,可以看到,同步快速多点温度测量得到了实现。仿真效果如下:1.开始画面,提示按一个选择开关。图112.
16、显示相应温度。图123.错误提示。图13六、设计总结刚刚结束了单片机课程的学习,也做过了很多的实验,但真正的去完成一个完整应用系统的设计这是第一次,所以我十分的重视这次机会,虽然时处期末考试期间,我还是抽出很多时间完成设计。从拿到设计课题我就开始了对DS18B20温度传感器的信息的采集,对还不曾学习的LCD的相关知识进行了解及扩展,联系我所学的知识,我对本系统逐渐有了很清楚的认识,便着手进行系统总体方案设计,硬件框图、硬件系统以及硬件模块的设计,最后是完成系统软件的设计 。我深刻了解的完成这些步骤是完成任何设计的基础,所以每一步都认真对待。在设计过程中我遇到了许多的问题,通过对问题的逐一解决,
17、我学到了许多的知识,同时也获得很多的乐趣,这也激励着我想去做更多的探索。参考文献:1. 余永权. 单片机原理及应用. 北京:电子工业出版社, 1997. 2.刘伟 陈盛云 郭毅刚.基于DS18B20 的温度测量系统的设计与仿真。3. 周月霞,孙传友.DS18B20硬件连接与软件编程。4. 刘君华. 智能传感器系统 M . 西安:西安电子科技大学出版社,1999.5. 邦田. 电子电路实用抗干扰技术 M . 北京:人民邮电出版社,1994.附录:程序。#includeunsigned int shu=0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x3
18、9;unsigned long t;unsigned char k,f=0;sbit RS=P20;sbit RW=P21;sbit E=P22;sbit DS=P11;void del( int count ) /延时程序while(count-);void delay(unsigned int count)/延时程序int p; while(count-) for(p=0;p125;p+);void write(unsigned char date)/向DS18B20中写入数据 int i; for(i=0;i=1; void init(unsigned int n)/ RW=0,RS=0
19、;向指令寄存器中写入命令,即对1602初始化。 delay(10); E=0; RS=0; RW=0; E=1; P0=n; E=0; void write_data(unsigned char n)/RS=1,RW=0;向数据寄存器中写入数据,即显示的数符。 delay(10); E=0; RS=1; RW=0; E=1; P0=n; E=0; void write2(unsigned char i) i+=0x30; if(i=4)i=0; write(0x55); write(0x28); write(i); write(0xc5); write(0xb8); write(0x00);
20、write(0x00); write(0x00);void matchrom() /匹配ROM unsigned char i; k=P3; switch(k) case 0: f=1; init(0x80);write_data(0x50); /press init(0x81);write_data(0x72); init(0x82);write_data(0x65); init(0x83);write_data(0x73); init(0x84);write_data(0x73); init(0x85);write_data(0x80); init(0x86);write_data(0x6
21、1);/a init(0x87);write_data(0x80); init(0x88);write_data(0x6b);/key init(0x89);write_data(0x65); init(0x8a);write_data(0x79); init(0x8b);write_data(0x80); init(0x8c);write_data(0x21);/! for(i=0x8d;i=0xcf;i+) init(i);write_data(0x80); break; case 1: init(0x83);write_data(0x31); /NO 1 write2(0); write
22、(0x8e); break; case 2: init(0x83);write_data(0x32);/NO 2 write2(1); write(0xb9); break; case 4: init(0x83);write_data(0x33); /NO 3 write2(2); write(0xe0); break; case 8: init(0x83);write_data(0x34); /NO 4 write2(3); write(0xd7); break; default: f=1; init(0x80);write_data(0x50); /please init(0x81);wr
23、ite_data(0x6c); init(0x82);write_data(0x65); init(0x83);write_data(0x61); init(0x84);write_data(0x73); init(0x85);write_data(0x65); init(0x86);write_data(0x80); init(0x87);write_data(0x70); /press init(0x88);write_data(0x72); init(0x89);write_data(0x65); init(0x8a);write_data(0x73); init(0x8b);write
24、_data(0x73); init(0x8c);write_data(0x80); init(0x8d);write_data(0x6f); /one init(0x8e);write_data(0x6e); init(0x8f);write_data(0x65); init(0xc0);write_data(0x80); init(0xc1);write_data(0x80); init(0xc2);write_data(0x80); init(0xc3);write_data(0x6b);/key init(0xc4);write_data(0x65); init(0xc5);write_
25、data(0x79); init(0xc6);write_data(0x80); init(0xc7);write_data(0x6f);/only init(0xc8);write_data(0x6e); init(0xc9);write_data(0x6c); init(0xca);write_data(0x79); init(0xcb);write_data(0x80); init(0xcc);write_data(0x21);/! init(0xcd);write_data(0x80); init(0xce);write_data(0x80); init(0xcf);write_dat
26、a(0x80); break; void lcd(unsigned char m) /当为负温度时,液晶显示可以高位为0屏蔽. init(0x80);write_data(0x4e);/NO init(0x81);write_data(0x4f); init(0x82);write_data(0x80); init(0x84);write_data(0x80); init(0x85);write_data(0x74);/temperature init(0x86);write_data(0x65); init(0x87);write_data(0x6d); init(0x88);write_d
27、ata(0x70); init(0x89);write_data(0x65); init(0x8a);write_data(0x72); init(0x8b);write_data(0x61); init(0x8c);write_data(0x74); init(0x8d);write_data(0x75); init(0x8e);write_data(0x72); init(0x8f);write_data(0x65); init(0xc0);write_data(0x80); init(0xc1);write_data(0x80); init(0xc2);write_data(0x69);
28、 /is: init(0xc3);write_data(0x73); init(0xc4);write_data(0x3a); if(m=1) if(t/1000%10)!=0) init(0xc5);write_data(0x2d); init(0xc6);write_data(shut/1000%10); else init(0xc5);write_data(0xfe); init(0xc6);write_data(0x2d); elseif(t/10000!=0) init(0xc5);write_data(shut/10000); init(0xc6);write_data(shut/1000%10); else if(t/1000%10)!=0) init(0xc5);write_data(0xfe); init(0xc6);write_data(shut/1000%10); else init(0xc5);write_data(0xfe); init(0xc6);write_data(0xfe); init(0xc7);write_data(shut/100%10); init(0
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1