基于单片机的测温系统

更新时间:2024-07-02 16:42:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于单片机的测温系统

摘要:随着时代的进步和发展,人们生活水平的不断提高,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术, 单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本文将介绍一种基于单片机控制的测温系统,本测温系统与传统的测温系统相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89C51,测温传感器使用DS18B20,采用共阴极LED数码管以串口传送数据,实现温度显示。 可以设置报警温度,当温度超过报警温度时,可以报警。 目录

1 设计要求 ………………………………………………………………………2 2 总体设计方案 …………………………………………………………………2

2.1 测温系统设计方案论证?????????????????????????2 2.1.1 方案一???????????????????????????????2 2.1.2 方案二???????????????????????????????2 2.2 方案二的总体设计框图?????????????????????????2

3 元器件的介绍和选定 …………………………………………………………3

3.1 主控制器(AT89C51) ??????????????????????????3 3.2 数码管????????????????????????????????3 3.3 温度传感器??????????????????????????????4

4 系统整体硬件电路 ……………………………………………………………7

4.1 主板电路???????????????????????????????7 4.2 报警电路???????????????????????????????7 4.3 键盘电路???????????????????????????????7 4.4 显示电路???????????????????????????????8 4.5 DS18B20温度传感器与单片机的接口电路?????????????????9

5 系统软件流程图………………………………………………………………10

5.1 主程序流程图??????????????????????????????10 5.2 采集温度子程序流程图??????????????????????????11 5.2.1 DS18B20初始化子程序流程图??????????????????????11 5.2.2 DS18B20写入和读取子程序流程图????????????????????12

5.3 显示数据刷新子程序流程图????????????????????????14 5.4 键盘扫描子程序流程图??????????????????????????14

6总结与体会 ………………………………………………………………………16 参考文献……………………………………………………………………………16 附录1 ………………………………………………………………………………17 附录2 ………………………………………………………………………………18

1 设计要求

■基本范围0℃-110℃ ■精度误差小于0.5℃ ■LED数码直读显示

■可以任意设定温度的上限报警功能

2 总体设计方案

2.1测温系统设计方案论证 2.1.1方案一

由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。

2.1.2 方案二

进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。

2.2方案二的总体设计框图

温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89C51,温度传感器采用DS18B20,用LED数码管以串口传送数据实现温度显示。

LED

单片机复位 主 报警点按键调显 示 控2 制 温 器度 时钟振荡 传

图1 总体设计方框图

3 元器件选定

3.1 主控制器(AT89C51)

AT89C51是一个低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的Flash只读程序存储器和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的AT89C51提供了高性价比的解决方案。

AT89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。

AT89C51具有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。 主要功能特性:

· 兼容MCS—51指令系统 · 32个双向I/O口

· 两个16位可编程定时/计数器 · 1个串行中断 · 两个外部中断源 · 可直接驱动LED · 低功耗空闲和掉电模式

· 4k可反复擦写(>1000次)Flash ROM · 可编程UARL通道 · 全静态操作0-24MHz · 128x8bit内部RAM · 共6个中断源 · 3级加密位

· 软件设置睡眠和唤醒功能

3.2 数码管

1) 显示电路采用共阴极LED数码管,从P1口输出段码。LED数码管的结构

LED数码管是由发光二极管构成的,亦称半导体数码管. 将条状发光二极管按照共阴极(负极)或共阳极(正极)的方法连接,组成\字,再把发光二极管另一电极作笔段电极,就构成了LED数码管.若按规定使某些笔段上的发光二极管就能显示从0~9的一系列数字。同荧光数码管、辉光数码管(NRT)相比它具有:体积小、功耗低、耐震动、寿命长、亮度高、单色性好、发光响应的时间短,能与TTL,CMOS电路兼容等的数显器件。 2) LED数码管的管脚排列

本次设计采用共阴极的LED数码管,其管脚排列如图2所示。

3

图2 共阴极数码管及其管脚排列

3.3温度传感器

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下:

●独特的单线接口仅需要一个端口引脚进行通信;

●多个DS18B20可以并联在惟一的三线上,实现多点组网功能; ●无须外部器件;

●可通过数据线供电,电压范围为3.0~5.5V; ●零待机功耗;

●温度以9或12位数字; ●用户可定义报警设置;

●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;

●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图3所示。 存储器与控制逻辑 I/O 64 温度传感器 位 ROM 高温触发器TH 和 高C 单 速低温触发器TL 线 缓接 存 口 配置寄存器 Vdd 8位CRC发生器

图3 DS18B20内部结构

64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入户报警上下限。

DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图4所示。头2个字节包含测得的温度信息,

4

第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图4所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。 温度 LSB 温度 MSB TH用户字节1 TL用户字节2 配置寄存器 保留 保留 保留

..CRC TMR1R0.11111.

图4 DS18B20字节定义

由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。

高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。

当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。

当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。

.表1 DS18B20温度转换时间表 ..R1R000011011分辨率/位温度最大转向时间/ms910111293.75187.5375750.

DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。

在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。

DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,

5

计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。

表2 一部分温度对应值表 温度/℃ +125 +85 +25.0625 +10.125 +0.5 0 -0.5 -10.125 -25.0625 -55 二进制表示 0000 0111 1101 0000 0000 0101 0101 0000 0000 0001 1001 0000 0000 0000 1010 0001 0000 0000 0000 0010 0000 0000 0000 1000 1111 1111 1111 0000 1111 1111 0101 1110 1111 1110 0110 1111 1111 1100 1001 0000 十六进制表示 07D0H 0550H 0191H 00A2H 0008H 0000H FFF8H FF5EH FE6FH FC90H 另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。

DS18B20的使用方法

由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。 由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。 DS18B20的复位时序

DS18B20的读时序

对于DS18B20的读时序分为读0时序和读1时序两个过程。 对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。

6

DS18B20的写时序

对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。

对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。

4 系统整体硬件电路

4.1 主板电路

系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上限报警调整电路,单片机主板电路等,如图5 所示。

图5 中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。

4.2 报警电路

图5中蜂鸣器可以在被测温度超过报警温度时,发出报警鸣叫声音,同时LED数码管将显示错误信息8888,这时可以调整报警温度,从而测出被测的温度值。

4.3 键盘电路

图5中有三个独立式按键可以分别调整系统的上限报警设置,按键S4是确认键,是设置报警温度的输入和退出键。按键S2和S3分别为“加1”和“减1”键,可调节报警温度

7

图5 单片机主板电路

4.4显示电路

显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用p1口的P1.0和P1.1,四只数码管采用74LS164右移寄存器驱动,显示比较清晰。

图6 温度显示电路

8

4.5 DS18B20温度传感器与单片机的接口电路

DS18B20可以采用两种方式供电,一种是寄生电源供电方式,如图7 所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。

当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。采用寄生电源供电方式时VDD端接地。由于单线制只有一根线,因此发送接口必须是三态的。另一种是采用电源供电方式,如图8此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。本设计就采用这种方式.

.VCCDS18B20DS18B20DS18B20单VCC片4.7K机GNDGNDGND.图7 DS18B20与单片机的接口电路

图8 DS18B20与单片机的接口电路

9

..

5系统软件流程图

系统软件流程图主要包括以下几个流程图:

5.1主程序流程图

主程序的主要功能是初始化并调用相关模块,完成相应的处理,其程序流程见下图所示。

主程序流程图 开始 初始化 调用温度采集模块 调用温度整数小数分离处理模块 调用温度计算成BCD码模块 调用温度转换输出类型模块 调用键盘扫描模块 调用报警模块 调用温度输出数码管模块

10

5.2采集温度子程序流程图

采集温度流程图 开始 发DS18B20初始化命令 发跳过ROM命令(0CCH) 发温度转换命令(44H) 再次初始化DS18B20 发跳过ROM命令(0CCH) 发读温度暂存器命令(0BEH) 结束

5.2.1 DS18B20初始化子程序流程图

11

DS18B20初始化程序流程图 开始 CLR总线,向DS18B20发出RESET脉冲 等待480US以上 SETB总线,等待15~60US N 总线变低? Y 置FLAG标志并延时200US 清除FLAG标志 返回

5.2.2 DS18B20写入和读取子程序流程图

12

DS18B20写入子程序 开始 DS18B20初始化 写入CCH,SKIP,ROM 写入44H,发转化命令 CLR总线,准备发送 延时15US 写入1位数据 延时15到45US SETB 总线,完成1位写N 8位写入了? Y 返回 DS18B20读取子程序 开始 DS18B20初始化 写入CCH,SKIP,ROM 写入BEH,发转化命令 SETB 总线 延时1US以上 CLR 总线,准备发送 延时1US以上 SETB DQ释放总线 读取1位数据 延时15~45US N 8位读完了? Y 返回 13

5.3 显示数据刷新子程序流程图

显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图11。

显示数据刷新流程图 开始 温度数据移入显示寄存器 Y 正数? N N 百位数0? Y N 十位数0? Y 十位数显示符号百位数不显示 百位数显示符号 结束 5.4 键盘扫描子程序流程图

