您现在的位置:首页 > >

(毕业设计)基于89C51和DS18B20的数字温度计设计

发布时间:

一 、设计要求
数字式温度计要求测温范围为-55~125°C,精度误差在 0.1°C,采用 AT89C51 单片机和 DS18B20 温度传感器,设定温度报警的最低值和最高值。采 用点阵 字符型液晶模块作为数字温度计的显示器,分两行显示,第一行显示 DS18B20 工作状态,第二行显示实测温度值和状态符号,>H 表示实测温度大于 温度报警范围,<L 表示实测温度小于设置温度报警范围, !表示实测温度在正常 范围内,当实测温度超过设定温度限制范围是,发出声光警报信号。

二 、方案论证
根据系统的设计要求,选择 DS18B20 作为本系统的温度传感器,选择单片 机 AT89C51 为测控系统的核心来完成数据采集、处理、显示、报警等功能。选 用数字温度传感器 DS18B20,省却了采样/保持电路、运放、数/模转换电路以及 进行长距离传输时的串/并转换电路,简化了电路,缩短了系统的工作时间,降 低了系统的硬件成本。 该系统的总体设计思路如下:温度传感器 DS18B20 把所测得的温度发送到 AT89C51 单片机上,经过 51 单片机处理,将把温度在显示电路上显示,本系统 显示器用点阵液晶模块 LCD1602 实现显示。检测范围-55 摄氏度到 125 摄氏度。 按照系统设计功能的要求,确定系统由 3 个模块组成:主控制器、测温电路 和显示电路。 数字温度计总体电路结构框图如图 1 所示。

温度传感器 DS18B20

AT89C51 主 控 制 器

显示电路

扫描驱动

图1

数字温度计总体电路结构框图

三 、系统硬件电路的设计
温度计电路设计原理图如图 2 所示,控制器使用单片机 AT89C51,温度传 感器使用 DS18B20,用 4 位共阳 LED 数码管实现温度显示。
LCD1
LM016L

VD D

VS S

VE E

R W

R S

1

2

3

4

5

6

U1
19 22p

X1

XTAL1

P0.0/AD0 P0.1/AD1

39 38 37

7

D 0

E

图2
1、主控制器

数字温度计设计电路原理图

AT89C51 是一种带 4K 字节闪烁可编程可擦除只读存储器的低电压, 高性能 CMOS8 位微处理器。该器件采用 ATMEL 高密度非易失存储器制造技术制造, 与工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪 烁存储器组合在单个芯片中,ATMEL 的 AT89C51 是一种高效微控制器,为很多 嵌入式控制系统提供了一种灵活性高且价廉的方案。 2、显示电路 、 显示电路采用点阵液晶显示器 LCD1602 能够同时显示 16x02 即 32 个字符,实
行双行显示。

3、温度传感器工作原理 、 DS18B20 温度传感器是美国 DALLAS 半导体公司最新推出的一种改进型智 能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并 且可根据实际要求通过简单的编程实现 9~12 位的数字值读数方式。 DS18b20 内部主要有三个数字部件:64 位激光 ROM、温度传感器、非易失 性温度报警触发器 TH 和 TL。 DS18B20 的性能特点如下: ●独特的单线接口方式仅需要一个端口引脚进行通信; ●多个 DS18B20 可以并联在唯一的三线上,实现多点组网功能; ●无需外部器件; ●可通过数据线供电,电压范围:3.0~5.5V;
2

●测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃ ●零待机功耗 ●温度以 9 或 12 位数字量读出; ●用户可定义的非易失性温度报警设置 ●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件 ●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工 作 DS18B20 采用 3 脚 PR-35 封装或8脚 SOIC 封装,其内部结构框图如图 3 所示

图 3 DS18B20 内部结构框图 64 b 闪速 ROM 的结构如下:?

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

主机操作 ROM 的命令有五种,如表 1 所列 指令 读 ROM(33H) 匹配 ROM(55H) 跳过 ROM(CCH) 说明 读 DS18B20 序列号 用于辨识某一特定的 DS18B20 进行操作 命令发出后系统将对所有 DS18B20 进行操 作 搜 ROM(F0H) 用于确定总线上的节点数以及所有节点的 序列号 报警搜索(ECH) 主要用于鉴别和定位系统中超出程序设定 的报警温度界限的节点

表 1 主机操作 ROM 的命令 DS18B20 温度传感器的内部存储器还包括一个高速暂存 RAM 和一个 非易失性的可电擦除的 EERAM。 高速暂存 RAM 的结构为 8 字节的存储器, 结构如图 4 所示。

温度LSB(字节1) 温度MSB(字节2) TH用户字节1 (字节3) TL用户字节2 (字节4) 配置寄存器(字节5) 保留(字节6) 保留(字节7) 保留(字节8) CRC(字节9)

TH用户字节1 TL用户字节2 E2RAM

图 4 高速暂存 RAM 结构图
4

