DS18B20温度采集系统
- 格式:ppt
- 大小:1.24 MB
- 文档页数:32
目录1.引言 (1)1.1绪论 (1)1.2课程设计任务书 (1)2.设计方案 (3)3.硬件设计方案 (3)3.1最小系统地设计 (3)3.2LED发光报警电路 (5)3.3DS18B20地简介及在本次设计中地应用 (5)3.3.1 DS18B20地外部结构及管脚排列 (5)3.3.2 DS18B20地工作原理 (6)3.3.3 DS18B20地主要特性 (7)3.3.4 DS18B20地测温流程 (8)3.3.5 DS18B20与单片机地连接 (8)3.4报警温度地设置 (8)3.5数码管显示 (9)3.5.1数码管工作原理 (9)3.5.2数码管显示电路 (10)3.6硬件电路总体设计 (11)4.软件设计方案 (12)4.1主程序介绍 (12)4.1.1主程序流程图 (12)4.1.2主流程地C语言程序 (13)4.2部分子程序 (17)4.2.1 DS18B20复位子程序 (17)4.2.2 写DS18B20命令子程序 (18)4.2.3读温度子程序 (20)4.2.4计算温度子程序 (22)4.2.5显示扫描过程子程序 (23)5.基于DS18B20地温度采集显示系统地调试 (25)6.收获和体会 (27)7.参考文献 (27)1.引言1.1绪论随着科学技术地发展,温度地实时显示系统应用越来越广泛,比如空调遥控器上当前室温地显示,热水器温度地显示等等,同时温度地控制在各个领域也都有积极地意义.采用单片机对温度进行控制不仅具有控制方便、简单、灵活性大等特点,而且还可以大幅度提高被控温度地技术指标.本文介绍了基于DS18B20地温度实时采集与显示系统地设计与实现.设计中选取单片机AT89C51作为系统控制中心,数字温度传感器DS18B20作为单片机外部信号源,实现温度地实时采集.并且用精度较好地数码管作为温度地实时显示模块.利用单片机程序来完成对DS18B20与AT89C51地控制,最终实现温度地实时采集与显示.采用单片机对温度进行控制不仅具有控制方便、简单、灵活性大等特点,而且还可以大幅度提高被控温度地技术指标.1.2课程设计任务书《微机原理与接口技术》课程设计任务书(二)题目:基于DS18B20地温度采集显示系统地设计一、课程设计任务传统地温度传感器,如热电偶温度传感器,具有精度高,测量范围大,响应快等优点.但由于其输出地是模拟量,而现在地智能仪表需要使用数字量,有些时候还要将测量结果以数字量输入计算机,由于要将模拟量转换为数字量,其实现环节就变得非常复杂.硬件上需要模拟开关、恒流源、D/A转换器,放大器等,结构庞大,安装困难,造价昂贵.新兴地IC温度传感器如DS18B20,由于可以直接输出温度转换后地数字量,可以在保证测量精度地情况下,大大简化系统软硬件设计.这种传感器地测温范围有一定限制(大多在-50℃~120℃),多适用于环境温度地测量.DS18B20可以在一根数据线上挂接多个传感器,只需要三根线就可以实现远距离多点温度测量.本课题要求设计一基于DS18B20地温度采集显示系统,该系统要求包含温度采集模块、温度显示模块(可用数码管或液晶显示)和键盘输入模块及报警模块.所设计地系统可以从键盘输入设定温度值,当所采集地温度高于设定温度时,进行报警,同时能实时显示温度值.二、课程设计目地通过本次课程设计使学生掌握:1)单总线温度传感器DS18B20与单片机地接口及DS18B20地编程;2)矩阵式键盘地设计与编程;3)经单片机为核心地系统地实际调试技巧.从而提高学生对微机实时控制系统地设计和调试能力.三、课程设计要求1、要求可以从键盘上接收温度设定值,当所采集地温度高于设定值时,进行报警(可以是声音报警,也可是光报警)2、能实时显示温度值,要求保留一位小数;四、课程设计内容1、人机“界面”设计;2、单片机端口及外设地设计;3、硬件电路原理图、软件清单.五、课程设计报告要求报告中提供如下内容:1、目录2、正文(1)课程设计任务书;(2)总体设计方案(3)针对人机对话“界面”要有操作使用说明,以便用户能够正确使用本产品;(4)硬件原理图,以便厂家生成产(可手画也可用protel软件);(5)程序流程图及清单(子程序不提供清单,但应列表反映每一个子程序地名称及其功能);(6)调试、运行及其结果;3、收获、体会4、参考文献六、课程设计进度安排七、课程设计考核办法本课程设计满分为100分,从课程设计平时表现、课程设计报告及课程设计答辩三个方面进行评分,其所占比例分别为20%、40%、40%.2.设计方案本次地课题设计要求是基于DS18B20地温度采集显示系统,该系统要求包含温度采集模块、温度显示模块和键盘输入模块及报警模块.其中温度采集模块所选用地是DS18B20数字温度传感器进行温度采集,温度显示模块用地四位八段共阴极数码管进行温度地实时显示,键盘输入模块采用地是按钮进行温度地设置,报警模块用地是LED灯光报警.具体方案见图2-1.图2-1 总体设计方案3.硬件设计方案3.1最小系统地设计本次设计单片机采用地是AT89C51系列地,它由一个8位中央处理器(CPU),4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个串行I/O口及中断系统等部分组成.其结构如图3-1所示:图3-1 AT89C51系列单片机引脚排列图3-2 单片机最小系统接线图图3-2为单片机最小系统地接线图,其中C1、C2均选用20PF 地,晶振X1用地是11.0592MHZXTAL1XTAL2 RST EA地.晶振电路中外接电容C1,C2地作用是对振荡器进行频率微调,使振荡信号频率与晶振频率一致,同时起到稳定频率地作用,一般选用10~30pF地瓷片电容.并且电容离晶振越近越好,晶振离单片机越近越好.晶振地取值范围一般为0~24MHz,常用地晶振频率有6MHz、12 MHz、11.0592 MHz、24 MHz 等.晶振地振荡频率直接影响单片机地处理速度,频率越大处理速度越快.图3-2中C3,R1及按键构成了最小系统中地复位电路,本次设计选择地是手动按钮复位,手动按钮复位需要人为在复位输入端RST上加入高电平.一般采用地办法是在RST端和正电源Vcc之间接一个按钮.当人为按下按钮时,则Vcc地+5V电平就会直接加到RST端.由于人地动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位地时间要求.在单片机最小系统中还要将EA地非接高电平,如图3-2也有体现出来.3.2 LED发光报警电路P1.7图3-3 LED发光报警电路图3-3为LED报警电路地接法,其中一根线接单片机地8号P1.7口,另外一根接地.当温度超过预设温度值时LED灯被接通发光报警.3.3 DS18B20地简介及在本次设计中地应用3.3.1 DS18B20地外部结构及管脚排列DS18B20地管脚排列如图3-4所示:DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)图3-4 DS18B20地引脚排列及封装3.3.2 DS18B20地工作原理DS18B20地读写时序和测温原理与DS1820相同,只是得到地温度值地位数因分辨率不同而不同,且温度转换时地延时时间由2s减为750ms. DS18B20测温原理如图3-5所示.图中低温度系数晶振地振荡频率受温度影响很小,用于产生固定频率地脉冲信号送给计数器1.高温度系数晶振随温度变化其振荡率明显改变,所产生地信号作为计数器2地脉冲输入.计数器1和温度寄存器被预置在-55℃所对应地一个基数值.计数器1对低温度系数晶振产生地脉冲信号进行减法计数,当计数器1地预置值减到0时,温度寄存器地值将加1,计数器1地预置将重新被装入,计数器1重新开始对低温度系数晶振产生地脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值地累加,此时温度寄存器中地数值即为所测温度.图中地斜率累加器用于补偿和修正测温过程中地非线性,其输出用于修正计数器1地预置值.图3-5 DS18B20测温原理图3.3.3 DS18B20地主要特性(1)适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电;(2)独特地单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20地双向通讯;(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一地三线上,实现组网多点测温;(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管地集成电路内;(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;(6)可编程地分辨率为9~12位,对应地可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温;(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快;(8)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强地抗干扰纠错能力;(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作.3.3.4 DS18B20地测温流程图3-6 DS18B20地测温流程图3.3.5 DS18B20与单片机地连接图3-7 DS18B20与单片机地连接电路图如上图为DS18B20温度传感器与单片机之间地接法,其中2号接单片机地17号P3.7接口.DS18B20通过P3.7口将采集到地温度实时送入单片机中.3.4 报警温度地设置P2.5 P2.6 P2.7P3.7图3-8 报警温度地设置电路图3-8为报警温度地设置电路,其中K1,K2,K3分别接到单片机地P2.5,P2.6,P2.7口.其中K1用于报警温度设定开关,K2用于报警温度地设置时候地加温度(每次加一),K3用于报警温度地设置时地减温度(每次减一).实现了报警温度地手动设置.3.5 数码管显示3.5.1数码管工作原理图3-9 数码管地引脚排列及结构图3-9为数码管地外形及引脚排列和两种接法(共阴极和共阳极)地结构图.共阳极数码管地8个发光二极管地阳极(二极管正端)连接在一起.通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端.当某段驱动电路地输出端为低电平时,则该端所连接地字段导通并点亮.根据发光字段地不同组合可显示出各种数字或字符.此时,要求段驱动电路能吸收额定地段导通电流,还需根据外接电源及额定段导通电流来确定相应地限流电阻.共阴极数码管地8个发光二极管地阴极(二极管负端)连接在一起.通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端.当某段驱动电路地输出端为高电平时,则该端所连接地字段导通并点亮,根据发光字段地不同组合可显示出各种数字或字符.此时,要求段驱动电路能提供额定地段导通电流,还需根据外接电源及额定段导通电流来确定相应地限流电阻.要使数码管显示出相应地数字或字符,必须使段数据口输出相应地字形编码.字型码各位定义为:数据线D0与a字段对应,D1与b字段对应……,依此类推.如使用共阳极数码管,数据为0表示对应字段亮,数据为1表示对应字段暗;如使用共阴极数码管,数据为0表示对应字段暗,数据为1表示对应字段亮.如要显示“0”,共阳极数码管地字型编码应为:11000000B(即C0H);共阴极数码管地字型编码应为:00111111B(即3FH).依此类推,可求得数码管字形编码如表3-5所示.表3-5数码管字符表显示地具体实施是通过编程将需要显示地字型码存放在程序存储器地固定区域中,构成显示字型码表.当要显示某字符时,通过查表指令获取该字符所对应地字型码.3.5.2数码管显示电路图3-10 四位八段数码管动态显示电路图3-10为本次设计所用到地四位八段数码管动态显示,其中段选接到单片机地P0口,位选接到单片机地P2口地低四位.其中P0口也接地有上拉电阻,图中未标示出来,会在下面地总体电路中标示出来.采用地是动态显示方式.3.6 硬件电路总体设计图3-11为本次设计地硬件总体设计图,其中利用K1,K2,K3处进行报警温度地设置,然后有DS18B20进行实时温度采集,并在数码管上同步显示,若采集到地温度达到或者超过预设地报警温度,则LED 灯会发光报警,若低于该报警温度,则不会报警.P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1P2.2 P2.3图3-11 硬件电路总体设计图4.软件设计方案4.1主程序介绍4.1.1主程序流程图本次设计首先对程序进行初始化,然后打开报警温度设定开关,对报警温度进行设定,确认设定值后,DS18B20温度传感器进行温度采集并送入单片机中,单片机将传感器所检测到地温度同步显示在数码管上,并且与设置地报警温度进行比较,若达到或者超过报警温度时,LED灯发光报警,如果没有达到,则继续进行温度采集.图4-1主程序流程图4.1.2主流程地C语言程序main (){ALERT=0。
“盛群杯”单片机大赛设计报告温度读取部分:采用数字温度传感器DS18B20。
DS18B20为数字式温度传感器,无需其他外加电路,直接输出数字量。
可直接与单片机通信,读取测温数据,电路简单。
如图1.2.2 所示。
DS18B20与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面带来了令人满意的效果2.2.1 温度采集部分设计本系统采用半导体温度传感器作为敏感元件。
传感器我们采用了DS18B20单总线可编程温度传感器,来实现对温度的采集和转换,直接输出数字量,可以直接和单片机进行通讯,大大简化了电路的复杂度。
DS18B20应用广泛,性能可以满足题目的设计要求。
DS18B20的测温电路如图2.2.1所示。
图2.2.1 DS18B20测温电路(1)DSI8B20的测温功能的实现:其测温电路的实现是依靠单片机软件的编程上。
当DSI8B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.062 5℃/LSB形式表示。
温度值格式如表2.2.1所示,其中“S”为标志位,对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值。
DSI8B20完成温度转换后,就把测得的温度值与 TH做比较,若T>TH或T<TL,则将该器件内的告警标志置位,并对主机发出的告警搜索命令做出响应。
表2.2.1 DS18B20温度值格式表(2)、DSl820工作过程中的协议初始化 -> RoM操作命令 -> 存储器操作命令-> 处理数据①初始化单总线上的所有处理均从初始化开始② ROM操作命令总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如表2.2.2所示表2.2.2 ROM操作命令表③存储器操作命令如表2.2.3所示表2.2.3 存储器操作命令表(3)温度转换算法及分析由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。
DS18B20的工作原理DS18B20是一种数字温度传感器,广泛应用于各种温度测量和控制系统中。
它采用一线式总线通信协议,具有高精度、低功耗和可靠性高等特点。
下面将详细介绍DS18B20的工作原理。
1. 传感器结构DS18B20由温度传感器、数字转换器和总线控制电路组成。
温度传感器采用微处理器技术,内部集成为了温度传感器、模数转换器和数字信号处理电路。
总线控制电路负责与主控设备进行通信,并提供传感器的供电。
2. 温度测量原理DS18B20采用基于半导体的温度传感器,利用温度对半导体材料电阻值的影响来测量温度。
具体来说,DS18B20内部有一个温度传感器,该传感器由一对电阻组成,其中一个电阻是一个恒流源,另一个电阻是一个PTAT(Proportional to Absolute Temperature)电阻。
当温度升高时,PTAT电阻的电阻值也会升高,而恒流源电阻的电阻值保持不变。
通过测量这两个电阻之间的电压差,可以计算出温度值。
DS18B20的内部电路会将这个电压差转换为数字信号,然后通过总线传输给主控设备。
3. 一线式总线通信协议DS18B20采用一线式总线通信协议进行与主控设备的通信。
这种通信方式只需要一根信号线,可以同时传输数据和供电。
主控设备通过发送特定的命令和参数来读取传感器的温度值。
在通信过程中,主控设备会发送复位脉冲,然后传感器会发送存在脉冲作为应答。
接着,主控设备发送读取温度命令,传感器会将温度值转换为数字信号,并通过总线传输给主控设备。
主控设备通过读取总线上的数字信号来获取温度值。
4. 精度和分辨率DS18B20具有高精度和可调节的分辨率。
其温度测量精度可以达到±0.5℃,分辨率可以调节为9位、10位、11位或者12位。
分辨率越高,温度测量的精度越高,但传输的数据量也越大。
5. 供电方式DS18B20可以通过总线路线从主控设备获取供电,也可以通过外部供电。
当通过总线供电时,传感器会利用总线上的电能进行工作;当通过外部供电时,传感器可以提供更大的测量范围和更快的响应速度。
目录摘要 (2)一、绪论 (3)二、系统方案实现 (3)2.1.设计要求 (3)2.2.设计方案论证 (3)2.3.总体设计框图 (4)三、主要硬件介绍 (4)3. 1.DS18B20 (4)3.1.1 DS18B20的主要特性 (4)3.1.2 DS18B20的外形和内部结构 (5)3.1.3 DS18B20工作原理 (6)3.1.4 高速暂存存储器 (7)3.2 AT89C51 (8)四、软件介绍 (9)4.1 功能概述 (9)4.2 系统软件流程图 (9)4.2.1程序 (9)4.2.2读出温度子程序 (10)4.2.3温度转换命令子程序 (11)4.3具体程序 (11)五、总结 (22)六、设计体会及今后的改进意见 (22)参考文献 (23)摘要本文基于DS18B20设计了一种温度数据采集系统,系统主要由AT89C51单片机,一个DS18B20 数字温度传感器以及一个液晶数码管构成。
软件方面,我们采用keil。
软件对程序进行编写以及调试,硬件方面,我们通过Proteus软件对硬件电路进行仿真以及测试,该系统结构简单,功耗较低,测温范围为- 50℃~+ 255℃。
现场温度直接以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量。
该系统硬件分为3部分:DS18B20 温度测量模块、单片机模块、显示模块。
关键词:DS18B20、7SEG-MPX4液晶数码管、AT89C51一、绪论在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。
其中,温度控制也越来越重要。
在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。
采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大提高产品的质量和数量。
因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题。
单总线温度传感器DS18B20简介DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。
它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20非常适用于远距离多点温度检测系统。
DS18B20外形及引脚说明外形及引脚如图2所示:图2 管脚排列图在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下:1(GND):地2(DQ):单线运用的数据输入输出引脚3(VDD):可选的电源引脚DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。
初始时,计数器1预置的是与-55℃相对应的一个预置值。
以后计数器1每一个循环的预置数都由斜率累加器提供。
为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。
计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。
2、设计分析及系统方案设计通过DS18B20进行小数11位温度转换、采集,通过单片机读取DS18B20采集到的11位温度值进行二进制到十六进制的转换,利用ZLG7290进行八位数码管显示;利用键盘进入中断来设定报警上、下限,当温度高于上限或低于下限时进入报警子程序。
利用键盘进入中断来查看当前设置的温度报警上下限值,利用ZLG7290和数码管来显示。
主程序不断循环采集温度比较,并可随时进入中断来修改温度上下限和查看温度值。
3、外围接口模块硬件电路功能描述1.DS18B20:用于测定温度,测量范围-55~+125,分辨率为0.0625℃,数据格式为二进制补码形式。
2.ZLG7290B:用于数码管动态显示驱动,键盘扫描管理。
能够驱动8位共阴极结构的LED数码管或64位独立的LED,同时还能扫描管理多达64个按键的扫描识别,其中八个键可以作为功能键使用。
接口采用I²C结构。
3.蜂鸣器:这里用作报警,为无源蜂鸣器。
设置DS18B20端口参数THI_WARNING EQU 40HTLI_WARNING EQU 41HTEMPER_FLAG EQU 42H ;温度符号位数据保存区TEMPER_POINT EQU 43H ;温度小数部分数据保存区TEMPER EQU 44H ;温度整数部分数值保存区TEMPER_H EQU 45H ;温度整数部分高位数值保存区TEMPER_L EQU 46H ;温度整数部分低位数值保存区TI_SHOW EQU 47H ;十进制温度整数部分数值保存区T_SAVE EQU 48HTEMPER_NUM EQU 60HFLAG1 BIT 00HDQ BIT P3.3;******************************;设置ZLG7290端口参数;******************************SDA BIT P1.0SCL BIT P1.1WSLA EQU 70HRSLA EQU 71HDISDA EQU 20HDISCON EQU 08H;*********************************ORG 8000HLJMP 8100HORG 8003HLJMP INT_7290;*********************************;初始化部分;*********************************ORG 8100HMOV SP,#60HCLR P1.7LCALL DELAYSETB P1.7;***************************;开中断,设置报警上下限值;**************************MOV TMOD,#11HMOV TL1,#0FCHMOV TH1,#4BHSETB TR1SETB EX0SETB EASETB IT0MOV THI_WARNING,#22HMOV TLI_WARNING,#20H;******************************************************************************;主程序部分;******************************************************************************LP1:LCALL GET_TEMPER ;从DS18B20读取温度数据LCALL TEMPER_COV ;转换读取的温度整数、符号位和小数部分数据并保存LCALL DATA_PRO;数码管显示前对要显示数据的相关处理LCALL LEDSHOW ;数码管显示程序MOV A,TEMPERCJNE A,TLI_WARNING,WAR;判断温度值是否低于报警下限值,低于则报警,不低于则判断WAR:JNC LOOP10;是否大于报警上限值LCALL BUZZL ;蜂鸣器报警程序SJMP LP1LOOP10:CJNE A,THI_WARNING,WAR1;判断温度值是否低于报警下限值,低于则报警,不低于则跳转WAR1:JC LP2LCALL BUZZH ;蜂鸣器报警程序SJMP LP1LP2: LCALL NOTWINKLE;对ZLG7290写入不闪烁控制字LJMP LP1;******************************************************************************;获取DS18B20温度值子程序;******************************************************************************GET_TEMPER:SETB DQBCD:LCALL INIT_1820 JB FLAG1,S22LJMP BCDS22:LCALL DELAY1MOV A,#0CCHLCALL WRITE_1820MOV A,#44HLCALL WRITE_1820LCALL DELAYCBA:LCALL INIT_1820 JB FLAG1,ABCLJMP CBAABC:LCALL DELAY1MOV A,#0CCHLCALL WRITE_1820MOV A,#0BEHLCALL WRITE_1820LCALL READ_18200RETWRITE_1820:MOV R2,#8CLR CWR1:CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRETREAD_18200:MOV R4,#2MOV R1,#46HRE00:MOV R2,#8RE01:CLR CSETB DQNOPCLR DQNOPNOPSETB DQMOV R3,#2DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;****************************************************************************** ;DS18B20温度值提取整数部分、符号位和小数部分的子程序;******************************************************************************TEMPER_COV:MOV A,#0F0HANL A,TEMPER_LSWAP AMOV TEMPER_NUM,AMOV A,TEMPER_HANL A,#07HSWAP AADD A,TEMPER_NUMMOV TEMPER_NUM,AMOV TEMPER,TEMPER_NUMMOV A,#0FHANL A,TEMPER_LSWAP AMOV TEMPER_POINT,AMOV A,TEMPER_HANL A,#08HSWAP AMOV TEMPER_FLAG,ARET;整数和小数的位偏移数据存储;****************************************************************************** ;30H——37H为数据存储区,其中30H--33H为小数值;34H--35H为整数值,36为百位值,37为符号位值;****************************************************************************** DATA_PRO:MOV 37H,#0AHMOV A,TEMPER_FLAGJZ POSITIVEMOV A,TEMPERCPL AANL A,#7FHADD A,#01HMOV TEMPER,AMOV 37H,#0BH POSITIVE: MOV A,TEMPERCJNE A,64H,SETHUNDREDBIT SETHUNDREDBIT:JC SETHUNDREDBIT1SUBB A,#64HMOV TEMPER,AMOV 36H,#01HSJMP SET1 SETHUNDREDBIT1: MOV 36H,#00HSET1: MOV A,TEMPERMOV B,#10DIV ABMOV 34H,BMOV 35H,AMOV A,TEMPER_POINTCLR CRLC ASWAP ARR AJNZ POINT1MOV 30H,#00HMOV 31H,#00HMOV 32H,#00HMOV 33H,#00HSJMP SHOWPOINT1: DEC AJNZ POINT2MOV 30H,#05HMOV 31H,#02HMOV 32H,#06HMOV 33H,#00HSJMP SHOWPOINT2: DEC AJNZ POINT3MOV 30H,#00HMOV 31H,#05HMOV 32H,#02HMOV 33H,#01HSJMP SHOWPOINT3: DEC AJNZ POINT4MOV 30H,#05HMOV 31H,#07HMOV 32H,#08HMOV 33H,#01HSJMP SHOWPOINT4: DEC AJNZ POINT5MOV 30H,#00HMOV 31H,#00HMOV 32H,#05HMOV 33H,#02HSJMP SHOW POINT5: DEC AJNZ POINT6MOV 30H,#05HMOV 31H,#02HMOV 32H,#06HMOV 33H,#00HSJMP SHOW POINT6: DEC AJNZ POINT7MOV 30H,#00HMOV 31H,#05HMOV 32H,#07HMOV 33H,#03HSJMP SHOW POINT7:MOV 30H,#05HMOV 31H,#07HMOV 32H,#03HMOV 33H,#04H SHOW: JNC SHOW1MOV A,33HADD A,#05H MOV 33H,A SHOW1:RET;****************************************************************************** ;ZLG7290数据显示部分子程序;******************************************************************************LEDSHOW: PUSH 00H PUSH 01H PUSH 02H PUSH 03HPUSH 07MOV DPTR,#LEDSEGCLR AMOV R7,#08HMOV R0,#20HMOV R1,#30H LOOP1:MOV A,@R1MOVC A,@A+DPTR MOV @R0,AINC R1INC R0DJNZ R7,LOOP1MOV A,24HADD A,#01HMOV 24H,ALOOP: MOV R7,#08H MOV R0,#20HMOV R2,#10HMOV R3,#WSLALCALL WRNBYTLCALL DELAY0POP 07HPOP 03HPOP 02HPOP 01HPOP 00HRET;******************************************************************************;延时子程序DELAY0: PUSH 00HPUSH 01HMOV R0,#00H DELAY2: MOV R1,#00H DJNZ R1,$DJNZ R0,DELAY2POP 01HPOP 00HRET DELAY1: MOV R7,#20H DJNZ R7,$RET DELAY: PUSH 00HPUSH 01HMOV R0,#00LP: MOV R1,#00HDJNZ R1,$DJNZ R0,LPPOP 01HPOP 00HRET;****************************************************************************** ;蜂鸣器子程序;******************************************************************************BUZZL:PUSH 04H MOV R4,#200 MOV TL0,#66HMOV TH0,#0FCHSETB TR0LOOP002:JNB TF0,$CLR TF0CPL P3.4MOV TL0,#55HMOV TH0,#0FCHDJNZ R4,LOOP002LCALL TWINKLEPOP 04HRETBUZZH:PUSH 04HMOV R4,#128MOV TL0,#66HMOV TH0,#0FCHSETB TR0LOOP003:JNB TF0,$CLR TF0CPL P3.4MOV TL0,#55HMOV TH0,#0FCHDJNZ R4,LOOP003LCALL TWINKLEPOP 04HRET;****************************************************************************** ;数码管闪烁子程序;******************************************************************************TWINKLE:PUSH 00HPUSH 02HPUSH 03HPUSH 07HMOV 38H,#70HMOV 39H,#0FFHMOV R7,#02HMOV R0,#38HMOV R2,#07HMOV R3,#WSLALCALL WRNBYTMOV 3AH,#00HMOV R7,#01HMOV R0,#3AHMOV R2,#0CHMOV R3,#WSLALCALL WRNBYTPOP 07HPOP 03HPOP 02HPOP 00HRET NOTWINKLE:PUSH 00HPUSH 02HPUSH 03HPUSH 07HMOV 38H,#70HMOV 39H,#00HMOV R7,#02HMOV R0,#38HMOV R2,#07HMOV R3,#WSLALCALL WRNBYTMOV 3AH,#00HMOV R7,#01HMOV R0,#3AHMOV R2,#0CH MOV R3,#WSLA LCALL WRNBYT POP 07HPOP 03HPOP 02HPOP 00H RET;****************************************************************************** ;中断子程序;****************************************************************************** INT_7290:PUSH 00HPUSH 01HPUSH 02HPUSH 03HPUSH 04HPUSH 07HPUSH ACCPUSH PSWLCALL NOTWINKLEMOV 50H,#00HMOV 51H,#00HMOV 52H,#00HMOV 53H,#00HMOV 54H,#00HMOV 55H,#00HMOV 56H,#00HMOV 57H,#00HLOOP_1: CLR CLCALL DISP1JB P3.2,$LCALL INITREADMOV A,29HDEC ACJNE A,#0FH,DOWN ;判断是F键吗,是F关中断退出SJMP TAIL1DOWN: CJNE A,#0EH,DOWN1 ;判断是E键吗,是E显示设定的温度上限MOV A,THI_WARNINGMOV B,#10DIV ABMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,AMOV A,BMOVC A,@A+DPTRMOV 50H,AMOV 52H,#12HMOV 53H,#6EHLCALL DISP1JB P3.2,$SJMP TAIL1DOWN1:CJNE A,#0DH,DOWN2 ;判断是D键吗,是D显示设定的温度下限 MOV A,TLI_WARNINGMOV B,#10DIV ABMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,AMOV A,BMOVC A,@A+DPTRMOV 50H,AMOV 52H,#12HMOV 53H,#1CHLCALL DISP1JB P3.2,$SJMP TAIL1DOWN2: CJNE A,#0CH,DOWN3 ;判断是C键吗,是C设定的温度下限MOV 50H,#00HMOV 51H,#00HMOV 52H,#12HMOV 53H,#1CHLCALL SET_TLIMITMOV TLI_WARNING,T_SAVEJB P3.2,$SJMP TAIL1DOWN3:CJNE A,#0BH,TAIL1 ;判断是B键吗,是B设定的温度上限MOV 52H,#12HMOV 53H,#6EHLCALL SET_TLIMITMOV THI_WARNING,T_SAVEJB P3.2,$SJMP TAIL1TAIL1: CLR IE0 ;必须清标志POP PSWPOP ACCPOP 07HPOP 04HPOP 03HPOP 02HPOP 01HPOP 00HRETI;****************************************************************************** ;设置报警温度上下限值子程序;****************************************************************************** SET_TLIMIT:LCALL DISP1AGAIN:JB P3.2,$LCALL INITREADMOV A,29HDEC ACJNE A,#0FH,STEP1SJMP TAILSTEP1:CJNE A,#0DH,STEP2SJMP AGAINSTEP2:CJNE A,#0CH,STEP3 SJMP AGAINSTEP3:CJNE A,#0BH,STEP4 JNC AGAINSTEP4:CJNE A,#0AH,STEP5JNC AGAINSTEP5: MOV T_SAVE,AMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,ALCALL DISP1 AGAIN1: JB P3.2,$LCALL INITREAD NOPMOV A,29HDEC ACJNE A,#0FH,STEP11 SJMP TAILSTEP11: CJNE A,#0DH,STEP12 SJMP AGAIN1STEP12: CJNE A,#0CH,STEP13 SJMP AGAIN1 STEP13:CJNE A,#0BH,STEP14 SJMP AGAIN1 STEP14:CJNE A,#0AH,STEP15 SJMP AGAIN1STEP15: MOV 50H,AMOV A,T_SAVEMOV B,#10MUL ABADD A,50HMOV T_SAVE,AMOV A,50HMOV DPTR,#LEDSEGMOVCA,@A+DPTRMOV 50H,ALCALL DISP1TAIL:RET;****************************************************************************** ;数码管显示子程序;******************************************************************************DISP1: PUSH 00H PUSH 02HPUSH 03HPUSH 04HPUSH 07HMOV R7,#08HMOV R0,#50HMOV R2,#10HMOV R3,#WSLA LCALL WRNBYT LCALL DELAY POP 07HPOP 04HPOP 03HPOP 02HPOP 00HRET;****************************************************************************** ;读取键值子程序;******************************************************************************INITREAD:MOV R0,#29H MOV R7,#01H MOV R2,#01HMOV R3,#WSLA MOV R4,#RSLA LCALL RDADD RET;****************************************************************************** ;初始化DS18B20子程序;******************************************************************************INIT_1820:SETB DQNOPCLR DQMOV R0,#80HTSR1:DJNZ R0,TSR1SETB DQMOV R0,#25HTSR2:DJNZ R0,TSR2JNB DQ,TSR3LJMP TSR4TSR3:SETB FLAG1 LJMP TSR5TSR4:CLR FLAG1 LJMP TSR7TSR5: MOV R0,#06BH TSR6:DJNZ R0,TSR6 TSR7:SETB DQRET;*********************************;ZLG7290相关子程序;*********************************;(1)带有内部单元地址的多字节写操作子程序 WRNBYT;******************************************************************* ;通用的I2C通讯子程序(多字节写操作);入口参数R7字节数,R0:源数据块首地址;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写);WRBYT、STOP、CACK、STA;******************************************************************* WRNBYT: PUSH PSWPUSH ACCWRADD: MOV A,R3 ;取外围器件地地址(包含r/w=0)LCALL STA ;发送起始信号SLCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应MOV A,R2LCALL WRBYT ;发送内部寄存器首地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应答不正确返回重来WRDA: MOV A,@R0LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应答不正确返回重来INC R0DJNZ R7,WRDALCALL STOPPOP ACCPOP PSWRET;(2)带有内部单元地址的多字节读操作子程序 RDADD;******************************************************************* ;通用的I2C通讯子程序(多字节读操作);入口参数R7字节数;;R0目标数据块首地址;R2从器件内部子地址;;R3器件地址(写);R4器件地址(读);WRBYT、STOP、CACK、STA、MNACK;******************************************************************* RDADD: PUSH PSW ;从PCF8563的02H单元读入7个参数PUSH ACC ;存放于20H-26H单元RDADD1: LCALL STAMOV A,R3 ;取器件地址(写)LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来MOV A,R2 ;取内部地址LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来LCALL STAMOV A,R4 ;取器件地址(读)LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来RDN: LCALL RDBYTMOV @R0,ADJNZ R7,ACKLCALL MNACKLCALL STOPPOP ACCPOP PSWRETACK: LCALL MACKINC R0SJMP RDN;(3)I2C各个信号子程序;********************************************************************** ; 启动信号子程序S;**********************************************************************STA: SETB SDA ;启动信号S SETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPCLR SDA NOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLRET;********************************************************************** ; 停止信号子程序P;*********************************************************************STOP: CLR SDA ;停止信号P SETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPSETB SDA NOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLCLR SDARET;********************************************************************** ; 应答信号子程序 MACKMACK: CLR SDA ;发送应答信号ACK SETB SCLNOP ;产生4.7US延时NOPNOP NOPNOPCLR SCL SETB SDA RET;********************************************************************** ; 非应答法信号子程序MNACK;**********************************************************************MNACK:SETB SDA ;发送非应答信号NACK SETB SCLNOP ;产生4.7US延时NOPNOP NOPNOPCLR SCL CLR SDA RET;********************************************************************** ; 应答检测子程序CACK;**********************************************************************CACK: SETB SDA;应答位检测子程序SETB SCLCLR F0MOV C,SDA ;采样SDAJNC CEND;应答正确时转CENDSETB F0;应答错误时F0置一CEND: CLR SCLRET;********************************************************************** ; 发送一个字节子程序WRBYT;**********************************************************************WRBYT: PUSH 06HMOV R6,#08H;发送一个字节子程序WLP: RLC A ;(入口参数A)MOV SDA,CSETB SCLNOP ;产生4.7US延时NOP NOPNOPNOPCLR SCL DJNZ R6,WLP POP 06H RET;********************************************************************** ; 接收一个字节子程序RDBYTRDBYT: PUSH 06HMOV R6,#08H ;接收一个字节子程序RLP: SETB SDASETB SCL; *******************************************NOP ;!!!!!产生大于15微秒的延时!!!!!!NOP ;注意这是专门为ZLG7290NOP ;添加的20微秒延时部分NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOP; ********************************************MOV C,SDAMOV A,R2RLC AMOV R2,ACLR SCLDJNZ R6,RLP ;(出口参数R2)POP 06HRET;********************************************************************** LEDSEG:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H,0FEH,0F6H,00H,02H END。