课程设计(论文)基于单片机的液晶温度显示器的设计

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

基于单片机的液晶温度显示器的设计
[摘要]本文主要介绍了一个基于A T89C51单片机的测温系统,详细描述了利用液晶显示器件LCD1602和传感器DS18B20开发测温系统的过程,对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别是数字温度传感DS18B20的数据采集过程。

[关键词]A T89C51;DS18B20 ;LCD1602
Based on single chip microcomputer temperature of liquid
crystal display design
Author:Zhou WeiTao
(Garde11 class4 Major Communication, School of Physics and Telecommunication Engineering, Shaanxi
University of Telechnology ,shaanxi hanzhong 723000)
Tutor: Liu Yafeng
[Abstract]This paper mainly introduces a temperature measurement system based on A T89C51, 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] A T89C51; DS18B20; LCD1602
引言
温度是生活及生产中最基本的物理量,它表征的是物体的冷热程度。

自然界中任何物理、化学过程都紧密地与温度相联系。

在很多生产过程中,温度的测量和控制都直接和安全生产、提高生产效率、保证产品质量、节约能源等重大技术经济指标相联系。

自18世纪工业革命以来,工业过程离不开温度控制。

温度控制广泛应用于社会生活的各个领域,如家电、汽车、材料、电力电子等。

温度控制的精度以及不同控制对象的控制方法选择都起着至关重要的作用。

随着社会的进步和工业技术的发展,温度因素在社会生活各个方面已不容忽视。

由于许多产品对温度范围要求严格,而目前市场上普遍存在的温度检测仪器大都是单点测量,同时有温度信息传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时做出决定,在这样的形式下,开发一种能够同时测量多点,并且实时性高、精度高,能够综合处理多点温度信息的测量系统就很有必要。

在单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术条件下,我们可以基于89S51单片机,利用液晶显示器件以及DS18B20温度传感器等器件,通过温度传感器在单片机下的硬件连接,软件编程即可设计DS18B20温度传感器系统。

该系统可以方便的实现实现温度采集和显示,并可根据需要任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。

DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。

1内容
1.1课程设计题目
基于DS18B20的温度传感器
1.2课程设计目的
通过基于MCS-51系列单片机AT89C51和DS18B20温度传感器检测温度,熟悉芯片的使用,温度传感器的功能,数码显示管的使用,汇编语言的设计;并且把我们这一年所学的数字和模拟电子技术、检测技术、单片机应用等知识,通过理论联系实际,从题目分析、电路设计调试、程序编制调试到传感器的选定等这一完整的实验过程,培养了学生正确的设计思想,使学生充分发挥主观能动性,去独立解决实际问题,以达到提升学生的综合能力、动手能力、文献资料查阅能力的作用,为毕业设计和以后工作打下一个良好的基础。

1.3设计任务和要求
以MCS-51系列单片机为核心器件,组成一个数字温度计,采用数字温度传感器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个模块组成:主控制器、测温电路和显示电路。

数字温度计总体电路结构框图如图2.1下所示。

图2.1 总体电路结构框图
微机系统
8255
PCD
显示电路
DS18B20
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)通过编程可实现9-12位的数字读数方式。

(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液晶模块内部的控制器控制指令
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].北京:机械工业出版社.2012(2).
[2]万隆.单片机原理及应用技术.[M].北京:清华大学出版社.2010.
[3]李朝青.单片机原理及接口技术(简明修订版).[M].杭州:北京航空航天大学出版社.2013(4).
[4]李广弟.单片机基础[M].北京:北京航空航天大学出版社.2007(3).
[5]康华光.数字电子技术基础(第四版)[M].北京:高等教育出版社.2008(5)
[6 张希影.基于74LS595驱动的温度显示器设计[J].微型计算机应用,2013,32(23):83-89.
[7]冯若晔,沈大伟,祖静.基于ARM微处理器LPC2148的LED温度显示器设计[J].电子测试,2010,23(10):60-63.
[8]洪连环.基于Proteus的液晶温度显示器仿真设计[J].电子设计工程,2011,19(5):186-189.
[9]张志奎,刘强.浅析温度计位置对测温的影响[J].变压器,2012,49(11):46-47.
[10]郭天祥. 51单片机C语言教程[M].北京:电子出版社. 2009(3).
[11]周鹏. 基于STC89C52单片机的温度检测系统设计[J]. 现代电子技术,2012,35(22):10-13.
附录
附录A:仿真总体电路图
附录B:程序源代码
#include <intrins.h>
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)
for(j=110;j>0;--j);
}
void Delayus(int t) //在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μs
{
int s;
for (s=0; s<t;s++);
}
void wait(void)// 等待繁忙标志
{
P0 = 0xFF;
do
{
RS = 0;
RW = 1;
EN = 0;
EN = 1;
}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')
{
w_dat(*p++);
}
}
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,因此延时时间为(480-24)/16 = 28.5,取29μs。

DQ = 1; // DQ返回高电平
Delayus(3); // 等待存在脉冲.经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3μs。

d = DQ; // 获得存在信号
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 拉低开始读时间隙
DQ = 1; // 然后返回高电平
for (i=0; i<3; i++); // 延时15μs
return(DQ); // 返回 DQ 线上的电平值
}
uchar ds18read_byte()//从单总线读取一个字节的值
{
uchar i;
uchar value = 0;
for (i=0;i<8;i++)
{ // 读取字节,每次读取一个字节
if(read_bit())
value|=0x01<<i; // 然后将其左移
Delayus(6);
}
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) //保证-48(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);
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);
}
}。

相关文档
最新文档