2007-04-18用S18B20测试温度
DS18B20的测温原理

3.2.3 DS18B20的测温原理DS18B20的测温原理如图3-2-2-6所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在 -55 ℃ 所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作必须按协议进行。
操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
各种操作的时序图与DS1820相同。
图3-2-3-1 DS18B20与处理器连接图3.2.4 DS18B20与单片机的典型接口设计以MCS51单片机为例,图3-2-3-1中采用寄生电源供电方式,P1 1口接单线总线为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管和89S51的P1 0来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D变换操作时,总线上必须有强的上拉,上拉开启时间最大为10 μs。
使用DS18B20温度传感器测温

第11章使用DS18B20温度传感器测温11.1 概述现实生产生活中,小到测量体温的温度计,大到航天飞机的温控系统,处处都离不开温度测量。
工业生产中的三大指标(流量、压力、温度)之一就是温度,温度测量可以说是无处不在,遍布了我们生活生产的方方面面。
DS18B20温度传感器是美国DALLAS半导体公司生产的数字化温度传感器,它与以往模拟量温度传感器不同,数字化是其一大特点,它能将被测环境温度直接转化为数字量,并以串行数据流的形式传输给单片机等微处理器去处理。
DS18B20温度传感器的另一个主要特点是它是单总线的,即它与单片机等微处理器连接时,只需占用一个I/O管脚,并且不再需要其它任何外部元器件,这大大简化了它与但单片机之间的接口电路。
11.2 DS18B20温度传感器介绍目前,使用最普遍的DS18B20温度传感器是三脚TO-92直插式封装这一种,这种封装的DS18B20实物如图11-1所示。
可以看到它体积很小,只有三只管脚,外形与一般的三极管极其相似。
图11-2是其三脚TO-92直插式封装图,表11-1列出了DS18B20各个引脚的定义。
如图11-1 如图11-2表11-1 DS18B20引脚定义。
1、DS18B20温度传感器特性简介◆独特的单总线(一条线)接口,与微处理器通信只需一个I/O管脚,且硬件连接无需其它外部元件;◆测量结果直接输出数字量,可直接与微处理器通信;◆供电电压范围3.0V~5.5V;在寄生电源方式下可有数据线供电;◆测温范围-55℃~+125℃;在-10℃~+85℃范围内,测量精度可达±0.5℃;◆可编程的9~12位测温分辨率,对应的可分辨温度值分别为0.5℃,0.25℃,0.125℃,0.0625℃;12位分辨率时的温度测量转换最长时间(上限)只有750ms;◆每一片DS18B20都有自己独一无二的芯片号码;多片DS18B20可以并联在一条数据总线上实现不同地点的多点组网;◆应用范围包括温度调控,工业现场测温,消费类产品,温度计及热敏系统等。
温度传感器ds18b20实验报告

温度传感器ds18b20实验报告温度传感器DS18B20实验报告引言温度传感器在现代生活中扮演着重要的角色,它们被广泛应用于各种领域,包括工业、医疗、农业等。
DS18B20是一种数字温度传感器,具有精准的测量能力和数字输出,因此备受青睐。
本实验旨在通过对DS18B20温度传感器的测试和分析,探讨其性能和应用。
实验目的1. 了解DS18B20温度传感器的工作原理和特性。
2. 测试DS18B20温度传感器的测量精度和响应速度。
3. 探讨DS18B20温度传感器在实际应用中的优缺点。
实验器材1. DS18B20温度传感器2. Arduino开发板3. 4.7kΩ电阻4. 连接线5. 电脑实验步骤1. 将DS18B20温度传感器连接到Arduino开发板上,并接入4.7kΩ电阻。
2. 编写Arduino程序,通过串口监视器输出DS18B20传感器的温度数据。
3. 将DS18B20传感器置于不同的温度环境中,记录其输出的温度数据。
4. 分析DS18B20传感器的测量精度和响应速度。
5. 探讨DS18B20传感器在实际应用中的优缺点。
实验结果经过实验测试,DS18B20温度传感器表现出了较高的测量精度和响应速度。
在不同温度环境下,其输出的温度数据与实际温度基本吻合,误差较小。
此外,DS18B20传感器具有数字输出,易于与各种微控制器和单片机进行连接,应用范围广泛。
然而,DS18B20传感器在极端温度环境下可能出现测量误差,且价格较高,需要根据实际需求进行选择。
结论DS18B20温度传感器具有较高的测量精度和响应速度,适用于各种温度测量场景。
然而,在选择和应用时需要考虑其价格和适用范围,以确保满足实际需求。
希望本实验能够为DS18B20温度传感器的应用提供参考和借鉴,推动其在各个领域的发展和应用。
DS18B20温度检测