14

开始 N ENTET键是否按下? Y Y ENTER-FLAG1? N Y 是否有ENTER键按下? N 为ENTER子程序FLAG=1 Y 是否有JIA键按下? N JIA子程序 是否有JIAN键按下? N 显示 Y JIAN子程序 退出子程序,返回主程序 15

6总结与体会

这次基于单片机的测温系统的设计,基本达到设计要求,在高兴之余也有了些体会。

在本次设计的过程中,我发现很多的问题和困难,但经过自己的不断努力和尝试并在老师的指导帮助下,基本完成了设计要求。虽然以前也做过相关的设计,但这次设计真的让我长进了很多,我们只有试着去做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。

从这次的设计中,我意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次设计中的最大收获。

附录1

16

附录2

17

ORG 0000H AJMP MAIN ORG 0030H

MAIN:MOV SP,#60H SETB P2.4 MOV 30H,#0 MOV 31H,#0 MOV 32H,#0

MAIN1:LCALL GET_TEMP ;采集温度

LCALL SEPERATE ;对采集后的温度数据进行处理 LCALL ZHUANHUAN ;二进制数转换为BCD的形式 LCALL QINGLING ;转换为满足输出的类型 LCALL JIANTIAO ;扫描键盘模块 LCALL BAOJING ;报警设置模块

LCALL SHUCHU ;显示数据到数码管 SJMP MAIN1

;******************************************************************* GET_TEMP:

CLR EA ;使用DS18B20一定要禁止任何中断产生 LCALL INT ;调用初使化子程序 MOV A,#0CCH ;

LCALL WRITE ;送入跳过ROM命令 MOV A,#44H

LCALL WRITE ;送入温度转换命令

LCALL INT ;温度转换完全,再次初使化DS18B20 MOV A,#0CCH

LCALL WRITE ;送入跳过ROM命令 MOV A,#0BEH

LCALL WRITE ;送入读温度暂存器命令 LCALL READ

MOV R7,A ;读出温度值低字节存入R7 LCALL READ

MOV R6,A ;读出温度值高字节存入R6 SETB EA RET

;****************************************************************** INT: ;初始化DS18B20子程序 CLR EA

L0:CLR P2.1 ;复位 MOV R2,#149

L1:DJNZ R2,L1 ;596US

SETB P2.1 ;释放DS18B20总线 MOV R2,#15 ;4US

18

L2:DJNZ R2,L2 ;60US

CLR C ;2US,清DS18B20存在信号 MOV C,P2.1 ;取DS18B20存在信号

JC L0 ;判断DS18B20存在吗?不存在则重新来 MOV R2,#125 ;存在则拉高 SETB P2.1

L3:DJNZ R2,L3 ;共500US RET

;****************************************************************** WRITE:

MOV R1,#08H ;设置写位个数 WLOP:RRC A ;把写的位放到C ACALL WRBIT ;调写1位子程序 DJNZ R1,WLOP ;8位全写完? RET WRBIT:

MOV R2,#14 ;设置时间常数 CLR P2.1 ;写开始 NOP ;2US

MOV P2.1,C ;C内容存到总线 WDLT:DJNZ R2,WDLT ;56US

SETB P2.1 ;释放总线 RET

;******************************************************************* READ:

MOV R1,#8H ;设置读位数 RLOP:ACALL RDBIT ;调读1位子程序

RRC A ;把读到的位在C中的依次送给A DJNZ R1,RLOP ;8位读完? RET RDBIT:

MOV R2,#13 ;设置时间常数 CLR P2.1

NOP ;2US

SETB P2.1 ;释放总线 NOP ;2US

MOV C,P2.1 ;把总线上的内容读到C RDDLT: DJNZ R2,RDDLT ;等待52US SETB P2.1 RET

;***************************************************************** ;程序名称:SEPERATE

;功能:处理采集后的的数据,把小数部分分开,R6放整数R7放小数,F0放符号位

19

;入口参数: R6,R7 ;出口参数: R6 R7 F0

;***************************************************************** SEPERATE:

MOV A,R6 MOV C,ACC.7

MOV F0,C ;符号位 JC SEPERATE1 SJMP SEPERATE2 SEPERATE1:MOV A,R6 CPL A MOV R6,A MOV A,R7 CPL A CLR C INC A MOV R7,A MOV A,R6 ADDC A,#00H MOV R6,A

SEPERATE2:MOV 40H,R7

ANL 40H,#0FH ;小数部分 MOV R0,#12 ;移12次 SEPERATE3:MOV A,R6 RRC A MOV R6,A MOV A,R7 RRC A MOV R7,A MOV A,41H RRC A

