
电子设计综合训练报告
数字温度计
姓 名: -----------------------------
学 号: 310708010323 /26
专业班级: 电气07-3班
指导老师: 杨凌霄
所在学院:电气工程与自动化学院
2010年6月9日
摘要
本设计是对一个数字温度计功能的实现,其主要功能是:1)基本范围-50℃~110℃,2)精度误差小于0.5℃,3)LED数码直读显示,4)扩展功能,5)可以任意设定温度的上下限报警功能。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机ATS51,测温传感器使用DS18B20,用4位共阴极LED数码管,实现温度显示,能准确达到以上要求。
温度计电路设计控制器采用单片机ATS51,具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。温度传感器采用DS18B20,DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式,仅需要一个端口引脚进行通信,内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。显示电路采用4位共阴极LED数码管,采用LED动态显示方式,从P1口输出段码,P2.0~P2.3作为位选控制端。
1 概述 ……………………………………………………………………………(4)
1.1 课程设计的要求 …………………………………………………………(4)
1.2课程设计的目的……………………………………………………………(4)
1.3 系统组成及工作原理………………………………………………………(4)
2 系统总体方案及硬件设计………………………………………………………(5)
2.1设计思路及描述……………………………………………………………(5) 2.2硬件构成……………………………………………………………………(5)
〈1〉主控模块ATC51单片机………………………………………………(5)
〈2〉DS18B20介绍 ……………………………………………………………(5)
2.3显示模块……………………………………………………………………(9)
2.4开关控制电路模块 ………………………………………………………(10)
3 软件设计 ……………………………………………………………………(11)
3.1主程序 ……………………………………………………………………(11)
3.2读取温度子程序 …………………………………………………………(11)
3.3温度转换命令子程序 ……………………………………………………(12)
3.4计算温度子程序……………………………………………………………(12)
3.5温度比较子程序……………………………………………………………(13)
4 Proteus软件仿真……………………………………………………………(14)
5 课程设计体会 ………………………………………………………………(17)
参考文献…………………………………………………………………………(17)
附1:源程序代码………………………………………………………………(18)
附2:系统原理图………………………………………………………………(33)
1 概述
1.1课程设计的要求
1)基本范围-50℃~110℃
2)精度误差小于0.5℃
3)LED数码直读显示
4)扩展功能
5)可以任意设定温度的上下限报警功能
1.2课程设计的目
(1) 通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。
(2)掌握按键消抖的方法,LED的动态显示,DS18B20的使用和编程原理。
(3)通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。
(4)掌握WAVE及proteus仿真软件的使用方法。
1.3 系统组成及工作原理
本系统功能是由硬件和软件两大部分协调完成的,硬件部分主要完成各种新号的采集和各种信息的显示的;软件主要完成信号的处理及控功能等。
基于工作原理是C51单片机对按钮的输入信号的查询和检测,然后对输入信号进行相应处理后通过LED数码管输出。
2 系统总体方案及硬件设计
2.1设计思路及描述
本实验设计4个开关按键K1,K2,K3,K4:其中K2按键按下去时,进入报警上下限设置,按动K2,K3分别对报警上限和下限进行设置,增减由K1进行控制,当设置完毕后,按K4保存并退出。该实验要求对环境温度进行测量并在LED上显示数据,则可利用ATC51芯片的P0.7-P0.0管脚对应了接数码管的A,B,C,D,E,F,G和小数点位,P2.0~P2.3接显示数据的小数位、个位、十位、百位(符号位),P3.4端口与DS18B20进行数据传递和通信端口,P3.7端口输出报警信号。
2.2硬件构成
〈1〉主控模块ATC51单片机
功能特性描述
ATC51是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程 Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得ATS52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
ATC51具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,ATS52可降至 0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。
P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P2口:P2口是一个具有内部上拉电阻的8位双向 I/O口,P2 输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
〈2〉DS18B20介绍
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
●独特的单线接口仅需要一个端口引脚进行通信;
●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
●无须外部器件;
●可通过数据线供电,电压范围为3.0~5.5V;
●零待机功耗;
●温度以9或12位数字;
●用户可定义报警设置;
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;
位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图3所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图1所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
| 温度 LSB |
| 温度 MSB |
| TH用户字节1 |
| TL用户字节2 |
| 配置寄存器 |
| 保留 |
| 保留 |
| 保留 |
| CRC |
图1 DS18B20字节定义
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表1是一部分温度值对应的二进制温度数据。
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。
在位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。
DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
表1 一部分温度对应值表
| 温度/℃ | 二进制表示 | 十六进制表示 |
| +125 | 0000 0111 1101 0000 | 07D0H |
| +85 | 0000 0101 0101 0000 | 0550H |
| +25.0625 | 0000 0001 1001 0000 | 0191H |
| +10.125 | 0000 0000 1010 0001 | 00A2H |
| +0.5 | 0000 0000 0000 0010 | 0008H |
| 0 | 0000 0000 0000 1000 | 0000H |
| -0.5 | 1111 1111 1111 0000 | FFF8H |
| -10.125 | 1111 1111 0101 1110 | FF5EH |
| -25.0625 | 1111 1110 0110 1111 | FE6FH |
| -55 | 1111 1100 1001 0000 | FC90H |
ROM操作命令
| 指令 | 说明 |
| 读ROM命令(33H) | 读18B20的序行号 |
| 搜索ROM命令(F0H) | 识别总线上各器件的编码 |
| 匹配ROM命令(55H) | 用于多个DS18B20的定位 |
| 跳过ROM命令(CCH) | 此命令执行后,存储器操作将针对总线上的所有操作 |
| 报警搜索ROM命令(ECH) | 仅温度超限的器件对此命令做出响应 |
| 指令 | 说明 |
| 温度转换(44H) | 启动温度转换 |
| 读暂存器(BEH) | 读全部暂存器内容,包括CRC字节 |
| 写暂存器(4EH) | 写暂存器第2,3和4个字节的数据 |
| 复制暂存器(48EH) | 将暂存器中的TH,TL和配置寄存器内容复制到EEPROM中 |
| 读EEPROM(B8H) | 将TH,TL和配置寄存器内容从EEPROM中回读至暂存器 |
DS18B20器件要求采用严格的通信协议,以保证数据的完整性。该协议定义了几种信号类型:复位脉冲,应答脉冲时隙;写0,写1时隙;读0,读1时隙。与DS18B20的通信,是通过操作时隙完成单总线上的数据传输。发送所有的命令和数据时,都是字节的低位在前,高位在后。
复位和应答脉冲时隙
每个通信周期起始于微控制器发出的复位脉冲,其后紧跟DS18B20发出的应答脉冲,在写时隙期间,主机向DS18B20器件写入数据,而在读时隙期间,主机读入来自DS18B20的数据。在每一个时隙,总线只能传输一位数据。
写时隙
当主机将单总线DQ从逻辑高拉为逻辑低时,即启动一个写时隙,所有的写时隙必须在60~120us完成,且在每个循环之间至少需要1us的恢复时间。写0和写1时隙如图所示。在写0时隙期间,微控制器在整个时隙中将总线拉低;而写1时隙期间,微控制器将总线拉低,然后在时隙起始后15us之释放总线。
读时隙
DS18B20器件仅在主机发出读时隙时,才向主机传输数据。所以在主机发出读数据命令后,必须马上产生读时隙,以便DS18B20能够传输数据。所有的读时隙至少需要60us,且在两次的读时隙之间,至少需要1us的恢复时间。每个读时隙都由主机发起,至少拉低总线1us。在主机发起读时隙之后,DS18B20器件才开始在总线上发送0或1,若DS18B20发送1,则保持总线为高电平。若发送为0,则拉低总线当发送0时,DS18B20在该时隙结束后,释放总线,由上拉电阻将总线拉回至高电平状态。DS18B20发出的数据,在起始时隙之后保持有效时间为15us。因而主机在读时隙期间,必须释放总线。并且在时隙起始后的15us之内采样总线的状态。
2.3显示模块
显示电路采用4位共阴极LED数码管,采用LED动态显示方式,从P1口输出段码,P2.0~P2.3作为位选控制端。其中P1做输出口时需要加上拉电阻。
2.4开关控制电路模块
本模块有四个按键来实现报警温度的设置功能,当K2 键按下时,系统进入 报警温度上下限调整程序,按动K2可以实现对报警温度上限TH增一或减一,按动K3可以实现对报警温度下限TL增一或减一,其加减由按动K1来控制,同时LED显示当前在调的报警温度值,当调整完毕后,按K4键退出调整程序。
3 软件设计
3.1主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,并与温度报警上下限设定值进行比较,同时查询K2是否按下进行报警温度的设置,然后循环执行。其程序流程见图2所示。
图2主程序流程图 图3 读取温度流程图
3.2读取温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图3所示。
3.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如图4所示
图4 温度转换流程图
3.4 计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如下图所示。
3.5温度比较
此程序是将实际温度与设置的报警上下限比较,决定是否发出报警信号。由于T为实际温度的绝对值,TH、TL也是温度的绝对值,因此判断大小关系时要通过其正负符号来确定。
4 Proteus软件仿真
(1)在正常工作模式下,LED显示当前所测的实际温度。如果所测温度没有超出报警温度的上下限时,报警指示灯D1和蜂鸣器不动作;若超出所设置的报警上下限温度,报警指示灯D1闪烁同时蜂鸣器发出报警声响。
(2)当K2 键按下时,系统进入 报警温度上下限调整程序,按动K2可以实现对报警温度TH上限增一或减一,其加减由按动K1来控制,同时LED显示当前的报警温度上限值。
(3)当系统进入报警上下限设置后,按K3键可以实现对报警温度下限TL的增一或减一,其加减同样由按动K1键来控制,同时LED显示当前的报警温度下限值。
5 课程设计体会
经过一个学期的学习,我们对单片机已经有了初步的认识,对于它的基本组成和结构已经有了简单的了解,这一周的课程设计让我体会到很多东西,不仅仅是有关单片机基本知识的,更多的是自己动手能力和逻辑思维能力的锻炼,同时,我更是知道了自己的不足,有好多东西是需要好好学习的。
其实要做出来做好这个课程设计是不容易的,是要付出很多心思的。一开始我根本摸不着头脑,也没有什么想法,对四个题目都没感觉,用汇编根本编不出大程序,后来我还是决定做相对熟悉的c语言来编写。于是,我就开始上网,去学校图书馆查询有关单片机的各种资料,每天一起来就是看书、查资料、编程、修改,写程序用了几天,还参考了好多参考书里设计实例的程序,加加减减的,还找同学指点,最后弄好了,可就是调试不出想要的结果,怎么找都找不到原因,最后还是与同学一起讨论、查找,在他们的帮助和积极引导下,才找出问题,做出很大的修改解决了问题。还有就是画图和调试,真是一个很令人头疼的事情,要照顾好多方面的,需要细心才行。
在社会工程实践应用中,单片机开发系统的研制仍是一个热门话题,所以我想还是有必要再好好学习以下单片机的,这对我们以后的工作应是有好处的。总之,这次课程设计让我学会了很多,也收获了很多,我想我是满意的。从中我知道了任何事情都是从不懂到懂、从不熟练到熟练的过程,有问题并不可怕,关键是要找到方法去解决问题,思考、查资料、修改并勤于动手。最后,非常感谢在设计中给予过我帮助的老师和同学。
参考文献
[1] 余发山.单片机原理及应用技术.徐州:中国矿业大学出版社,2003
[2] 谭浩强.单片机课程设计. 北京:清华大学出版社,19
[3] 何立民.单片机应用技术大全.北京:北京航空航天大学出版社, 1994
[4] 杨凌霄,微型计算机原理及应用.江苏:中国矿业大学出版社,2004
[5] 张毅刚. 单片机原理及接口技术.哈尔滨:哈尔滨工业大学出版社,1990
[6] 李广弟.单片机基础.北京:北京航空航天大学出版社,1992
附1:源程序代码
TEMP_ZH DATA 24H ;实时温度值整合后存放单元
TEMPL DATA 25H
TEMPH DATA 26H
TEMP_TH DATA 27H ;高温报警值存放单元
TEMP_TL DATA 28H ;低温报警值存放单元
TEMPHH DATA 29H ;百位数bcd码存放单元
TEMPHL DATA 2AH ;十位数bcd码存放单元
TEMPLH DATA 2BH ;个位数bcd码存放单元
TEMPLL DATA 2CH ;小位数bcd码存放单元
SIGN EQU 20H.3 ;1=温度为负,0=温度为正
K1 EQU P1.4
K2 EQU P1.5
K3 EQU P1.6
K4 EQU P1.7
BEEP EQU P3.7
FLAG1 EQU 20H.0 ;DS18B20是否存在/1存在,0不存在
DQ EQU P3.4
;=====================================================
ORG 0000H
JMP MAIN
MAIN: MOV SP,#60H
MOV A,#00H
MOV R0,#20H ;将 20H-2FH 单元清零
MOV R1,#10H
CLEAR: MOV @R0,A
INC R0
DJNZ R1,CLEAR
LCALL THTL_DISP
MOV R1,#250
MMM1: LCALL DELAY
DJNZ R1,MMM1
START: CALL RESET ;18B20复位子程序
JNB FLAG1,START1 ;DS1820不存在
CALL READ_E2 ;从eerom拷贝TH\\TL到暂存器
JMP START2
START1: JMP $
START2: CLR BEEP
CALL RESET
JNB FLAG1,START1 ;DS1820不存在
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#44H ; 发出温度转换命令
CALL WRITE
CALL RESET
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#0BEH ; 发出读温度命令
CALL WRITE
CALL READ
CALL CONV_TEMP
CALL LED_DISP
CALL TEMP_COMP
CALL PROC_K2
JMP START2
;-----------------------------------------------------
;============================================
;检测是否有键按下
;============================================
PROC_K2: ; 按键K2处理
JB K2,PROC_END
CALL DELAY
JB K2,PROC_END
JNB K2,$
CALL BZ55_127
MOV 29H,#0BH ;H的bcd码送百位
MOV R4,TEMP_TH
LCALL THTL_BCD
LCALL THTL_DISP
CALL SET_ALARM
CALL RE_18B20 ;将设定的TH,TL值写入DS18B20内
CALL WRITE_E2
PROC_END:
RET
;-------------------------------------------------
;变不在 -55---127 内的 TH. TL 的为0
;------------------------------------------------
BZ55_127: MOV R1,#TEMP_TH
MOV R2,#2
BZ1: CLR C
MOV A,@R1
SUBB A,#0B7H
JC BZ2
MOV @R1,#00H
INC R1
DJNZ R2,BZ1
BZ2: RET
;============================================
;设定报警值 TH、TL
;============================================
SET_ALARM: NOP
AS_K1:
JB K1,AS0_K1
CALL DELAY
JB K1,AS0_K1
JNB K1,$
CPL 20H.1 ;UP/DOWN 标记
AS0_K1: JB 20H.1,UP_TH ;20H.1=1,UP
JMP DOWN_TH ;20H.1=0,DOWN
AS_K4: LCALL THTL_DISP
JB K4,AS_K1 ;确定调整 OK
CALL DELAY
JB K4,AS_K1
JNB K4,$
RET
UP_TH: JB K2,UP_TL ;TH值调整(增加)
CALL DELAY
JB K2,UP_TL
JNB K2,$
MOV A,TEMP_TH
ANL A,#80H
JNZ UP_TH1
INC TEMP_TH
MOV A,TEMP_TH
CJNE A,#128,TH_DISP ;TH大于127转零
MOV TEMP_TH,#0B7H
JMP TH_DISP
UP_TH1: DEC TEMP_TH
MOV A,TEMP_TH
CJNE A,#128,TH_DISP ;TH大于127转零
MOV TEMP_TH,#00H
TH_DISP: MOV 29H,#0BH ;H的bcd码送百位
MOV R4,TEMP_TH
LCALL THTL_BCD
LCALL THTL_DISP
JMP UP_TH
UP_TL : JB K3,AS_K4 ;TL值调整(增加)
CALL DELAY
JB K3,AS_K4
JNB K3,$
MOV A,TEMP_TL
ANL A,#80H
JNZ UP_TL01
INC TEMP_TL
MOV A,TEMP_TL
CJNE A,#128,TL_DISP ;TL大于127转零
MOV TEMP_TL,#0B7H
JMP TL_DISP
UP_TL01: DEC TEMP_TL
MOV A,TEMP_TL
CJNE A,#128,TL_DISP
MOV TEMP_TL,#00H
TL_DISP: MOV 29H,#0CH ;L的bcd码送百位
MOV R4,TEMP_TL
LCALL THTL_BCD
LCALL THTL_DISP
JMP UP_TL
DOWN_TH:
JB K2,ASJ02 ;TH值调整 (减少)
CALL DELAY
JB K2,ASJ02
JNB K2,$
MOV A,TEMP_TH ;TH为0,应变为-1
ANL A,#80H
JNZ DOWN_TH01
DEC TEMP_TH
MOV A,TEMP_TH
CJNE A,#0FFH,ASJ011
MOV A,#81H
MOV TEMP_TH,A
JMP ASJ011
DOWN_TH01: INC TEMP_TH
MOV A,TEMP_TH
CJNE A,#0B8H,ASJ011
MOV TEMP_TH,#127
ASJ011: MOV 29H,#0BH ;H的bcd码送百位
MOV R4,TEMP_TH
LCALL THTL_BCD
LCALL THTL_DISP
JMP DOWN_TH
ASJ02: JB K3,ASJ03 ;TL值调整(减少)
CALL DELAY
JB K3,ASJ03
JNB K3,$
MOV A,TEMP_TL
ANL A,#80H
JNZ ASJ022
DEC TEMP_TL
MOV A,TEMP_TL
CJNE A,#0FFH,ASJ021
MOV TEMP_TL,#81H
JMP ASJ021
ASJ022: INC TEMP_TL
MOV A,TEMP_TL
CJNE A,#0B8H,ASJ021
MOV TEMP_TL,#127
ASJ021: MOV 29H,#0CH ;L的bcd码送百位
MOV R4,TEMP_TL
LCALL THTL_BCD
LCALL THTL_DISP
JMP ASJ02
ASJ03: JMP AS_K4
RET
;============================================
;TH/TL分离bcd码
;============================================
THTL_BCD: CLR 20H.2
MOV A,R4 ;十六进制-> BCD
ANL A,#80H
JZ THTL_01
SETB 20H.2
MOV 2AH,#0AH ;负号的bcd码
MOV A,R4
ANL A,#7FH
MOV B,#10
JMP THTL_02
THTL_01: MOV A,R4
MOV B,#100
DIV AB
MOV 2AH,A ;百位数的bcd码
MOV A,#10
XCH A,B
THTL_02: DIV AB
MOV 2BH,A ;TEMPLH = 十位数 BCD
MOV 2CH,B ;TEMPLL = 个位数 BCD
RET
;=======================================================
;将设定的TH,TL值写入DS18B20内
;=======================================================
RE_18B20:
JB FLAG1,RE_18B20A
RET
RE_18B20A:
CALL RESET
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#4EH ;写暂存寄存器
LCALL WRITE
MOV A,TEMP_TH ;TH(报警上限)
LCALL WRITE
MOV A,TEMP_TL ;TL(报警下限)
LCALL WRITE
MOV A,#7FH ;12位精确度
LCALL WRITE
RET
;------------------------------------------------------------
WRITE_E2:
CALL RESET
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#48H ;把暂存器里的温度报警值拷贝到EEROM
LCALL WRITE
RET
;--------------------------------------------------------------
READ_E2:
CALL RESET
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器
CALL WRITE
RET
;====================================================
;实际温度值与报警温度比较
;====================================================
TEMP_COMP:
JB SIGN,ARM2
MOV A,TEMP_TH
ANL A,#80H
JNZ CHULI
CLR C
MOV A,TEMP_ZH
SUBB A,TEMP_TH
JNC CHULI
MOV A,TEMP_TL
ANL A,#80H
JNZ ARM1
MOV A,TEMP_ZH
CLR C
SUBB A,TEMP_TL
JC CHULI
CLR BEEP
ARM1: RET
ARM2: MOV A,TEMP_TH
ANL A,#80H
JZ ARM21
CLR C
MOV A,TEMP_TH
ANL A,#7FH
MOV R5,TEMP_ZH
XCH A,R5
SUBB A,TEMP_TH
JC CHULI ;温度大于TH,则跳转闪烁
ARM21: MOV A,TEMP_TL
ANL A,#80H
JNZ CHULI
MOV A,TEMP_TL
ANL A,#7FH
CLR C
MOV R5,TEMP_ZH
XCH A,R5
SUBB A,R5
JNC CHULI ;温度小于TL,则跳转闪烁
CLR BEEP
RET
CHULI: LCALL BEEP_BL
CLR BEEP
RET
;====================================================
;DS18B20复位初始化程序 (已修改)
;====================================================
RESET:
SETB DQ
NOP
CLR DQ
MOV R1,#03
TSR1: MOV R0,#80
DJNZ R0,$ ;延时
DJNZ R1,TSR1
SETB DQ ;然后拉高数据线
NOP
MOV R0,#15 ;96微秒
TSR2: JNB DQ,TSR3
DJNZ R0,TSR2
JMP TSR4 ;延时
TSR3: SETB FLAG1 ;置标志位,表示DS18B20存在
LJMP TSR5
TSR4: CLR FLAG1 ;清标志位,表示DS18B20不存在
JMP TSR7
TSR5: MOV R0,#115 ;200微秒
DJNZ R0,$ ;延时
TSR7: SETB DQ
RET
;==============================================================
;WRITE程序,从P3.3端口写一个字节 (已修改)
;==============================================================
WRITE: MOV R2,#8 ;一共8位数据
CLR C
WR1:
CLR DQ ;开始写入DS18B20总线要处于复位(低)状态
MOV R3,#07
DJNZ R3,$ ;总线复位保持16微妙以上
RRC A ;把一个字节DATA 分成8个BIT环移给C
MOV DQ,C ;写入一个BIT
MOV R3,#3CH
DJNZ R3,$ ;等待100微妙
SETB DQ ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一个BIT
SETB DQ
RET
;==============================================================
;READ程序,从18B20中读出温度低位、高位、TH、TL (已修改)
;==============================================================
READ: MOV R4,#4 ;将温度低位、高位、TH、TL从DS18B20中读出
MOV R1,#TEMPL ;存入25H、26H、27H、28H
RE00: MOV R2,#8
RE01: CLR CY
SETB DQ
NOP
NOP
CLR DQ ;读前总线保持为低
NOP
NOP
NOP
SETB DQ ;开始读总线释放
MOV R3,#09 ;延时18微妙
DJNZ R3,$
MOV C,DQ ;从DS18B20总线读得一个BIT
MOV R3,#3CH
DJNZ R3,$ ;等待100微妙
RRC A ;把读得的位值环移给A
DJNZ R2,RE01 ;读下一个BIT
MOV @R1,A
INC R1
DJNZ R4,RE00
RET
;*****************************************************
; 处理温度 BCD 码子程序 (已修改)
;***************************************F*************
CONV_TEMP: CLR SIGN ;符号标志位清零
MOV A,TEMPH ;判温度是否零下
ANL A,#80H
JZ TEMPC1 ;温度零上转TEMPC1
SETB SIGN ;小于零,符号标志位置1
CLR C
MOV A,TEMPL ;零下,二进制数求补(双字节)
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
TEMPC1: MOV A,TEMPL
ANL A,#0FH ;小数位,精确到0.1
MOV DPTR,#TAB0
MOVC A,@A+DPTR
MOV TEMPLL,A ;TEMPLL=小数部分 BCD
MOV A,TEMPL ;整数部分
ANL A,#0F0H ;取出高四位
SWAP A
MOV TEMPL,A
MOV A,TEMPH ;取出低四位
ANL A,#0FH
SWAP A
ORL A,TEMPL ;重新组合
MOV TEMP_ZH,A
MOV B,#100 ;十六进制-> BCD
DIV AB ;B= A % 100
MOV TEMPHH,A ;TEMPHH = 百位数
TEMPC3: MOV A,#10
XCH A,B
DIV AB ;B = A % B
MOV TEMPHL,A ;TEMPHL = 十位数 BCD
MOV TEMPLH,B ;TEMPLH = 个位数 BCD
RET
;==========================================================
; LED 显示子程序 (已修改)
;==========================================================
LED_DISP: LCALL LED_BCD
MOV R0,#0FEH
MOV R1,#29H ;待输出数据,百位
MOV R2,#02H ;连续输出百位和十位
MOV DPTR,#TAB2
LED_DISP0: MOV P2,#0FFH
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
MOV A,R0
MOV P2,A
RL A
MOV R0,A
LCALL DELAY ;延时5mS
INC R1
DJNZ R2,LED_DISP0
MOV P2,#0FFH
MOV DPTR,#TAB1 ;输出个位
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
CLR P2.2
LCALL DELAY ;延时5mS
SETB P2.2
INC R1 ;输出小数部分
MOV A,@R1
MOV DPTR,#TAB2
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
LCALL DELAY ;延时5mS
SETB P2.3
RET
;==========================================================
;TH TL的显示
;==========================================================
THTL_DISP:
MOV R0,#0FEH
MOV R1,#29H ;待输出数据
MOV R2,#04H ;
MOV DPTR,#TAB2
THTL_DISP0: MOV P2,#0FFH
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
MOV A,R0
MOV P2,A
RL A
MOV R0,A
LCALL DELAY ;延时5mS
INC R1
DJNZ R2,THTL_DISP0
RET
;-------------------------------------------------------------
; 个位部分码表(共阴极)
;-------------------------------------------------------------
TAB1: DB 0FDH 61H 0DBH 0F3H 67H
DB 0B7H 0BFH 0E1H 0FFH 0F7H
TAB0: DB 00H 01H 01H 02H 03H 03H 04H 04H
DB 05H 06H 06H 07H 08H 08H 09H 09H
;-------------------------------------------------------------
;小数、十位、百位、符号等码表(共阴极)
;-------------------------------------------------------------
TAB2: DB 0FCH 60H 0DAH 0F2H 66H 0B6H 0BEH
DB 0E0H 0FEH 0F6H 02H 6EH 1CH 00H
; ( - H L 熄灭)
; ( 0A 0B 0C 0D )
;-----------------------------------------------------------------
; 符号的显示位置调整程序 (已修改)
;-----------------------------------------------------------------
LED_BCD: MOV A,TEMPHH
JZ LED_BCD1 ;百位为零,转移
RET ;百位不为零,返回
LED_BCD1: MOV A,TEMPHL
JZ LED_BCD3 ;十位为零,转移
JB SIGN,LED_BCD2 ;温度零下,转移
MOV TEMPHH,#0DH ;温度大于零且为两位数,百位熄灭
SJMP LED_BCD5
LED_BCD2: MOV TEMPHH,#0AH ;温度小于零且为两位数,百位显示负号
SJMP LED_BCD5
LED_BCD3: MOV TEMPHH,#0DH ;温度小于10,百位熄灭
JB SIGN,LED_BCD4 ;温度零下,转移
MOV TEMPHL,#0DH ;温度大于零且小于10 ,十位熄灭
SJMP LED_BCD5
LED_BCD4: MOV TEMPHL,#0AH ;温度小于零且为一位数,十位显负号
LED_BCD5: RET
;----------------------------------------------------------------
BEEP_BL:
MOV R6,#20
BL2: CALL DEX1
CPL BEEP
DJNZ R6,BL2
RET
DEX1: MOV R7,#180
DE2: NOP
DJNZ R7,DE2
RET
;----------------------------------------------------------------
DELAY: ;延时5MS
MOV R6,#10
DL2: MOV R7,#100
DJNZ R7,$
DJNZ R6,DL2
RET
;================================================
END
附2:系统原理图