目录1引言 (1)2系统描述 (2)2.1系统功能 (2)2.2系统设计指标 (2)3系统的主要元件 (3)3.1单片机 (3)3.2温度传感元件 (4)3.3LCD显示屏 (6)4硬件电路 (7)4.1系统整体原理图 (7)4.2单片机晶振电路 (7)4.3温度传感器连接电路 (8)4.4LCD电路 (9)4.5报警和外部中断电路 (10)5结论 (11)温度监测系统硬件设计摘要:利用DS18B20为代表的新型单总线数字式温度传感器实现温度的监测,可以简化硬件电路,也可以实现单线的多点分布式温度监测,而不会浪费单片机接口,提供了单片机接口的利用率。
同时提高了系统能够的抗干扰性,使系统更灵活、方便。
本系统主要实现温度的检测、显示以及高低温的报警。
也可以通过单总线挂载多个DS18B20实现多点温度的分布式监测。
关键词: DS18B20,单总线,温度,单片机1引言在科技广泛发展的今天,计算机的发展已经越来越快,它的应用已经越来越广泛。
而单片机的发展和应用是其中的重要一方面。
单片机在工业生产(机电、化工、轻纺、自控等等)和民用家电各方面有广泛的应用。
其中,单片机在工业生产中的应用尤其广泛。
单片机具有集成度高,处理能力强,可靠性高,系统结构简单,价格低廉的优点,因此被广泛应用。
在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要测量参数。
例如:在冶金工业、化工工业、电力工程、机械制造和食品加工等许多领域中,人们都需要对各类加热炉、热处理炉、反映炉和锅炉,尤其是热学试验(如:物体的比热容、汽化热、热功当量、压强温度系数等教学实验)中的温度进行测量,并经常会对其进行控制。
传统的方式是采用热电偶或热电阻,但是由于模拟温度传感器输出为模拟信号,必须经过A/D 转换环节获得数字信号后才能够被单片机等微处理器接收处理,使得硬件电路结构复杂,制作成本较高。
近年来,美国DALLAS公司生产的DS18B20为代表的新型单总线数字式温度传感器以其突出优点广泛使用于仓储管理、工农业生产制造、气象观测、科学研究以及日常生活中。
DS18B20实现测温功能

题目:室内温度检测系统<一> 实验要求:1. 用温度传感器DS18B20实现能检测室内环境温度(-10 o C~40o C),要求用2位或多位LED 显示;2. 要求能有报警功能,当温度超过报警上限时要能报警,报警上限要能通过键盘设定;3. 自己制作电路板。
(可考虑留有上传温度数据的接口)<二> 设计思想和说明:室内温度检测系统是由AT89C51单片机和温度传感器DS18B20和实现对温度检测。
由DS18B20将测得的温度通过DQ端传给单片机,再通过单片机在LED上显示,完成测温功能。
<三>器件清单器件名称数量AT89C51单片机 1温度传感器DS18B20 14位LED数码显示器 1晶振11.0592 Mhz 174LS245 1蜂鸣器 1三极管2N3904 5按钮 533 pf电容 210 uf电容 14.7k电阻710k电阻 50.1k电阻 11 k电阻 45V电源 1<四>硬件原理图<五>硬件原理图与其软件配合介绍DS18B20的DQ端与单片机的P2.0口相连,进行数据传送。
DSl8820内部结构主要由4部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
根据DSl8820的通信协议,主机控制DSl8820完成温度转换必须经过3个步骤:每一次读写之前都要对其进行复位,复位成功后发送1条ROM指令,最后发送RAM指令,这样才能对DSl8820进行预定的操作。
复位要求主CPU将数据线下拉500μs,然后释放,DSl8820收到信号后等待16~60μs左右,后发出60~240μs的存在低脉冲,主CPU收到此信号表示复位成功。
由于DSl8820采用的是单线进行控制与读取数据,因此对操作的时序要求非常严格,否则由于时序不匹配,将无法完成对器件的正确操作。
P0口与4位LED显示的“字型码”端相连,P1口的低四位与4位LED显示的“位”选择相连,实现将从DS18B20中读取的数据显示出来。
基于DS18B20的温度测量资料