MOV 41H,A ;整数部分 DJNZ R0,SEPERATE3

MOV R6,41H ;存整数部分 MOV R7,40H ;存小数部分 RET

;***************************************************************** ;程序名称:ZHUANHUAN

;功能:将R6R7中的二进制数转换为BCD的形式 ;入口参数:R6R7 ;出口参数:R4R5R6R7

;***************************************************************** ZHUANHUAN:

20

MOV A,R6 ;开始处理整数部分 MOV B,#100 DIV AB

MOV R4,A ;存百位 MOV A,B MOV B,#10 DIV AB

MOV R5,A ;存十位 MOV R6,B ;存个位

MOV A,R7 ;开始处理小数部分地 MOV B,#5 MUL AB MOV B,#10 DIV AB

MOV 40H,A ;存进位 MOV A,R7 MOV B,#2 MUL AB ADD A,40H MOV B,#10 DIV AB

MOV 40H,A ;存进位 MOV A,R7 MOV B,#6 MUL AB ADD A,40H MOV B,#10 DIV AB

MOV R7,A ;暂存小数最高位 MOV A,B CLR C

SUBB A,#5

JC ZHUANHUAN1 INC R7 ZHUANHUAN1:RET

;************************************************************ ;程序名称:JIANTIAO ;功能:扫描键盘 ;入口参数:R5R6R7

;出口参数:30H,31H,32H

;************************************************************ JIANTIAO:

JB P1.7,QUIT ; 如果有Enter键入,则开始键盘输入

21

LCALL DELAY JB P1.7,QUIT

CLR 21H.1 ; 每次进来都赋值输入标志,设置为0 MOV 30H, R5 ;以当前所测温度为基准,进行加减 MOV 31H, R6 MOV 32H, R7 LOOP:

JB 21H.1,QUIT ;如果输入完成,20H.1则为1,退出键盘程序

JB P1.7,JIA LCALL DIFINE JIA: JB P1.5,JIAN LCALL JIAYI

JIAN: JB P1.6,XIANSHI LCALL JIANYI

XIANSHI:LCALL QINGLING LCALL SHUCHU SJMP LOOP QUIT:RET

;********************************************************** ;程序名称:DIFINE

;功能:确认键盘输入和退出键盘输入 ;入口参数:ENTER_FLAG ;出口参数:ENTER_FLAG

;********************************************************** DIFINE:

LCALL DELAY

JB P1.7,LOOP ;按键抖动处理 SETB 21H.1

LCALL DELAY RET

;***************************************************************** ;程序名称:JIAYI ;功能:数值上调处理

;入口参数: 30H,31H,32H ;出口参数:R5R6R7

;***************************************************************** JIAYI:

LCALL DELAY JB P1.5,LOOP

INC 32H ;小数位加1 MOV A,32H

CJNE A,#0AH,JIANEXT ;小数位增加到10,回0

22

MOV 32H,#00H

INC 31H ;个位进1 MOV A,31H

CJNE A,#0AH,JIANEXT MOV 31H,#00H

INC 30H ;十位进1 MOV A,30H

CJNE A,#0AH,JIANEXT ;十位超过99.9,溢出了 MOV R0,#200

CUOWU1:LCALL CUOWU ;出错,显示8888 DJNZ R0,CUOWU1

DEC 30H ;退回99.9 MOV 31H,#09H MOV 32H,#09H JIANEXT:

MOV R5,30H MOV R6,31H MOV R7,32H LCALL DELAY RET

;***************************************************************** ;程序名称:JIANYI ;功能:数值下调处理

;入口参数: 30H,31H,32H ;出口参数:R5R6R7

;***************************************************************** JIANYI:

LCALL DELAY

JB P1.6,LOOP ;按键抖动处理 DEC 32H ;小数位减一 MOV A,32H

CJNE A,#0FFH,JIANNEXT ;小数位减到0,回到9

MOV 32H,#09H

DEC 31H ;个位减一 MOV A,31H

CJNE A,#0FFH,JIANNEXT ;个位减到0,回到9 MOV 31H,#09H

DEC 30H ;十位减一 MOV A,30H

CJNE A,#0FFH,JIANNEXT ;十位低于0,溢出了 MOV R0,#200

CUOWU2:LCALL CUOWU ;出错,显示8888

23

DJNZ R0,CUOWU2 INC 30H

MOV 31H,#00H ;退回00.0 MOV 32H,#00H JIANNEXT:

MOV R5,30H MOV R6,31H MOV R7,32H LCALL DELAY RET

