《基于stc89c52单片机的温度测量及报警电路设计论文-本科论文.doc》由会员分享,可在线阅读,更多相关《基于stc89c52单片机的温度测量及报警电路设计论文-本科论文.doc(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、沈阳理工大学学士学位论文 摘 要摘要:在日常生活及工业生产过程中,经常要用到温度的检测及控制,温度是生产过程和科学实验中普遍而且重要的物理参数之一。传统的测温元件有热电偶和二电阻。而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,这些方法相对比较复杂,需要比较多的外部硬件支持。我们用一种相对比较简单的方式来测量。采用美国DALLAS半导体公司推出的一种改进型智能温度传感器DS18B20作为检测元件,温度范围为-55125 C,最高分辨率可达0.0625 C。DS18B20可以直接读出被测温度值,而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。基于STC89C5
2、2单片机的温度测量及报警电路,电路采用DS18B20作为温度监测元件,测量范围0-50,使用LCD模块显示,能设置温度报警上下限。着重介绍软硬件系统的各部分电路,介绍了集成温度传感器DS18B20的原理,STC89C52单片机功能和应用。该电路设计新颖、功能强大、结构简单。关键词:温度测量 报警 DS18B20 STC89C52 AbstractAbstract:In daily life and industrial production process, often used in the detection and control of temperature, temperature
3、is the production process and scientific experiments in general and one of the important physical parameter. Traditional thermocouple and temperature components are the second resistor. The thermocouple and thermal resistance are generally measured voltage, and then replaced by the corresponding tem
4、perature, these methods are relatively complex, requiring a relatively large number of external hardware support. We use a relatively simple way to measure. Use the United States following DALLAS Semiconductor DS1820 improved after the introduction of a smart temperature sensor DS18B20 as the detect
5、ion element, a temperature range of -55 C 125 C, up to a maximum resolution of 0.0625 C. DS18B20 can be directly read out the temperature on the north side, and three-wire system with single-chip connected to a decrease of the external hardware circuit, with low-cost and easy use.The introduction of
6、 a cost-based STC89C52 MCU a temperature measurement circuits, the circuits used DS18B20 high-precision temperature sensor, measuring scope 0 C+100 C, can set the warning limitation, the use of seven segments LCD that can be display the current temperature. The paper focuses on providing a software
7、and hardware system components circuit, introduced the theory of DS18B20, the functions and applications of AT89C51 .This circuit design innovative, powerful, can be expansionary strong. Key words: Temperature measurement warning DS18B20 STC89C52目 录1 绪论11.1 引言11.2 设计内容及要求.11.3主体的部分.22 AT89S52单片机介绍及应
8、用42.1 AT89S52的主要功能.42.2 引脚结构及说明52.2.1方框图.62.2.2 引脚说明72.3 特殊功能寄存器102.4 存储器结构.132.5 软件看门狗及串口142.5.1 WDT的使用.142.5.2 掉电和空闲方式下的WDT.152.5.3 定时器2.152.6 其他功能介绍163 系统软件的设计.233.1 程序设计语言.233.2 主程序.233.3 显示子程序.243.4 定时器T0中断服务程序253.5 T1中断服务程序.253.6 调时功能程序.253.7 时钟/秒表功能程序254 硬件电路的操作和显示.264.1 硬件工作过程264.2 LED的性能特点.
9、275 其他外围电路设计.285.1 时钟电路285.2 复位电路295.3 键盘电路30结 论.32致 谢.33参考文献.34附录A 英文和翻译.35附录B 电路原理图.43 第一章 绪论1.1引言 随着科技的发展,在工业、农业生产等重要领域对温度的控制要求越来越高,因而对温度报警系统的要求也越来越高。如何设计一款成本低廉、报警准确、操作简单的智能温度报警系统成为一个重要问题。以STC89C52单片机为处理核心,通过数字温度传感器DS18B20将检测到的数据输入单片机进行处理,与声光报警电路组合就可以构成温度报警系统,这种设计系统的成本较小,结构简单、操作方便,并且测量也很准确,能够满足工业
10、、农业生产对温度要求不是特别高的地方。 温度报警系统,在工业、农业自动化控制中占有非常重要的地位。单片机系统的开发应用给现代工、农业测控领域带来了一次新的技术革命,自动化、智能化均离不开单片机的应用。将单片机控制方法运用到温度控制系统中,可以克服温度控制系统中存在的严重滞后现象,同时在提高采样频率的基础上可以很大程度的提高控制效果和控制精度。现代自动控制越来越朝着智能化发展,在很多的小型系统中,处理机的成本占系统成本的比例高达20%,而对于这些小型的系统来说,配置一个如此高速的处理机没有任何必要,因为这些小系统追求经济效益,而不是最在乎系统的快速性,所以用成本低廉的单片机控制小型的,而又不是很
11、复杂,不需要大量复杂运算的系统中是非常适合的。 随着电子技术以及应用需求的发展,单片机技术得到了迅速的发展,在高集成度,高速度,低功耗以及高性能方面取得了很大的进展。伴随着科学技术的发展,电子技术有了更高的飞跃,我们现在完全可以运用单片机和电子温度传感器对某处进行温度检测,而且我们可以很容易地做到多点的温度检测,如果对此原理图稍加改进,我们还可以进行不同地点的实时温度检测和控制。1.2 设计内容及要求采用STC 89C52单片机作为处理器。STC 89C52是一个超低功耗,和标准51系列单片机相比较具有运算速度快,抗干扰能力强,支持ISP在线编程,片内含8k空间的可反复擦写1000次的Flas
12、h只读存储器,具有256 bytes的随机存取数据存储器(RAM),32个I/O口,2个16位可编程定时计数器。其指令系统和传统的8051系列单片机指令系统兼容,降低了系统软件设计的难度,电路设计简单、价格低廉,其精确度和运算速度也都完全符合系统的要求。本设计以AT89S51单片机为核心的温度控制系统的工作原理和设计方法。温度信号由温度芯片DS18B20采集,并以数字信号的方式传送给单片机。该控制系统的硬件部分,包括:温度检测电路、温度控制电路、PC机与单片机串口通讯电路和一些接口电路 。单片机通过对信号进行相应处理,从而实现温度控制的目的采用干电池供电 第二章 AT89S52单片机介绍及应用
13、2.1 AT89S52的主要功能AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。1、与MCS-51单片机产品兼容;2、8K字节在系统可编程Flash存储器;3、1000次擦写周期;4、全静态操作:0Hz-33MHz;5、三级加密程序存储器;6、32个可编程I/O口线;7、三个1
14、6位定时器/计数器;8、8个中断源;9、全双工UART串行通道;10、低功耗空闲和掉电模式;11、掉电后中断可唤醒;12、看门狗定时器;13、双数据指针;14、掉电标识符。2.2引脚说明AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 AT89S52具有以下标准功
15、能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻 辑电平。对P0端口写“1”时,引脚用作高阻抗输入。 当访问外部程序和数据存储器
16、时,P0口也被作为低8位地址/数据复用。在这种模式下, P0不具有内部上拉电阻。 在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验 时,需要外部上拉电阻。P1口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个 TTL 逻辑电平。此外,P1.0和P1.1分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2 的触发输入(P1.1/T2EX)。 在flash编程和校验时,P1口接收低8位地址字节。P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个 TTL 逻辑电平。对P2 端口写“1”时,
17、内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR) 时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用 8位地址(如MOVX RI)访问外部数据存储器时,P2口输出P2锁存器的内容。 在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3口是一个具有内部上拉电阻的8 位双向I/O 口,p3 输出缓冲器能驱动4 个 TTL 逻辑电平。 P3口亦作为AT89S52特殊功能(第二功能)使用,如下
18、表所示。 在flash编程和校验时,P3口也接收一些控制信号。端口引脚第二功能:P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 INTO(外中断0)P3.3 INT1(外中断1)P3.4 TO(定时/计数器0)P3.5 T1(定时/计数器1)P3.6 WR(外部数据存储器写选通)P3.7 RD(外部数据存储器读选通)此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。XTAL1振荡器反相放大器和内部时钟发生电路的输入端。XTAL2振荡器反相放大器的输出端。2.3存储器MCS-51器
19、件有单独的程序存储器和数据存储器。外部程序存储器和数据存储器都可以64K寻址。程序存储器:如果EA引脚接地,程序读取只从外部存储器开始。对于 89S52,如果EA 接VCC,程序读写先从内部存储器(地址为0000H1FFFH)开始,接着从外部寻址,寻址地址为:2000HFFFFH。数据存储器:AT89S52 有256 字节片内数据存储器。高128 字节与特殊功能寄存器重叠。也就是说高128字节与特殊功能寄存器有相同的地址,而物理上是分开的。当一条指令访问高于7FH 的地址时,寻址方式决定CPU 访问高128 字节RAM 还是特殊功能寄存器空间。直接寻址方式访问特殊功能寄存器(SFR)。例如,下
20、面的直接寻址指令访问0A0H(P2口)存储单元MOV 0A0H , #data使用间接寻址方式访问高128 字节RAM。例如,下面的间接寻址方式中,R0 内容为0A0H,访问的是地址0A0H的寄存器,而不是P2口(它的地址也是0A0H)。MOV R0 , #data堆栈操作也是间接寻址方式。因此,高128字节数据RAM也可用于堆栈空间。2.4看门狗定时器WDT是一种需要软件控制的复位方式。WDT 由13位计数器和特殊功能寄存器中的看门狗定时器复位存储器(WDTRST)构成。WDT 在默认情况下无法工作;为了激活WDT,用户必须往WDTRST寄存器(地址:0A6H)中依次写入01EH 和0E1H
21、。当WDT激活后,晶振工作,WDT在每个机器周期都会增加。WDT计时周期依赖于外部时钟频率。除了复位(硬件复位或WDT溢出复位),没有办法停止WDT工作。当WDT溢出,它将驱动RSR引脚一个高电平输出。WDT的使用为了激活WDT,用户必须向WDTRST寄存器(地址为0A6H的SFR)依次写入01EH和0E1H。当WDT激活后,用户必须向WDTRST写入01EH和0E1H喂狗来避免WDT溢出。当计数达到8191(1FFFH)时,13 位计数器将会溢出,这将会复位器件。晶振正常工作、WDT激活后,每一个机器周期WDT 都会增加。为了复位WDT,用户必须向WDTRST 写入01EH 和0E1H(WD
22、TRST 是只读寄存器)。WDT计数器不能读或写。当WDT计数器溢出时,将给RST引脚产生一个复位脉冲输出,这个复位脉冲持续96个晶振周期(TOSC),其中TOSC=1/FOSC。为了很好地使用WDT,应该在一定时间内周期性写入那部分代码,以避免WDT复位。掉电和空闲方式下的 WDT在掉电模式下,晶振停止工作,这意味这WDT也停止了工作。在这种方式下,用户不必喂狗。有两种方式可以离开掉电模式:硬件复位或通过一个激活的外部中断。通过硬件复位退出掉电模式后,用户就应该给WDT喂狗,就如同通常AT89S52 复位一样。通过中断退出掉电模式的情形有很大的不同。中断应持续拉低很长一段时间,使得晶振稳定。
23、当中断拉高后,执行中断服务程序。为了防止WDT在中断保持低电平的时候复位器件,WDT 直到中断拉低后才开始工作。这就意味着WDT 应该在中断服务程序中复位。为了确保在离开掉电模式最初的几个状态WDT不被溢出,最好在进入掉电模式前就复位WDT。在进入待机模式前,特殊寄存器AUXR的WDIDLE位用来决定WDT是否继续计数。默认状态下,在待机模式下,WDIDLE=0,WDT继续计数。为了防止WDT在待机模式下复位AT89S52,用户应该建立一个定时器,定时离开待机模式,喂狗,再重新进入待机模式。2.5 DS18B20的介绍2.5.1 DS18B20的主要特点 温度传感器的种类众多,在高精度、高可靠
24、性的应用场合时DALLAS(达拉斯)公司生产的DS18B20温度传感器比较理想。它体积小,硬件开消低,抗干扰能力强,精度高,附加功能强。与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。它具有独特的单线接口仅需要一个端口引脚进行通信,并可通过数据线供电,电压范围为3.05.5。2.5.2 DS18B20的结构 TO92封装的DS18B20的引脚排列见下图。 图3.2.1 DS18B20实物图及封装 其引脚功能描述见下表。 表3.2.1DS18B20详细引脚功能描述序号名称引脚功能描述1GND接地信号2DQ数据输入/输出引脚。开漏
25、单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。3VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。 DS18B20的内部结构示意图如下图所示。C64 位ROM和单线接口高速缓存存储器与控制逻辑温度传感器高温触发器TH低温触发器TL配置寄存器8位CRC发生器VddI/O图3.2.2 DS18B20内部结构64位ROM的结构起始位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器和,可通过软件写入户报警上下限。DS18B20温度传感器的内部存储器还包括一个高速暂存和
26、一个非易失性的可电擦除的EERAM。高速暂存器RAM由9个字节的存储器组成。第0-1个字节是温度的显示位;第2和第3个字节是TH和TL,同时第2和第3个字节的数字可以更新;第4个字节是配置寄存器,同时第4个字节的数字也可以更新;第5、6、7三个字节是保留的。第8字节读出前面所有字节的CRC码,可用来检验数据,从而保证通信数据的正确性。 2.5.3 DS18B20的测温原理DS18B20的测温原理是这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器的脉冲输入。器件中还有一个计数门
27、,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将55所对应的一个基数分别置入减法计数器和温度寄存器中。DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图3.2.3 所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。 图3.2.3 DS18B20的接口电路当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有上拉
28、,上拉开启时间最大为10us。采用寄生电源供电方式时VDD端接地。由于单线制只有一根线,因此发送接口必须是三态的。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、写数据、读数据。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。(1)DS18B20的初始化时序1) 先将数据线置高电平12) 延时
29、(该时间要求不是很严格,但尽可能短一点)3) 数据线拉到低电平04) 延时750us(该时间范围可以设定为480-960us范围内)5) 数据线拉到高电平16) 延时等待。如果初始化成功则在15-60ms内产生一个由DS18B20返回的低电平0,据该状态可以确定它的存在。7) 若CPU读到数据线上的低电平0后,还要进行延时,其延时的时间从发出高电平算起最少480us8) 将数据线再次拉到高电平1后结束(2)DS18B20的写数据 ) 数据线先置低电平0) 延时确定的时间为15us) 按从低位到高位的顺序发送数据(一次只发送一位) 延时时间为45us) 将数据线拉到高电平1) 重复1-5步骤,直
30、到发送完整个字节) 最后将数据线拉到(3)DS18B20的读数据) 将数据线拉高到) 延时us) 将数据线拉低到0) 延时6us) 将数据线拉高到1) 延时4us) 读数据线的状态得到一个状态位,并进行数据处理) 重复1-7步骤,直到读取完一个字节2.6 LCD1602的介绍LCD1602液晶显示器也叫1602字符型液晶显示器。它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成。每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。 LCD1602是指显示的内容为16X2,即可以显示两行,每
31、行16个字符液晶模块。管脚功能 LCD1602引脚图LCD1602采用标准的16脚接口,其中: 第1脚:VSS为电源地 第2脚:VCC接5V电源正极 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器 第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。 第6脚:E(或EN)端为使能(enable)端。 第714脚:D0D7为8位双向数据端。 第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 操作控制 1602液晶模块内部的字符发生存储器(CGROM)已经存储
32、了160个不同的点阵字符图形。这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等。每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如A。指令集1602通过D0D7的8位数据端传输数据和指令。显示模式设置: (初始化)0011 1000 0x38 设置162显示,57点阵,8位数据接口;显示开关及光标设置: (初始化)0000 1DCB D显示(1有效)、C
33、光标显示(1有效)、B光标闪烁(1有效)0000 01NS N=1(读或写一个字符后地址指针加1&光标加1),N=0(读或写一个字符后地址指针减1&光标减1),S=1且N=1(当写一个字符后,整屏显示左移)s=0当写一个字符后,整屏显示不移动数据指针设置:数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)其他设置:01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。2.7 硬件设计2.7.1硬件设计目标系统通过温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机处理后
34、,显示在8位数据线与单片机P0口的液晶显示器LCD上。串口经过MAX232的电平转换后R1 OUT和T1 IN接到单片机的RXD与TXD来实现与用C语言编辑的计算机软件的界面间的通信。液晶LCD的RS、RW、E分别接到单片机的P2.0P2.2来实现单片机控制液晶的读写命令和数据的显示控制。2.7.2硬件功能模块划分(1)STC89C52RC单片机:实现对整个系统的控制。(2)DS18B20、LCD1602:温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机处理后,显示在8位数据线与单片机P0口的液晶LCD上。2.7.3接
35、口和连接方式(1)液晶LCD1602的数据和指令选择控制端RS接到单片机的P2.0,读写控制接到单片节的P2.1,数据读写控制位E接到单片机的P2.2,8位数据线DB0DB7接到单片机的P0口。(2)4个按键K1K4分别接到单片机的P1.0P1.3。(3)DS18B20的DQ接到单片机的P3.3.2.7.4硬件仿真电路第四章 软件设计程序介绍4.1 1602液晶显示处理部分 在本次设计系统中定义了P22口为1602液晶的使能端;P20为数据命令的选择端;P21为读,写选择端。定义了有关的函数;write_com()向1602写入命令码函数,write_date()向1602写入数据函数;dis
36、play()1602显示函数;lcd_init()1602初始化;lcd_display()1602显示初始化。 具体程序如下所示; void lcd_init()/1602初始化 write_com(0x38);/两行显示,5*7点阵 delayms(5);/延时5毫秒 write_com(0x01);/显示清屏 delayms(5); write_com(0x0c);/开显示,不显示光标,光标不闪烁 delayms(5); write_com(0x06);/当读或写一个字符后地址指针加一,且光标加一 delayms(5); void lcd_display()/1602显示初始化lcd_i
37、nit();/1602初始化 write_com(0x80);/第一行第一个字符开始显示 display(str1);/第一行显示temperature write_com(0xc0);/第二行第一个字符开始显示 display(str2);/显示空白4.2 18B20函数处理部分在本次设计系统中P33口用来单片机与温度传感器通讯;它用到的相关函数如下;ds_init()18B20初始化 ; ds_write()向18B20中写入数据 ;ds_read()由18B20读取数据 ;ds_temp()从18B20中读取温度值 ;ds_dis()把温度值送入1602中显示。具体程序如下所示;void
38、 ds_init()/18B20初始化dq=1; delayus(4);/CPU将总线拉高 dq=0; delayus(480);/CPU将总线拉低延时480微妙 dq=1; delayus(60);/CPU将总线拉高延时60微妙 if(dq=0) delayus(240);/CPU判断是否为低电平,是的话说明温度传感器在线上void ds_write(uchar date1)/向18B20中写入数据注意写入是按从低位到高位的顺序发送数据一次只发送一位。uchar ds_read()/由18B20读取数据,读的时候也是从最低位读uint ds_temp()/从18B20中读取温度值 uchar
39、 a,b; ds_init();/初始化温度传感器 ds_write(0xcc);/忽略ROM指令 ds_write(0x44);/开始温度转换 ds_init();/初始化温度传感器 ds_write(0xcc);/忽略ROM指令 ds_write(0xbe);/读取温度值 a=ds_read();/读取低八位 b=ds_read();/读取高八位 tvalue=b;/ tvalue=8;/ tvalue=tvalue|a;/得到16位的温度值 if(tvalue0x0fff)/判断温度大于0 tflag=0; else tvalue=tvalue+1;/如果温度小于0,取反加一 tflag
40、=1;/ tvalue=tvalue*(0.625);/乘以最小分辨率得到温度值 return(tvalue);/ void ds_dis()/把温度值送入1602中显示uchar flagdat; disdata0=tvalue/1000+0x30;/温度百位 disdata1=tvalue%1000/100+0x30;/温度十位 disdata2=tvalue%100/10+0x30;/温度个位 disdata3=tvalue%10+0x30;/小数点后一位 if(tflag=0) flagdat=0x20;/如果温度大于0,不显示 if(tflag=1) flagdat=0x2d;/如果
41、温度小于0显示负号 if(disdata0=0x30) disdata0=0x20;/百位为0不显示 if(disdata1=0x30) disdata1=0x20;/十位为0不显示 write_com(0xc0); write_date(flagdat);/第二行第一个显示温度正负 write_com(0xc1); write_date(disdata0);/第二行第二个显示温度百位 write_com(0xc2); write_date(disdata1);/第二行第三个显示温度十位 write_com(0xc3); write_date(disdata2);/第二行第四个显示温度个位 write_com(0xc4);/ write_date(0x2e);/第二行第五个显示小数点 write_com(0xc5);/ write_date(disdata3);/第二行第六个显示小数点后一位