DS18B20中文资料美国DALLAS 半导体公司的DSl8B20 是世界上第一片支持“单总线”接口的数字式温度传感器,能够直接读取被测物的温度值。
它具有TO - 9 2 、TSOC、SOIC 多种封装形式,可以适应不同的环境需求。
其测量范围在-55~+125℃、-10℃~+85℃之内的测量精度可达± 0.5℃,稳定度为1%。
通过编程可实现9、10、11、l2 位的分辨率读出温度数据,以上都包括一个符号位,因此对应的温度量化值分别为0.5℃、0.25℃、0.125℃、0.062 5℃,芯片出厂时默认为12 位的转换精度。
读取或写入DS18B20仅需要一根总线,要求外接一个约4. 7k Ω的上拉电阻,当总线闲置时,其状态为高电平。
此外DS18B20是温度- 电流传感器,对于提高系统抗干扰能力有很大的帮助。
2.2 DSl8B20引脚结构DS18B20采用3脚TO-92封装或8脚的SOIC封装,如图1 所示。
各引脚的功能:GND为电压地;DQ为单数据总线;V DD 为电源电压;NC 为空引脚。
2.3 DSl8B20工作原理及应用DS18B20 的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。
其一个工作周期可分为两个部分,即温度检测和数据处理。
在讲解其工作流程之前我们有必要了解18B20 的内部存储器资源。
18B20 共有三种形态的存储器资源,它们分别是:(1)ROM 只读存储器,用于存放DS18B20ID编码,其前8 位是单线系列编码(DS18B20 的编码是19H),后面48 位是芯片唯一的序列号,最后8 位是以上56 位的CRC 码(冗余校验)。
数据在出厂时设置不由用户更改。
DS18B20 共64 位ROM。
(2)RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20 共9 个字节RAM,每个字节为8 位。
如图2 所示。
第1、2 个字节是温度转换后的数据值信息,第3 和第4 字节是高温触发器T H 和低温触发器T L 的易失性拷贝,第5 个字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率,DS18B20 工作时寄存器中的分辨率转换为相应精度的温度数值。
温度传感器ds18b20实验报告
温度传感器ds18b20实验报告温度传感器DS18B20实验报告引言:温度传感器是一种用于测量环境温度的设备,它在许多领域都有广泛的应用,如气象学、工业控制、冷链物流等。
本实验报告将介绍DS18B20温度传感器的原理、实验装置和实验结果,并对其性能进行评估。
一、实验原理DS18B20温度传感器是一种数字温度传感器,采用单总线接口进行通信。
它采用了最新的数字温度传感器技术,具有高精度、低功耗、抗干扰等特点。
其工作原理是利用温度对半导体材料电阻值的影响,通过测量电阻值的变化来确定温度。
二、实验装置本实验使用的实验装置包括DS18B20温度传感器、Arduino开发板、杜邦线和计算机。
Arduino开发板用于读取传感器的温度数据,并通过串口将数据传输到计算机上进行处理和显示。
三、实验步骤1. 连接电路:将DS18B20温度传感器的VCC引脚连接到Arduino开发板的5V 引脚,GND引脚连接到GND引脚,DQ引脚连接到Arduino开发板的数字引脚2。
2. 编写代码:使用Arduino开发环境编写代码,通过OneWire库和DallasTemperature库读取DS18B20传感器的温度数据。
3. 上传代码:将编写好的代码上传到Arduino开发板上。
4. 监测温度:打开串口监视器,可以看到DS18B20传感器实时的温度数据。
四、实验结果在实验过程中,我们将DS18B20温度传感器放置在不同的环境中,记录了其测得的温度数据。
实验结果显示,DS18B20温度传感器具有较高的精度和稳定性,能够准确地测量环境温度。
五、实验评估本实验评估了DS18B20温度传感器的性能,包括精度、响应时间和抗干扰能力。
实验结果表明,DS18B20温度传感器具有较高的精度,能够在0.5℃的误差范围内测量温度。
响应时间较快,能够在毫秒级别内完成温度测量。
同时,DS18B20温度传感器具有较好的抗干扰能力,能够在干扰环境下保持稳定的测量结果。
亿学通电子 DS18B20 温度传感器使用手册
1) DS18B20 是DALLAS 公司生产的一线制数字温度传感器; 2) 具有3 引脚TO-92 小体积封装形式; 3) 温度测量范围为-55℃~+125℃; 4) 电源供电范围为3V~5.5V ; 5) 可编程为9 位~12 位数字表示;6) 测温分辨率可达0.0625℃,被测温度用符号扩展的16 位数字量方式串行输出;7) 其工作电源既可在远端引入,也可采用寄生电源方式产生;8) 多个DS18B20 可以并联到3 根(VDD、DQ 和GND)或2 根(利用DQ 线供电、GND)线上,CPU 只需一根端口线就能与总线上的多个串联的DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
TO-92封装的DS18B20DS18B20 的管脚排列及不同封装形式如图 2所示,DQ 为数字信号输入/输出端;GND 为电源地;VDD 为外接供电电源输入端(在寄生电源接线方式时接地,见),NC 表示无连接。
管脚图DS18B20内部结构如图3所示,主要由4 部分组成:64 位ROM 、温度传感器、非易失性存储的温度报警触发器TH 和TL 、配置寄存器。
DS18B20管脚DS18B20概述DS18B20内部结构图非常适用于远距离多点温度检测系统。
DQ-数据输入输出。
漏极开路1 线接口。
也在寄生电源模式时给设备提供电源。
访问DS18B20 的顺序如理初始化;DS18B20读写 连接图应用领域ROM 命令(接着是任何需要的数据交换);DS18B20 函数命令(接着是任何需要的数据交换)。
每一次访问DS18B20 时必须遵循这一顺序,如果其中的任何一步缺少或打乱它们的顺序,DS18B20 将不会响应。
(1)初始化时序所有与DS18B20 的通信首先必须初始化:控制器发出复位脉冲,DS18B20 以存在脉冲响应。
ds18b20温度传感器工作原理
ds18b20温度传感器工作原理
DS18B20温度传感器是一种数字温度传感器,它基于热电效
应来测量温度。
该传感器由一个精密的温度传感器和一个数字转换器组成。
以下是DS18B20温度传感器的工作原理:
1. 热电效应:DS18B20温度传感器利用热电效应来测量温度。
当两个不同材料的接触点形成温度梯度时,就会产生电动势。
传感器中的温度传感器部分采用的材料对温度变化非常敏感,因此产生的电动势可以反映出温度的变化。
2. 温度传感器:DS18B20温度传感器中的温度传感器部分是
由一个特殊的材料制成的。
该材料具有温度敏感性,当温度变化时,该材料会产生电动势。
这个电动势可以通过传感器的引脚进行读取和转换。
3. 数字转换器:DS18B20温度传感器具有内置的数字转换器。
这个数字转换器可以将从温度传感器获得的电压信号转换为数字信号。
数字信号可以直接读取和处理,而无需进行模拟信号转换。
4. 串行总线通信:DS18B20温度传感器通过一种称为One-
Wire总线的串行通信协议与主控制器进行通信。
传感器和主
控制器之间只需使用单一的数据线进行通信,使得传感器的连接变得简单方便。
总结起来,DS18B20温度传感器工作原理是利用热电效应测
量温度,并通过温度传感器和数字转换器来转换和读取温度信号。
该传感器通过One-Wire总线与主控制器进行通信。
DS18B20温度测量
DS18B20温度测量1.实验目的与效果:学习单总线温度传感器的读写,实现对环境温度的测量。
将ds18b20里的温度信息读出,在数码管上显示;显示的样式EP=XX.X℃。
▲ds18b20初始化(复位)时序:▲ds18b20读写时序:▲ds18b20寄存器:提示:DS18B20相关详细信息请查看DS18B20.pdf文档。
2. 原理图:3. 实验板上操作:1)在DS18B20模块区域,用短路冒将P2.7与DQ连接起来。
2)将DS18B20插到三个孔型插座上,说明:之所以不把DS18B20焊牢在板子上,是因为考虑到18B20也是挺贵的温度传感器,你可以做完是实验把DS18B20用于比赛或其他,这样就省掏钱再买一个了。
(不错的选择把)3)将数码管位选拨码开关拨到ON上。
( 请看实物图1)4)把液晶那边的拨码开关全部拨到OFF,也就是不要拨到ON上(看实物图2)5)做完本次实验请将DS18B20拔下,保管好。
4.实物连接图:实物图1:实物图2:5.C语言程序://MCU: AT89S51//晶振:12M#include "AT89X51.h"#include "intrins.h"//common part#define HIGH 1#define LOW 0#define TRUE 1#define ZERO 0#define MSB 0x80//ds18b20 part#define SkipRom 0xcc#define ConvertTemperature 0x44#define ReadScratchpad 0xbe/*******************************************************************/ sbit One_Wire_Bus=P2^7;unsigned char code numcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x86,0x8c,0xb7,0X9C,0XC6};//数字0~9及"EP=OC"共阳数码管代码unsigned char code dot_numcode[]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};//带数点的0~9共阳数码管代码unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管位选代码unsigned char dispbuff[8]={14,13,0,0,0,12,11,10};unsigned char timecount;unsigned char disp_bit_count;/********************************************************************/ unsigned char GetScratchpad[2];unsigned char code decimalH[16]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93}; unsigned char code decimalL[16]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75}; unsigned char ResultTemperatureH;unsigned char ResultTemperatureLH,ResultTemperatureLL;unsigned char ResultSignal;/********************************************************************/ void One_Wire_Delay(unsigned char delay_time){while(delay_time)delay_time--;//延时时间:=(8+delay_time*6)us;}//*****初始化DS18B20******/void Initize_One_Wire_Bus(void){One_Wire_Bus=0;One_Wire_Delay(80);//总线拉低488usOne_Wire_Bus=1;One_Wire_Delay(25);//总线拉高158us;}/***********************************************************************//*******************读一个字节ds18b20 *********************************/ unsigned char One_Wire_Read_Byte(void){bit temp_bit;unsigned char i,result=0;for(i=0;i<8;i++){One_Wire_Bus=0;One_Wire_Bus=1;temp_bit=One_Wire_Bus;One_Wire_Delay(9);//延时62 usif(temp_bit)result|=0x01<<i;}return(result); //返回ds18b20值}/*********向ds18b20写一个字节*********************/ void One_Wire_Write_Byte(unsigned char oww_dat){unsigned char i;for(i=0;i<8;i++){One_Wire_Bus=0;if(oww_dat&0x01)One_Wire_Bus=1;One_Wire_Delay(20);// 128 usOne_Wire_Bus=1;oww_dat>>=1;}One_Wire_Delay(10);}/******************************************/void Read_18B20(void){unsigned char tempH,tempL;Initize_One_Wire_Bus();One_Wire_Write_Byte(SkipRom);_nop_();//There is just one DS1820 on the bus;One_Wire_Write_Byte(ConvertTemperature);One_Wire_Delay(5);//Start to convert temperature;Initize_One_Wire_Bus();One_Wire_Write_Byte(SkipRom);_nop_();One_Wire_Write_Byte(ReadScratchpad);GetScratchpad[0]=One_Wire_Read_Byte();//Master samples the LSB temperature from the scratchpad; GetScratchpad[1]=One_Wire_Read_Byte();//Master samples the MSB temperature from the scratchpad;One_Wire_Delay(120);tempH=(GetScratchpad[1]<<4)|(GetScratchpad[0]>>4);tempL=(GetScratchpad[0]&0x0f);Initize_One_Wire_Bus();//Issue a reset to terminate left parts;if(tempH&0x80){tempH=~tempH;tempL=~tempL+1;ResultSignal=1;//Negative temperature;}ResultTemperatureH=tempH;ResultTemperatureLL=decimalL[tempL];ResultTemperatureLH=decimalH[tempL];//Result of temperature;}//Read the byte0 and byte1 from scratchpad;/***********************************************************************/void main(void){TMOD=0x01; //使用定时器0,选择方式1(16位定时器)TH0=(65536-3000)/256; //定时3MS初值TL0=(65536-3000)%256;ET0=1; //开定时器0溢出中断EA=1; //开总中断Initize_One_Wire_Bus();TR0=1; //开定时器0while(TRUE ){if(timecount==10) //每30ms采样一次温度,可以修改采样时间{timecount=0;Read_18B20();dispbuff[4]=((ResultTemperatureH%100)/10); //温度十位dispbuff[3]=(ResultTemperatureH%10); //温度个位dispbuff[2]=(ResultTemperatureLH/10); //温度小数位}}}/*********3MS中断服务程序*************/void t0(void) interrupt 1{TH0=(65536-3000)/256;TL0=(65536-3000)%256;timecount++;if(disp_bit_count==3)P0=dot_numcode[dispbuff[disp_bit_count]];elseP0=numcode[dispbuff[disp_bit_count]];P1=bitcode[disp_bit_count];disp_bit_count++;if(disp_bit_count==8)disp_bit_count=0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*2007-04-18用S18B20测试温度*/
#include <REGX51.H>
#include <INTRINS.H>
#define uchar unsigned char
#define Delay10uS _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); /* 使用11.0592晶体,每周期为1.08uS. */
sbit DQ = P2^0;
void Delay(uchar uS)
{
while(--uS)
Delay10uS;
}
void Reset_DS18B20(void)
{
DQ =0;/* 将DQ 线拉低*/
Delay(47);/* 保持480μs */
DQ =1;/* DQ返回高电平*/
Delay(45);/* 等待时间隙结束*/
}
void Write_Byte(uchar Val)
{
uchar i;
for (i=0;i<8;i++)
{
DQ =0;
DQ =( Val &0x01);
Delay(6);
DQ =1;
Val >>=1;
}
Delay(6);
}
uchar Read_Byte(void)
{
uchar i;
uchar Value =0;
for (i=0;i<8;i++)
{/* 读取字节,每次读取一个字节*/
Value >>=1;/* 将其左移*/
DQ =0;/* 将DQ 拉低开始读时间隙*/
DQ =1;
Delay10uS;
if(1== DQ)
Value |=0x80;
Delay(5);
}
return Value;
}
/*
void Write_ROM(uchar H_Byte,uchar L_Byte)/* 2=H,3=L. */ {
Reset_DS18B20();
Write_Byte(0xCC); /* 跳过ROM . */
Write_Byte(0x4e); /* 写入写暂存存储器命令. */
Write_Byte(H_Byte); /* 写入高位第2字节. */
Write_Byte(L_Byte);/* 写入低位第3字节. */
Write_Byte(0x43); /* 写入复制暂存器命令. */
Delay(10); /* 延时(写入EEPROM). */ }
*/
uchar Temp_H;
uchar Temp_L;
uchar Temp_t;
void Read_Temperature(void)/* 读取温度函数*/
{
uchar get[10],k;
union{
uchar c[2];
unsigned int t;
}temp;
Reset_DS18B20();
Write_Byte(0xCC);/* 跳过ROM */ Write_Byte(0x44);/* 动温度转换*/ Delay(60);
Reset_DS18B20();
Write_Byte(0xCC);/* 跳过ROM */ Write_Byte(0xBE);/* 读缓存器*/
for (k=0;k<9;k++)
{
get[k]= Read_Byte();
}/* 读缓存器*/
temp.c[0]= get[1];
temp.c[1]= get[0];
Temp_t = temp.t >>4;
Temp_H = get[2];
Temp_L = get[3];
}
const uchar Number[]={/* 定义数码管显示数据. */
0x28,/* 0 */
0xbe,/* 1 */
0x64,/* 2 */
0x34,/* 3 */
0xb2,/* 4 */
0x31,/* 5 */
0x21,/* 6 */
0xbc,/* 7 */
0x20,/* 8 */
0x30,/* 9 */
};
const uchar Number_C[]={/* 定义数码管显示数据. */
0x20,/* 0 */
0xb6,/* 1 */
0x44,/* 2 */
0x14,/* 3 */
0x92,/* 4 */
0x11,/* 5 */
0x01,/* 6 */
0xb4,/* 7 */
0x00,/* 8 */
0x10,/* 9 */
};
#define Char_C 0x61 /* 'C' 定义数码管显示数据Centigrade . */ #define Char_H 0x82 /* H. */
#define Char_L 0x4b /*L. */
#define Char_t 0x43 /* t. */
uchar DisDel;
uchar DisDa[4];
uchar DisBit;
void Int1(void) interrupt 3 using 3/* 使用中断0控制4 LED轮流显示. */
{/* 显示周期为32mS*4. */ TH1 =0xf0;
TL1 =0x00;
P1 =~(0x01<< DisBit);/* 显示单元左位移. */
P0 = DisDa[DisBit];/* 显示数据更新. */
DisBit++;/* 显示记录递增. */
if(4== DisBit)/* 定义为显示4单元. */
{
DisBit =0;
}
}
void Init(void)
{
EA =1;/* 初始化中断. */
ET1 =1;
TR1 =1;
TMOD =0x10;
TH1 =0xf0;
TL1 =0x00;
P2 =0xff;
DisDel =0;
DisBit =0;
Temp_H =0;
Temp_L =0;
Temp_t =0;
}
void Display_Data(uchar One,uchar Two,uchar Three)/* 显示数据. */ {
DisDa[0]= One;
DisDa[1]= Number_C[Two];
DisDa[2]= Number[Three];
DisDa[3]= Char_C;
}
void delay_s(void)/* 长延时. */
{/* 10S. */
uchar i,b;
for(i=0;i<250;i++)
for(b=0;b<250;b++)
_nop_();
}
void main(void)
{
Init();
while(1)
{
delay_s();
Read_Temperature();
Display_Data(Char_t,Temp_t/10,Temp_t%10);
}
}。