基于单片机的液晶温度显示器的
设计
时间:2021.03.02 创作:欧阳数 [摘要]本文主要介绍了一个基于AT89C51单片机的测温系统,详细描述了利用液晶显示器件LCD1602和传感器DS18B20开发测温系统的过程,对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽阐发,特别是数字温度传感DS18B20的数据收集过程。
[关键词]AT89C51;DS18B20;LCD1602
Based on singlechip microcomputertemperatureof
liquid crystal display design Author:ZhouWeiTao
(Garde11 class4Major Communication, School of Physics and Telecommunication Engineering,Shaanxi
University of Telechnology ,shaanxi hanzhong
723000)
Tutor: LiuYafeng [Abstract]This paper mainly introduces a temperature measurement system based on AT89C51, describes in detail using LCD1602 LCD display device and sensor DS18B20 temperature measurement and control system in the development process, focusing on sensor under the single chip microcomputer hardware connection, software programming and the flow diagram of each module system are analyzed in detail, especially the digital temperature sensor DS18B20 the data collection process.
[Key words]AT89C51;DS18B20;LCD1602
欧阳数创编
引言
温度是生活及生产中最基本的物理量,它表征的是物体的冷热水平。自然界中任何物理、化学过程都紧密地与温度相联系。在很多生产过程中,温度的丈量和控制都直接和平安生产、提高生产效率、包管产品质量、节约能源等重年夜技术经济指标相联系。自18世纪工业革命以来,工业过程离不开温度控制。温度控制广泛应用于社会生活的各个领域,如家电、汽车、资料、电力电子等。温度控制的精度以及不合控制对象的控制办法选择都起着至关重要的作用。
随着社会的进步和工业技术的成长,温度因素在社会生活各个方面已不容忽视。由于许多产品对温度规模要求严格,而目前市场上普遍存在的温度检测仪器年夜都是单点丈量,同时有温度信息传递不及时、精度不敷的缺点,晦气于工业控制者根据温度变更及时做出决定,在这样的形式下,开发一种能够同时丈量多点,并且实时性高、精度高,能够综合处理多点温度信息的丈量系统就很有需要。
在单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术条件下,我们可以基于89S51单片机,利用液晶显示器件以及DS18B20温度传感器等器件,通过温度传感器在单片机下的硬件连接,软件编程即可设计DS18B20温度传感器系统。该系统可以便利的实现实现温度收集和显示,并可根据需要任意设定上下限报警温度,它使用起来相当便利,具有精度高、量程宽、灵敏度高、体积小、功耗高等优点,适合于我们日常生活和工、农业生产中的温度丈量,也可以看成温度处理模块嵌入其它系统中,作为其他主系统的帮助扩展。DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于卑劣环境下进行现场温度丈量,有广泛的应用前景。 1内容
1.1课程设计题目
基于DS18B20的温度传感器 1.2课程设计目的
通过基于MCS51系列单片机AT89C51和DS18B20温度传感器检测温度,熟悉芯片的使用,温度传感器的功能,数码显示管的使用,汇编语言的设计;并且把我们这一年所学的数字和模拟电子技术、检测技术、单片机应用等知识,通过理论联系实际,从题目阐发、电路设计调试、法度编制调试到传感器的选定等这一完整的实验过程,培养了学生正
欧阳数创编
欧阳数创编
确的设计思想,使学生充分阐扬主观能动性,去自力解决实际问题,以达到提升学生的综合能力、入手能力、文献资料查阅能力的作用,为结业设计和以后工作打下一个良好的基础。
1.3设计任务和要求
以MCS51系列单片机为核心器件,组成一个数字温度计,采取数字温度传感器DS18B20为检测器件,进行单点温度检测,检测精度为±0.5摄氏度。温度显示采取LCD1602显示,两位整数,一位小数。
图1.1系统总体仿真图
1.4计划选择与论证
根据设计任务的总体要求,本系统可以划分为以下几个基本模块,针对各个模块的功能要求,辨别有以下一些不合的设计计划: 1.4.1温度传感模块
计划一:采取热敏电阻,热敏电阻精度、重复性、可靠性较差,对检测1摄氏度的信号是不适用的,也不克不及满足丈量规模。在温度丈量系统中,也常采取单片温度传感器,比方AD590,LM35等。但这些芯片输出的都是模拟信号,必须经过A/D转换后才干送给计算机,这样就使测温系统的硬件结构较庞杂。另外,这种测温系统难以实现多点测温,也要用到庞杂的算法,一定水平上也增加了软件实现的难度。计划二:采取单总线数字温度传感器DS18B20丈量温度,直接输出数字信号。便于单片机处理及控制,节省硬件电路。且该芯片的物理化学性很稳定,此元件线形性能好,在0—100摄氏度时,最年夜线形偏差小于1摄氏度。DS18B20的最年夜特点之一采取了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C51构成的温度装置,它直接输出温度的数字信号到微控制器。每只DS18B20具有一个独有的不成修改的64位序列号,根据序列号可拜访不合的器件。这样一条总线上可挂接多个DS18B20传感器,实现多点温度丈量,轻松的组建传感网络。
综上阐发,我选用第二种计划。
图1.2温度传感模块仿真图
欧阳数创编
欧阳数创编
1.4.2显示模块
计划一:采取8位段数码管,将单片机获得的数据通过数码管显示出来。该计划简单易行,但所需的元件较多,且不容易进行操纵,可读性差,一旦设定后很难再加入其他的功能,显示格式受限制,且年夜耗电量年夜,不宜用电池给系统供电。计划二:采取液晶显示器件,液晶显示平稳、省电、美观,更容易实现题目要求,对后续的园艺通兼容性高,只需将软件作修改即可,可操纵性强,也易于读数,采取RT1602两行十六个字符的显示,能同时显示其它的信息如日期、时间、星期、温度。 综上阐发,我们采取了第二个计划
图1.3显示模块仿真图
2系统概述
2.1系统的总体设计计划
采取AT89S52单片机作为控制核心对温度传感器DS18B20控制,读取温度信号并进行计算处理,并送到液晶显示器LCD1602显示。依照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路和显示电路。数
8255 字温度计总体电路结构框图如图2.1下所示。
显示电路 微机系统 PCD DS18B20 图2.1 总体电路结构框图 2.2硬件电路设计
2.2.1单片机控制模块
该模块由AT89C51单片机组成在设计方面,AT89C51
的EA接高电平,其外围电路提供能使之工作的晶振脉冲、复位按键,四个I/O辨别接8路的单列IP座便利与外围设备连接。当AT89C51芯片接到来自温度传感器的信号时,其内部法度将根据信号的类型进行处理,并且将处理的结果送到显示模块,发送控制信号控制各模块。
2.2.2温度传感器模块
欧阳数创编
欧阳数创编
图2.2 DS18B20
2.2.2.1 DS18B20原理与阐发
DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,它能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方法。可以辨别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线自己也可以向所挂接的DS18B20供电,而无需额定电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、辩白率等方面较DS1820有了很年夜的改进,给用户带来了更便利的使用和更令人满意的效果。 以下是DS18B20的特点: (1)共同的单线接口方法:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(2)在使用中不需要任何外围元件。
(3)可用数据线供电,电压规模:+3.0∽+5.5 V。 (4)测温规模:55 +125 ℃。固有测温辩白率为0.5 ℃。
(5)通过编程可实现912位的数字读数方法。 (6)用户可自设定非易失性的报警上下限值。 (7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。
欧阳数创编
欧阳数创编
(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不克不及正常工作。
图2.3 DS18B20的测温原理
2.2.2.2 DS18B20的测温原理
DS18B20的测温原理如图2.3所示,图2.3高温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变更其震荡频率明显修改,所产生的信号作为减法计数器2的脉冲输入,图2.3还隐含着计数门,当计数门掀开时,DS18B20就对高温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度丈量。计数门的开启时间由高温度系数振荡器来决定,每次丈量前,首先将55 ℃所对应的基数辨别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在 55 ℃ 所对应的一个基数值。减法计数器1对高温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对高温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图中的斜率累加器用于赔偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操纵必须按协议进行。操纵协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操纵命令→处理数据。DS18B20工作过程一般遵循以下协议:初始化——ROM操纵命令——存储器操纵命令——处理数据
① 初始化 单总线上的所有处理均从初始化序列开始。初始化序列包含总线主机收回一复位脉冲,接着由从属器件送出存在脉冲。存在脉冲让总线控制器知道DS1820 在总线上且已准备好操纵。
② ROM操纵命令 一旦总线主机检测到从属器件的存在,它即可以收回器件ROM操纵命令之一。所有ROM操纵命令均为8位长。这些命令如下: Read ROM(读ROM)[33h]
此命令允许总线主机读DS18B20的8位产品系列编码,唯一的48位序列号,以及8位的CRC。此命令只能在总线上仅有一个DS18B20的情况下可以使用。如果总线上
欧阳数创编
欧阳数创编
存在多于一个的从属器件,那么当所有从片企图同时发送时将产生数据冲突的现象(漏极开路会产生线与的结果)。 Match ROM( 合适ROM)[55h]
此命令后继以64位的ROM数据序列,允许总线主机对多点总线上特定的DS1寻址。只有与64位ROM序列严格相符的DS18B20才干对后继的存贮器操纵命令作出响应。所有与64位ROM序列不符的从片将等待复位脉冲。此命令在总线上有单个或多个器件的情况下均可使用。 Skip ROM( 跳过ROM )[CCh]
在单点总线系统中,此命令通过允许总线主机不提供64位ROM编码而拜访存储器操纵来节省时间。如果在总线上存在多于一个的从属器件并且在Skip ROM命令之后收回读命令,那么由于多个从片同时发送数据,会在总线上产生数据冲突(漏极开路下拉会产生线与的效果)。 Search ROM( 搜索ROM)[F0h]
当系统开始工作时,总线主机可能不知道单线总线上的器件个数或者不知道其64位ROM编码。搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。
Alarm Search(告警搜索)[ECh]
此命令的流程与搜索ROM命令相同。可是,仅在最近一次温度丈量呈现告警的情况下,DS18B20才对此命令作出响应。告警的条件界说为温度高于TH 或低于TL。只要DS18B20一上电,告警条件就坚持在设置状态,直到另一次温度丈量显示出非告警值或者修改TH或TL的设置,使得丈量值再一次位于允许的规模之内。贮存在EEPROM内的触发器值用于告警。 ③ 存储器操纵命令
Write Scratchpad(写暂存存储器)[4Eh]
这个命令向DS18B20的暂存器中写入数据,开始位置在地址2。接下来写入的两个字节将被存到暂存器中的地址位置2和3。可以在任何时刻收回复位命令来中止写入。Read Scratchpad(读暂存存储器)[BEh]
这个命令读取暂存器的内容。读取将从字节0开始,一直进行下去,直到第9(字节8,CRC)字节读完。如果不想读完所有字节,控制器可以在任何时间收回复位命令来中止读取。
Copy Scratchpad(复制暂存存储器)[48h]
欧阳数创编
欧阳数创编
这条命令把暂存器的内容拷贝到DS18B20的E2存储器里,即把温度报警触发字节存入非易失性存储器里。如果总线控制器在这条命令之后跟着收回读时间隙,而DS18B20又正在忙于把暂存器拷贝到E2存储器,DS18B20就会输出一个“0”,如果拷贝结束的话,DS18B20 则输出“1”。如果使用寄生电源,总线控制器必须在这条命令收回后立即起动强上拉并最少坚持10ms。 Convert T(温度变换)[44h]
这条命令启动一次温度转换而无需其他数据。温度转换命令被执行,此后DS18B20坚持等待状态。如果总线控制器在这条命令之后跟着收回读时间隙,而DS18B20又忙于做时间转换的话,DS18B20将在总线上输出“0”,若温度转换完成,则输出“1”。如果使用寄生电源,总线控制器必须在收回这条命令后立即起动强上拉,并坚持500ms。 Recall E2(重新调整E2)[B8h]
这条命令把贮存在E2中温度触发器的值重新调至暂存存储器。这种重新调出的操纵在对DS18B20上电时也自动产生,因此只要器件一上电,暂存存储器内就有了有效的数据。在这条命令收回之后,对所收回的第一个读数据时间片,器件会输出温度转换忙的标识:“0”=忙,“1”=准备就绪。
Read Power Supply(读电源)[B4h]
对在此命令发送至DS18B20之后所收回的第一读数据的时间片,器件城市给出其电源方法的信号:“0”=寄生电源供电,“1”=外部电源供电。 ④ 处理数据
DS18B20的高速暂存存储器由9个字节组成,其分派如表2.1所示。当温度转换命令宣布后,经转换所得的温度值以二字节补码形式寄存在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
表2.1 DS18B20温度数据表
表2.1是DS18B20温度收集转化后获得的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度年夜于或即是0,这5位为0,只要将测到的数值乘于0.0625即可获得实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可获得实际温度。
温度转换计算办法举例:
欧阳数创编
欧阳数创编
例如当DS18B20收集到+125℃的实际温度后,输出为07D0H,则:实际温度=07D0H*0.0625=2000*0.0625=1250C。例如当DS18B20收集到55℃的实际温度后,输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作为计算),则:实际温度=370H*0.0625=880*0.0625=550C。
2.2.2.3显示模块LCD1602资料(这里主要介绍下指令说明及时序)
表2.21602液晶模块内部的控制器控制指令
序号 1 2 3 4 5 6 7 8 9 指令 清显示 光标前往 置输入模式 显示开/关控制 光标或字符移位 置功能 置字符产生存贮器地址 置数据存贮器地址 读忙标记或地址 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 * 0 0 0 0 0 0 0 1 I/D S 0 0 0 0 0 0 1 D C B 0 0 0 0 0 1 S/C R/L * * 0 0 0 0 1 DL N F * * 0 0 0 1 字符产生存贮器地址 0 0 1 显示数据存贮器地址 0 1 BF 计数器地址 要写的数据内容 读出的数据内容 10 写数到CGRAM或DDRAM) 1 0 11 从CGRAM或DDRAM读数 1 1 1602液晶模块的读写操纵、屏幕和光标的操纵都是通
过指令编程来实现的。(说明:1为高电平、0为低电平) 置。
指令1:清显示,指令码01H,光标复位到地址00H位指令2:光标复位,光标前往到地址00H。
指令3:光标和显示模式设置 I/D:光标移动标的目的,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平暗示有效,低电平则无效。
欧阳数创编
欧阳数创编
指令4:显示开关控制。 D:控制整体显示的开与关,高电平暗示开显示,低电平暗示关显示 C:控制光标的开与关,高电平暗示有光标,低电平暗示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符产生器RAM地址设置。 指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标记位,高电平暗示忙,此时模块不克不及接收命令或者数据,如果为低电平暗示不忙。
指令10:写数据。 指令11:读数据。
表2.3与HD44780相兼容的芯片时序
读状态 写指令
输入 RS=L,R/W=H,E=H
输出 D0—D7=状态字
输入 RS=L,R/W=L,D0—D7=指令码,E=高输出 无
脉冲 输入 RS=H,R/W=H,E=H
输出 D0—D7=数据
读数据 写数据
输入 RS=H,R/W=L,D0—D7=数据,E=高脉输出 无
冲
图2.4 读操纵时序 图2.5 写操纵时序
3软件设计
系统法度主要包含主法度、读出温度子法度、温度转换子法度、计算温度子法度、显示等等。
3.1主法度
欧阳数创编
欧阳数创编
主要功能是完成DS18B20的初始化工作,并进行读温度,将温度转化成为压缩BCD码并在显示器上显示传感器所测得的实际温度。
3.2读出温度子法度
读出温度子法度的主要功能是读出RAM中的9字节,在读出时需要进行CRC校验,校验有错时不进行温度数据的改写。其法度流程图如图3.1。
图3.1 DS18B20的初始化流程
3.3温度转换命令子法度
温度转换命令子法度主要是发温度转换开始命令,当采取12位辩白率时转换时间约为750ms,在本法度设计中采取1s显示法度延时法等待转换的完成。流程图如图3.2
发DS18B20复位 命令 发跳过ROM命令 图3.2 延时流程图 发温度转换开始 命令 结束 3.4计算温度子法度
计算温度子法度将RAM中读取值进行BCD码的转换
运算,并进行温度值正负的判定。流程图如图3.3。
图3.3 正负温度判定流程图
4系统测试
4.1设计中的问题
通过这次基于DS18B20传感器丈量温度的设计,我学到了很多新的知识。首先,这次设计让我把书本上学到的理论知识转化成为现实生活中有价值的实物。如果没有这次设计为我 搭建的平台,我就不克不及对书本上的知识进行很好的理解,也不克不及熟练的把它们应用到现实生活中。还有,我们学会不克不及手高眼低,要踏踏实实,从基础学起、做起。可是,具体到设计时,我遇到了很多问题。
1. 2.
如何将传感器获得的温度转换成为对应的电信号; 如何将电信号输送到单片机进行控制;
欧阳数创编
欧阳数创编
3.
如何把测得的温度用数字显示出来。
4.2系统改进设想
本次基于单片机的温度监测系统的设计我感觉最年夜的缺陷就是没有加入温度上下限报警系统的设计,联系实际在法度中默认设置系统的下限温度为零下三十摄氏度。改进设想如下:
1.
在硬件方面应该加上一个蜂鸣器和三个按钮辨别为温度“+”、温度“—”和“确定”,根据不合的监测环境的要求用三个按钮来设置具体的上限温度;
2.
在软件方面辨别加上设置系统默认下限温度的代码、根据不合的环境设置系统上限温度的代码、当达到上限温度是蜂鸣器就报警的代码。
参考文献
[1]梁森,欧阳三泰,王侃夫. 自动检测技术及应用[M].北京:机械工业出版社.(2).
[2]万隆.单片机原理及应用技术.[M].北京:清华年夜学出版社..
[3]李朝青.单片机原理及接口技术(简明修订版).[M].杭州:北京航空航天年夜学出版社.(4).
[4]李广弟.单片机基础[M].北京:北京航空航天年夜学出版社.(3).
[5]康华光.数字电子技术基础(第四版)[M].北京:高等教育出版社.(5)
[6 张希影.基于74LS595驱动的温度显示器设计[J].微型计算机应用,,32(23):8389.
[7]冯若晔,沈年夜伟,祖静.基于ARM微处理器LPC2148的LED温度显示器设计[J].电子测试,,23(10):6063.
[8]洪连环.基于Proteus的液晶温度显示器仿真设计[J].电子设计工程,,19(5):186189.
[9]张志奎,刘强.浅析温度计位置对测温的影响[J].变压器,,49(11):4647.
[10]郭天祥. 51单片机C语言教程[M].北京:电子出版社. (3). [11]周鹏. 基于STC89C52单片机的温度检测系统设计[J]. 现代电子技术,,35(22):1013. 附录
欧阳数创编
欧阳数创编
附录A:仿真总体电路图
附录B:法度源代码 #include typedef unsigned char uint8; #define uint unsigned int #define uchar unsigned char sbit DQ = P3^3; // 界说DQ引脚为P3.3 uchar code Bw[10]= {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//百位编码 ucharcodeXsw[16]={0x30,0x31,0x31,0x32,0x33,0x33,0x34,0x34,0x35,0x36,0x36,0x37,0x38,0x38,0x39,0x39};//小数位编码 sbit RS = P2^0 ; sbit RW = P2^1 ; sbit EN = P2^2 ; sbit BUSY = P0^7; uchar wendu; uchar temp_g,temp_d; unsigned char code word1[]={\"Temperature:\ void delay(uint xms) { uint i,j; for(i=xms;i>0;i) } void Delayus(int t) //在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μs { int s; 欧阳数创编 for(j=110;j>0;j); 欧阳数创编 for (s=0; s P0 = 0xFF; { RS = 0; RW = 1; EN = 0; EN = 1; do }while (BUSY == 1); EN = 0; } void w_dat(uint8 dat)// 写数据 { wait(); EN = 0; P0 = dat; RS = 1; RW = 0; EN = 1; EN = 0; } void w_cmd(uint8 cmd)// 写命令 { wait(); EN = 0; P0 = cmd; RS = 0; 欧阳数创编 欧阳数创编 RW = 0; EN = 1; EN = 0; } void w_string(uint8 addr_start, uint8 *p)//发送字符串到LCD { w_cmd(addr_start); while (*p != '\\0') { } } void Init_LCD1602(void)// 初始化1602 { 接口 烁 w_cmd(0x38); // 16*2显示,5*7点阵,8位数据 w_cmd(0x0c); // 显示器开、光标开、光标允许闪 w_cmd(0x06); // 文字不动,光标自动右移 w_cmd(0x01); // 清屏 } uchar Reset()//完成单总线的复位操纵。 { uchar d; DQ = 0; // 将 DQ 线拉低 Delayus(29); // 坚持 480μs .复位时间为480μs,因此延时时间为(48024)/16 = 28.5,取29μs。 DQ = 1; // DQ前往高电平 Delayus(3); // 等待存在脉冲.经过70μs之后检测存在脉冲,因此延时时间为(7024)/16 = 2.875,取3μs。 d = DQ; // 获得存在信号 欧阳数创编 w_dat(*p++); 欧阳数创编 Delayus(25); // 等待时间隙结束 return(d); // 前往存在信号,0 = 器件存在, 1 = 无器件 } void write_bit(uchar bitval)//向单总线写入1位值:bitval { DQ = 0; // 将DQ 拉低开始写时间隙 if(bitval==1) DQ =1; // 如果写1,DQ 前往高电平 Delayus(5);// 在时间隙内坚持电平值, DQ = 1; // Delayus函数每次循环延时16μs,因此Delayus(5)=5*16+24=104μs } void ds18write_byte(char val)//向单总线写入一个字节值:val { uchar i; uchar temp; for (i=0; i<8; i++)// 写入字节, 每次写入一位 { temp = val>>i; temp &= 0x01; write_bit(temp); } Delayus(5); } uchar read_bit()//从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面界说 { //的Delayus()函数,而采取一个for()循环来实现延时。 uchar i; 欧阳数创编 欧阳数创编 DQ = 0; DQ = 1; //将DQ 拉低开始读时间隙 // 然后前往高电平 // 前往 DQ 线上的电平值 for (i=0; i<3; i++); // 延时15μs return(DQ); } uchar ds18read_byte()//从单总线读取一个字节的值 { uchar i; uchar value = 0; for (i=0;i<8;i++) { // 读取字节,每次读取一个字节 if(read_bit()) value|=0x01<return(value); } int Readtemperature()//如果单总线节点上只有一个器件则可以直接失落用本函数。如果节点上有多个器 { //件,为了避免数据冲突,应使用Match ROM函数来选中特定器件。 uchar temp_d,temp_g,k,get[2],temp; Reset(); ds18write_byte(0xcc); ROM 转换 ds18write_byte(0x44); Delayus(5); Reset(); ds18write_byte(0xcc); ROM ds18write_byte(0xbe); 欧阳数创编 // 跳过 // 启动温度 // 跳过 // 读暂存器 欧阳数创编 for (k=0;k<2;k++) { get[k]=ds18read_byte(); } temp_d = get[0];//低位 temp_g = get[1];//高位 if((temp_g&0xf0)==0xf0) //正负号判断 { temp_d=~temp_d; if(temp_d==0xff) //包管(1111110100000000)、32和16显示正常 { temp_d=temp_d+0x01;//00000000 temp_g=~temp_g;//00000010 temp_g=temp_g+0x01;//00000011 } else { temp_d=temp_d+0x01; temp_g=~temp_g; } w_cmd(0xc5); w_dat(Xsw[temp_d&0x0f]); //查表得小数位的值 temp=((temp_d&0xf0)>>4)|((temp_g&0x0f)<<4); w_cmd(0xc1); w_dat(0x2d);//负号 } else //正数 { w_cmd(0xc5); 欧阳数创编 48 欧阳数创编 w_dat(Xsw[temp_d&0x0f]); //查表得小数位的值 temp=((temp_d&0xf0)>>4)|((temp_g&0x0f)<<4); w_cmd(0xc1); w_dat(Bw[temp/100]); } return temp; } main() { Init_LCD1602(); w_string(0x80,word1); while (1) { wendu=Readtemperature(); temp_g=wendu%100/10+'0'; temp_d=wendu%10+'0'; w_cmd(0xc2); delay(2); w_dat(temp_g); delay(2); w_dat(temp_d); delay(2); w_cmd(0xc4); delay(2); w_dat(0x2e);//小数点 delay(2); w_cmd(0xc6); delay(2); w_dat(0xdf);//温度符号 欧阳数创编 欧阳数创编 delay(2); w_dat(0x43); } } 时间:2021.03.02 创作:欧阳数 欧阳数创编 因篇幅问题不能全部显示,请点此查看更多更全内容