DS18B20温度传感器
单总线温度传感器DS18B20简介

单总线温度传感器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℃计数器所需要的计数个数。
第31课温度传感器DS18B20详解

实验现象
通过对DS18B20的控制,读取出DS18B20所采集的温度数据并在 数码管的第4、5、6、7位进行显示,温度精确到小数点后一位。
显示方式为:020.5(温度为正)或-10.4(温度为负)。
DS18B20的命令
ROM操作命令
(1)读ROM--33H (2)匹配ROM--55H (3)跳过ROM--CC
功能命令
(1)写暂存寄存器命令--4EH (2)读暂存寄存器指令--BEH (3)复制暂存寄存器命令—48H (4)启动温度转换命令—44H (5)回传EEPROM内容指令--B8H (6)读电源类型指令--B4H
如何用DS18B20来采集温度
访问一个DS18B20必须经过初始化、ROM命令和功能命令这三个步骤 。 单个DS18B20发命令顺序 第一步: DS18B20初始化----跳过ROM命令(CCH)----启动温度转换命令(44H) 第二步: DS18B20初始化----跳过ROM命令(CCH)----读暂存寄存器指令(BEH)
DS18B20简介
DS18B20是DALLS公司推出的“1-WIRE”接口的 数字温度传感器,可以直接将温度转换为9~12位串行 数字信号供单片机处理。它具有体积小、功耗低、精度 高、抗干扰能力强等优点。
DS18B20引脚和封装
DS18B20的内部结构
DS18B20当分辨率为9,10,11,和12位时,分别对应与0.5℃, 0.25℃,0.125℃,0.0625℃的温度增量
DS18B20写数据时序图分析
①首先给DQ赋值低电平。 ②延时确定时间15us。 ③对DQ赋值,向DS18B20写入相应的高低 电平。 ④再延时时间为45us。 ⑤最后给DQ置高电平。
DS18B20读数据时序分析
DS18B20温度传感器

DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
单总线,意味着没有时钟线,只有一根通信线。
单总线读写数据是靠控制起始时间和采样时间来完成,所以时序要求很严格,这也是DS18B20驱动编程的难点。
一.DS18B20温度传感器1.引脚图2.DS18B20内部结构图主要由2部分组成:64位ROM、9字节暂存器,如图所示。
(1) 64 位ROM。
它的内容是64 位序列号,它可以被看作是该DS18B20 的地址序列码,其作用是使每个DS18B20 都各不相同,这样就可以实现一根总线上挂接多个DS18B20 的目的。
(2) 9字节暂存器包含:温度传感器、上限触发TH高温报警器、下限触发TL低温报警器、高速暂存器、8位CRC产生器。
3.64位ROM结构图8位CRC:是单总线系列器件的编码,DS18B20定义为28H。
48位序列号:是一个唯一的序列号。
8位系列码:由CRC产生器生产,作为ROM中的前56位编码的校验码。
4.9字节暂存器结构图以上是内部9 个字节的暂存单元(包括EEPROM)。
字节0~1 是温度存储器,用来存储转换好的温度。
字节2~3 是用户用来设置最高报警和最低报警值。
这个可以用软件来实现。
字节4 是配置寄存器,用来配置转换精度,让它工作在9~12 位。
字节5~7 保留位。
字节8 CRC校验位。
是64位ROM中的前56位编码的校验码。
由CRC发生器产生。
5.温度寄存器结构图温度寄存器由两个字节组成,分为低8位和高8位。
一共16位。
其中,第0位到第3位,存储的是温度值的小数部分。
第4位到第10位存储的是温度值的整数部分。
第11位到第15位为符号位。
全0表示是正温度,全1表示是负温度。
表格中的数值,如果相应的位为1,表示存在。
如果相应的位为0,表示不存在。
6.配置寄存器精度值:9-bit 0.5℃10-bit 0.25℃11-bit 0.125℃12-bit 0.0625℃7.温度/数据关系注意:如果温度是一个负温度,要将读到的数据减一再取反二.单总线协议1.单总线通信初始化初始化时序包括:主机发出的复位脉冲和从机发出的应答脉冲。
DS18B20详细中文资料