前 2 个字节包含测得的温度信息,第 3 和第 4 字节 TH 和 TL 的拷贝, 是易失的,每次上电复位时被刷新。第 5 个字节,为配置寄存器,它的内容 用于确定温度值的数字转换分辨率。 DS18B20 工作时寄存器中的分辨率转换 为相应精度的温度数值。
温度低位 LSB 温度高位 MSB TH TL 配置 保留 保留 保留 8 位 CRC

DS18B20 提供如下存储器命令: 1. 温度转换,代码为 44H,用于启动 DS18B20 进行温度测量,温度转 换命令被执行后 DS18b20 保持等待状态。如果主机在这条命令后跟 着发出读时间间隙, DS18B20 又忙于进行温度交换的话, 而 DS18b20 将在总线上输出 0, 若温度完成转换, 则输出 1。 如果使用寄生电源, 主机必须在发出这条命令后立即启动强上拉,并保持 750ms,在这 段时间内部允许进行任何其他操作。 2. 读暂存器,代码为 BEH,用于读取暂存器中的内容,从字节 0 开始 最多可以读 9 个字节,如果不想读完所有字节,主机可以在任何时 间发出复位命令来终止读取。 3. 写暂存器,代码为 4EH,用于将数据写入到 DS18B20 暂存器的地址 2 和地址 3(TH 和 TL 字节) 。可以在任何时刻发出复位命令来终止 写入 4. 复制暂存器,代码为 48H,用于将暂存器的内容复制到 DS18B 的非 易失性 E2RAM 中,即使、把温度报警触发字节存入非易失性存储 器中,如果主机在这条命令之后发出读时间隙,而 DS18B20 有忙在 吧暂存器的内容复制到 E2RAM 存储器,DS18B20 就会输出一个 0, 如果复制结束的哈,DS18B20 输出 1,如果使用寄生电源,主机必 须在这条命令发出后立即启动强行上拉并至少保持 10ms,在这段时 间内部允许进行任何其他操作。 5. 重读 E2RAM,代码为 B8H,用于将存储器在非易失性 E2RAM 中的 内容重新读入到暂存器中,这种复制操作在 DS18B20 上电时自动执 行,这样一上电,暂存器里马上就存在有效数据了。若在这条命令 发出之后发出读时间隙,器件就会输出温度转换忙的标志:0 代表忙 1 代表完成。
5

6. 读电源,代码为 B4H,用于将 DS18B20 的供电方式信号送到主机。 若在这条名令发出后发出读时间隙, DS18B20 将返回它的供电模式: 0 代表寄生电源,1 代表外部电源。 当 DS18B20 接收到温度转换命令后,开始启动转换。转换完成后的温 度值就以 16 位带符号扩展的二进制补码形式存储在高速暂存存储器的第 1, 2 字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后, 数据格式以 0.062 5 ℃/LSB 形式表示。温度值格式如下:?

这是 12 位转化后得到的 12 位数据, 存储在 18B20 的两个 8 比特的 RAM 中,二进制中的前面 5 位是符号位,如果测得的温度大于 0,这 5 位为 0, 只要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小于 0,这 5 位 为 1,测到的数值需要取反加 1 再乘于 0.0625 即可得到实际温度。图中,S 表示位。对应的温度计算:当符号位 S=0 时,表示测得的温度植为正值,直 接将二进制位转换为十进制;当 S=1 时,表示测得的温度植为负值,先将补 码变换为原码,再计算十进制值。例如+125℃的数字输出为 07D0H, +25.0625℃的数字输出为 0191H,-25.0625℃的数字输出为 FF6FH,-55℃的 数字输出为 FC90H。 DS18B20 温度传感器主要用于对温度进行测量,数据可用 16 位符号扩 展的二进制补码读数形式提供,并以 0.0625℃/LSB 形式表示。表 2 是部分 温度值对应的二进制温度表示数据。?

6

表 2 部分温度值 DS18B20 完成温度转换后,就把测得的温度值与 RAM 中的 TH、TL 字 节内容作比较,若 T>TH 或 T<TL,则将该器件内的告警标志置位,并对主机 发出的告警搜索命令作出响应。因此,可用多只 DS18B20 同时测量温度并 进行告警搜索。 在 64 位 ROM 的最高有效字节中存储有循环冗余校验码(CRC) 。主机 根据 ROM 的前 56 位来计算 CRC 值,并和存入 DS18B20 中的 CRC 值做比 较,以判断主机收到的 ROM 数 据是否正确。? 3)DS18B20 测温原理 DS18B20 的测温原理如图 5 所示, 图中低温度系数晶振的振荡频率受温 度的影响很小用于产生固定频率的脉冲信号送给减法计数器 1,高温度系数 晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器 2 的脉 冲输入,图中还隐含着计数门,当计数门打开时,DS18B20 就对低温度系数 振荡器产生的时钟脉冲后进行计数, 进而完成温度测量.计数门的开启时间由 高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置 减法计数器 1 和温度寄存器被预置在-55 ℃ 入减法计数器 1 和温度寄存器中, 所对应的一个基数值。 减法计数器 1 对低温度系数晶振产生的脉冲信号进行减法计数,当减法 计数器 1 的预置值减到 0 时温度寄存器的值将加 1,减法计数器 1 的预置将 重新被装入,减法计数器 1 重新开始对低温度系数晶振产生的脉冲信号进行 计数,如此循环直到减法计数器 2 计数到 0 时,停止温度寄存器值的累加,此 时温度寄存器中的数值即为所测温图 2 中的斜率累加器用于补偿和修正测温 过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关 闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是 DS18B20 的测温原理。 另外,由于 DS18B20 单线通信功能是分时完成的,他有严格的时隙概 念,因此读写时序很重要。系统对 DS18B20 的各种操作必须按协议进行。 操作协议为:初始化 DS18B20(发复位脉冲)→发 ROM 功能命令→发存储 器操作命令→处理数据。 在正常测温情况下,DS1820 的测温分辨力为 0.5℃,可采用下述方法获 得高分辨率的温度测量结果:首先用 DS1820 提供的读暂存器指令(BEH) 读出以 0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位 (LSB) ,得到所测实际温度的整数部分 Tz,然后再用 BEH 指令取计数器 1 的计数剩余值 Cs 和每度计数值 CD。考虑到 DS1820 测量温度的整数部分以 0.25℃、0.75℃为进位界限的关系,实际温度 Ts 可用下式计算: Ts=(Tz-0.25℃)+(CD-Cs)/CD
7

