数字温度计.docx
《数字温度计.docx》由会员分享,可在线阅读,更多相关《数字温度计.docx(29页珍藏版)》请在冰豆网上搜索。
数字温度计
绵阳职业技术信息工程系
课程实训报告
课程名称:
单片机课程设计
实训题目:
数字温度计
起止时间:
专业班级:
电气自动化091班
学生姓名:
敖
学号:
0902668
指导教师:
乔老师
绵阳职业技术学院信息工程系
年月日
任务书
一、实训任务
设计一款基于AT89C2051单片机的数字温度计。
测温范围在-55~125℃,误差在±0.5℃以内,采用LED数码管直接显示。
二、设计要求
1.基本要求
1)用4位共阳LED数码管以动态扫描法实现温度显示。
2)控制器使用单片机AT89C2051,温度传感器使用DS18B20,用LED显示温度。
2.
(1)画出电路原理图;
(2)确定元器件及元件的参数;
(3)给出全部源程序;
(4)进行电路模拟仿真
摘要
此电路是用AT89S51心器件,并利用DS18B20温度传感器和4位共阳极L数码管动态扫描来完成温度显示。
电路特点有体积小,灵敏度和精度高,很适应很多对精度要求较高的场合,完成对设备及场地的温度控制,能有效的提高工作人员对环境的变化的反应速度。
关键词:
AT89S51;DS18B20;LED;温度控制等
第一章绪论1
1.1概述1
1.2设计目的1
1.3设计任务和内容1
第二章总体设计及核心器件简介
2.1总体设计
2.AT89C2051
第3章电路模块设计
3.1系统硬件电路的设计
3.2显示电路
3.3温度主程序
3.4读出温度子程序
3.5温度转换命令子程序
3.6显示数据刷新子程序
3.7温度数据的计算处理方法
3.8调试及性能分析
第4章所需器件及软件编程
4.1所需器件列表
4.2主程序框图
4.3源程序
第五章设计心得和存在问题
第1章绪论
1.1概述
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。
数字温度计给人们的生活带来了更多的方便与快捷。
1.2设计目的
(1)加强对单片机和C51语言的认识,充分掌握和理解设计各部分的工作原理、设计过程、选择芯片器件、模块化编程等多项知识。
(2)用单片机模拟实现具体应用,使个人设计能够真正使用。
(3)把理论知识与实践相结合,充分发挥个人能力,并在实践中锻炼。
(4)提高利用已学知识分析和解决问题的能力。
(5)提高实践动手能力。
1.3设计任务和内容
1.3.1设计任务
结合教材及在网上搜索的参考资料,用AT89C2051的控制DS18B20温度传感器和4位共阳极L数码管动态扫描来完成温度显示。
1.3.2设计内容
(1)写设计任务书。
(2)进行总体设计,画出原理图。
(3)用Protel软件画出PCB板并制板。
(4)焊接器件和芯片。
(5)编写并调试程序。
第二章总体设计及核心器件简介
2.1总体设计
方框图所示为数字温度控制器的单体设计方框图。
其工作原理为:
当该电路上电工作以后,首先刷新显示(LED),然后,温度传感器采集温度送单片机检查温度的高低,由单片机送出信号经过驱动电路送往显示电路或报警电路。
图2-1
2.2AT89C2051
at89c2051是美国ATMEL公司生产的低电压、高性能CMOS8位单片
机,片内含2kbytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大at89c2051单片机可为您提供许多高性价比的应用场合。
2.1.2AT89C2051的引脚功能
AT89C2051单片机的P口特点如下图:
P1口:
P1口是一个8位双向I/O端口,其中P1.2~P1.7引脚带有内部上拉电阻,P1.0和P1.1要求外部上拉电阻。
P1.0和P1.1还分别作为片内精密模拟比较器的同相输入(AIN0)和反相输入(AIN1)。
P1口输出缓冲器可吸收20mA电流,并能直接驱动LED显示。
对端口写1时,通过内部的上拉电阻把端口拉到高电位,这时可作输入口。
P1口作输入口使用时,因为内部有上拉电阻,那些被外部信号拉低的引脚会输出一个电流
P3口:
P3.0~P3.5、P3.7是带有内部上拉电阻的7个双向I/O端口。
P3.6用于固定输入片内比较器的输出信号并且它作为一通用I/O口引脚而只读。
P3口输出缓冲器可吸收20mA电流。
对端口写1时,通过内部的上拉电阻把端口拉到高电位,这时可作输入口。
P3口作输入口使用时,因为内部有上拉电阻,那些被外部信号拉低的引脚会输出一个电流。
图2-2
2.13DS18B20
DS18B20简介:
DS18B20简介美国美信(Maxim)公司生产的单线数字温度传感器DS1820,可把温度信号直接转换成串行数字信号供微机处理。
DS18B20的主要特性适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
4个主要的数据部件
2.14温度传感器工作原理
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
●独特的单线接口仅需要一个端口引脚进行通信;
●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
●无须外部器件;
●可通过数据线供电,电压范围为3.0~5.5V;
●零待机功耗;
●温度以9或12位数字;
●用户可定义的非易失性温度报警设置;
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如下图所示。
DS18B20内部结构图
64位ROM的位结构如下图(1)所示。
开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
非易失性温度报警触发器TH和TL,可通过软件写入户报警上下限。
图(1):
64位ROM结构图
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构如下图(2)所示。
头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时按些寄存器中的分辨率将温度转换为相应精度的数值。
该字节各位的定义如图图(3)所示。
低5位一直为1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户不要去改动,R1和R0决定温度转换的精度位数,来设置分辨率,定义方法(1)见表。
图(2):
高速暂存器RAM结构图
图(3):
配置寄存器
表(1):
DS18B20分辨率的定义规定
由表(1)可见,DS18B20温度转换的时间比较长,而且设定的分辨率越高,所需要的温度数据转换时间越长。
因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。
第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。
单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB,温度值格式如图(4)所示。
2-4
2-3
2-2
2-1
20
21
22
23
LS字节
S
S
S
S
S
S6
S5
S4
MS字节
图(4):
温度格式值
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制值勤。
表(2)是一部分温度值对应的二进制温度数据
DS18B20完成温度转换后,就把测得的温度值与RAMH、TL字节内容作比较。
若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。
因此,可用多只DS18B20同时测量温度并进行报警搜索。
二进制表示
十六进制表示
+125
0000011111010000
07D0H
+85
0000010101010000
0550H
+25.0625
0000000110010001
0191H
+10.125
0000000010100010
00A2H
+0.5
0000000000001000
0008H
0
0000000000000000
0000H
-0.5
1111111111111000
FFF8H
-10.125
1111111101011110
FF5EH
-25.0625
1111111001101111
FE6FH
-55
1111110010010000
FC90H
二进制表示
十六进制表示
+125
0000011111010000
07D0H
+85
0000010101010000
0550H
+25.0625
0000000110010001
0191H
+10.125
0000000010100010
00A2H
+0.5
0000000000001000
0008H
0
0000000000000000
0000H
-0.5
1111111111111000
FFF8H
-10.125
1111111101011110
FF5EH
-25.0625
1111111001101111
FE6FH
-55
1111110010010000
FC90H
表
(2)
64位ROM有效字节中存储有循环冗余检验码(CRC)。
主机热气ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。
DS18B20的测温原理如图(5)所示。
图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,浓厚兴趣计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
斜率累加器
减到0
温度寄存器
预置
计数比较器
预置
减法计数器1
低温度系数振荡器器
减到0
高温度系数振荡器
减法计数器2
图(5):
测温原理图
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将加将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。
图(5)中的斜率累加器用于补偿和修正测温过程中的非线形性,其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作按协议进行。
操作协议为:
初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
3.4DS18B20与单片机的接口电路
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式,如图(6)所示。
单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
图(6):
寄生电源供电方式
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD和BND端均接地。
由于单线制只有一根线,因此发送接口必须是三态的。
第三章路模块设计
3.1系统硬件电路的设计
此电路是用AT89S51心器件,并利用DS18B20温度传感器和4位共阳极L数码管动态扫描来完成温度显示。
如下图所示:
图3-0
3.2显示电路
显示电路采用4位共阳LED数码管,从P1口输出段码,列扫描用P3.0~P3.3口来实现,列驱动用9021三极管。
3.3温度主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值,温度测量每1s进行一次。
其程序读出温度流程图:
3.4读出温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定。
计算温度子程序流程图如下:
图3-3
3.5温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令。
当采用12位分辨率时,转换时间约为750ms。
在本程序设计中,采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如下:
图3-4
3.6显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为0时,降幅好显示移入下一位。
显示数据刷新子程序流程图:
3.7温度数据的计算处理方法
从DS18B20读取出的二进制值必须先转换成十进制值,才能用于字符的显示。
因为DS18B20的转换精度为9~12位可选项的,为了提高精度采用12位。
在采用12位转换精度时,温度寄存器里的值是以0.0625为步进的,即温度值为温度寄存器里的二进制值乘以0..625,就是实际的二进制温度值。
通过观察表
(2)发现一个十进制值和二进制值之间有很明显的关系,就是把二进制的高字节的低半字节和低字节的低半字节化成十进制后,就是温度值的小数部分。
小数部分因为是半个字节,所以二进制值范围是0~F,转换成十进制小数值就是0。
0625的倍数(0~15)。
这样需要4位的数码管来显示小数部分实际应用不必有这么高的精度,采用1位数码管来显示小数,可以精确到0.1℃。
3.8调试及性能分析
系统的调试以程序为主。
硬件调试比较简单,首先检查电路的焊接是否正确,然后可用万用表测试或通电检测。
软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度子程序、显示数据刷新等子程序的编程及调试,由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读写编程时必须严格地保证读写时序,否则将无法读取测量结果。
本程序采用单片机汇编编写,用wave3.2编译器编程调试。
软件调试到能显示温度值,而且在有温度变化时(例如用手去接触)显示温度能改变就基本完成。
性能测试可用制作的温度计和已有的成品温度计来同时测量比较,由于DS18B20的精度很高,所以误差指标可以限制在0.1℃以内,另外-55~+125℃的测温范围使得该温度计完全适合一般的应用场合,其低电压供电特性可做成用电池供电的手持电子温度计。
DS18B20温度计还可以在高低温报警、远距离多点测温控制等方面进行应用开发,但在实际设计中应注意以下问题:
●DS18B20工作时电流高达1.5mA,总线上挂接点数较多且同时进行转换时,要考虑增加总线驱动,可用单片机端口在温度转换时导通一个MOSFET供电。
●连接DS18B20的总线电缆是有长度限制的,因此在用DS18B20进行长距离测温系统设计时,要充分考虑总线分布电容和阻抗匹配等问题。
在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦某个DS18B20接触不好或断线,当程序读该DS18B20时,将没有返回信号,程序进入死循环,这一点在进行DS18B20硬件连接和软件设计时要给予一定的重视。
第4章所需器件及软件编程
4.1所需的器件如下列表:
单片机:
AT89C2051
电容:
10uf1个
30uf2个
电阻:
6.8千欧1个
4.7千欧5个
510欧9个
晶振:
12HZ1个
LED数码管:
4个
晶体管(三极管):
4个
DS18B20:
1个
4.2主程序框图
如图:
4.3源程序
;**************************
;常数定义
;**************************
SHIJIANEQU0E0H
SHIJIAHEQU0B1H
SHIJIA1EQU36H
;*************************
;工作内存定义
;************************
BBITDATA20H
TIMEEBITBBIT.1
TIMBITBBIT.2
TIIDATA26H
TIIHDATA27H
MPDATA28H
TIICDATA29H
;*************************
;引脚定义
;*************************
MP1BITP3.7
;*************************
;中断向量区
;**************************
ORG0000H
LJMPSTART
ORG000BH
LJMPT0IT
;**************************
;系统初始化
;**************************
START:
MOVSP,#40H
CL:
MOVR0,#20H
MOVR1,#60H
CL1:
MOV@R0,#00H
INCR0
DJNZR1,CL1
MOVTMOD,#00100001B
MOVTH0,#SHIJIAN
MOVTL0,#SHIJIAH
SJMPINIT
ERROR:
NOP
LJMPSTART
NOP
INIT:
NOP
SETBET0
SETBTR0
SETBEA
MOVPSW,#00H
CLRTIM
LJMPMAIN
;**************************
;定时器0中断服务程序
;**************************
T0IT:
PUSHPSW
MOVPSW,#10H
MOVTH0,#SHIJIAH
MOVTL0,#SHIJIAN
INCR7
CJNER7,#32H,T0IT1
MOVR7,#00H
SETBTIME1SOK
T0IT1:
POPPSW
RETI
;****************************
;主程序
;****************************
MAIN:
LCALLDISP1
JNBTIME1SOK,MAIN
CLRTIME1SOK
JNBTIM,MAIN2
LCALLRE1
LCALLCONVTEMP
LCALLDISPBCD
LCALLDISP1
MAIN2:
LCALLRE
SETBTIM
LJMPMAIN
;****************************
;子程序
;****************************
;RESETDS18B20
;****************************
DS1820:
SETBMP1
NOP
NOP
CLRMP1
MOVR6,#0A0H
DJNZR6,$
MOVR6,#0A0H
DJNZR6,$
SETBMP1
MOVR6,#32H
DJNZR6,$
MOVR6,#3CH
LOOP1820:
MOVC,MP1
JCDS1820OUT
DJNZR6,LOOP1820
MOVR6,#064H
DJNZR6,$
SJMPDS1820
RET
DS1820OUT:
SETBMP1
RET
;**********************************
;从ds18b20中读出一个字节的数据
;**********************************
RDS1820:
MOVR7,#08H
SETBMP1
NOP
NOP
RDS1820LOOP:
CLRMP1
NOP
NOP
NOP
SETBMP.
MOVR6,#07H
DJNZR6,$
MOVC,MP1
MOVR6,#3CH
DJNZR6,$
RRCA
SETBMP1
DJNZR6,RDS1820LOOP
MOVR6,#3CH
DJNZR6,$
RET
;**********************************
;从d