分辨率可编程单总线数字温度传感器——DS18B20 特征:独特单总线接口,只需要一个端口引脚线即可实现通信每个器件的片上ROM 有一个独特64 位串行码存储多点能力使分布式温度检测应用得到简化不需要外围元件能用数据线供电,供电的范围3.0V~5.5V测量温度的范围:-55℃~+125℃(-67℉~+257℉)从-10℃~+85℃的测量的精度是±0.5℃温度传感器分别率由用户从9-12 位中选择在750ms 内把温度转换为12 位数字字(最大值)用户可定义,非易失性温度告警设置告警搜索命令识别和寻址温度在编定的极限之外的器件(温度告警情况)可采用8 引脚SO(150mil)、8 引脚µSOP 和3 引脚TO-92 封装软件兼容DS1822 器件应用范围包括:恒温控制、工业系统、消费类产品、温度计和任何的热敏系统图1 DS18B20 引脚排列图引脚说明:GND—地DQ—数字输入输出VDD—供电电压NC—空连接一般说明:DS18B20 数字温度传感器提供9~12 位摄氏温度的测量,拥有非易失性用户可编程最高与最低触发点告警功能。
DS18B20 通过单总线实现通信,单总线通常是DS18B20 连接。
它能够感应温度的范围为-55℃~+125℃,在-10℃~+85℃的测量的精度是±0.5℃,而且DS18B20 可以直接从数据线上获取供电(寄生电源)而不需要一个额外的外部电源。
因为每个DS18B20 拥有一个独特的64 序列号,因此它允许多个DS18B20 在一条单总线上,所以很方便使用一个微控制器来控制多个分布在较大范围内的DS18B20。
受益于这一特性的应用包括HAVC 环境控制、建筑物、设备和机械内的温度监测、以及过程监测和控制过程的温度监测。
图2注意: A "+"符号在封装上也标有。
订购信息表1S O* µSOP * TO-924 4 15 1 23 8 3DS18B20 详细引脚说明号符明说GND 地当脚引线总单路开,脚引出输入输据数,DQ 生寄见(供件器给时式模源电生寄用使电)分部源电VDD 选可下式模作操源电生寄在脚引,VDDVDD 地接须必* 表中所有未列出的引脚都是NC(空接)概述:方框图3 给出了表一所描述的DS18B20 的主要引脚连接。
温度传感器DS18B20中文资料

以 0.5 的增量值 在 0.5 至+125 的范围内测量温度 对于应用华氏温度的场合 必须使用查
找表或变换系数
注意 在 DS1820 中 温度是以 1/2 LSB 最低有效位 形式表示时 产生以下 9 位格式
MSB 最高有效位 1
最低有效位 LSB 11001110
= -25 最高有效 符号 位被复制到存储器内两字节的温度寄存器中较高 MSB 的所有位 这种 符号扩展
4
PD om
PD om
er ww
er ww
F-XChange View !
Click to buy NOW
w.docu-track.c
TARGETECH®
DS1820
F-XChange View !
Click to buy NOW
w.docu-track.c
图 3 使用 VDD 提供温度变换所需电流
钭率累加器用于补偿振荡器温度特性的非线性 以产生高分辩率的温度测量 通过改变温度每 升高一度 计数器必须经历的计数个数来实行补偿 因此 为了获得所需的分辩率 计数器的数值
5
PD om
PD om
er ww
er ww
F-XChange View !
Click to buy NOW
w.docu-track.c
Click to buy NOW
w.docu-track.c
到这一点 当使用寄生电源方式时 VDD 引脚必须连接到地 向 DS1820 供电的另外一种方法是通过使用连接到 VDD 引脚的外部电源 如图 3 所示 这种方法
的优点是在 I/O 线上不要求强的上拉 总线上主机不需向上连接便在温度变换期间使线保持高电
3
ds18b20工作原理

