基于DS18B20的lcd1602的温度检测系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.1、来源
在人类的生活环境中,温度扮演着极其重要的角色。
无论你生活在哪里,从事什么工作,无时无刻不在与温度打着交道。
温度无时无刻不在,同样也时时刻刻都在变化,为了让人们能更直观的看出此时此刻此地的实时温度,我就利用了单片机来完成这一功能。
1.2、意义
温度的检测与控制在现代经济与社会中有举足轻重的地位,与我们的生活息息相关,密不可分,越发占有一席之地。
例如在储粮仓库、智能楼宇、空调控制及其他的工农业生产和科学研究中应用广泛。
在温度的检测与控制方面,DS18B20小型温度检测系统及其数字温度传感器有许多突出的优点,其通过单总线与单片机连接,系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度检测,因此对于我们来设计并研究基于DS18B20的温度检测系统有主要的现实意义,从一方面讲这不仅对于工农业的发展,更对于国防的巩固与建设起到重要的作用;另一方面,本设计能够在一定程度上提高自己的单片机开发能力。
1.3、目的
(1)本实验要实现的是通过DS18B20温度传感器采集温度并在LCD上显示,并学会使用单片机控制DS18B20此类单总线器件,并对数字温度传感器DS18B0进行时序分析。
(2)更进一步了解LCD1602的应用。
(3)掌握单片机与PC的远程通信。
2、课题承担人员及分工说明
*********:(1)主要负责电路板的制作、焊接与调试。
(2)电路的仿真。
(3)温度主要程序的编写与调试。
**********:(1)Protel画板,材料的收集。
(2)串口的调试与程序编写。
(3)VB界面的设计和上位机程序的编写。
二、课题总体设计说明
1、说明总体开发计划和课题所达到的功能目标和技术指标
1.1、总体开发计划
1.1.1、基本功能
(1)以数字传感器DS1820作为前端采集温度,经过单片机处理后,将外部的温度显示在液晶屏上。
(2)可用通过独立式按键来设定温度的上限值和下限值,当坏境温度超过上限值或低于下限值时蜂鸣器会自动报警,并在液晶屏上提示温度大于上限值或温度小于下限值。
(3)当单片机检测到DS18B20存在时会在在LCD1602上显示“DS18B20 Succes”,反之则显示“DS18B20 is Wrong,TEMP is No on”。
1.1.2、扩展功能
以数字传感器DS1820作为前端采集温度,经过单片机处理后,再通过串口通信,把实
时温度值、上限值和下限值显示在用VB语言编辑的计算机软件的界面上并显示出实时温度的变化曲线,当实时温度超过所设定的上限值和下限值时会在用VB语言编辑的计算机软件的界面上提示当前温度超过上限值或下限值,模拟实现设备与计算机的通信,通过计算机对设备的温度检测以及实时监控。
1.2、课题所达到的功能目标和技术指标
(1)能在LCD1602上准确的显示出实时温度;
(2)独立式按键能设置报警温度的上限值、下限值和查看所设定的上限值、下限值;
(3)当温度大于上限值或低于下限值时蜂鸣器会报警;
(4)通过串口和PC机连接,能够把实时温度值、上限值和下限值显示在用VB语言编辑的计算机软件的界面上并显示出实时温度的变化曲线,当实时温度超过所设定的上限值和下限值时会在用VB语言编辑的计算机软件的界面上提示当前温度超过上限值或下限值。
总之,课题所达到的功能和技术指标与前期计划的一样。
2、计划课题总体设计方案,比较几个备选方案,确定最终方案
(1)本系统的温度检测有两套方案
方案一:采用AD590,使用AD590作为温度传感器,需要进行电流电压变换,电压放大以及A/D转换。
方案二:采用DS18B20作为温度传感器进行温度测量。
DS18B20可以满足从-55摄氏度到+125摄氏度测量范围,在一秒内把温度转化成数字,测得的温度值的存储在两个八位的RAM中,单片机直接从中读出数据转换成十进制就是温度,使用方便。
另外采用外加电源供电对DS18B20的VDD引脚供电。
它的好处是无须MOSFET,而且在温度转换期间总线可自由搭载其它器件。
它试用于对性能要求不高,成本严格控制的应用,是经济型产品。
它具有线性好、精度适中、灵敏度高、体积小和使用方便等优点,得到广泛应用。
因为AD590需要模拟转数字电路,精确度低,测温点数少对线阻有要求,电路繁多,成本也较高,故本系统采用方案二。
(2)本系统的显示有两套方案
方案一:数码管显示
方案二:液晶显示采用1602字符型LCD,它是一种专门用于显示字母、数字、符号等点阵式LCD。
其有显示质量高、数字接口、功耗低、体积小等优点。
因为数码管只能显示数字和简单的字母,LCD可以显示字符,图形等,并能更形象的体现出字符与图像。
故本系统采用方案二。
(3)按键的选择
方案一:行列式按键
方案二:独立式按键
独立式按键电路配置灵活,硬件结构简单,但每个按键必须占用一根I/O口线。
在按键数量较多时,I/O口浪费较大。
故只在按键数量不多时,采用这种按键。
因为本系统只用到4个按键且I/O口够用,所以采用方案二。
(4)单片机的选择
本系统采用了51单片机,其体积小巧,携带方便,价格便宜。
且USB接口通讯及供电,通讯速度快,无须外接电源。
51单片机有一个全双工的串通信口,非常适合与电脑进行通信。
三、硬件设计说明
1、硬件总体设计方案
1.1、硬件设计目标
本系统中通过温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机出来后,显示在8位数据线与单片机P0口的液晶LCD上。
蜂鸣器经过三极管9012的驱动后接到单片机的P3.7,来实现当实时温度大于下限或高于上限的报警。
4个按键K1~K4接到单片机的P1.0~P1.4,来实现对上限值和下限值的查看与设定。
串口经过MAX232的电平转换后R1 OUT和T1 IN接到单片机的
RXD与TXD来实现与用VB语言编辑的计算机软件的界面间的通信。
液晶LCD的RS、—W/R、
E分别接到单片机的P2.0~P2.2来实现单片机控制液晶的读写命令和数据的控制。
1.2、硬件功能模块划分
(1)AT89S51:实现对整个系统的控制。
(2)DS18B20、LCD1602:温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机处理后,显示在8位数据线与单片机P0口的液晶LCD上。
(3)按键输入:对报警温度上限值TH和下限值TL的设置。
(4)串口通信:实现与与用VB语言编辑的计算机软件的界面间的通信。
1.3、主控芯片和关键元器件的选型、接口和连接方式定义
1.3.1、主控芯片和关键元器件的选型
(1)主控芯片:A T89S51
(2)温度采集:DS18B20
(3)按键:独立式按键(K1~K4)
(4)显示:LCD1602
(5)串口:通过MAX232与单片机的10脚11脚相连(6)报警:蜂鸣器
1.3.2、接口和连接方式定义
(1)液晶LCD1602的数据和指令选择控制端RS接到单片机的P2.0,读写控制
—
W
/
R接到单
片节的P2.1,数据读写控制位E接到单片机的P2.2,8位数据线DB0~DB7接到单片机的P0口。
(2)4个按键K1~K4分别接到单片机的P1.0~P1.3。
(3)蜂鸣器接到单片机的P3.7。
(4)DS18B20的DQ接到单片机的P3.3.
2、硬件单元设计
(1)主控电路:实现对整个系统的控制
(2)串口通信电路:串口经过MAX232的电平转换后R1 OUT和T1 IN接到单片机的RXD 与TXD来实现与用VB语言编辑的计算机软件的界面间的通信。
(3)液晶LCD1602、DS18B20电路:温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机处理后,显示在8位数据线与单片机P0口的液晶LCD上。
(4)按键、蜂鸣器电路:按键K1用来查看所设置的上限温度TH、下限温度TL和设置上限温度TH、下限温度TL增加或减少的切换,K2用来设置上限温度TH,K3用来设置下限温度TL和查看上限温度和下限温度的退出,K4是设置好上限温度和上限温度的确定键;蜂鸣器用来当实时温度大于TH或TL的报警。
四、软件设计说明
1、软件总体设计方案
1.1、软件设计目标
(1)结构合理
程序应该采用结构模块化设计。
这不仅有利于程序的进一步扩充,而且也有利于程序的修改和维护。
在程序编程时,要尽量使得程序的层次分明。
易于阅读和理解,同时还可以简化程序减小程序对于内存的使用量,当程序中有经常需要加以修改或变化的参数时,应该设计成独立的参数传递群序,避免程序的频繁修改。
(2)操作性能好
操作性能好是指使用方便。
这点是、对数据采集系统来说是很重要的。
在开发程序时,应该考虑如何降低对操作人员专业知识的要求。
(3)系统应设计一定的检测程序
例如状态检测利于诊断程序,以便系统发生故障时容易确定故障部位,对于重要的参数要定时存储,以防止因掉电而丢失数据。
(4)提高程序的执行速度。
子程序名标号参数读取温度子程序RE_TEMP 累加器A
温度数据处理子程序SET_DATA 无
按键扫描子程序P_KEY 无设定报警值TH、TL子程序SET_ALARM R5 菜单显示子程序LCD_PRINT 无
2、软件设计
2.1、主程序
主程序首先设置堆栈为5FH,设置定时器工作方式T1为方式2,设置串口方式。
接着开始启动定时器,调用LCD初始化子程序,调用DS18B20复位子程序去判断DS18B20是否存在,如果存在调用显示“success”子程序,接着调用上下限写入暂存器子程序,把EEROM 里的温度报警值拷贝回暂存器,调用读取温度子程序,调用处理显示子程序,调用实际温度值与标记温度值比较子程序,调用按键扫描子程序后返回到调用读取温度子程序;如果DS18B20不存在,则调用显示“wrong”信息子程序后返回到调用DS18B20复位子程序。
(1)流程图
(2)重要代码
2.2、键扫描子程序
按键扫描子程序首先判断按键K1是否按下,如果按下就掉用鸣响子程序,接着判断K1是否放开,直到K1放开,存M-ALAX表,调用显示字符子程序,然后去判断K3是否按下,直到K3按下,调用鸣响子程序,调用显示“OK”信息子程序,最后放回;如果K1没有按下去判断K2是否按下,如果没按下就跳到返回,如果有按下就调用鸣响子程序,然后去判断K3是否放开直到K3放开才存TA1表,接着调用显示字符子程序,调用设定报警TH、TL子程序,调用报警上下限写入暂存器子程序,调用报警值拷贝EEROM子程序,最后跳到调用显示“OK”信息子程序。
(1)流程图
2.3、LCD显示子程序
LCD显示子程序开始先让LCD初始化,接着光标定位,显示字符,最后放回。
(1)流程图
开始
LCD 初始化
光标定位
显示字符
结束
五、软硬件调试说明
1、硬件性能测试
(1)LCD 测试:通过单片机小系统将所需要的字符送给LCD,LCD能正常显示出所送内容,且LCD的亮度可调。
(2)按键与蜂鸣器:通过单片机小系统使蜂鸣器受按键的控制,即按下按键蜂鸣器响,放开即停。
(3)串口:先用串口调试助手,让单片机发出简单的字符,串口调试助手能正常接收到数据即可。
再将串口与VB相连接。
注意:串口硬件电路图的连接关键所在,首先串口是通过MAX232再与单片机连,在这MAX232的外围电路就相当重要,其外围要连接4个电解电容最好都用10UF的注意极性不要连反了。
其次串口的发送、接收要与MAX232的相对应。
当然单片机的发送、接收也同样要与MAX232的相对应。
最关键的是波特率的设置,单片机的波特率一定要与计算机的串口一样。
(4)硬件调试时存在的问题:串口的PC_RXD与PC_TXD接反,芯片MXA232的16脚没有接+5V的电源,15脚没有接地。
(5)解决办法:查阅串口原理图连接的相关资料,修改电路板。
(6)硬件的最终调试结果如下图1、图2、图3、图4所示。
图1、当实时温度超大于限值时的报警
图2、用串口与用VB语言编的界面相连接时当实时温度大于上限温度的报警
图3、当实时温度超小于限值时的报警
图4、用串口与用VB语言编的界面相连接时当实时温度小于上限温度的报警
2、软件性能测试
(1)软件性能测试时用Proteus将画好的仿真图调人用Keil编译后的Temp.hex文件,
开始仿真,测试每个按键的功能是否以及实时温度和上下限报警是否与预期计划的一致。
(2)软件性能测试结果如下图:
(3)软件性能测试存在的问题:实时温度的百位数字一致闪烁。
(4)解决办法:由于考虑平时的室温根本不会超过100摄氏度,做一将软件中的百位地址73H直接赋0。
六、课题开发总结
1、总结整个课题的任务完成情况,是否与预期规划的相符合,设计出来的作品性能如何、优缺点
本系统完成的与预期计划相吻合,预期所有功能基本实现,作品性能好,突出的优点是
本作品的硬件电路做的相当美观,且电路相当稳定,不仅实现了LCD的显示同样也很好的
在VB6.0人机界面上绘制出温度变化曲线,根据我们设定的上限报警温度和下线报警温度,
判断当前温度有无高温报警或低温报警,如果温度超限,则给出相应的报警信息。
并达到了
远程功能。
2、硬件宏观上的设计要点,达到的性能指标,存在的问题
硬件的设计要点,达到的性能指标与计划预期的一样,没有存在什么问题,可以说此硬
件做的相当完美。
3、软件宏观上的设计要点,达到的性能指标、开发编译工具和方法、存在的问题
(1)软件设计要点,达到的性能指标几乎达到计划预期的,在设计这个系统的过程还
学会了串口调试工具。
(2)整个电路的设计仿真过程中除了运用了单片机相关软件外还利用了以下软件
Multisim8:用于电路的设计与仿真
串口调试助手与模拟串口:用于串口的调试与仿真
VB6.0:用于数据的显示与显示温度变化的曲线
Protel:电路板的设计
七、用户操作说明
第一步:将电路板上的串口与电脑的串口相连接;
第二步:将电路板接上+5V的电源(此时电源指示灯会点亮,会在LCD1602上显示实时温
度,如图1所示);
第三步:在VB界面上点击打开串口(此时会在VB界面上显示实时温度,上限温度,下限
温度和实时温度变化的曲线,如图2所示)。
附:本系统有四个控制按键功能如下
K1:用于查看上下限温度与温度加减切换
K2:用于上限温度的调节
K3:用于下限温度的调节,并兼查看上下限温度时的返回
K4:设定好上限温度与下限温度时的确定键
如,当要调上限温度时:首先按下K2,再按K2时上限温度就加1,如果要减1就按下
切换按键K1,再按K2即变为减。
1、硬件设计的总电路原理图、PCB版图
2、元器件清单(器件名称、型号、在原理图中的编号)
器件名称型号原理图中的编号器件名称型号原理图中的编号电阻1K R1、R2 三级管9012 Q10
4.7K R8、R9 晶振12M Y1
10K R4~R6 温度传感器DS18B20 U3
200 R3 液晶LCD1602 U2 电容10uF C6~C9 单片机AT89S51 U1
20P C2、C3 MAX232 U2_MAX232
22uF C1、C4 串口JP4
104 C5 蜂鸣器BELL 排阻103 P0_Pull 按键RES、K1~K4
3、硬件电路板外观图片、PROTEUS仿真效果图3.1、硬件电路板外观图片
正面
背面
3.2、PROTEUS仿真效果图
;数字温度计汇编语言源程序如下:
;******************************温度值存放单元***************** TEMP_ZH EQU 24H ;实时温度值存放单元
TEMPL EQU 25H ;低温度值存放单元
TEMPH EQU 26H ;高温度值存放单元
TEMP_TH EQU 27H ;高温报警值存放单元
TEMP_TL EQU 28H ;低温报警值存放单元
TEMPHC EQU 29H ;存十位数的BCD码
TEMPLC EQU 2AH ;存个位数的BCD码
;****************************按键输入引脚定义****************** K1 EQU P1.0
K2 EQU P1.1
K3 EQU P1.2
K4 EQU P1.3
SPK EQU P3.7 ;蜂鸣器
ZF EQU 22H.1
X EQU 2FH ;设置显示位置
;****************************LCD控制引脚************************* RS EQU P2.0
RW EQU P2.1
E EQU P2.2
FLAG EQU 21H.0 ;温度传感器标志位
KEY_UD EQU 21H.1
DQ EQU P3.3 ;温度传感器数据采集口
; *****************************主程序******************************
ORG 0000H
LJMP MAIN
ORG 0023H
ORG 30H
MAIN: MOV SP,#5FH
MOV TMOD ,#20H ;定时器T1为方式2(自动再装入8位计数器)
MOV TH1,#0F3H ;设置定时器初值,
MOV TL1,#0F3H
MOV PCON,#00H
MOV SCON,#50H ;串口工作方式1,10为为1帧,REN=1允许接收
SETB TR1 ;定时器启动
MOV TEMP_TH,#27
MOV TEMP_TL,#20
ACALL SET_LCD ;LCD初始化设置子程序
TOOP: ACALL RESET_1820 ;调用18B20复位子程序
JNB FLAG,TOOP1 ;DS1820不存在,则跳转
ACALL XS_S ;调用显示"SUCCES"信息子程序
ACALL WR_THL ;将报警上下限写入暂存寄存器子程序
ACALL RE_THL ;把E2ROM里温度报警值拷贝回暂存器
JMP TOOP2
TOOP1: ACALL XS_WRONG ;显示"WRONG"信息
SJMP TOOP ;返回继续判断
TOOP2: ACALL RE_TEMP ;调用读取温度数据子程序
ACALL SET_DA TA ;调用处理显示温度数据子程序
ACALL TEMP_COMP ;实际温度值与标记温度值比较子程序
ACALL P_KEY ;调用按键扫描子程序
JMP TOOP2 ;循环
;;****************************读取温度数据子程序************************** RE_TEMP:
JNB FLAG,TOOP1 ;判断DS18B20是否存在?
ACALL RESET_1820 ;18B20复位子程序
MOV A,#0CCH ;跳过ROM匹配
ACALL WRITE_1820
MOV A,#44H ;发出温度转换命令
ACALL WRITE_1820
ACALL RESET_1820 ;调用复位子程序
MOV A,#0CCH ;跳过ROM匹配
ACALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
ACALL WRITE_1820
ACALL READ_1820 ;调用读取子程序
RET
;****************************温度数据处理显示子程序************************** SET_DATA:
ACALL CONV_TEMP ;处理温度BCD码子程序
ACALL DISP_BCD ;显示区BCD码温度值刷新子程序
ACALL CONV ;LCD显示子程序
MOV A,#0CBH ;设定第二行起始地址
ACALL TEMP_BJ ;显示温度标记"℃"
ACALL zhfu
RET
;****************************按键扫描子程序************************************ P_KEY: ;按键K1处理
JB K1, PK1 ;K1键未按,则跳转到PK1处
ACALL SPK_BZ ;K1键按下,发出一声响声
JNB K1, $ ;等按键放开
MOV DPTR, #M_ALAX1 ;存M_ALAX1表
MOV A, #1
ACALL LCD_PRINT ;显示字符
ACALL LOOK_ALARM ;显示信息区子程序
JB K3, $ ;等待K3按下(返回)
ACALL SPK_BZ ;发出一声响声
JMP PK2 ;转到标号PK2处
PK1: ;按键K2处理
JB K2, PK3 ;K2键未按,则跳转到PK3处
ACALL SPK_BZ ;K2键按下,发出一声响声
JNB K2, $ ;等键放开
MOV DPTR,#TA1 ;存#TA1表
MOV A, #01
ACALL LCD_PRINT ;显示字符
ACALL LOOK_ALARM ;调用显示信息区子程序
ACALL SET_ALARM ;设定报警值TH、TL
ACALL WR_THL ;将设定的TH,TL值写入DS18B20内
ACALL WRITE_E2 ;调用报警值拷贝E2ROM子程序
PK2: ACALL XS_S ;显示"OK"信息子程序
PK3: RET
TA1: ;菜单表
DB "SET ALERT DA TA",0H
;********************************设定报警值TH、TL子程序**************************
SET_ALARM:
A0: JB K1, A2 ;按下K1程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
JNB K1, $ ;等待放开
CPL KEY_UD ;UP/DOWN标记反向
A2: JB KEY_UD, A3 ;20H.1=1,UP,跳转到A3 JMP A8 ;20H.1=0,DOWN,跳转到A8
;TH值调整(增加)
A3: JB K2, A5 ;按下K2键,程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
INC TEMP_TH ;TH值调整(增加)
MOV A, TEMP_TH ;TH值送入A
CJNE A, #120, A4 ;TH值增到120,程序向下运行
MOV TEMP_TH, #0 ;TH值清0
A4: ACALL LOOK_ALARM ;调用显示信息区子程序MOV R5, #10
ACALL DELAY ;调用延时程序
JMP A3 ;循环
;TL值调整(增加)
A5: JB K3, A7 ;按下K3键程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
INC TEMP_TL ;TL值增加1
MOV A, TEMP_TL ;TL值送入A
CJNE A, #119, A6 ;比较,若A=99,程序向下运行
MOV TEMP_TL, #00H ;TL值清0
A6: ACALL LOOK_ALARM ;调用显示信息区子程序MOV R5, #10
ACALL DELAY ;调用延时程序
JMP A5 ;程序跳转到A5,循环
;确定调整OK
A7: JB K4, A0 ;按下K4键,程序向下运行ACALL SPK_BZ ;蜂鸣器响一声
JNB K4, $ ;等放开
RET
;TH值调整(减少)
A8: JB K2, A10 ;按下K2键,程序向下运行ACALL SPK_BZ ;蜂鸣器响一声
DEC TEMP_TH ;TH值减1
MOV A, TEMP_TH ;TH值送入A
CJNE A, #0FFH,A9 ;比较,若A=0FF,程序向下运行
JMP A12 ;跳转到A12
A9: ACALL LOOK_ALARM ;调用显示信息区子程序MOV R5, #10
ACALL DELAY ;调用延时子程序
JMP A0 ;跳转到A0
;TL值调整(减少)
A10: JB K3, A13 ;按K3键,程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
DEC TEMP_TL ;TL值减1
MOV A, TEMP_TL ;TH值送入A
CJNE A, #0FFH,A11 ;比较,若A=0FFH,程序向下运行
JMP A12 ;转移到A12
A11: A CALL LOOK_ALARM ;调用显示信息区子程序
MOV R5, #10
ACALL DELAY ;调用延时子程序
JMP A0 ;转移到A0
A12: CPL 20H.1 ;UP/DOWN标记反向
JMP A3 ;跳转到A3,TH值调整(增加)
A13: JMP A7 ;跳转到A7,确定调整OK
RET ;子程序返回
;********************************************菜单显示子程序******************* ;在LCD的第一行或第二行显示字符
LCD_PRINT:
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1:
ACALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置LCD的第一行地址
ACALL WR_COMM ;写入命令
JMP FILL
LINE2:
ACALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置LCD的第二行地址
ACALL WR_COMM ;写入命令
FILL:
CLR A
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1:
ACALL WR_DATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
;*****************************显示信息区子程序************************
LOOK_ALARM:
MOV DPTR,#M_ALAX2 ;存表
MOV A, #2 ;显示在第二行
ACALL LCD_PRINT ;调用显示字符子程序
MOV A,#0C6H ;显示起始地址第二行第7位
ACALL TEMP_BJ ;调用显示温度标记子程序
MOV A, TEMP_TH ;加载TH数据
MOV X, #3 ;设置位置
ACALL SHOW_LINE2H ;显示数据;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A, #0CEH ;设定显示起始地址为第二行第15位
ACALL TEMP_BJ ;调用显示温度标记子程序
MOV A,TEMP_TL ;加载TL数据
MOV X, #12 ;设置位置
ACALL SHOW_LINE2L ;显示数据
RET
M_ALAX1:
DB"LOOK TH","&","TL DATA",0H
M_ALAX2:
DB"TH: TL: ",0H
;*******************************在LCD的第二行显示高温数字******************** SHOW_LINE2H:
MOV B, #100 ;设置被除数,B为百位数
DIV AB ;除法运算,结果A存商数,B存余数
ADD A,#30H ;低半字节加30得到ASCII码
PUSH B ;B放入堆栈暂存起来
MOV B,X ;设置LCD显示的位置
ACALL LCDP2 ;由LCD显示出来;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
POP B ;B由堆栈取出来
MOV A, #0AH ;A赋值10
XCH A,B ;A,B数据互换,B为十位数
DIV AB ;除法运算,结果A存入商数,B存余数
ADD A, #30H ;转换为字符
INC X ;LCD显示位位置加1
PUSH B ;B放入堆栈暂存起来
MOV B,X ;设置LCD显示的位置
ACALL LCDP2 ;由LCD显示出来;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
POP B ;B由堆栈取出来
INC X ;LCD显示位位置加1
MOV A,B ;B为个位数
MOV B,X ;设置LCD显示的位置
ADD A, #30H ;转换为字符
ACALL LCDP2 ;由LCD显示出来
RET
;************************************-在LCD的第二行显示低温数字***************
SHOW_LINE2L:
MOV B, #100 ;设置被除数
DIV AB ;除法运算,结果A存商数,B存余数
MOV A, #0AH ;A赋值10
XCH A, B ;A、B数据互换,B为十位数
DIV AB ;除法运算,结果A存商数,B存余数
ADD A, #30H ;转换为字符
PUSH B ;B压入堆栈暂存起来
MOV B, X ;设置LCD显示的位置
ACALL LCDP2 ;由LCD显示出来;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
POP B ;B由堆栈取出来
INC X ;LCD显示位位置加1
MOV A, B ;B为个位数
MOV B, X ;设置LCD显示的位置
ADD A, #30H ;转换为字符
ACALL LCDP2 ;由LCD显示出来
RET
;**************************温度值比较子程序***********************
;实际温度值与标记温度值比较
TEMP_COMP:
MOV A,TEMP_TH ;高温报警值送入A
SUBB A,TEMP_ZH ;减数>被减数,则
JC TCL1 ;借位标志位C=1,转到TCL1
MOV A,TEMP_ZH ;实时温度送入A
SUBB A,TEMP_TL ;减数>被减数,则
JC TCL2 ;借位标志位C=1,转到TCL2
MOV DPTR,#BJ5 ;存表BJ5
ACALL TEMP_BJ3 ;调用显示高,低温度及加热标记子程序
RET
;**************************实时温度>高温报警值的处理程序****************** TCL1:
MOV DPTR,#BJ3 ;存入#BJ3表
ACALL TEMP_BJ3 ;调用显示高、低温度及加热标记子程序
ACALL SPK_BZ ;调用鸣响子程序
RET
TCL2: ;实时温度>高温报警值的处理程序
MOV DPTR,#BJ4 ;存入#BJ4表
ACALL TEMP_BJ3 ;调用显示高、低温度及标记子程序
ACALL SPK_BZ ;调用鸣响子程序
RET
;*************************显示高、低温度及加热标记程序*************** TEMP_BJ3:
MOV A, #0CEH ;设定显示位置
ACALL WR_COMM ;调用写指令子程序
MOV R1, #0 ;使指针指到表中第一个码
MOV R0, #2 ;取码次数
BJJ: MOV A, R1 ;A位0
MOVC A, @A+DPTR ;读取码
ACALL WR_DATA ;调用写数据子程序
INC R1 ;R1增加1
DJNZ R0,BJJ ;判断是否将代码读取完?
RET
BJ3:
DB ">H"
BJ4:
DB "<L"
BJ5:
DB "!"
;*********************报警上下线写入暂存器子程序*************** WR_THL:
JB FLAG,WR_T ; FLAG=1,表示DS18B20存在,转WR_T处
RET
WR_T:
ACALL RESET_1820 ;调用18B20复位子程序
MOV A, #0CCH ;跳过ROM匹配
ACALL WRITE_1820
MOV A, #4EH ;写暂存寄存器
ACALL WRITE_1820
MOV A,TEMP_TH ;TH(报警上限)
ACALL WRITE_1820
MOV A,TEMP_TL ;TL(报警下限)
ACALL WRITE_1820
MOV A, #7FH ;12位精确度
ACALL WRITE_1820
RET
;*********************报警值拷贝到EEROM子程序***************** WRITE_E2:
ACALL RESET_1820 ;调用18B20复位子程序
MOV A, #0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A, #48H ;[48H]为拷贝到EEROM子程序
LCALL WRITE_1820
RET
;************************报警值拷贝回暂存器子程序************** RE_THL:
ACALL RESET_1820 ;调用18B20复位子程序
MOV A, #0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器
ACALL WRITE_1820
RET
;*****************处理温度BCD码子程序************************ CONV_TEMP:
MOV A,TEMPH ; 判断温度是否零下
ANL A,#80H
JZ TC1 ; A为零,温度为正值,则转到TC1
;为负值;
CLR C ; C=0
setb ZF ;为1时,温度是负值
MOV A,TEMPL ;二进制数求补
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
JMP TC2
TC1: clr ZF ;为0时,温度是正值
MOV TEMPHC,#0AH
TC2: MOV A,TEMPHC
SWAP A ; 高低位交换
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;乘0.0625
MOV DPTR,#DOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ;TEMPLC ,低位为小数部分,BCD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,TEMPL ;整数部分
ANL A,#0F0H ;取出高4位
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH ;取出低4位
SWAP A ;高低位交换
ORL A,TEMPL ;重新组合
MOV TEMP_ZH,A
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H ;取出高4位
SWAP A ;高低位交换
ORL A,TEMPHC ;TEMPHC,低位为十位值,BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;取出低4位
SWAP A ;高低位交换
ORL A,TEMPLC ;TEMPLC,高位存个位值,BCD
MOV TEMPLC,A
MOV A,R4
JZ TC3 ;百位不为0往下执行
ANL A,#0FH ;取出低4位
SWAP A
MOV R4,A ;
MOV A,TEMPHC ;TEMPHC 高位为百位值,BCD
ANL A,#0FH ;取出TEMP的十位值
ORL A,R4
MOV TEMPHC,A ;存十、百位值
TC3: RET
;**************************显示区BCD 码温度值刷新子程序************ DISP_BCD:
MOV A,TEMPLC ;个位数BCD码送入A
ANL A,#0FH ;取低位码
MOV 70H,A ;小数位值
MOV A,TEMPLC
SWAP A ;高低位交换
ANL A,#0FH ;取结果数的高位
MOV 71H,A ;个位值
MOV A,TEMPHC
ANL A,#0FH ;取低位码
MOV 72H,A ;十位值
MOV A,TEMPHC
SWAP A ;高低位交换
ANL A,#0FH;
MOV 73H,A ;百位值
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#010H,DI0 ;判断百位是否为0,是跳
MOV 73H,A ;如果百位为1
JMP DI2
DI0: MOV A,TEMPHC ;百位为0时,下...
ANL A,#0FH ;取十位值
JNZ DI2 ;十位是0时,往下执行
MOV A,TEMPLC
SWAP A
ANL A,#0FH ;取结果数的高位
MOV 73H,#20h ;符号位不显示
MOV 72H,#0 ;十位数显示符号
DI2: lcall send1
RET
HEX2BCD1:
MOV B,#100 ; 十六进制转BCD
DIV AB
MOV R4,A ;R4 为百位数
MOV A,#0AH
XCH A,B
DIV AB
SWAP A ;高低位交换
ORL A,B
RET
;小数部分码表
DOTTAB:
DB 00H,00H,01H,01H,02H,03H,03H,04H
DB 05H,05H,06H,06H,07H,08H,08H,09H
;**************************************DS18B20复位初始化子程序************* RESET_1820:
SETB DQ
NOP
CLR DQ
;主机发出延时537us的复位脉冲
MOV R1,#3
DL Y: MOV R0,#107
DJNZ R0,$
DJNZ R1,DL Y
;------------------------------
SETB DQ ;然后拉高数据线
NOP
NOP
NOP
;等待DS18B20回应
MOV R0,#25H
T2: JNB DQ,T3 ;0时跳
DJNZ R0,T2
JMP T4
;置标志位FLAG=1,表示DS18B20存在
T3: SETB FLAG
JMP T5
;清标志位FLAG=0,表示DS18B20不存在
T4: CLR FLAG
JMP T7
;时序要求延时一段时间
T5: MOV R0,#117
T6: DJNZ R0,T6
T7: SETB DQ
RET
;*****************************写入DS18B20子程序***************************** ;写入DS18B20
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C ;C=0
WR1:
CLR DQ ; 总线低位,开始写入
MOV R3,#6
DJNZ R3,$ ;保持16us以上
RRC A ; 把字节DATA分成8位,环移给C
MOV DQ,C ;写入一个位
MOV R3,#23
DJNZ R3,$ ;等待
SETB DQ ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一个位
SETB DQ ;释放总线
RET
;-********************************读出DS18B20子程序*********************** ;将温度值从DS18B20中读出
READ_1820:
MOV R4,#4
MOV R1,#TEMPL ;存入25H 26H 27H 28H
RE0:
MOV R2,#8 ;数据一共有8位
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ ;总线释放
MOV R3,#9
DJNZ R3,$
MOV C,DQ ; 从总线读到一个位
MOV R3,#23 ;
DJNZ R3,$ ;等待50us
RRC A ;把读得的位环移给A
DJNZ R2,RE1 ; 读下一个位
MOV @R1,A
INC R1 ;R1内数据递增
DJNZ R4,RE0
RET
;*******************************LCD1602显示程序*********************** ;初始化设置
SET_LCD:
CLR E
ACALL INIT_LCD ;初始化LCD
ACALL SELF_DATA ;将自定义字符存入LCD的CGRAM
RET
;*****************************LCD初始化子程序********************* INIT_LCD:
MOV A,#38H ;设置显示模式(8位、2行、5*7点阵)
ACALL WR_COMM
ACALL DELAY1
MOV A,#0CH ;显示开关及光标的设置(开显示,光标关,字符不闪烁) ACALL WR_COMM
ACALL DELAY1
MOV A,#01H ;清除LCD显示屏
ACALL WR_COMM
ACALL DELAY1
RET
;******************************LCD显示子程序*********************** CONV:
MOV 73h,#30h
mov A,73h ;加载百位数据
MOV X,#6 ;设置显示位置
CJNE A,#1,CO1
JMP CO2
CO1: MOV B,X
ACALL LCDP2 ;显示第二行
JMP CO3
CO2:
ACALL SHOW_LINE2 ;显示数据
CO3: INC X ;位加1
MOV A,72H ;十位
ACALL SHOW_LINE2 ;显示数据
INC X ;位加1
MOV A,71H ;个位
ACALL SHOW_LINE2 ;显示数据
INC X
MOV A,#'.'
MOV B,X
ACALL LCDP2 ;显示字符
MOV A,70H ;加载小数点位
INC X ;设置位置
ACALL SHOW_LINE2 ;显示数据
RET
;**************************显示第二行**************************
;在LCD的第二行显示数字
SHOW_LINE2:
ADD A,#30H
MOV B,X
ACALL LCDP2
RET
LCDP2: PUSH ACC ;压入堆栈
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
ACALL WR_COMM ; 写入命令
POP ACC ;由堆栈取出A
ACALL WR_DATA ;写入数据
RET
;******************************写指令子程序****************************** WR_COMM:
MOV P0,A ;写入指令
CLR RS ;RS=0,选择指令寄存器
CLR RW ;RW=0,选择写模式
SETB E ;E=1,允许读写LCM
ACALL DELAY1 ;延时5ms
CLR E ;E=0,禁止读写LCM
RET
;*****************************写数据子程序***************************** WR_DATA:
MOV P0,A ;写入数据
SETB RS ;RS=1,选择数据寄存器
CLR RW ; RW=0,选择写模式
SETB E ;E=1,允许读写LCM
ACALL DE ;延时0.5ms
CLR E ;E=0,禁止读写LCM
ACALL DE ;延时0.5ms
RET
;******************************清除LCD的字符*********************
CLR_LINE: MOV A,#0C0H ;设置LCD的第一行字符
ACALL WR_COMM ;调用写指令子程序
MOV R0,#24 ;设置计数器。