图5

DS18B20 测温原理图

系统程序的设计 四 系统程序的设计
系统程序主要包括主程序、 DS18b20 复位与检测子程序、 读温度子程序、 温度数据处理子程序、 温度显示子程序、 按键扫描子程序报警值设定子程序、 温度比较子程序等。 主程序首先进行初始化,当检测到 DS18B20 存在时发出温度转换命令 和度温度命令,再分别调用相应的子程序,完成测温及显示工作。 DS18B20 复位温度与检测子程序的主要功能是位检测 DS18b20 是否存 在。若存在则将标志位 FLAG1 置 1,不存在则将标志位 FLEG1 置 0。后续 程序可以通过标志位来决定进行那种操作。 读温度子程序只读出 DS18b20 暂存器前 4 个字节的数据:温度值 LSB、 温度值 MSB、温度报警值 TH 和 TL,并将它们分别存入 26~29H。 温度数据处理子程序首先判断温度值 MSB 的符号位,当符号位 S=0 时, 表示测得温度为正值, 可以直接将二进制转换成十进制; 当符号位为 S=1 时, 表示测得温度为负值,要首先将补码变成原码,再计算十进制。计算时先将 温度值 LSB 的低四位取出,进行小数部分数据处理。再将温度值 LSB 的高 四位和温度值 MSB 的低四位取出,重新组合后尽心整数部分的数据处理。 温度显示子程序将从 DS18b20 读出的温度值,经过数据处理后,送往 LCD 进行实测温度显示。 按键扫描子程序对数字温度计的 K1 ~K4 键进行扫描,得到键值,根据 键值完成相应的操作。按 K1 键进行查看温度报警值按 K3 键进行返回。按 下 K2 键设定温度报警值,再次按下 K2 键调整 TH 的设定值,按下 K3 键调
8

整 TH 的设定值, 设定过程中可以通过 K1 来决定是增施减, 再按下 K4 键确 定设定完毕,将温度报警值写入 DS18B20 的 EEROM 中保存,每次开机时 自动从 DS18B20 中读出温度报警值。 温度比较子程序将实测温度值与设定的温度报警值进行比较,根据比较 LCD 结果执行相应处理子程序。 当实测温度大于温度报警值 TH 的设定值时, 显示>H 并使指示灯闪动,蜂鸣器发出警报声。当实测温度值小于温度报警 ,同时点亮指示灯。 值 TL 的设定值时,LCD 显示!

初始化

发 DS18B20 复位命令

显示调用子程序

发跳过 ROM 命令

N

1s 到? Y

发读取温度命令

读取操作, CRC 校验 Y 初次上电? N N 读出温度值 温度计算处理 显示数据刷新 9 字节完?

Y CRC 校验正确? N

发温度转换开始命令 Y 移入温度暂存器

图 6 主程序流程图

结束 发 DS18B20 复位命令

图 7 读出温度子程序流程图
发跳过 ROM 命令

发温度转换开始命令

9

图8

温度转换命令 子程序流程图

开始

N 温度零下 S=0? Y 温度值取补码置“—”标志 置 “+” 标志

计算小数位温度 BCD 值

计算整数位温度 BCD 值

结束

图9

温度处理子程序流程图

温度数据移入显示寄存器

N 十位数 0?

Y N 百位数 0?
10

Y

右图为 DS18B20 引脚图 DS18S20 采用 3 脚 PR35 封装(或 8 脚 SOIC 封装),DQ 为数据输入/输出脚,VDD 为电源电压。

汇编程序 五 汇编程序

TEMP_ZH 元 TEMPL TEMPH TEMP_TH 元 TEMP_TL TEMPHC

EQU

24H

;实测温度值存放单 实测温度值存放单

EQU 25H EQU 26H EQU 27H ;高温报警值存放单 高温报警值存放单

