课程设计任务书
题 目:基于DS18B20的多点温度采集系统设计(LCD)
系(部): 信息科学与电气工程学院
实习地点:
班 级:
学生姓名: 学号:
指导教师:
时间:2012年 月 日 到2012年 月 日
山 东 交 通 学 院
1
摘要
单片机已在各行业得到广泛应用,为适应更多的应用领域,厂家采取了在一块单片机芯片上集成多种功能部件和大容量存储器的方法。因而,整个应用系统不需要扩展,而体积变小、可靠性增高,使单片机成为真正意义上的单片机系统。
本设计是基于STCC52单片机和DS185B20实现温度的测量系统,单片机在本系统中作为温度输入和显示控制器件,DS18B20被用作温度数据的采集和温度输出器件。本系统采用单总线操作,线路简单,测量值精确,可实现多点测量,并对温度超过值,产生报警和数据采集。本系统被广泛应用于温度控制、温度检测、温度采、消防等系统中。
关键词 单片机;数据转换;温度显示;
2
目录
一.课程设计总体说明---------------------------------------1 1.1目的----------------------------------------------------------------------1 1.2基本功能----------------------------------------------------------------1 1.3扩展功能----------------------------------------------------------------1 1.4课题所达到的功能目标------------------------------1 1.5单片机的选择--------------------------------------1
二.硬件系统说明-------------------------------------------2
1硬件总体设计方案------------------------------------2
1.1硬件设计目标-------------------------------------2
1.2硬件功能模块划分---------------------------------2
1.3主控芯片和关键元器件的选型、接口和引脚介绍-------2
2.软件设计----------------------------------------------6
2.1流程图-------------------------------------------6
三.软件调试说明-------------------------------------------7
1.软件性能测试---------------------------------------7
四.课题开发总结------------------------------------------10
3
五.用户操作说明-----------------------------------------11
六.参考资料----------------------------------------------------------------11
附录:程序-----------------------------------------------------------------12
4
一、课题总体设计说明
1.1、目的
(1)本实验要实现的是通过DS18B20温度传感器采集温度并在LCD上显示,并学会使用单片机控制DS18B20此类单总线器件,并对数字温度传感器DS18B0进行时序分析。
(2)更进一步了解LCD1602的应用。 (3)掌握单片机与PC的远程通信。
1.2、基本功能
(1)以数字传感器DS1820作为前端采集温度,经过单片机处理后,将外部
的温度显示在液晶屏上。
(2)可用通过式按键来设定温度的上限值和下限值,当坏境温度超过上限值或低于下限值时会自动提示,并在液晶屏上提示温度大于上限值或温度小于下限值。
(3)当单片机检测到DS18B20存在时会在在LCD1602上显示“DS18B20 Succes”,反之则显示“DS18B20 is Wrong,TEMP is No on”。
1.3、扩展功能
以数字传感器DS1820作为前端采集温度,经过单片机处理后,再通过串口通信,把实时温度值、上限值和下限值显示在用VB语言编辑的计算机软件的界面上并显示出实时温度的变化曲线,当实时温度超过所设定的上限值和下限值时会在用VB语言编辑的计算机软件的界面上提示当前温度超过上限值或下限值,模拟实现设备与计算机的通信,通过计算机对设备的温度检测以及实时监控。
1.4、课题所达到的功能目标
(1)能在LCD1602上准确的显示出实时温度;
(2)式按键能设置报警温度的上限值、下限值和查看所设定的上限值、下限值;
(3)当温度大于上限值或低于下限值时在液晶屏上自动提示;
(4)通过串口和PC机连接,能够把实时温度值、上限值和下限值显示在用VB语言编辑的计算机软件的界面上并显示出实时温度的变化曲线,当实时温度超过所设定的上限值和下限值时会在用VB语言编辑的计算机软件的界面上提示当前温度超过上限值或下限值。
1.5、单片机的选择
本系统采用了51单片机,其体积小巧,携带方便,价格便宜。且USB接口
1
通讯及供电,通讯速度快,无须外接电源。 51单片机有一个全双工的串通信口,非常适合与电脑进行通信。
二、硬件设计说明 1、 硬件总体设计方案 1.1、硬件设计目标
本系统中通过温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机出来后,显示在8位数据线与单片机P0口的液晶LCD上。,当坏境温度超过上限值或低于下限值时会自动提示,并在液晶屏上提示温度大于上限值或温度小于下限值。4个按键K1~K4接到单片机的P1.0~P1.4,来实现对上限值和下限值的查看与设定。串口经过MAX232的电平转换后R1 OUT和T1 IN接到单片机的RXD与TXD来实现与用VB
—语言编辑的计算机软件的界面间的通信。液晶LCD的RS、R/W、E分别接到单片机的P2.0~P2.2来实现单片机控制液晶的读写命令和数据的控制。
1.2、硬件功能模块划分
控制模块 (1)ATS51:实现对整个系统的控制。
(2)DS18B20、LCD1602:温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机处理后,显示在8位数据线与单片机P0口的液晶LCD上。
(3)按键输入:对报警温度上限值TH和下限值TL的设置。
(4)串口通信:实现与与用VB语言编辑的计算机软件的界面间的通信。
温度检测模块 显示模块 主控芯片 通信模块 1.3、主控芯片和关键元器件的选型、接口和连接方式定义 1.3.1、主控芯片和关键元器件的选型
(1)主控芯片:ATS51 (2)温度采集:DS18B20 (3)按键:式按键(K1~K4)
2
(4)显示:LCD1602
(5)串口:通过MAX232与单片机的10脚11脚相连
1.3.1.1 、ATS51引脚结构,见图1-1
图1-1单片机封装及引脚结构
引脚功能说明:
VCC:供电电压。 GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为ATC51的一些特殊功能口,如下表所示: 口管脚 备选功
3
能
P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。
1.3.1.2、 DS18B20数字温度传感器介绍
功能介绍
DALLAS最新单线数字温度传感器DS18B20的“一线器件”体积更小、适用
电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。DS18B20、 DS1822 “一线总线”字化温度传感器 同DS1820一样,DS18B20也 支持“一线总线”接口,测量温度范围为 -55°C~+125°C,-10~+85°C范围内,精度为±0.5°C。DS1822的精度较差为± 2°C 。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更
4
小。 DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。可选更小的方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电依然保存。DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822DS18B20软件兼容,是DS18B20的简化版本。省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。 继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。DS18B20的内部结构DS18B20内部结构主要由四部分组成:位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如下: DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。光刻ROM中的位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位,见表2-1。
表2-1DS18B20内部温度表示形式
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。见表2-2
表2-2DS18B20转化温度形式
实际温度值 +125℃ +85℃
数字输出(二进制) 0000 0111 1101 0000 0000 0101 0101 0000
数字输出(十六进制)
07D0H 0550H
5
+25.0625℃ +10.125℃ +0.5℃ 0℃ -0.5℃ -10.125℃ -25.0625℃ -55℃
0000 0001 1001 0001 0000 0000 1010 0010 0000 0000 0000 1000 0000 0000 0000 0000 1111 1111 1111 1000 1111 1111 0101 1110 1111 1110 0110 1111 1111 1100 1001 0000
0191H 00A2H 0008H 0000H FFF8H FF5EH FE6EH FC90H
1.3.2、接口和连接方式定义
(1)液晶LCD1602的数据和指令选择控制端RS接到单片机的P2.0,读写控制
—R/W接到单片节的P2.1,数据读写控制位E接到单片机的P2.2,8位数据线
DB0~DB7接到单片机的P0口。
(2)4个按键K1~K4分别接到单片机的P1.0~P1.3。 (3) DS18B20的DQ接到单片机的P3.3.
2、软件设计
(1)流程图
6
三、软件调试说明
1、软件性能测试
(1)软件性能测试时用Proteus将画好的仿真图调人用Keil编译后的
Temp.hex文件,开始仿真,测试每个按键的功能是否以及实时温度和上下限报警是否与预期计划的一致。
7
(2)软件性能测试结果如下图:
8
9
四、课题开发总结
1、总结整个课题的任务完成情况,是否与预期规划的相符合,
设计出来的作品性能如何、优缺点
10
本系统完成的与预期计划相吻合,预期所有功能基本实现,作品性能好,突出的优点是本作品的硬件电路做的相当美观,且电路相当稳定,不仅实现了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即变为减。
六、参考资料
单片机原理及应用教程 范立南 2006年 1 月
单片机原理及应用教程 刘瑞新 2003年 07月
11
附:程序:
TEMP_ZH EQU 24H ;实测温度值存放单元 TEMPL EQU 25H TEMPH EQU 26H
TEMP_TH EQU 27H ;高温报警值存放单元 TEMP_TL EQU 28H ;低温报警值存放单元 TEMPHC EQU 29H ;正、负温度值标记 TEMPLC EQU 2AH
TEMPFC EQU 2BH K1 EQU P1.4 ;查询按键 K2 EQU P1.5 ;设置/调整键 K3 EQU P1.6 ;调整键 K4 EQU P1.7 ;确定键 BEEP EQU P3.7
RELAY EQU P1.3 ;指示灯
LCD_X EQU 2FH ;LCD 字符显示位置 LCD_RS EQU P2.0 ;LCD 寄存器选择信号 LCD_RW EQU P2.1 ;LCD 读写信号 LCD_EN EQU P2.2 ;LCD 允许信号
FLAG1 EQU 20H.0 ;DS18B20是否存在标志 KEY_UD EQU 20H.1 ;设定按键的增、减标志 DQ EQU P3.3 ;DS18B20数据信号 ORG 0000H LJMP MAIN ORG 0030H 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 SET_LCD LCALL RE_18B20 START: LCALL RST ;调用18B20复位子程序 JNB FLAG1,START1 ;DS1820不存在 LCALL MENU_OK ;DS1820存在,调用显示正确信息子程序 MOV TEMP_TH,#055H ;设置TH初值85度 MOV TEMP_TL,#019H ;设置TL初值25度 LCALL RE_18B20A ;调用暂存器操作子程序 LCALL WRITE_E2 ;写入DS18B20 LCALL TEMP_BJ ;显示温度标记 JMP START2
START1: LCALL MENU_ERROR ;调用显示出错信息子程序 LCALL TEMP_BJ ;显示温度标记 SJMP $
START2: LCALL RST ;调用DS18B20复位子程序 JNB FLAG1,START1 ;DS18B20不存在 MOV A,#0CCH ;跳过ROM匹配命令 LCALL WRITE
MOV A,#44H ;温度转换命令 LCALL WRITE LCALL RST
MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE
MOV A,#0BEH ;读温度命令 LCALL WRITE LCALL READ ;调用DS18B20数据读取操作子程序 LCALL CONVTEMP ;调用温度数据BCD 码处理子程序 LCALL DISPBCD ;调用温度数据显示子程序 LCALL CONV ;调用LCD显示处理子程序
12
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 K2,$
MOV DPTR,#RST_A1 MOV A,#1
LCALL LCD_PRINT LCALL SET_ALARM
LCALL RE_18B20 ;将设定的TH,TL值写入DS18B20 LCALL WRITE_E2 PROC_K2: LCALL MENU_OK LCALL TEMP_BJ PROC_END:RET
;*************************** 设定温度报警值 TH、TL *************************** SET_ALARM:LCALL LOOK_ALARM AS0: JB K1,AS00
LCALL BEEP_BL JNB K1,$
CPL 20H.1 ;UP/DOWN 标记 AS00: JB 20H.1,ASZ01 ;20H.1=1,增加 JMP ASJ01 ;20H.1=0,减小 ASZ01: JB K2,ASZ02 ;TH值调整(增加) LCALL BEEP_BL INC TEMP_TH MOV A,TEMP_TH CJNE A,#120,ASZ011 MOV TEMP_TH,#0
ASZ011: LCALL LOOK_ALARM MOV R5,#10 LCALL DELAY JMP ASZ01
ASZ02: JB K3,ASZ03 ;TL值调整(增加) LCALL BEEP_BL INC TEMP_TL MOV A,TEMP_TL CJNE A,#99,ASZ021 MOV TEMP_TL,#00H
ASZ021: LCALL LOOK_ALARM MOV R5,#10 LCALL DELAY JMP ASZ02
ASZ03: JB K4,AS0 ;确定调整 LCALL BEEP_BL JNB K4,$ RET
ASJ01: JB K2,ASJ02 ;TH值调整(减少) LCALL BEEP_BL DEC TEMP_TH MOV A,TEMP_TH
13
CJNE A,#0FFH,ASJ011 JMP ASJ022
ASJ011: LCALL LOOK_ALARM MOV R5,#10 LCALL DELAY JMP AS0
ASJ02: JB K3,ASJ03 ;TL值调整(减少) LCALL BEEP_BL DEC TEMP_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
;*********************** 实测温度值与设定温度值比较子程序 ********************** TEMP_COMP:MOV A,TEMP_TH
SUBB A,TEMP_ZH ;减数>被减数,则 JC CHULI1 ;借位标志位C=1,转 MOV A,TEMPFC CJNE A,#0BH,COMP SJMP CHULI2 COMP: MOV A,TEMP_ZH
SUBB A,TEMP_TL ;减数>被减数,则 JC CHULI2 ;借位标志位C=1,转 MOV DPTR,#BJ5 LCALL TEMP_BJ3
CLR RELAY RET
CHULI1: MOV DPTR,#BJ3 LCALL TEMP_BJ3
SETB RELAY LCALL BEEP_BL RET
CHULI2: MOV DPTR,#BJ4 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: DB \">H\" BJ4: DB \" 14 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 \" DS18B20 OK \M_OK2: DB \" TEMP: \ ;******************************** 显示出错信息子程序 *************************** MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息 MOV A,#1 ;显示在第一行 LCALL LCD_PRINT MOV DPTR,#M_ERROR2 ;指针指到显示消息1 MOV A,#2 ;显示在第一行 LCALL LCD_PRINT RET M_ERROR1: DB \" DS18B20 ERROR \M_ERROR2: DB \" TEMP: ---- \ ;****************************DS18B20复位子程序 ***************************** RST: SETB DQ NOP CLR DQ MOV R0,#6BH ;主机发出延时复位低脉冲 MOV R1,#04H TSR1: DJNZ R0,$ MOV R0,#6BH DJNZ R1,TSR1 SETB DQ ;拉高数据线 NOP NOP NOP MOV R0,#32H TSR2: JNB DQ,TSR3 ;等待DS18B20回应 DJNZ R0,TSR2 JMP TSR4 ; 延时 TSR3: SETB FLAG1 ; 置1标志位,表示DS1820存在 JMP TSR5 TSR4: CLR FLAG1 ; 清0标志位,表示DS1820不存在 JMP TSR7 TSR5: MOV R0,#06BH TSR6: DJNZ R0,$ ; 时序要求延时一段时间 TSR7: SETB DQ RET ;************************ DS18B20暂存器操作子程序 *************************** RE_18B20:JB FLAG1,RE_18B20A RET 15 RE_18B20A: LCALL RST MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE WR_SCRAPD: 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:LCALL RST MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE MOV A,#48H ;把暂存器里的温度报警值拷贝到EEROM LCALL WRITE RET ;*********************** 重读EEROM子程序 ******************************** READ_E2:LCALL RST MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE MOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器 LCALL WRITE RET ;************************ 将自定义字符写入LCD的CGRAM中 ********************* STORE_DATA: MOV A,#40H 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 ;一共8位数据 CLR C WR1: CLR DQ ;开始写入DS18B20总线要处于复位(低)状态 MOV R3,#07 DJNZ R3,$ ;总线复位保持16微妙以上 RRC A ;把一个字节DATA 分成8个BIT环移给C MOV DQ,C ;写入一位 MOV R3,#3CH DJNZ R3,$ ;等待100微妙 SETB DQ ;重新释放总线 NOP DJNZ R2,WR1 ;写入下一位 SETB DQ RET ;********************** DS18B20数据读取操作子程序 ************************** READ: MOV R4,#4 ;将温度低位、高位、TH、TL从DS18B20中读出 16 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总线读得一位 MOV R3,#3CH DJNZ R3,$ ;等待100微妙 RRC A ;把读得的位值环移给A DJNZ R2,RE01 ;读下一位 MOV @R1,A INC R1 DJNZ R4,RE00 RET ;************************ 温度值 BCD 码处理子程序 ************************* CONVTEMP: MOV A,TEMPH ;判温度是否零下 ANL A,#08H JZ TEMPC1 ;温度零上转 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 MOV TEMPHC,#0BH ;负温度标志 MOV TEMPFC,#0BH SJMP TEMPC11 TEMPC1: MOV TEMPHC,#0AH ;正温度标志 MOV TEMPFC,#0AH TEMPC11: MOV A,TEMPHC SWAP A MOV TEMPHC,A MOV A,TEMPL ANL A,#0FH ;乘0.0625 MOV DPTR,#TEMPDOTTAB MOVC A,@A+DPTR MOV TEMPLC,A ;TEMPLC LOW=小数部分 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 LCALL HEX2BCD1 MOV TEMPL,A ANL A,#0F0H SWAP A ORL A,TEMPHC ;TEMPHC LOW = 十位数 BCD 17 MOV TEMPHC,A MOV A,TEMPL ANL A,#0FH SWAP A ;TEMPLC HI = 个位数 BCD ORL A,TEMPLC MOV TEMPLC,A MOV A,R4 JZ TEMPC12 ANL A,#0FH SWAP A MOV R4,A MOV A,TEMPHC ;TEMPHC HI = 百位数 BCD ANL A,#0FH ORL A,R4 MOV TEMPHC,A TEMPC12: RET ;************************ 二-十进制转换子程序 ***************************** HEX2BCD1: MOV B,#0H DIV AB MOV R4,A MOV A,#0AH XCH A,B DIV AB SWAP A ORL A,B RET TEMPDOTTAB: DB 00H,00H,01H,01H,02H,03H,03H,04H ; 小数部分码表 DB 05H,05H,06H,06H,07H,08H,08H,09H ;********************** 查询温度报警值子程序 *************************** LOOK_ALARM: MOV DPTR,#M_ALAX2 ;指针指到显示信息区 MOV A,#2 ;显示在第二行 LCALL LCD_PRINT MOV A,#0C6H LCALL TEMP_BJ1 MOV A,TEMP_TH ;加载TH数据 MOV LCD_X,#3 ;设置显示位置 LCALL SHOW_DIG2H ;显示数据 MOV A,#0CEH LCALL TEMP_BJ1 MOV A,TEMP_TL ;加载TL数据 MOV LCD_X,#12 ;设置显示位置 LCALL SHOW_DIG2L ;显示数据 RET M_ALAX1: DB \" LOOK ALERT CODE\M_ALAX2: DB \"TH: TL: \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 A,#30H 18 PUSH B MOV B,LCD_X LCALL LCDP2 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 DIV AB ADD A,#30H 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 ;************************ 显示区 BCD 码温度值刷新子程序 ********************** DISPBCD: MOV A,TEMPLC 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 ;百位 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 19 CONV11: MOV A,#\" \" ;\"+\"号不显示 CONV111: MOV B,LCD_X LCALL LCDP2 JMP CONV3 CONV2: LCALL SHOW_DIG2 ;显示数据 CONV3: 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 ;*************************** 第二行显示数字子程序 ************************* LCDP2: PUSH ACC MOV A,B ;设置显示地址 ADD A,#0C0H ;设置LCD的第二行地址 LCALL WCOM ;写入命令 POP ACC ;由堆栈取出A LCALL WDATA ;写入数据 RET ;*************************** 对 LCD 做初始化设置及测试************************* SET_LCD: CLR LCD_EN LCALL INIT_LCD ;初始化 LCD LCALL STORE_DATA ;将自定义字符存入LCD的CGRAM RET ;****************************** LCD初始化 *********************************** INIT_LCD: MOV A,#38H ;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 ;清除 LCD 显示屏 LCALL WCOM LCALL DELAY1 RET ;***************************** 清除LCD的第一行字符 ************************** CLR_LINE1:MOV A,#80H ;设置 LCD 的第一行地址 LCALL WCOM MOV R0,#24 ;设置计数值 20 C1: MOV A,#' ' ;载入空格符至LCD LCALL WDATA ;输出字符至LCD DJNZ R0,C1 ;计数结束 RET ;************************* LCD的第一行或第二行显示字符 ********************** LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行 LINE1: MOV A,#80H ;设置 LCD 的第一行地址 LCALL WCOM ;写入命令 LCALL CLR_LINE ;清除该行字符数据 MOV A,#80H ;设置 LCD 的第一行地址 LCALL WCOM ;写入命令 JMP FILL LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址 LCALL WCOM ;写入命令 LCALL CLR_LINE ;清除该行字符数据 MOV A,#0C0H ;设置 LCD 的第二行地址 LCALL WCOM FILL: CLR A ;填入字符 MOVC A,@A+DPTR ;由消息区取出字符 CJNE A,#0,LC1 ;判断是否为结束码 RET LC1: LCALL WDATA ;写入数据 INC DPTR ;指针加1 JMP FILL ;继续填入字符 RET ;*************************** 清除1行 LCD 的字符 **************************** CLR_LINE: MOV R0,#24 CL1: MOV A,#' ' LCALL WDATA DJNZ R0,CL1 RET DE: MOV R7,#250 DJNZ R7,$ RET ;**************************** LCD 间接控制方式命令写入 ************************* WCOM: MOV P0,A ;写入命令 CLR LCD_RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲 CLR LCD_RW SETB LCD_EN LCALL DELAY1 CLR LCD_EN RET ;**************************** LCD 间接控制方式数据写入 ************************* WDATA: MOV P0,A ;写入数据 SETB LCD_RS CLR LCD_RW SETB LCD_EN LCALL DE CLR LCD_EN LCALL DE RET ;************************** 在LCD的第一行显示字符 ************************** LCDP1: PUSH ACC MOV A,B ;设置显示地址 ADD A,#80H ;设置LCD的第一行地址 LCALL WCOM ;写入命令 POP ACC ;由堆栈取出A LCALL WDATA ;写入数据 RET 21 ;****************************** 声光报警子程序 ******************************* BEEP_BL: MOV R6,#100 BL2: LCALL DEX1 CPL BEEP CPL RELAY DJNZ R6,BL2 MOV R5,#10 LCALL DELAY RET DEX1: MOV R7,#180 DE2: NOP DJNZ R7,DE2 RET ;****************************** 延时子程序 ******************************* DELAY: MOV R6,#50 DL1: MOV R7,#100 DJNZ R7,$ DJNZ R6,DL1 DJNZ R5,DELAY RET DELAY1: MOV R6,#25 ;延时5毫秒 DL2: MOV R7,#100 DJNZ R7,$ DJNZ R6,DL2 RET END 22
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- vipyiyao.com 版权所有 湘ICP备2023022495号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务