DS18B20+DS1302项目报告

合集下载

基于DS18B20温控实验报告

基于DS18B20温控实验报告

基于DS18B20温控实验报告一、实验目的:温湿度与生产及生活密切相关。

像仓库、农田、生产过程,温度变化会影响品质;精密仪器、半导体器件,过温而导致性能降低,另外,人们的生活质量提高,对室内环境的高要求也需要对温度的适时监控,可见,温度传感器的应用范围是很广的。

而在日常生活中,温度,尤其是水温的测控尤为重要,婴儿奶瓶,热水壶等等一系列产品对温度测控的需求相当的迫切。

虽然市面上已经有许多成品测温仪器,但我们希望,通过自己的努力,能够作出一款功能齐全,制作简单的温度测控仪器。

希望能在在精进学识的同时培养我们的动手能力。

二、设计要求:1.基本要求1)测量温度范围0℃~100℃2)精度△℃0.125℃3)显示测量温度4)自动控制温度2.发挥部分1)能够设定温度上下限,若温度超过预定范围,应能报警2)能自动将温度控制在限定的范围内三、资料准备:2.1 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的电压范围,使系统设计更灵活、方便。

而且新一代产品更便宜,体积更小。

温度传感器ds18b20实验报告

温度传感器ds18b20实验报告

温度传感器ds18b20实验报告温度传感器DS18B20实验报告引言温度传感器在现代生活中扮演着重要的角色,它们被广泛应用于各种领域,包括工业、医疗、农业等。

DS18B20是一种数字温度传感器,具有精准的测量能力和数字输出,因此备受青睐。

本实验旨在通过对DS18B20温度传感器的测试和分析,探讨其性能和应用。

实验目的1. 了解DS18B20温度传感器的工作原理和特性。

2. 测试DS18B20温度传感器的测量精度和响应速度。

3. 探讨DS18B20温度传感器在实际应用中的优缺点。

实验器材1. DS18B20温度传感器2. Arduino开发板3. 4.7kΩ电阻4. 连接线5. 电脑实验步骤1. 将DS18B20温度传感器连接到Arduino开发板上,并接入4.7kΩ电阻。

2. 编写Arduino程序,通过串口监视器输出DS18B20传感器的温度数据。

3. 将DS18B20传感器置于不同的温度环境中,记录其输出的温度数据。

4. 分析DS18B20传感器的测量精度和响应速度。

5. 探讨DS18B20传感器在实际应用中的优缺点。

实验结果经过实验测试,DS18B20温度传感器表现出了较高的测量精度和响应速度。

在不同温度环境下,其输出的温度数据与实际温度基本吻合,误差较小。

此外,DS18B20传感器具有数字输出,易于与各种微控制器和单片机进行连接,应用范围广泛。

然而,DS18B20传感器在极端温度环境下可能出现测量误差,且价格较高,需要根据实际需求进行选择。

结论DS18B20温度传感器具有较高的测量精度和响应速度,适用于各种温度测量场景。

然而,在选择和应用时需要考虑其价格和适用范围,以确保满足实际需求。

希望本实验能够为DS18B20温度传感器的应用提供参考和借鉴,推动其在各个领域的发展和应用。

温度(温度传感器ds18b20)控制系统(水温) 带ds1302时间显示 lcd1602显示