EQU 28H EQU 29H
11

;低温报警值存放单元 低温报警值存放单元 ;正、负温度值标记 正

TEMPLC TEMPFC K1 K2 K3 K4 BEEP RELAY LCD_X LCD_RS 号 LCD_RW LCD_EN FLAG1 志 KEY_UD 志 DQ

EQU 2AH EQU 2BH ;查询按键 查询按键 ;设置 调整键 设置/调整键 设置 ;调整键 调整键 ;确定键 确定键 ;蜂鸣器 蜂鸣器 ;指示灯 指示灯 ;LCD 字符显示位置 ;LCD 寄存器选择信

EQU P1.4 EQU P1.5 EQU P1.6 EQU P1.7

EQU P3.7 EQU P1.3 EQU 2FH EQU P2.0

EQU P2.1 EQU P2.2 EQU 20H.0

;LCD 读写信号 ;LCD 允许信号 ;DS18B20 是否存在标

EQU 20H.1

;设定按键的增、减标 设定按键的增、 设定按键的增

EQU P3.3

;DS18B20 数据信号

ORG 0000H LJMP MAIN ORG MAIN: 0030H

MOV SP,#60H
12

MOV A,#00H MOV R0,#20H 零 MOV R1,#10H CLEAR: MOV @R0,A INC R0 DJNZ R1,CLEAR LCALL SET_LCD LCALL RE_18B20 START: 程序 JNB FLAG1,START1 ;DS1820 不存在 ;DS1820 存在,调用显 存在, LCALL RST ;调用 18B20 复位子 调用 ; 将 20H~2FH 单 元 清

LCALL MENU_OK 示正确信息子程序 MOV MOV TEMP_TH,#055H TEMP_TL,#019H

;设置 TH 初值 85 度 设置 ;设置 TL 初值 25 度 设置 ;调用暂存器操作子程序 调用暂存器操作子程序 ;写入 DS18B20 写入 ;显示温度标记 显示温度标记

LCALL RE_18B20A LCALL WRITE_E2 LCALL TEMP_BJ JMP START1: 信息子程序
13

START2 ;调用显示出错

LCALL MENU_ERROR

LCALL TEMP_BJ SJMP $ START2: LCALL RST JNB FLAG1,START1 MOV 令 LCALL WRITE MOV A,#44H A,#0CCH

;显示温度标记 显示温度标记

;调用 DS18B20 复位子程序 调用 ;DS18B20 不存在 ;跳过 ROM 匹配命 跳过

;温度转换命令 温度转换命令

LCALL WRITE LCALL RST MOV A,#0CCH ;跳过 ROM 匹配 跳过

LCALL WRITE MOV A,#0BEH ;读温度命令 读温度命令

LCALL WRITE LCALL READ 取操作子程序 LCALL CONVTEMP 处理子程序 LCALL DISPBCD 程序 LCALL CONV 序
14

;调用 DS18B20 数据读 调用

;调用温度数据 BCD 码 调用温度数据

; 调用温度数据显示子

;调用 LCD 显示处理子程 调用

LCALL TEMP_COMP 设定温度值比较子程序 LCALL PROC_KEY SJMP START2 ;*************************** ***************************** PROC_KEY:JB K1,PROC_K1 LCALL BEEP_BL JNB K1,$ ;循环 循环 键 扫

;调用实测温度值与 调用实测温度值与

;调用键扫描子程序 调用键扫描子程序









MOV DPTR,#M_ALAX1 MOV A,#1 LCALL LCD_PRINT LCALL LOOK_ALARM JB K3,$ LCALL BEEP_BL JMP PROC_K2 PROC_K1: JB K2,PROC_END LCALL BEEP_BL JNB MOV MOV K2,$ DPTR,#RST_A1 A,#1

LCALL LCD_PRINT
15

LCALL SET_ALARM LCALL RE_18B20 写入 DS18B20 LCALL WRITE_E2 PROC_K2: LCALL MENU_OK LCALL TEMP_BJ PROC_END:RET ;将设定的 TH,TL 值 将设定的

;*************************** 设 定 温 度 报 警 值 TH 、 TL *************************** SET_ALARM:LCALL LOOK_ALARM AS0: JB K1,AS00

LCALL BEEP_BL JNB K1,$ ;UP/DOWN 标记 ;20H.1=1,增加 , ;20H.1=0,减小 , ;TH 值调整 增加 值调整(增加 增加)

CPL 20H.1 AS00: JB 20H.1,ASZ01 JMP ASJ01 ASZ01: JB K2,ASZ02 LCALL BEEP_BL INC TEMP_TH MOV A,TEMP_TH CJNE A,#120,ASZ011
16

MOV TEMP_TH,#0 ASZ011: LCALL LOOK_ALARM MOV R5,#10 LCALL DELAY JMP ASZ01 ASZ02: JB K3,ASZ03 LCALL BEEP_BL INC TEMP_TL MOV A,TEMP_TL CJNE A,#99,ASZ021 ;TL 值调整 增加 值调整(增加 增加)

