最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

数字温度计--单片机课程设计

来源:动视网 责编:小OO 时间:2025-10-02 07:31:48
文档

数字温度计--单片机课程设计

河南理工大学电子设计综合训练报告数字温度计姓名:-----------------------------学号:310708010323/26专业班级:电气07-3班指导老师:杨凌霄所在学院:电气工程与自动化学院2010年6月9日摘要本设计是对一个数字温度计功能的实现,其主要功能是:1)基本范围-50℃~110℃,2)精度误差小于0.5℃,3)LED数码直读显示,4)扩展功能,5)可以任意设定温度的上下限报警功能。本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,
推荐度:
导读河南理工大学电子设计综合训练报告数字温度计姓名:-----------------------------学号:310708010323/26专业班级:电气07-3班指导老师:杨凌霄所在学院:电气工程与自动化学院2010年6月9日摘要本设计是对一个数字温度计功能的实现,其主要功能是:1)基本范围-50℃~110℃,2)精度误差小于0.5℃,3)LED数码直读显示,4)扩展功能,5)可以任意设定温度的上下限报警功能。本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,
河南理工大学

电子设计综合训练报告

数字温度计

姓    名: -----------------------------

学    号:  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 一部分温度对应值表

温度/℃

二进制表示十六进制表示
+1250000 0111    1101 000007D0H
+850000 0101    0101 00000550H
+25.06250000 0001    1001 00000191H
+10.1250000 0000    1010 000100A2H

+0.50000 0000    0000 00100008H
00000 0000    0000 10000000H
-0.51111 1111    1111 0000FFF8H
-10.1251111 1111    0101 1110FF5EH
-25.06251111 1110    0110 1111FE6FH
-551111 1100    1001 0000FC90H
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。

ROM操作命令

指令说明
读ROM命令(33H)

读18B20的序行号

搜索ROM命令(F0H)

识别总线上各器件的编码
匹配ROM命令(55H)

用于多个DS18B20的定位

跳过ROM命令(CCH)

此命令执行后,存储器操作将针对总线上的所有操作
报警搜索ROM命令(ECH)

仅温度超限的器件对此命令做出响应
RAM操作命令

指令说明
温度转换(44H)

启动温度转换
读暂存器(BEH)

读全部暂存器内容,包括CRC字节

写暂存器(4EH)

写暂存器第2,3和4个字节的数据

复制暂存器(48EH)

将暂存器中的TH,TL和配置寄存器内容复制到EEPROM中

读EEPROM(B8H)

将TH,TL和配置寄存器内容从EEPROM中回读至暂存器

DS18B20的通信协议:

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:系统原理图

文档

数字温度计--单片机课程设计

河南理工大学电子设计综合训练报告数字温度计姓名:-----------------------------学号:310708010323/26专业班级:电气07-3班指导老师:杨凌霄所在学院:电气工程与自动化学院2010年6月9日摘要本设计是对一个数字温度计功能的实现,其主要功能是:1)基本范围-50℃~110℃,2)精度误差小于0.5℃,3)LED数码直读显示,4)扩展功能,5)可以任意设定温度的上下限报警功能。本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top