DELAY: MOV R0,#250 ;延时程序 LOOP1: MOV R1,#100 DJNZ R1,$ DJNZ R0,LOOP1 RET

;***************************************************************** ;程序名称:BAOJING ;功能:报警控制 ;入口参数: ;出口参数:

;***************************************************************** BAOJING:

MOV A,30H ;三个Buffer都是0的话,说明还没有输入数值,直接退出

JNZ BIJIAO MOV A,31H JNZ BIJIAO MOV A,32H JZ SQUIT BIJIAO:

MOV A,30H

CLR C ;置C为0 SUBB A,R5

JNZ GUODU ;十位不等转移 MOV A,31H SUBB A,R6

JNZ GUODU ;个位不等转移 MOV A,32H SUBB A,R7

JNZ GUODU ;小数位不等转移 RET GUODU:CLR P2.4

JC MINGJIAO ;当前所测温度大于设置的温度,则鸣叫

24

RET

MINGJIAO:LCALL CUOWU LJMP JIANTIAO SQUIT:RET

;***************************************************************** ;程序名称:CUOWU

;功能:程序出错处理,显示四个8,即8888 ;入口参数:无

;出口参数:R4R5R6R7

;***************************************************************** CUOWU: SETB P2.4 MOV R4,#08H MOV R5,#08H MOV R6,#08H MOV R7,#08H LCALL QINGLING LCALL SHUCHU RET

;***************************************************************** ;程序名称:QINGLING

;功能:将R4R5R6R7转换为满足输出的类型 ;输入参数:R4R5R6R7 ;输出参数:R4R5R6R7

;***************************************************************** QINGLING:

MOV DPTR,#TABLE ;指向表首 MOV A,R4 ;转换为表格中的数据 MOVC A,@A+DPTR MOV 35H,A MOV A,R5

MOVC A,@A+DPTR MOV 36H,A MOV A,R6

MOVC A,@A+DPTR MOV 37H,A MOV A,R7

MOVC A,@A+DPTR MOV 38H,A

INC 37H ;小数点 MOV A,35H

CJNE A,#0FCH,ANDY2 ;高位清零 MOV 35H,#00H MOV A,36H

25

CJNE A,#0FCH,ANDY2 MOV 36H,#00H

ANDY2: JB F0,ANDY3 ;判断是否为负数加符号 SJMP ANDY ;如果为正数则不加符号 ANDY3: MOV A,35H

CJNE A,#00H,ANDY ;最高位是否为零 MOV A,36H

CJNE A,#00H,IVERSON ;中位是否为零

MOV 36H,#02H ;R5用来显示符号 SJMP ANDY

IVERSON: MOV 35H,#02H ;R4用来显示符号 ANDY: RET

TABLE:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H

;***************************************************************** ;程序名称:SHUCHU

;功能:显示数据到数码管中。 ;入口参数:R4R5R6R7 ;出口参数:无

;***************************************************************** SHUCHU:

MOV R4,35H MOV R5,36H MOV R6,37H MOV R7,38H

MOV R0,#07H ;分别对应四个字

LOOP2:MOV R1,#08H ;每个字八位 MOV A,@R0 LOOP3: RRC A CLR P1.1 MOV P1.0,C SETB P1.1

DJNZ R1,LOOP3 DEC R0

CJNE R0,#03H,LOOP2 RET

;********************************************************* END

26

CJNE A,#0FCH,ANDY2 MOV 36H,#00H

ANDY2: JB F0,ANDY3 ;判断是否为负数加符号 SJMP ANDY ;如果为正数则不加符号 ANDY3: MOV A,35H

CJNE A,#00H,ANDY ;最高位是否为零 MOV A,36H

CJNE A,#00H,IVERSON ;中位是否为零

MOV 36H,#02H ;R5用来显示符号 SJMP ANDY

IVERSON: MOV 35H,#02H ;R4用来显示符号 ANDY: RET

TABLE:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H

;***************************************************************** ;程序名称:SHUCHU

;功能:显示数据到数码管中。 ;入口参数:R4R5R6R7 ;出口参数:无

;***************************************************************** SHUCHU:

MOV R4,35H MOV R5,36H MOV R6,37H MOV R7,38H

MOV R0,#07H ;分别对应四个字

LOOP2:MOV R1,#08H ;每个字八位 MOV A,@R0 LOOP3: RRC A CLR P1.1 MOV P1.0,C SETB P1.1

DJNZ R1,LOOP3 DEC R0

CJNE R0,#03H,LOOP2 RET

;********************************************************* END

26

本文来源:https://www.bwwdw.com/article/b00.html

Top