MOV TEMP_TL,#00H ASZ021: LCALL LOOK_ALARM MOV R5,#10 LCALL DELAY JMP ASZ02 ASZ03: JB K4,AS0 LCALL BEEP_BL JNB RET ASJ01: JB K2,ASJ02 LCALL BEEP_BL DEC TEMP_TH
17

;确定调整 确定调整

K4,$

;TH 值调整(减少) 值调整(减少)

MOV A,TEMP_TH CJNE A,#0FFH,ASJ011

JMP ASJ022 ASJ011: LCALL LOOK_ALARM MOV R5,#10 LCALL DELAY JMP AS0 ASJ02: JB K3,ASJ03 LCALL BEEP_BL DEC TEMP_TL ;TL 值调整(减少) 值调整(减少)

MOV A,TEMP_TL CJNE A,#0FFH,ASJ021

JMP ASJ022 ASJ021: LCALL LOOK_ALARM MOV R5,#10 LCALL DELAY JMP AS0 ASJ022: CPL 20H.1 JMP ASZ01 ASJ03: JMP ASZ03 RET RST_A1: DB " SET ALERT CODE " ,0
18

;

;*********************** 实测温度值与设定温度值比较子程 序 ********************** TEMP_COMP:MOV SUBB JC MOV A,TEMP_TH ;减数 被减数,则 减数>被减数 减数 被减数, ;借位标志位 C=1,转 借位标志位 ,

A,TEMP_ZH

CHULI1 A,TEMPFC

CJNE A,#0BH,COMP SJMP CHULI2 COMP: MOV A,TEMP_ZH SUBB A,TEMP_TL ;减数 被减数,则 减数>被减数 减数 被减数, ;借位标志位 C=1,转 借位标志位 ,

JC CHULI2 MOV DPTR,#BJ5 LCALL TEMP_BJ3 CLR RET CHULI1: MOV DPTR,#BJ3 LCALL TEMP_BJ3 SETB RELAY RELAY

;点亮指示灯 点亮指示灯

;熄灭指示灯 熄灭指示灯 ;蜂鸣器响 蜂鸣器响

LCALL BEEP_BL RET CHULI2: MOV DPTR,#BJ4
19

LCALL TEMP_BJ3 SETB RELAY ;熄灭指示灯 熄灭指示灯 ;蜂鸣器响 蜂鸣器响

LCALL BEEP_BL RET ;----------------------------------------TEMP_BJ3: MOV A,#0CEH LCALL WCOM MOV R1,#0 MOV R0,#2 BBJJ3: MOV A,R1 MOVC A,@A+DPTR LCALL WDATA INC R1 DJNZ R0,BBJJ3 RET BJ3: BJ4: BJ5: ; DB DB DB ">H" "<L" " !"

;**************************** 显 示 温 度 标 记 子 程 序 *************************** TEMP_BJ: MOV A,#0CBH
20

LCALL WCOM MOV DPTR,#BJ1 MOV R1,#0 MOV R0,#2 BBJJ1: MOV A,R1 MOVC A,@A+DPTR LCALL WDATA INC R1 DJNZ R0,BBJJ1 RET BJ1: DB 00H,"C" ;指针指到显示消息 指针指到显示消息

;******************************** 显 示 正 确 信 息 子 程 序 *************************** MENU_OK: MOV DPTR,#M_OK1 MOV A,#1 LCALL LCD_PRINT MOV DPTR,#M_OK2 MOV A,#2 LCALL LCD_PRINT RET M_OK1: DB " (^-^) OK
21

;指针指到显示消息 指针指到显示消息

;显示在第一行 显示在第一行

;指针指到显示消息 指针指到显示消息 ;显示在第一行 显示在第一行

",0

M_OK2:

DB

" TEMP:

",0

;******************************** 显 示 出 错 信 息 子 程 序 *************************** MENU_ERROR:MOV 消息 MOV A,#1 LCALL LCD_PRINT MOV DPTR,#M_ERROR2 1 MOV A,#2 LCALL LCD_PRINT RET M_ERROR1: DB M_ERROR2: DB " DS18B20 ERROR ",0 " TEMP: ---",0 ;显示在第一行 显示在第一行 ;指针指到显示消息 指针指到显示消息 ;显示在第一行 显示在第一行 DPTR,#M_ERROR1 ; 指针指到显示

;****************************DS18B20 ***************************** RST: SETB DQ NOP CLR DQ MOV R0,#6BH
22

复 位 子 程 序

;主机发出延时复位低脉冲 主机发出延时复位低脉冲

MOV R1,#04H TSR1: DJNZ R0,$ MOV R0,#6BH DJNZ R1,TSR1 SETB DQ NOP NOP NOP MOV R0,#32H TSR2: JNB DQ,TSR3 DJNZ R0,TSR2 JMP TSR4 TSR3: 存在 JMP TSR5 TSR4: 不存在 JMP TSR7 TSR5: TSR6: TSR7: MOV R0,#06BH DJNZ R0,$ SETB DQ RET
23

;拉高数据线 拉高数据线