温度(温度传感器ds18b20)控制系统(水温) 带ds1302时间显示   lcd1602显示
delay(12);
if(k4==0)
{
(times[4])--;
if((times[4])==0x00)
{(times[4])=0x12;}
}
write_1302(0x88,times[4]);
}
break;
case 4:
{
if(k3==0);
delay(12);
if(k3==0)
{
(times[6])++;
}
/************************************************************/
void rdtemp(void)
{
txreset();
rxwait();
delay_b(1);//延时
wrbyte(0xcc);
wrbyte(0xbe);
tpl=rdbyte();
}
write_1302(0x82,times[1]);
}
break;
case 1:
{
if(k3==0);
delay(12);
if(k3==0)
{
(times[2])++;
if((times[2])==0x24)
{(times[2])=0x00;}
write_1302(0x84,times[2]);
}
void delay(uint z)
{
uint i,j;
for(i=0;i<=z;i++)
for(j=0;j<=500;j++);
}
void keycan()
{
if(k2==0);

大三上课设实验(DS18B20)报告

大三上课设实验(DS18B20)报告

简易温度测量仪班级:0120902队员:指导老师:摘要温度测量仪主要有以DS18B20为核心的温度采集电路,以蜂鸣器为核心的报警电路以及学习板电路三部分电路构成。

软件实现方面包括三个模块:温度采集模块、报警模块、按键与显示模块。

本温度测试仪采用数码管显示温度测试范围0~+125℃,可实现两点温度测量、摄氏温度华氏温度相互转换、设置温度显示精度、设置报警温度上下限、蜂鸣器报警等五个功能。

关键词:温度测量仪 DS18B20 蜂鸣器分辨率多点测量目录目录……………………………………………………1第一章设计目的 (3)第二章方案的选取 (3)第三章DS18B20测温电路系统设计要求 (4)第四章DS18B20测温电路系统设计 (5)1.DS18B20测温电路的组成框图 (5)2. DS18B20的简介 (5)2.1 DS18B20的内部结构 (6)2.2 DS18B20的工作过程及时序 (7)3. 系统硬件电路 (10)3.1 DS18B20温度传感器与单片机的接口电路 (10)3.2 蜂鸣器电路 (11)4. 系统软件设计 (11)4.1系统主程序流程图 (11)4.2重点模块程序分析 (12)第五章系统测试和结论 (14)6.1测试条件及方案 (14)6.2测试结果和分析 (15)第六章设计体会 (15)一、设计目的1.进一步熟悉和掌握DS18B20芯片的结构及工作原理。

2.掌握单片机的接口技术及相关外围芯片的外特性,控制方法。

3.通过课程设计,掌握以单片机核心的电路设计的基本方法和技术,了解有关电路参数的计算方法。

4.通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。

5.通过完成一个包括电路设计和程序开发的完整过程,使学生了解开发单片机应用系统的全过程,为今后从事相应打下基础。

6.了解 DS1820数字温度传感器特性7. 掌握单片机基本功能的运用、简单接口电路如键盘、数码管显示电路设计及其相应驱动软件的编制软、硬件系统的调试二、方案的选取方案一由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。

基于DS18B20的数字温度计及DS1302时钟显示的设计

基于DS18B20的数字温度计及DS1302时钟显示的设计

东北林业大学综合电子课程设计总结报告设计项目:基于DS18B20的数字温度计的设计项目完成人:贺超、马永飞指导教师:刘嘉新副教授学院:信息与计算机工程学院专业:电子信息工程2008级1、2班2011年 7月12 日综合电子课程设计任务书基于DS18B20的数字温度计的设计摘要随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。

国内外温度控制系统发展迅速,并在智能化、自适应、参数自整定等方面取得成果。

目前社会上温度控制大多采用智能调节器,国产调节器分辨率和精度较低,温度控制效果不是很理想,但价格便宜,国外调节器分辨率和精度较高,价格较贵。

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用。

该设计控制器使用单片机A T89C51,测温传感器使用DS18B20,键盘采用独立按键(功能自定义),显示器采用HD7279芯片驱动4位LED显示。

数码管以串口传送数据,实现温度显示,能准确达到以上要求。

关键词:单片机,数字控制,温度计,DS18B20,A T89C51目录摘要1 绪论 (1)1.1 课题研究的背景和意义 (1)1.2 本设计的主要技术指标及要求 (1)2 系统方案选择 (2)2.1 系统方案实现 (2)2.2 器件选型 (2)2.2.1单片机芯片的选择 (2)2.2.2温度传感器的选择 (3)2.2.3时钟芯片的选择 (3)3系统主要芯片简介 (5)3.1 AT89C51单片机芯片介绍 (5)3.2 DS18B20芯片的介绍 (5)3.3 HD7279芯片介绍 (7)3.3.1特点 (8)3.4 DS1302时钟芯片简介 (9)4系统的硬件设计及测试 (12)4.1系统的电路原理图 (12)4.2 AT89C51单片机最小系统 (13)4.3 HD7279驱动芯片应用电路 (13)4.4 开发板焊接及其测试 (14)5 系统软件设计及调试 (15)5.1 主程序流程图 (15)5.2 设定DS18B20暂存器设定值 (16)5.3 读转换后的温度 (16)5.4 读出的温度进行数据转换 (17)5.5 调试 (17)5.5.1硬件调试 (18)5.5.2软件调试 (18)6 系统联调及操作说明 (19)6.1系统联调 (19)6.2 操作说明 (19)7 总结 (20)参考文献附录1绪论1.1课题研究的背景和意义随着现代信息技术的飞速发展和传统工业改造的逐步实现,能够独立工作的温度检测和显示系统应用于诸多领域。

DS1302 18B20

DS1302 18B20
LcdWriteData('0'+datas[3]); //显示小数点
LcdWriteCom(0xcf); //写地址 80表示初始地址
LcdWriteData('0'+datas[4]); //显示小数点
}
LcdWriteData('2');
LcdWriteData('0');
LcdWriteData('0'+TIME[6]/16); //年
LcdWriteData('0'+(TIME[6]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[4]/16); //月
LcdWriteData('0'+(TIME[4]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[3]/16); //日
LcdWriteData('0'+(TIME[3]&0x0f));
LcdWriteCom(0x8D);
LcdWriteData('0'+(TIME[5]&0x07)); //星期
* 实 验 名 : 18B20温度显示试验
* 实验说明 : LCD1602显示温度值。
* 连接方式 : 见连接图
* 注 意 :
*******************************************************************************/

51单片机课程设计(DS1302时钟、18B20温度计)

摘要: 该设计实现了24小时制的时间显示及设定、年月日星期的显示及设定、闹钟的设定、温度的检测及显示等功能。

设计共分为四大部分,分别是控制部分、时钟部分、温度检测部分和人机交互部分。

以单片机(A T89C51)组成的最小系统为整个设计的控制核心,单片机通过对时钟芯片(DS1302)的控制完成时钟的功能,通过对温度传感器(18B20)的控制完成温度检测的功能,最后通过对数码管、蜂鸣器及按键的控制完成时间和温度的显示以及调整时间、设定闹钟等功能。

时间和温度的显示以及调整时间、设定闹钟等功能。

关键词:电子钟;温度计;单片机关键词:电子钟;温度计;单片机目录目录摘要: ......................................................................................................................1 第一章 设计任务设计任务设计任务 ...................................................................................................3 第二章 电路设计电路设计电路设计 ...................................................................................................3 2.1电路方案的比较 . (3)2.2根据设计绘制框图及原理图根据设计绘制框图及原理图.........................................................................5 第三章 工作原理工作原理工作原理 ...................................................................................................7 3.1 单片机的工作原理. (7)3.2 DS18B20的工作原理 (8)3.3DS1302的工作原理 (10)3.4数码管的工作原理 (12)第四章 调试与验证调试与验证 (12)4.1程序调试 (12)4.2仿真验证 (15)参考文献 (15)附录附录.....................................................................................................................16 附录一附录一 使用说明使用说明..............................................................................................16 附录二附录二 元件清单元件清单..............................................................................................16 附录三 pcb 版图版图...............................................................................................17 附录四附录四 程序清单程序清单 (18)第一章设计设计任务1、基本要求、基本要求)能够实现时间的正确显示,并且可以对表进行调整。

ds1302+ds18b20可调时,可调闹钟,温度上下限报警

signed char TH=30; //上限报警温度,默认值为38
signed char TL=3; Байду номын сангаас //下限报警温度,默认值为3
bit beep_st; //蜂鸣器间隔标志
int temp; //温度值全局变量
unsigned char time_allow; //整点报时标志
#define KEY_5 0x10
#define KEY_NULL 0x1f
#define KEY_PRESS 0x80
#define KEY_LONG 0x40
#define KEY_STATE_INIT 0
#define KEY_STATE_PRESS 1
#define KEY_STATE_LONG 2
bit ss,mm,ff,yue,tian,xq,THwendu,TLwendu;
sbit key1=P3^1; //切换
sbit key2=P3^2;//移位
sbit key3=P3^3;//加
sbit key4=P3^4;//减
int main_flag=0; //切换标志位
if(keyTemp!=KEY_NULL)
{
s_keyState=KEY_STATE_PRESS;
}
break;
case KEY_STATE_PRESS:
if(keyTemp!=KEY_NULL)
#define DS1302_RAM_WRITE 0xFE //写入RAM
#define DS1302_SECOND_WRITE 0x80 //写时钟芯片的寄存器位置
#define DS1302_MINUTE_WRITE 0x82

DS18B20课设报告

一、课程设计的基本目的与任务二、课程设计的基本内容三、课程设计的教学要求(以上三项见于课程设计指导书的那两张纸)四、芯片及程序的设计说明和流程图1、DS1302芯片DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1 202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。

DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。

时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。

DS1302与RAM 相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

2、DS18B20温度测量器DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。

与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。

温度传感器ds18b20实验报告

温度传感器ds18b20实验报告温度传感器DS18B20实验报告引言:温度传感器是一种用于测量环境温度的设备,它在许多领域都有广泛的应用,如气象学、工业控制、冷链物流等。

本实验报告将介绍DS18B20温度传感器的原理、实验装置和实验结果,并对其性能进行评估。

一、实验原理DS18B20温度传感器是一种数字温度传感器,采用单总线接口进行通信。

它采用了最新的数字温度传感器技术,具有高精度、低功耗、抗干扰等特点。

其工作原理是利用温度对半导体材料电阻值的影响,通过测量电阻值的变化来确定温度。

二、实验装置本实验使用的实验装置包括DS18B20温度传感器、Arduino开发板、杜邦线和计算机。

Arduino开发板用于读取传感器的温度数据,并通过串口将数据传输到计算机上进行处理和显示。

三、实验步骤1. 连接电路:将DS18B20温度传感器的VCC引脚连接到Arduino开发板的5V 引脚,GND引脚连接到GND引脚,DQ引脚连接到Arduino开发板的数字引脚2。

2. 编写代码:使用Arduino开发环境编写代码,通过OneWire库和DallasTemperature库读取DS18B20传感器的温度数据。

3. 上传代码:将编写好的代码上传到Arduino开发板上。

4. 监测温度:打开串口监视器,可以看到DS18B20传感器实时的温度数据。

四、实验结果在实验过程中,我们将DS18B20温度传感器放置在不同的环境中,记录了其测得的温度数据。

实验结果显示,DS18B20温度传感器具有较高的精度和稳定性,能够准确地测量环境温度。

五、实验评估本实验评估了DS18B20温度传感器的性能,包括精度、响应时间和抗干扰能力。

实验结果表明,DS18B20温度传感器具有较高的精度,能够在0.5℃的误差范围内测量温度。

响应时间较快,能够在毫秒级别内完成温度测量。

同时,DS18B20温度传感器具有较好的抗干扰能力,能够在干扰环境下保持稳定的测量结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目: DS18B20+24C02+按键项目管理人: 罗俊杰硬件负责人: 罗俊杰软件负责人:罗俊杰发题时间: 2012/3/10 交题时间: 2012/3/24 班级:电研二班指导老师: 王筝老师摘要:本温度测量仪由8位MCU单片机为主控制器,通过DS18B20对温度的采集,24C02保存上下限温度报警值,按键可以调节上下限报警温度,DS1302时钟显示,LCD1602显示,自动进入待机省电模式。

该系统能测量温度范围在:-55度到+128度。

测量精度达到1%是理想的测温系统。

关键词: DS18B20,DS24C02,LCD1602,DS1302。

一题目要求:实现DS18B20测温,温度范围(-55~+128),通过LCD1602显示。

按键进行上下限温度调节,和断电保存上下限温度值,并且可以实现报警功能,另外就是通过1302显示时间。

二题目分析:1.DS18B20能够实现正常的温度测量2.LCD1602要能够显示出DS18B20的温度值,以及1302的时间,年月日星期,显示。

3.1302时钟模块要能够正常显示时间,年月日,星期的显示。

4.按键能够调整上下限报警的温度值。

三.功能描述:当开启时,同一个界面同时显示1302时间时间显示模块,通过按键可以跳转到另一个界面,调节上下限温度值,当温度超过上下限温度值时,蜂鸣器会自动报警。

四.硬件电路设计五.汇编程序代码:;**************************************************** ;程序编写人:罗俊杰,QQ:849833861;程序编写时间:2012年3月17日于源点EIC实验室;程序实现的功能:DS18B20测温+1302时钟+24C02存储;**************************************************** TEMP_ZH DATA 24H ;实时温度值存放单元TEMPL DATA 25H ;TEMPH DATA 26H ;TEMP_TH DATA 27H ;高温报警值存放单元TEMP_TL DATA 28H ;低温报警值存放单元TEMPHC DATA 29H ;TEMPLC DATA 2AH ;TEMPFC EQU 2BH ;LCD_X EQU 2FH ;LCD 字符显示位置COUNT EQU 51H ;1s计时COUNT1 EQU 52H ;60s计时FLAG1 EQU 20H.0 ;DS18B20是否存在标志RELAY EQU P1.3 ;指示灯BEEP EQU P3.3 ;蜂鸣器lcd equ p0ce equ p2.1 ;复位脚dio equ p2.2 ;数据脚clk equ p2.3 ;时钟rs equ p2.4rw equ p2.5en equ p2.6 ;使能端dq equ p3.7second equ 40h ;秒minute equ 41h ;分hour equ 42h ;时day equ 43h ;天month equ 44h ;月week equ 45h ;周year equ 46h ;年bcd equ 47hhex equ 48hK1 EQU P1.4 ;查看温度报警设置值,并能调节加减K2 EQU P1.5 ;低温报警值加减按键K3 EQU P1.6 ;高温报警值加减按键K4 EQU P1.7 ;保存设置值并退出SDA BIT P1.0 ;定义24C02数据线SCL BIT P1.1 ;定义24C02时钟线org 0000hajmp startorg 0030h;*****************初始化*********************************** start:MOV SP,#60HLCALL SET_LCD ;对 LCD 做初始化设置及测试LCALL RE_18B20 ;DS18B20暂存器操作子程序LCALL RST ;调用18B20复位子程序(初始化)/////////////////////////////////////////////////////////////////// lcall ds1302csh ;调用1302初始化子程序lcall lcdcsh ;调用lcd初始化子程序lcall w1302 ;调用1302写子程序lcall r1302 ;调用1302读子程序lcall display ;调用显示子程序;************************************************************* main:CALL MK1 ;判断DS18B20是否响应以及初始值的设定:CALL MK3 ;ds18b20的写读及显示加1302时钟显示AJMP MAIN;*************************************************************MK4: AJMP MK2 ;跳转到错误子程序MK1: JNB FLAG1,MK4 ;DS1820不存在LCALL MENU_OK ;DS1820存在,调用显示正确信息子程序CALL RD_EEPROM ;将报警温度值从EEPROM中读出来RET;*************************************************************MK3: LCALL RST ;调用DS18B20复位子程序JNB FLAG1,MK4 ;DS18B20不存在跳转到错误显示子程序MOV A,#0CCH ;跳过ROM匹配命令LCALL WRITE ;DS18B20数据写入操作子程序MOV A,#44H ;温度转换命令LCALL WRITE ;DS18B20数据写入操作子程序LCALL RST ;调用DS18B20复位子程序MOV A,#0CCH ;跳过ROM匹配LCALL WRITE ;DS18B20数据写入操作子程序MOV A,#0BEH ;读温度命令LCALL WRITELCALL READ ;调用DS18B20数据读取操作子程序LCALL CONVTEMP ;调用温度数据BCD 码处理子程序LCALL DISPBCD ;调用温度数据显示子程序LCALL CONV ;调用LCD显示处理子程序LCALL TEMP_COMP ;调用实测温度值与设定温度值比较子程序LCALL PROC_KEY ;调用键扫描子程序;******************************************************************** ******LCALL SHIZHONG ;调用1302时钟模块SJMP MK3;******************************************************************** *SHIZHONG:mov tmod,#01h ;用定时器0,方式一工作mov th0,#70h ;为定时器赋初值mov tl0,#00hsetb tr0lp1:jbc tf0,lp2 ;定时器溢出跳到lp2处并将tf0清零 clr tr0lp2: mov th0,#70h ;为定时器赋初值mov tl0,#00hlcall r1302 ;调用读1302子程序lcall display ;调用显示程序setb tr0RET;******************LCD初始化**********************************set_lcd:CLR ENLCALL INIT_LCD ;初始化 LCDLCALL STORE_DATA ;将自定义字符存入LCD的CGRAMRET;//////////////////////////////////////////////////////////////////// ///////;设置1302初值子程序ds1302csh:mov second,#00h ;miao秒mov minute,#57h ;分mov hour,#15h ;时mov day,#17h ;天mov month,#03h ;月mov week,#06h ;周mov year,#12h ;年;//////////////////////////////////////////////////////////////////// /;lcd初始化子程序lcdcsh: mov lcd,#38hlcall xzlmov lcd,#08hlcall xzlmov lcd,#01hlcall xzlmov lcd,#06hlcall xzlmov lcd,#0chlcall xzl;/////////////////////////////;1302写数据子程序w1302: clr ce ;复位脚置低电平clr clk ;串行时钟置低电平nopsetb ce ;复位脚置高电平mov b,#8eh ;送操作地址lcall wbit ;调用写字节子程序mov b,#00h ;送操作数lcall wbit ;调用写字节子程序setb clk ;串行时钟置高电平,下降沿有效clr ce ;禁止写入数据mov r0,#second ;将秒寄存器送到r0mov r1,#80h ;将80h送到Amov r7,#7 ;将r7送7///////////////////////////////////////////////////////////////////// /////wloop: clr ce ;复位脚置低电平clr clk ;复位脚置低电平nopsetb ce ;复位脚置高电平,准备写数据mov b,r1 ;将r1内的数据送给blcall wbit ;调用写字节子程序mov a,@r0 ;将r0内地址中的数送到Amov hex,a ;将a中的数送到十进制寄存器lcall hex_bcd ;调用十进制转bcd码子程序mov b,a ;将a内的数送给blcall wbit ;调用写字节子程序inc r0 ;r0加一inc r1 ;r1加一inc r1setb clk ;串行时钟下降沿写入clr ce ;禁止写入djnz r7,wloop ;判断是否将年月日等七组数写入1302 clr ce ;禁止写入clr clk ;nopsetb ce ;准备写入mov b,#8eh ;送操作地址lcall wbit ;调用写字节子程序mov b,#80h ;送操作数lcall wbit ;调用写字节子程序setb clk ;下降沿有效clr ce ;禁止写入ret ;子程序返回;/////////////////////////////;写字节子程序wbit: mov r2,#08h ;给r2送8w_loop:mov a,b ;b送给arrc a ;带进位的右移Amov b,amov dio,c ;sclk上升沿时写入数据setb clknopclr clk ;禁止写入djnz r2,w_loop ;判断是否送完ret ;;/////////////////////////////;hex转bcd码hex_bcd:mov a,hex ;将十六进制数送给Aadd a,#00h ;da a ;对A进行十进制调整ret;/////////////////////////////;1302读数据子程序r1302: mov r0,#second ;将秒寄存器送到R0 mov r1,#81h ;将首读地址送到R1mov r7,#7 ;R7送7r_loop: clr ce ;复位脚清零clr clk ;时钟串行口清零nopsetb ce ;准备写数据mov b,r1 ;将r1送到Blcall wbit ;调用写字节子程序lcall rbit ;调用读字节子程序mov @r0,a ;将a中的数据送到R0所指的地址inc r0 ;加一inc r1inc r1setb clk ;clr cedjnz r7,r_loop ;判断是否读完ret;/////////////////////////////;读字节子程序rbit: mov r4,#08h ;送8 rloop: mov c,dio ;读IO数据rrc a ;带进位右移Asetb clk ;下降沿有效nopclr clkdjnz r4,rloop ;判断是否读完ret;/////////////////////////////;显示子程序display:mov lcd,#80hlcall xzlmov a,#'2'lcall xsjmov lcd,#81hlcall xzlmov a,#'0'lcall xsjmov lcd,#84hlcall xzlmov a,#2dhlcall xsjmov lcd,#87hlcall xzlmov a,#2dhlcall xsjmov lcd,#8bhlcall xzlmov a,#'W'lcall xsj///////////////////////////////////////////////////////////// mov lcd,#8chlcall xzlmov a,#3ahlcall xsjmov lcd,#0c2hlcall xzlmov a,#3ahlcall xsjmov lcd,#0c5hlcall xzlmov a,#3ahlcall xsj ;以上显示冒号;////////////以下显示动态//////////////////mov bcd,year ;将年送给bcdlcall bcd_dec ;调用bcd码转十进制子程序mov lcd,#82h ;将显示位置送到lcdlcall xzl ;调用写指令子程序mov dptr,#tab ;建表MOVC A,@A+DPTR ;查表lcall xsj ;调用写数据子程序mov lcd,#83h ;将显示位置送到lcdlcall xzl ;调用写指令子程序mov dptr,#tab ;建表mov a,b ;将b送给AMOVC A,@A+DPTR ;查表lcall xsj ;调用写数据子程序mov bcd,monthlcall bcd_decmov lcd,#85hlcall xzlmov dptr,#tabMOVC A,@A+DPTRlcall xsjmov lcd,#86hlcall xzlmov dptr,#tabmov a,bMOVC A,@A+DPTRlcall xsjmov bcd,daylcall bcd_decmov lcd,#88hlcall xzlmov dptr,#tabMOVC A,@A+DPTRlcall xsjmov lcd,#89hlcall xzlmov dptr,#tabmov a,bMOVC A,@A+DPTRlcall xsjmov bcd,weeklcall bcd_decmov lcd,#8dhlcall xzlmov dptr,#tabmov a,bMOVC A,@A+DPTRlcall xsj;/////////////////////////////mov bcd,hourlcall bcd_decmov lcd,#0c0hlcall xzlmov dptr,#tabMOVC A,@A+DPTRlcall xsjmov lcd,#0c1hlcall xzlmov dptr,#tabmov a,bMOVC A,@A+DPTRlcall xsj ;以上显示时 mov bcd,minutelcall bcd_decmov lcd,#0c3hlcall xzlmov dptr,#tabMOVC A,@A+DPTRlcall xsjmov lcd,#0c4hlcall xzlmov dptr,#tabmov a,bMOVC A,@A+DPTRlcall xsj ;以上显示分mov bcd,second ;秒数值赋给bcdlcall bcd_decmov lcd,#0c6hlcall xzlmov dptr,#tabMOVC A,@A+DPTRlcall xsjmov lcd,#0c7hlcall xzlmov dptr,#tabmov a,bMOVC A,@A+DPTRlcall xsj ;以上显示秒ret;///////////////////////////// ;bcd转十进制bcd_dec:mov a,bcdmov b,#16div ab ;a中放置十位,b中放置个位ret;//////////////////////////////;lcd写指令子程序xzl: clr rwclr rssetb enlcall delay3clr enret;/////////////////////////////;lcd写数据子程序xsj: mov lcd,aclr rwsetb rssetb enlcall delay3clr enret;/////////////////////////////;延时子程序delay3: mov r5,#4 ;延时5msd0: mov r6,#255djnz r6,$djnz r5,d0ret;/////////////////////////////;表格tab: DB 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h ;0到9;-------------------------------------------------------------- EEPROM:MOV R0,#27H ;要写入的数据,TH,TL MOV R1,#00H ; 要保存数据的首地址MOV R2,#02H ;数据的长度REP: CLR AMOV A,@R0MOV B,ALCALL WR_Byte ;调用24c02写子程序INC R1INC R0DJNZ R2,REPRET;-----------------------------------------WR_Byte: LCALL Begin ;调用启动24c02子程序REP_S1: MOV A,#0A0H ;写器件地址LCALL Send_B ;调用发送一个字节到I2C总线子程序LCALL WAITACK ;调用应答信号检测程序JC REP_S1 ;没有应答则重发数据REP_S2: MOV A,R1 ;写入地址LCALL Send_B ;调用发送一个字节子程序LCALL WAITACKJC REP_S2REP_S3: CLR AMOV A,B ;写入数据LCALL Send_BLCALL WAITACKJC REP_S3LCALL STOP ;调用停止子程序LCALL Delay ;10MS延时RET;//////向IIC总线发送一个字节数据子程序///////////////////////////// ;入口参数:A---待发送数据存放在A中;////////////////////////////////////////////////////////////////// Send_B: MOV R7,#08H ;发送位数S_B: RLC AMOV SDA,CNOPSETB SCLNOPCLR SCLDJNZ R7,S_B ;8位发送完毕?NOPRET;//////检测应答信号//////////////////////////////////////////////;出口参数:C---是否有应答信号;//////////////////////////////////////////////////////////////// WAITACK: SETB SDA ;释放SDA信号线NOPSETB SCLNOPREP3: MOV C,SDACLR SCLNOPRET;*****************RD_EEPROM:MOV R0,#27H ;设置读出数据保存首地址MOV R1,#00H ;送读数首地址MOV R2,#02H ;要读2个数REP1: LCALL RD_Byte ;调用24c02读子程序MOV @R0,A ;把读出数据送到TH,TLINC R0 ;保存数据地址加一,保存在27H,28H单元中,27H为TH,28H为TLINC R1 ;DJNZ R2,REP1 ;RET;//////读24c02操作子程序///////////////////////////////////////;输入参数:R2---要读的字节地址,;输出参数: A---结果;//////////////////////////////////////////////////////////////RD_Byte:LCALL Begin ;启动信号REP_S4: MOV A,#0A0H ;器件地址LCALL Send_B ;调用发送一个字节子程序LCALL WAITACKJC REP_S4REP_S5: MOV A,R1 ;送读数地址LCALL Send_BLCALL WAITACKJC REP_S5REP_S6: LCALL Begin ;重发启动信号MOV A,#0A1H ;读数LCALL Send_BLCALL WAITACKJC REP_S6LCALL Receive_B ;调用从I2C总线上接收一个字节数据子程序LCALL StopRET;//////从IIC总线上接收一个字节数据子程序//////////////////////////////;出口参数:A---接收数据存放在A中;//////////////////////////////////////////////////////////////////////Receive_B: SETB SDA ;释放SDA数据线MOV R7,#08H ;一个字节共接收8位数据CLR AR_B: SETB SCL ;启动一个时钟周期,读总线 NOPMOV C,SDA ;将SDA状态读入CRLC A ;结果移入ACLR SCLNOPDJNZ R7,R_B ;判断8位数据是否接收完全?SETB SDANOPRET;//////停止24c02子程序///////////////////////////////////Stop: CLR SDA ;时钟高电平时数据上升沿为停止信号NOPSETB SCLNOPSETB SDANOPCLR SCLRETBegin: ;24C02启动子程序SETB SCL ;时钟高电平时数据下降沿为启动信号NOPSETB SDANOPCLR SDANOPCLR SCL ;钳住IC总线准备发送或接受数据NOPRET;****************无温度显示时子程序************************************************************MK2: LCALL MENU_ERROR ;调用显示出错信息子程序SJMP $RET;**************LCD初始化***********************************************INIT_LCD:MOV A,#38H ;2行显示,字形5*7点阵LCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#0CH ;开显示,显示光标,光标不闪烁LCALL WCOMLCALL DELAY1MOV A,#01H ;清除 LCD 显示屏LCALL WCOMLCALL DELAY1RET;************************DS1820初始化时序************************ RST:SETB DQNOPCLR DQMOV R0,#6BH ;主机发出延时复位低脉冲MOV R1,#04HTSR1: DJNZ R0,$MOV R0,#6BHDJNZ R1,TSR1SETB DQ ;拉高数据线NOPNOPNOPMOV R0,#32HTSR2: JNB DQ,TSR3 ;等待DS18B20回应DJNZ R0,TSR2JMP TSR4 ; 延时TSR3: SETB FLAG1 ; 置1标志位,表示DS1820存在JMP TSR5TSR4: CLR FLAG1 ; 清0标志位,表示DS1820不存在JMP TSR7TSR5: MOV R0,#06BHTSR6: DJNZ R0,$ ; 时序要求延时一段时间TSR7: SETB DQRET;************************** LCD显示子程序**********************************SHOW_DIG2H:MOV B,#100DIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BMOV A,#0AHXCH A,BDIV ABADD A,#30HINC LCD_XPUSH BMOV B,LCD_XLCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RET;*************************** 键扫描子程序*****************************PROC_KEY:JB K1,PROC_K1 ; 按键K1处理CALL BEEP_BL ;调用蜂鸣器处理程序JNB K1,$ ;按键没有松开则继续等待MOV DPTR,#M_ALAX1 ;查表,LOOK ALERT CODEMOV A,#1 ;设置显示在第一行CALL LCD_PRINT ;调用第一行显示,显示LOOK ALERT CODECALL LOOK_ALARM ;调用温度报警值显示子程序JB K3,$ ;判断K3是否按下,没按下则等待CALL BEEP_BL ;按下了调用蜂鸣器处理程序JMP PROC_K2 ;跳到PROC_K2PROC_K1: ; 按键K2处理JB K2,PROC_END ;判断K2是否按下,没有按下则跳出去CALL BEEP_BL ;调用蜂鸣器处理程序JNB K2,$ ;按键2没有松开则等待MOV DPTR,#RESET_A1 ; 表头指向 RESET ALERT CODEMOV A,#1 ;设置显示位置为第一行CALL LCD_PRINT ;调用LCD显示,显示RESET ALERT CODECALL SET_ALARM ;调用报警值设置子程序CALL EEPROM ;将设定的TH,TL值写入EEPROMPROC_K2:CALL MENU_OK ;调用正常温度显示,显示DS18B20 OK // CALL TEMP_BJ ;调用显示温度标记子程序PROC_END:RETRESET_A1:DB "RESET ALERT CODE";*************************** 设定温度报警值TH、TL ***************************SET_ALARM:LCALL LOOK_ALARMAS0: JB K1,AS00LCALL BEEP_BLJNB 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_BLINC TEMP_THMOV A,TEMP_THCJNE A,#120,ASZ011MOV TEMP_TH,#0ASZ011: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP ASZ01ASZ02: JB K3,ASZ03 ;TL值调整(增加) LCALL BEEP_BLINC TEMP_TLMOV A,TEMP_TLCJNE A,#99,ASZ021MOV TEMP_TL,#00HASZ021: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP ASZ02ASZ03: JB K4,AS0 ;确定调整LCALL BEEP_BLJNB K4,$RETASJ01: JB K2,ASJ02 ;TH值调整(减少) LCALL BEEP_BLDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,ASJ011JMP ASJ022ASJ011: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP AS0ASJ02: JB K3,ASJ03 ;TL值调整(减少) LCALL BEEP_BLDEC TEMP_TLMOV A,TEMP_TLCJNE A,#0FFH,ASJ021JMP ASJ022ASJ021: LCALL LOOK_ALARM ;MOV R5,#10LCALL DELAYJMP AS0ASJ022: CPL 20H.1JMP ASZ01ASJ03: JMP ASZ03RETRST_A1: DB " SET ALERT CODE " ,0;--------------------------------------------M_ALAX1:DB " LOOK ALERT CODE",0M_ALAX2:DB "TH: TL: ",0LOOK_ALARM:MOV DPTR,#M_ALAX2 ;指针指到显示信息区MOV A,#2 ;显示在第二行CALL LCD_PRINT ;调用显示MOV A,#0C6H ;CALL TEMP_BJ1MOV A,TEMP_TH ;加载TH数据MOV LCD_X,#3 ;设置位置CALL SHOW_DIG2H ;显示数据MOV A,#0CEHCALL TEMP_BJ1MOV A,TEMP_TL ;加载TL数据MOV LCD_X,#12 ;设置位置CALL SHOW_DIG2L ;显示数据RET;******************************************************************** **TEMP_BJ1:LCALL WCOMMOV DPTR,#BJ2 ;指针指到显示信息区MOV R1,#0MOV R0,#2BBJJ2: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ2RETBJ2: DB 00H,"C";*********************** 实测温度值与设定温度值比较子程序**********************TEMP_COMP:MOV A,TEMP_THSUBB A,TEMP_ZH ;减数>被减数,则JC CHULI1 ;借位标志位C=1,转 MOV A,TEMPFCCJNE A,#0BH,COMPSJMP CHULI2COMP: MOV A,TEMP_ZHSUBB A,TEMP_TL ;减数>被减数,则JC CHULI2 ;借位标志位C=1,转MOV DPTR,#BJ5LCALL TEMP_BJ3CLR RELAY ;点亮指示灯RETCHULI1: MOV DPTR,#BJ3LCALL TEMP_BJ3SETB RELAY ;熄灭指示灯LCALL BEEP_BL ;蜂鸣器响RETCHULI2: MOV DPTR,#BJ4LCALL TEMP_BJ3SETB RELAY ;熄灭指示灯LCALL BEEP_BL ;蜂鸣器响RET;-----------------------------------------TEMP_BJ3: MOV A,#0CeHLCALL WCOMMOV R1,#0MOV R0,#2BBJJ3: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ3RETBJ3: DB ">H"BJ4: DB "<L"BJ5: DB " C";************************ 显示区BCD 码温度值刷新子程序**********************DISPBCD: MOV A,TEMPLCANL A,#0FHMOV 70H,A ;小数位MOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,A ;个位MOV A,TEMPHCANL A,#0FHMOV 72H,A ;十位MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,A ;百位DISPBCD2: RET;************************ 温度值BCD 码处理子程序*************************CONVTEMP: MOV A,TEMPH ;判温度是否零下ANL A,#08HJZ TEMPC1 ;温度零上转CLR CMOV A,TEMPL ;二进制数求补(双字节)CPL A ;取反加1ADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,AMOV TEMPHC,#0BH ;负温度标志MOV TEMPFC,#0BHSJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH ;正温度标志MOV TEMPFC,#0AHTEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;乘0.0625MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=小数部分 BCD MOV A,TEMPL ;整数部分ANL A,#0F0H ;取出高四位SWAP AMOV TEMPL,AMOV A,TEMPH ;取出低四位ANL A,#0FHSWAP AORL A,TEMPL ;重新组合MOV TEMP_ZH,ALCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHC ;TEMPHC LOW = 十位数 BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI = 个位数 BCDORL A,TEMPLCMOV TEMPLC,AMOV A,R4JZ TEMPC12ANL A,#0FHSWAP AMOV R4,AMOV A,TEMPHC ;TEMPHC HI = 百位数 BCDANL A,#0FHORL A,R4MOV TEMPHC,ATEMPC12: RET;************************ 二-十进制转换子程序*****************************HEX2BCD1: MOV B,#064HDIV ABMOV R4,AMOV A,#0AHXCH A,BDIV ABSWAP AORL A,BRETTEMPDOTTAB: DB 00H,00H,01H,01H,02H,03H,03H,04H ; 小数部分码表DB 05H,05H,06H,06H,07H,08H,08H,09H;********************** DS18B20数据读取操作子程序**************************READ: MOV R4,#4 ;将温度低位、高位、TH、TL从DS18B20中读出MOV R1,#TEMPL ;存入25H、26H、27H、28H单元RE00: MOV R2,#8RE01: CLR CYSETB DQNOPNOPCLR DQ ;读前总线保持为低NOPNOPNOPSETB DQ ;开始读总线释放MOV R3,#09 ;延时18微妙DJNZ R3,$MOV C,DQ ;从DS18B20总线读得一位MOV R3,#3CHDJNZ R3,$ ;等待100微妙RRC A ;把读得的位值环移给ADJNZ R2,RE01 ;读下一位MOV @R1,AINC R1DJNZ R4,RE00RET;*************************** 第二行显示数字子程序*************************SHOW_DIG2:ADD A,#30HMOV B,LCD_XLCALL LCDP2RET;*************************** 第二行显示数字子程序*************************LCDP2: PUSH ACCMOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA ;写入数据RET;******************************** 显示正确信息子程序***************************MENU_OK: MOV DPTR,#M_OK1 ;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_OK2 ;指针指到显示消息MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_OK1: DB " " ,0M_OK2: DB " ",0;******************************** 显示出错信息子程序***************************MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_ERROR2 ;指针指到显示消息1MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_ERROR1: DB " ",0M_ERROR2: DB " mistake ",0;************************* LCD的第一行或第二行显示字符**********************LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置 LCD 的第一行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置 LCD 的第一行地址LCALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置 LCD 的第二行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置 LCD 的第二行地址LCALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1: LCALL WDATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;*************************** 清除1行LCD 的字符****************************CLR_LINE: MOV R0,#24CL1: MOV A,#' 'LCALL WDATADJNZ R0,CL1RETDE: MOV R7,#250DJNZ R7,$RET;**************************显示数据*************************************SHOW_DIG2L:MOV B,#100DIV ABMOV A,#0AHXCH A,BDIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RET;*************************** LCD 显示数据处理子程序*************************CONV:MOV A,73H ;加载百位数据MOV LCD_X,#8 ;设置位置CJNE A,#1,CONV1JMP CONV2CONV1: CJNE A,#0BH,CONV11MOV A,#"-" ;"-"号显示JMP CONV111CONV11: MOV A,#" " ;"+"号不显示CONV111: MOV B,LCD_XLCALL LCDP2JMP CONV3CONV2: LCALL SHOW_DIG2 ;显示数据CONV3: INC LCD_XMOV A,72H ;十位LCALL SHOW_DIG2INC LCD_XMOV A,71H ;个位LCALL SHOW_DIG2INC LCD_XMOV A,#'.'MOV B,LCD_XLCALL LCDP2MOV A,70H ;加载小数点位INC LCD_X ;设置显示位置LCALL SHOW_DIG2 ;显示数据RET;************************ 复制暂存器子程序*******************************WRITE_E2:LCALL RSTMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#48H ;把暂存器里的温度报警值拷贝到EEROM LCALL WRITERET;************************将自定义字符写入LCD的CGRAM中*********************STORE_DATA:MOV A,#40HLCALL WCOMMOV R2,#08HMOV DPTR,#D_DATAMOV R3,#00HS_DATA: MOV A,R3MOVC A,@A+DPTRLCALL WDATA ;写入数据INC R3DJNZ R2,S_DATARETD_DATA: DB 0CH,12H,12H,0CH,00H,00H,00H,00H;************************ DS18B20暂存器操作子程序***************************RE_18B20:JB FLAG1,RE_18B20ARET;**********************响应后*****************************************************RE_18B20A:LCALL RSTMOV A,#0CCH ;跳过ROM匹配LCALL WRITEWR_SCRAPD:MOV A,#4EH ;写暂器LCALL WRITEMOV A,TEMP_TH ;TH(报警上限)LCALL WRITEMOV A,TEMP_TL ;TL(报警下限)LCALL WRITEMOV A,#7FH ;12位精度LCALL WRITERET;*********************** DS18B20数据写入操作子程序************************WRITE: MOV R2,#8 ;一共8位数据CLR CWR1: CLR DQ ;开始写入DS18B20总线要处于复位(低)状态MOV R3,#07DJNZ R3,$ ;总线复位保持16微妙以上RRC A ;把一个字节DATA 分成8个BIT环移给C MOV DQ,C ;写入一位MOV R3,#3CHDJNZ R3,$ ;等待100微妙SETB DQ ;重新释放总线NOPDJNZ R2,WR1 ;写入下一位SETB DQRET;**************写命令************************************** WCOM: ;以8位控制方式将命令写至LCDMOV lcd,A ;写入命令CLR RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲CLR RWSETB ENLCALL DELAY1CLR ENRET;**************写数据************************************** WDATA: ;以8位控制方式将数据写至LCDMOV lcd,A ;写入数据SETB RSCLR RWSETB ENCALL DECLR ENCALL DERET;==============================================BEEP_BL: ;蜂鸣器处理程序MOV R6,#100 ;D3: CALL DEX1 ;CPL BEEP ;取反蜂鸣器DJNZ R6,D3MOV R5,#10CALL DelayRETDEX1: MOV R7,#180DJNZ R7,$RETDelay: ;(R5)*延时10MSMOV R6,#50D1: MOV R7,#50DJNZ R7,$DJNZ R6,D1DJNZ R5,DelayRET;****************************延时************************ DELAY1: ;延时5MSMOV R6,#25DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RET;****************结束************************************ end六.调试经验:1.当你发现软件不论怎么改都正常显示不了的时候不妨去检查一下硬件,很可能是硬件上的错误,从而耽误了你很多的时间。

相关文档
最新文档