ds18b20工作原理
DS18B20温度传感器是一种数字温度传感器,采用"1-wire"
(单总线)接口通信,其工作原理如下:
1. 传感器结构:DS18B20传感器由温度传感器芯片、电源线
和数据线组成。
芯片内部包含温度传感器、模数转换器和存储器。
2. 电源供电:传感器通过电源线从计算机、微控制器或其他设备中获取供电。
传感器的VDD和GND引脚用于供电。
3. 温度测量:传感器使用其内部温度传感器测量环境温度。
当温度变化时,传感器内部的温度传感器会产生电压变化。
4. 模数转换:传感器内部的模数转换器将温度传感器测量到的电压转换为数字信号。
转换后的数字信号可以在数据线上传输。
5. 通信协议:传感器使用1-wire接口协议进行通信。
该协议
允许使用单根数据线进行数据传输。
传感器通过数据线将温度数据发送给主控设备。
6. 数据读取:主控设备发送读取指令给传感器,传感器将温度数据通过数据线返回给主控设备。
主控设备可以通过读取传感器返回的数据来获取环境温度。
总结:DS18B20温度传感器工作原理基于温度传感器芯片和
模数转换器的结构,在供电后,传感器通过测量温度传感器的
电压变化来获取环境温度,并通过1-wire接口协议将温度数据传输给主控设备。
DS18B20温度传感器

数字温度传感器 DS18B20DS18B20 数字式温度传感器,使用集成芯片,采用单总线技术,其能够有效的减小外界的干扰,提高测量的精度,同时,它可以直接将被测温度转化成串行数字信号供微机处理,接口简单,使数据传输和处理简单化。
部分功能电路的集成,使总体硬件设计更简洁,能有效地降低成本,搭建电路和焊接电路时更快,调试也更方便简单化,这也就缩短了开发的周期。
DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点:(1)采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。
单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
(2)测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃;在 -10~+ 85°C 范围内,精度为± 0.5°C 。
(3)在使用中不需要任何外围元件。
(4)持多点组网功能多个 DS18B20 可以并联在惟一的三线上,实现多点测温。
(5)供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。
因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。
(6)测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。
(7)负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
(8)掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。
DS18B20 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。
DS18B20的内部结构DS18B20测温原理:DS18B20 的内部测温电路框图低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器 1 ,为计数器提供一频率稳定的计数脉冲。
DS18B20中文资料