;等待 DS18B20 回应 等待

; 延时 ; 置 1 标志位 表示 DS1820 标志位,表示

SETB FLAG1

CLR FLAG1

; 清 0 标志位 表示 DS1820 标志位,表示

; 时序要求延时一段时间

;************************ DS18B20 暂 存 器 操 作 子 程 序 *************************** RE_18B20:JB FLAG1,RE_18B20A RET RE_18B20A: LCALL RST MOV A,#0CCH LCALL WRITE WR_SCRAPD: MOV A,#4EH LCALL WRITE MOV A,TEMP_TH LCALL WRITE MOV A,TEMP_TL LCALL WRITE MOV A,#7FH LCALL WRITE RET ;12 位精度 ;TL(报警下限) 报警下限) 报警下限 ;TH(报警上限) 报警上限) 报警上限 ;写暂器 写暂器 ;跳过 ROM 匹配 跳过

;************************

复 制 暂 存 器 子 程 序

*******************************
24

WRITE_E2:LCALL RST MOV A,#0CCH LCALL WRITE MOV A,#48H 拷贝到 EEROM LCALL WRITE RET ;把暂存器里的温度报警值 把暂存器里的温度报警值 ;跳过 ROM 匹配 跳过

;***********************

重 读

EEROM

子 程 序

******************************** READ_E2:LCALL RST MOV A,#0CCH LCALL WRITE MOV A,#0B8H 值拷贝回暂存器 LCALL WRITE RET ;把 EEROM 里的温度报警 把 ;跳过 ROM 匹配 跳过

;************************ 将 自 定 义 字 符 写 入 LCD 的 CGRAM 中 ********************* STORE_DATA: MOV A,#40H
25

LCALL WCOM MOV R2,#08H MOV DPTR,#D_DATA MOV R3,#00H S_DATA: MOV A,R3 MOVC A,@A+DPTR ;写入数据 写入数据

LCALL WDATA INC R3 DJNZ R2,S_DATA RET D_DATA: DB

0CH,12H,12H,0CH,00H,00H,00H,00H DS18B20 数 据 写 入 操 作 子 程 序

;*********************** ************************ WRITE: MOV R2,#8 CLR C WR1: CLR DQ

;一共 8 位数据 一共

;开始写入 DS18B20 总线要 开始写入