DS18B20中文资料在现代电子技术领域,温度测量是一项非常重要的任务。
而DS18B20 作为一款常用的数字温度传感器,以其出色的性能和简单的接口,在各种温度测量应用中得到了广泛的应用。
DS18B20 是由美国达拉斯半导体公司(Dallas Semiconductor)推出的一款单线数字温度传感器。
它具有体积小、硬件开销低、抗干扰能力强、精度高等优点。
从外观上看,DS18B20 通常采用小型的TO-92 封装或者SOP 封装,这使得它能够轻松集成到各种电路中,占用极小的空间。
在性能方面,DS18B20 的测量范围非常广泛,从-55℃到+125℃,能够满足大多数实际应用场景的温度测量需求。
其测量精度在-10℃到+85℃范围内可达到 ±05℃,这对于很多对温度精度要求较高的场合来说,是非常出色的表现。
DS18B20 之所以能够在众多温度传感器中脱颖而出,很大程度上得益于其独特的单线接口。
这意味着它只需要一根数据线就可以与微控制器进行通信,大大简化了电路设计和布线工作。
在使用 DS18B20 进行温度测量时,首先需要将其正确连接到微控制器。
通常,将 DS18B20 的数据线连接到微控制器的一个通用输入输出引脚(GPIO)上。
然后,通过微控制器发送特定的指令来启动温度转换,并读取转换后的温度值。
DS18B20 的工作原理基于其内部的温度敏感元件和模数转换电路。
当接收到温度转换指令后,传感器内部的温度敏感元件会感知当前环境温度,并将其转换为对应的数字信号,然后通过单线接口传输给微控制器。
在编程方面,不同的微控制器平台可能会有一些差异,但基本的流程大致相同。
一般来说,需要先初始化单线接口,然后发送复位脉冲和搜索 ROM 指令来识别总线上的 DS18B20 设备。
接着,发送启动温度转换指令,并等待转换完成。
最后,读取转换后的温度数据,并进行相应的处理和显示。
为了确保测量的准确性和稳定性,在实际应用中还需要注意一些问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十DS18B20温度传感器喻海中一、实验目的1、掌握用单片机控制以“一线总线”数字方式传输数据的器件的编程方法;2、理解温度传感器DS18B20温度编码方法;3、了解温度传感器DS18B20的工作原理。
二、实验仪器1、微型计算机2、AT89S52单片机系统3、HNIST-I单片机系统实验箱4、USB接口数据线及跳线三、实验原理本实验采用AT89S52单片机P3^5口控制温度传感器DS18B20的温度测量,以四位数码感形式输出测量温度,原理图如下图一:图一1、DS18B20特性介绍DS18B20是DALLAS公司的最新单线数字温度传感器, 它的体积更小、适用电压更宽、更经济。
DS18B20是世界上第一片支持“一线总线”接口的温度传感器。
一线总线独特而且经济的特点, 使用户可轻松地组建传感器网络, 为测量系统的构建引入全新概念。
他的测量温度范围为-55~+125℃, 在-10~+85℃范围内, 精度为±0、5℃。
现场温度直接以“一线总线”的数字方式传输大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量, 如: 环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同, 新的产品支持3~5、5V 的电压范围, 使系统设计更灵活、方便。
而且新一代产品更便宜, 体积更小。
DS18B20可以程序设定9~12位的分辨率, 精度为±0、5℃。
可以选择更小的封装方式,更宽的电压适用范围分辨率设定及用户设定的报警温度存储在E2PROM 中, 掉电后依然保存。
DS18B20 的性能是新一代产品中最好的, 性能价格比也非常出色, 继“一线总线”的早期产品后,DS18B20开辟了温度传感器技术的新概念。
DS18B20和DS18B22使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
1、1 DS18B20的内部结构DS18B20内部结构主要由4 部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL,配置寄存器。
DS18B20的管脚排列如图二所示:图二DS18B20 中的温度传感器可完成对温度的测量, 以12位转化为例: 用16 位符号扩展的二进制补码读数形式提供, 以0、0625℃/LSB 形式表达,其中S为符号位。
表1 12 位转化后得到的12 位数据表1 是12 位转化后得到的12 位数据, 存储在18B20的2 个8 bit 的RAM 中, 二进制中的前面5 位是符号位,如果测得的温度大于0℃, 则这5 位为0,只要将测到的数值乘于01062 5 即可得到实际温度; 如果温度小于0℃,则这5 位为1,测到的数值需要取反加1 再乘于01062 5即可得到实际温度。
例如: +125℃的数字输出为07D0H, +25、0625℃的数字输出为0191H,-25、0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。
表2 温度与数字输出的对应关系1、2DS18B20 温度传感器的存储器DS18B20 温度传感器的内部存储器包括一个高速暂存RAM 和一个非易失性的可电擦除的E2 RAM , 后者存放高温度和低温度触发器TH , TL 和结构寄存器。
暂存存储器包含了8 个连续字节, 前2 个字节是测得的温度信息, 第1 个字节的内容是温度的低8 位, 第2 个字节是温度的高8 位。
第3 个和第4 个字节是TH , TL 的易失性拷贝, 第5 个字节是结构寄存器的易失性拷贝, 这3 个字节的内容在每一次上电复位时被刷新。
第6 , 7 , 8个字节用于内部计算。
第9 个字节是冗余检验字节。
根据DS18B20 的通讯协议, 主机控制DS18B20 完成温度转换必须经过3 个步骤: 每一次读写之前都要对DS18B20 进行复位; 复位成功后发送一条ROM 指令; 最后发送RAM 指令。
这样才能对DS18B20 进行预定的操作。
复位要求主CPU 将数据线下拉500 μs , 然后释放,DS18B20 收到信号后等待16 ~60 μs 左右, 后发出60 ~240μs低脉冲, 主CPU 收到此信号表示复位成功。
1、3 DS18B20 使用中的注意事项DS18B20 虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点, 但在实际应用中也应注意以下几方面的问题:(1) DS18B20 从测温结束到将温度值转换成数字量需要一定的转换时间, 这是必须保证的, 不然会出现转换错误的现象, 使温度输出总是显示85 。
(2) 在实际使用中发现, 应使电源电压保持在5 V 左右。
若电源电压过低,会使所测得的温度与实际温度出现偏高现象, 经过试验发现, 一般在5 V 左右。
(3) 较小的硬件开销需要相对复杂的软件进行补偿,由于DS18B20与微处理器间采用串行数据传送, 因此,在对DS18B20 进行读写编程时, 必须严格保证读写时序,否则将无法读取测温结果。
(4)在DS18B20 测温程序设计中, 向DS18B20 发出温度转换命令后, 程序总要等待DS18B20 的返回信号,一旦某个DS18B20 接触不好或断线, 当程序读该DS18B20 时, 将没有返回信号, 程序进入死循环。
这一点在进行DS18B20 硬件连接和软件设计时也要给予一定的重视。
2、对DS18B20的一般控制流程整个对DS18B20的操作都是以“复位”、“等待应答”、“读一字节”、“写一字节”这几个操作为基础的, 所以他们是使DS18B20 能否正常测温的关键。
对不同的操作只要发出相应的命令控制字即可, 详情请参看有关技术文档。
典型的测温流程如图三所示:图三四、实验步骤1、连线:温度传感器输入输出口OUT接P3^5口;2、打开电源,观察数码管显示的温度;3、改变温度传感器DS18B20附近温度,观察数码管上温度的变化。
五、流程图与程序设计1、流程图1.1.主函数部分:1.2 .温度测量部分:NY开 始温度测量数据计算处理数据位分配数码管显示数码管刷新初始化DS18B20 TxReset()应答脉冲RxWait() 复位,初始化DS18B20 TxReset() 跳过ROM 匹配WrByte(0xcc)启动温度转换convert() 读取温度RdByte()返回值返回跳过ROM 匹配WrByte(0x44)1.3数据计算处理部分 1.3.1整数部分NYYN1.3.2小数部分Y N2、源程序/********************************************************************************* ****************程序名:main.c ********************* ****************功 能:温度传感器测量温度 ********************** **************** ********************** ****************单 位:湖南理工物电系创新基地 ********************** **************** All rights reserved ********************** **************** ********************** ****************开始时间:2009.08.07 ********************** ****************结束时间:2009.08.10 ********************** ********** ******版本信息: **************************************备 注:DS18B20的输入输出口接单片机的P3^5口********************* *********************************************************************************/ #include<reg52.h>取出8位整数部分数据ii >=0 ?返回值返回i=i-1小数部分全为0取出4位小数部分存入数组整数i >=0 ?原码计算小数位的值补码计算小数位的值返回值返回#define uint unsigned int#define uchar unsigned char#define negative -100uchar tplsb;//温度值低位字节uchar tpmsb;//温度值高位字节/***************************数字0-9及字母A,b,C,d,E,F,负号*******************/ uchar code table1[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x02};/***********************************带小数点的数字0-9****************************/ uchar code table2[]={0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xbf,0xe1,0xff,0xf7};/**************************************端口定义*********************************/ sbit DQ=P3^5;sbit P14=P1^4;/*************************************延时t秒************************************/ void delay(uint t){uint i;while(t--)for(i=0;i<125;i++);}/******************************产生复位脉冲,初始化DS18B20*********************/ void TxReset(void){uint i;DQ=0;/*拉低约900us*/i=100;while(i>0) i--;DQ=1; //产生上升沿i=4;while(i>0) i--;}/************************************等待应答脉冲*******************************/ void RxWait(void){uint i;while(DQ);while(~DQ);i=4;while(i>0) i--;}/***************************读取数据的一位,满足读时限要求*********************/bit RdBit(void){uint i;bit b;DQ=0;i++; //保持低至少1usDQ=1;i++; //延时15us以上,读时隙上升沿后15us,DS18B20输出数据才有效i++;b=DQ;i=8;while(i>0) i--;//读时延时不低于60usreturn(b);}/********************************读取数据的一个字节*******************************/ uchar RdByte(void){uchar i,j,b;b=0;for(i=1;i<=8;i++){j=RdBit();b=(j<<7)|(b>>1);}return(b);}/**********************写数据的一个字节,满足写1和写0的时隙要求****************/ void WrByte(uchar b){uint i;uchar j;bit btmp;for(j=1;j<=8;j++){btmp=b&0x01;b=b>>1; //取下一位(由低位到高位)if(btmp){/*写1*/DQ=0;i++;i++; //延时15usDQ=1;i=8;while(i>0) i--;//整个写1时隙不低于60us}else{/*写0*/DQ=0;i=8;while(i>0) i--;//保持低电平在60us到120us之间DQ=1;i++;i++;}}}/**********************************启动温度转换**********************************/ void convert(void){TxReset();//产生复位脉冲,初始化DS18B20RxWait();//等待DS18B20给出应答脉冲delay(1);//延时WrByte(0xcc);//skip rom命令WrByte(0x44);//convert T命令}/*************************************读取温度值**********************************/ void RdTemp(void){TxReset();//产生复位脉冲,初始化DS18B20RxWait();//等待DS18B20给出应答脉冲delay(1);//延时WrByte(0xcc);//skip rom命令WrByte(0xbe);//read scratchpad 命令tplsb=RdByte();//温度值低位字节(其中低4位位二进制的"小数"部分)tpmsb=RdByte();//温度值高位字节(其中高5位为符号位)}/************************************温度测量主函数******************************/ char Temperature(void){char T=0;delay(1);//延时1msconvert();//启动温度转换,需要750msdelay(1000);//延时1sRdTemp();//读取温度tplsb=tplsb>>4;tpmsb=tpmsb<<4;T=tpmsb|tplsb;return (T); //返回取出的温度值整数部分,有符号}/*********************************取出四位小数位********************************/ uchar *XiaoShuWei(void){ uchar i,AfterDot[4];bit Compare=1; //用于取位for(i=0;i<4;i++){AfterDot[i]=tplsb&Compare;tplsb=tplsb>>1; //每取一位右移,准备下一次}return(AfterDot);//四位小数位以数组返回}/*********************************小数位值的计算*********************************/ unsigned short JiSuanXiaoShu(char T1,uchar *After_Dot){unsigned short XSW;if(T1>=0)//为正数时小数原码表示XSW=After_Dot[3]*500+After_Dot[2]*250+After_Dot[1]*125+After_Dot[0]*62;else//为负数时小数补码表示{if(After_Dot[0]==1)//最后一位是1,转换位原码时不用借位XSW=(!After_Dot[3])*500+(!After_Dot[2])*250+(!After_Dot[1])*125+After_Dot[0]*62;if(After_Dot[0]==0&&After_Dot[1]==1)XSW=(!After_Dot[3])*500+(!After_Dot[2])*250+After_Dot[1]*125;if(After_Dot[0]==0&&After_Dot[1]==0&&After_Dot[2]==1)XSW=(!After_Dot[3])*500+After_Dot[2]*250;if(After_Dot[0]==0&&After_Dot[1]==0&&After_Dot[2]==0&&After_Dot[3]==1)XSW=After_Dot[3]*500;if(After_Dot[0]==0&&After_Dot[1]==0&&After_Dot[2]==0&&After_Dot[3]==0)XSW=0;}return(XSW);//小数部分返回小数点左移三位后的值}/*******数位分配函数***********/uchar *shuweifenpei(char CC, unsigned short DD,uchar After_dot[4]){uchar tab[4];uchar ge,shi,bai,sign,k;/*温度范围是-55~125*/if(CC>=0){sign=CC/100; //分配百位bai=(CC%100)/10; //分配十位shi=CC%10; //分配个位ge=DD/100; //分配小数位}if(CC<0){sign=negative;bai=(0-CC)/10;k=After_dot[3]==0&&After_dot[2]==0&&After_dot[1]==0&&After_dot[0]==0;// k用于判断小数位是否全为0if(k==1)shi=(0-CC)%10;//如果小数位全0,个位是补码形式if(k!=1) shi=(-1-CC)%10;//如果小数位非全0,整数部分为反码,个位是反码ge=DD/100;}tab[0]=sign;tab[1]=bai;tab[2]=shi;tab[3]=ge;return(tab);//将数位以数组tab[]返回}/***************************结果显示数位译码(不带小数点) *************************/ uchar yima(uchar ge_shi_bai_sign){uchar GE_SHI_BAI_SIGN;switch(ge_shi_bai_sign){case 0:GE_SHI_BAI_SIGN=table1[0];break;case 1:GE_SHI_BAI_SIGN=table1[1];break;case 2:GE_SHI_BAI_SIGN=table1[2];break;case 3:GE_SHI_BAI_SIGN=table1[3];break;case 4:GE_SHI_BAI_SIGN=table1[4];break;case 5:GE_SHI_BAI_SIGN=table1[5];break;case 6:GE_SHI_BAI_SIGN=table1[6];break;case 7:GE_SHI_BAI_SIGN=table1[7];break;case 8:GE_SHI_BAI_SIGN=table1[8];break;case 9:GE_SHI_BAI_SIGN=table1[9];break;case negative:GE_SHI_BAI_SIGN=table1[16];break; //负号'-'//case Error:GE_SHI=table1[14];break; //报错'EE'}return(GE_SHI_BAI_SIGN);}/******************************译码带小数点的个位*********************************/ uchar yima2(uchar ge_shi_bai_sign){uchar GE_SHI_BAI_SIGN;switch(ge_shi_bai_sign){case 0:GE_SHI_BAI_SIGN=table2[0];break;case 1:GE_SHI_BAI_SIGN=table2[1];break;case 2:GE_SHI_BAI_SIGN=table2[2];break;case 3:GE_SHI_BAI_SIGN=table2[3];break;case 4:GE_SHI_BAI_SIGN=table2[4];break;case 5:GE_SHI_BAI_SIGN=table2[5];break;case 6:GE_SHI_BAI_SIGN=table2[6];break;case 7:GE_SHI_BAI_SIGN=table2[7];break;case 8:GE_SHI_BAI_SIGN=table2[8];break;case 9:GE_SHI_BAI_SIGN=table2[9];break;//case negative:GE_SHI_BAI_SIGN=table1[16];break; //负号'-'//case Error:GE_SHI=table1[14];break; //报错'EE'}return(GE_SHI_BAI_SIGN);}/********************************数码管显示初始化*********************************/ void Init_shumaguan(void){P1=0x00;}void Output(uchar figure1,uchar figure2,uchar figure3,uchar figure4) //figure1,figure2,figure3,figure4分别为符号位,百位,十位,个位{ //负数显示符号位,正数显示百位P14=1;P0=figure1;P14=0;P1=0x08;delay(1);//显示十位P14=1;P0=figure2;P14=0;P1=0x04;delay(1);//显示个位(带小数点)P14=1;P0=figure3;P14=0;P1=0x02;delay(1);P14=1; //显示小数位P0=figure4;P14=0;P1=0x01;delay(1);}/************************************main()主函数********************************/ void main(){ while(1){char WenDu;uchar i=100,j=2;uchar *SW,*XiaoShu2,SIGN,GE,SHI,BAI;unsigned short XiaoShu;WenDu=Temperature();//测量温度,并把整数部分赋值给WenDuXiaoShu2=XiaoShuWei();//将四位小数位取出存入数组XiaoShu2XiaoShu=JiSuanXiaoShu(WenDu,XiaoShu2);//计算小数的值SW=shuweifenpei(WenDu,XiaoShu,XiaoShu2);//将各位数字分配到数码管上SIGN=yima(SW[0]);//将数字译码为数码管的代码BAI=yima(SW[1]);SHI=yima2(SW[2]);GE=yima(SW[3]);while(i--){ while(j--){Output(SIGN,BAI,SHI,GE);}j=6;}Init_shumaguan();}}六、问题与讨论1、怎样用液晶来显示温度的测量数据;2、怎样利用温度传感器来设置报警装置或实现自动控制。