处于复位(低)状态 处于复位( MOV R3,#07 DJNZ R3,$ RRC A 个 BIT 环移给 C MOV DQ,C
26

;总线复位保持 16 微妙以上 总线复位保持 ;把一个字节 DATA 分成 8 把一个字节

;写入一位 写入一位

MOV R3,#3CH DJNZ R3,$ SETB DQ NOP DJNZ R2,WR1 SETB DQ RET ;写入下一位 写入下一位 ;等待 100 微妙 等待 ;重新释放总线 重新释放总线

;********************** DS18B20 数 据 读 取 操 作 子 程 序 ************************** READ: MOV R4,#4 ;将温度低位、高位、TH、 将温度低位、高位、 、 将温度低位

TL 从 DS18B20 中读出 MOV R1,#TEMPL 28H 单元 RE00: RE01: MOV R2,#8 CLR CY SETB DQ NOP NOP CLR DQ NOP NOP
27

;存入 25H、26H、27H、 存入 、 、 、

;读前总线保持为低 读前总线保持为低

NOP SETB DQ MOV R3,#09 DJNZ R3,$ MOV C,DQ MOV R3,#3CH DJNZ R3,$ RRC A DJNZ R2,RE01 MOV @R1,A INC R1 DJNZ R4,RE00 RET ;等待 100 微妙 等待 ;把读得的位值环移给 A 把读得的位值环移给 ;读下一位 读下一位 ;从 DS18B20 总线读得一位 从 ;开始读总线释放 开始读总线释放 ;延时 18 微妙 延时

;************************ 温 度 值 ************************* CONVTEMP: MOV A,TEMPH ANL A,#08H JZ TEMPC1 CLR C MOV A,TEMPL 节)
28

BCD 码 处 理 子 程 序

;判温度是否零下 判温度是否零下

;温度零上转 温度零上转

;二进制数求补(双字 二进制数求补( 二进制数求补

CPL A ADD A,#01H MOV TEMPL,A MOV A,TEMPH CPL A ADDC A,#00H MOV TEMPH,A MOV MOV TEMPHC,#0BH TEMPFC,#0BH

;取反加 1 取反加

;负温度标志 负温度标志

SJMP TEMPC11 TEMPC1: MOV TEMPC11: MOV TEMPHC,#0AH TEMPFC,#0AH ;正温度标志 正温度标志

MOV A,TEMPHC SWAP A MOV TEMPHC,A MOV A,TEMPL ANL A,#0FH ;乘 0.0625 乘

MOV DPTR,#TEMPDOTTAB MOVC A,@A+DPTR MOV LOW=小数部分 BCD 小数部分 MOV A,TEMPL
29

TEMPLC,A

;TEMPLC

;整数部分 整数部分

ANL A,#0F0H SWAP A MOV TEMPL,A MOV A,TEMPH ANL A,#0FH SWAP A ORL A,TEMPL MOV TEMP_ZH,A LCALL HEX2BCD1 MOV TEMPL,A ANL A,#0F0H SWAP A ORL LOW = 十位数 BCD MOV TEMPHC,A MOV A,TEMPL ANL A,#0FH SWAP A 个位数 BCD ORL A,TEMPLC MOV TEMPLC,A MOV A,R4
30

;取出高四位 取出高四位

;取出低四位 取出低四位

;重新组合 重新组合

A,TEMPHC

;TEMPHC

;TEMPLC HI =

JZ TEMPC12 ANL A,#0FH SWAP A MOV R4,A MOV HI = 百位数 BCD ANL A,#0FH ORL A,R4 MOV TEMPHC,A TEMPC12: RET A,TEMPHC ;TEMPHC

;************************

二 - 十 进 制 转 换 子 程 序

***************************** HEX2BCD1: MOV B,#064H DIV AB MOV R4,A MOV A,#0AH XCH A,B DIV AB SWAP A ORL A,B RET
31

TEMPDOTTAB: 00H,00H,01H,01H,02H,03H,03H,04H ; 小数部分码表 DB 05H,05H,06H,06H,07H,08H,08H,09H

DB

;**********************

查 询 温 度 报 警 值 子 程 序

*************************** LOOK_ALARM: 到显示信息区 MOV A,#2 LCALL LCD_PRINT MOV A,#0C6H LCALL TEMP_BJ1 MOV A,TEMP_TH MOV LCD_X,#3 LCALL SHOW_DIG2H MOV A,#0CEH LCALL TEMP_BJ1 MOV A,TEMP_TL MOV LCD_X,#12 LCALL SHOW_DIG2L RET M_ALAX1: DB " LOOK ALERT CODE",0
32

MOV DPTR,#M_ALAX2

;指针指

;显示在第二行 显示在第二行

;加载 TH 数据 加载 ;设置显示位置 设置显示位置 ;显示数据 显示数据

;加载 TL 数据 加载 ;设置显示位置 设置显示位置 ;显示数据 显示数据

M_ALAX2: DB

"TH:

TL:

",0

TEMP_BJ1: LCALL WCOM MOV DPTR,#BJ2 区 MOV R1,#0 MOV R0,#2 BBJJ2: MOV A,R1 MOVC A,@A+DPTR LCALL WDATA INC R1 DJNZ R0,BBJJ2 RET BJ2: DB 00H,"C" ;指针指到显示信息 指针指到显示信息

;**************************

LCD











********************************** SHOW_DIG2H: MOV B,#100 DIV AB ADD PUSH A,#30H B

MOV B,LCD_X LCALL LCDP2
33

POP B MOV A,#0AH XCH A,B

DIV AB ADD A,#30H

INC LCD_X PUSH B

MOV B,LCD_X LCALL LCDP2 POP B INC LCD_X MOV A,B MOV B,LCD_X ADD A,#30H

LCALL LCDP2 RET

SHOW_DIG2L: MOV B,#100 DIV AB MOV A,#0AH XCH A,B
34

DIV AB ADD PUSH A,#30H B

MOV B,LCD_X LCALL LCDP2 POP B INC LCD_X MOV A,B MOV B,LCD_X ADD A,#30H

LCALL LCDP2 RET

;************************ 显示区 BCD 码温度值刷新子程序 ********************** DISPBCD: MOV A,TEMPLC ANL A,#0FH MOV 70H,A MOV A,TEMPLC SWAP A ANL A,#0FH MOV 71H,A
35

;小数位 小数位

;个位 个位

MOV A,TEMPHC ANL A,#0FH MOV 72H,A MOV A,TEMPHC SWAP A ANL A,#0FH MOV 73H,A DISPBCD2: RET ;百位 百位 ;十位 十位

;*************************** LCD 显 示 数 据 处 理 子 程 序 ************************* CONV: MOV A,73H MOV LCD_X,#6 CJNE A,#1,CONV1 JMP CONV2 CONV1: CJNE A,#0BH,CONV11 MOV A,#"-" JMP CONV111 CONV11: MOV A,#" " ;"+"号不显示 号不显示 ;"-"号显示 号显示 ;加载百位数据 加载百位数据 ;设置位置 设置位置

CONV111: MOV B,LCD_X LCALL LCDP2 JMP CONV3
36

CONV2: CONV3:

LCALL SHOW_DIG2 INC LCD_X ;十位 十位

;显示数据 显示数据

MOV A,72H LCALL SHOW_DIG2 INC LCD_X MOV A,71H LCALL SHOW_DIG2 INC LCD_X MOV A,#'.' MOV B,LCD_X LCALL LCDP2 MOV A,70H INC LCD_X LCALL SHOW_DIG2 RET

;个位 个位

;加载小数点位 加载小数点位 ;设置显示位置 设置显示位置 ;显示数据 显示数据

;*************************** 第 二 行 显 示 数 字 子 程 序 ************************* SHOW_DIG2:ADD A,#30H MOV B,LCD_X LCALL LCDP2 RET
37

;*************************** 第 二 行 显 示 数 字 子 程 序 ************************* LCDP2: PUSH ACC ;设置显示地址 设置显示地址 ;设置 LCD 的第二行地址 设置 ;写入命令 写入命令 ;由堆栈取出 A 由堆栈取出 ;写入数据 写入数据

MOV A,B ADD A,#0C0H LCALL WCOM POP ACC LCALL WDATA RET

;*************************** 对 LCD 做初始化设置及测试 ************************* SET_LCD: CLR LCD_EN LCALL INIT_LCD ;初始化 LCD 初始化

LCALL STORE_DATA ;将自定义字符存入 LCD 的 将自定义字符存入 CGRAM RET

;****************************** *********************************** INIT_LCD: MOV A,#38H
38

LCD







;2 行显示,字形 5*7 点阵 行显示,

LCALL WCOM LCALL DELAY1 MOV A,#38H LCALL WCOM LCALL DELAY1 MOV A,#38H LCALL WCOM LCALL DELAY1 MOV A,#0CH 闪烁 LCALL WCOM LCALL DELAY1 MOV A,#01H LCALL WCOM LCALL DELAY1 RET ;清除 LCD 显示屏 清除 ;开显示,显示光标,光标不 开显示,显示光标, 开显示

;***************************** 清 除 LCD 的 第 一 行 字 符 ************************** CLR_LINE1:MOV A,#80H LCALL WCOM MOV R0,#24
39

;设置 LCD 的第一行地址 设置

;设置计数值 设置计数值

C1:

MOV A,#' ' LCALL WDATA DJNZ R0,C1 RET

;载入空格符至 LCD 载入空格符至 ;输出字符至 LCD 输出字符至 ;计数结束 计数结束

;************************* LCD 的第一行或第二行显示字符 ********************** LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行 判断是否为第一行 LINE1: MOV A,#80H LCALL WCOM LCALL CLR_LINE MOV A,#80H LCALL WCOM JMP FILL LINE2: MOV A,#0C0H LCALL WCOM LCALL CLR_LINE MOV A,#0C0H LCALL WCOM FILL: CLR MOVC CJNE RET
40

;设置 LCD 的第一行地址 设置 ;写入命令 写入命令 ;清除该行字符数据 清除该行字符数据 ;设置 LCD 的第一行地址 设置 ;写入命令 写入命令

;设置 LCD 的第二行地址 设置 ;写入命令 写入命令 ;清除该行字符数据 清除该行字符数据 ;设置 LCD 的第二行地址 设置

A

;填入字符 填入字符 A,@A+DPTR ;由消息区取出字符 由消息区取出字符

A,#0,LC1

;判断是否为结束码 判断是否为结束码

LC1:

LCALL WDATA INC DPTR JMP FILL RET

;写入数据 写入数据 ;指针加 1 指针加 ;继续填入字符 继续填入字符

;*************************** 清 除 1 行 **************************** CLR_LINE: MOV R0,#24 CL1: MOV A,#' ' LCALL WDATA DJNZ R0,CL1 RET DE: MOV R7,#250 DJNZ R7,$ RET

LCD 的 字 符

;**************************** LCD 间接控制方式命令写入 ************************* WCOM: MOV P0,A CLR LCD_RS E=高脉冲 高脉冲 CLR LCD_RW
41

;写入命令 写入命令 ;RS=L,RW=L,D0-D7=指令码, 指令码, 指令码

SETB LCD_EN LCALL DELAY1 CLR LCD_EN RET

;**************************** LCD 间接控制方式数据写入 ************************* WDATA: MOV P0,A SETB CLR SETB LCD_RS LCD_RW LCD_EN ;写入数据 写入数据

LCALL DE CLR LCD_EN

LCALL DE RET

;************************** 在 LCD 的 第 一 行 显 示 字 符 ************************** LCDP1: PUSH ACC ;设置显示地址 设置显示地址 ;设置 LCD 的第一行地址 设置 ;写入命令 写入命令 写入命
42

MOV A,B ADD A,#80H LCALL WCOM

POP ACC LCALL WDATA RET

;由堆栈取出 A 由堆栈取出 ;写入数据 写入数据

;****************************** ******************************* BEEP_BL: MOV R6,#100 BL2: LCALL DEX1 CPL BEEP CPL RELAY DJNZ R6,BL2

声 光 报 警 子 程 序

MOV R5,#10 LCALL DELAY RET DEX1: DE2: MOV R7,#180 NOP DJNZ RET R7,DE2

;****************************** ******************************* DELAY: MOV R6,#50
43











DL1:

MOV R7,#100 DJNZ DJNZ DJNZ RET R7,$ R6,DL1 R5,DELAY

DELAY1: MOV R6,#25 DL2: MOV R7,#100 DJNZ DJNZ RET END R7,$ R6,DL2

;延时 5 毫秒 延时

44



热文推荐
猜你喜欢
友情链接: 工作计划 总结汇报 团党工作范文 工作范文 表格模版 生活休闲