STM32制作DS18B20 温度传感器解析
DS18B20的工作原理

DS18B20的工作原理DS18B20是一种数字温度传感器,广泛应用于各种温度测量场景。
它采用单总线接口,能够通过一条数据线同时进行数据传输和供电,具有高精度、可靠性强、体积小等优点。
本文将详细介绍DS18B20的工作原理。
DS18B20传感器由温度传感器、数字转换器和总线接口电路组成。
温度传感器采用了先进的温度传感技术,能够测量范围为-55℃至+125℃的温度,并且具有±0.5℃的测量精度。
数字转换器负责将温度传感器测量到的摹拟信号转换为数字信号,以便进行数据处理和传输。
总线接口电路则负责与主控设备进行通信,通过单总线接口实现数据传输和供电。
DS18B20的工作原理如下:1. 初始化:主控设备向DS18B20发送初始化命令,使其进入工作状态。
初始化命令包括发送复位脉冲和读取设备序列号等操作。
2. 温度转换:DS18B20在工作状态下会周期性地进行温度转换。
主控设备发送温度转换命令后,DS18B20会测量环境温度,并将测量结果转换为数字信号。
3. 数据传输:DS18B20的数据传输采用单总线接口方式。
主控设备通过控制总线电平的变化来实现数据的读取和写入。
读取温度数据时,主控设备发送读取命令,DS18B20将温度数据以序列的方式通过总线发送给主控设备。
4. 温度计算:主控设备接收到DS18B20发送的温度数据后,需要进行温度计算才干得到实际的温度值。
DS18B20采用12位分辨率的温度转换,温度数据以二进制补码形式表示。
主控设备根据DS18B20的工作模式和分辨率,将温度数据转换为实际温度值。
5. 供电方式:DS18B20通过单总线接口进行供电,主控设备向总线提供所需的电源电压。
DS18B20内部有一个供电电路,能够将总线上的电能转换为所需的工作电压。
DS18B20的工作原理简单清晰,具有较高的精度和可靠性,适合于各种温度测量场景。
它可以广泛应用于家电、工业自动化、气象监测等领域,为温度监测提供了一种简单有效的解决方案。
DS18B20的工作原理

DS18B20的工作原理DS18B20是一种数字温度传感器,可以通过一根单线串行总线与微处理器或者其他设备进行通信。
它采用了数字温度传感技术,可以准确地测量环境温度,并将温度数据以数字形式传输给主设备。
DS18B20的工作原理如下:1. 温度测量原理:DS18B20使用了一个精确的温度传感器,该传感器基于温度对半导体材料电阻值的影响。
在DS18B20中,温度传感器是由一对金属电极和一个细丝电阻器组成的。
当温度升高时,电阻值增加,反之亦然。
通过测量电阻值的变化,可以确定环境温度。
2. 单线串行总线通信:DS18B20通过单线串行总线与主设备通信,这意味着只需要一根数据线就可以实现数据传输。
通信过程中,主设备发送指令给DS18B20,DS18B20将温度数据以数字形式传输回主设备。
这种通信方式简化了硬件连接,降低了成本。
3. 温度转换和精度:DS18B20将温度数据转换为数字形式,并以12位精度表示。
它可以测量的温度范围为-55℃至+125℃,精度为±0.5℃。
DS18B20还具有可编程的分辨率功能,可以选择9位、10位、11位或者12位的温度分辨率。
4. 供电和工作模式:DS18B20可以通过总线路线提供供电,也可以通过外部电源提供供电。
它还具有多种工作模式,包括连续转换模式和温度警报模式。
在连续转换模式下,DS18B20可以周期性地测量温度并发送数据。
在温度警报模式下,DS18B20可以设置上下限温度阈值,当温度超过或者低于设定阈值时,会触发警报信号。
总结:DS18B20是一种数字温度传感器,采用了数字温度传感技术。
它通过测量温度对半导体材料电阻值的影响来测量环境温度,并将温度数据以数字形式传输给主设备。
DS18B20具有单线串行总线通信、温度转换和精度、供电和工作模式等特点。
它在许多领域中被广泛应用,如气象监测、工业自动化、家用电器等。
其高精度和简单的硬件连接使其成为一种理想的温度传感器。
stm32--温度传感器DS18B20使用

void Delay_us(u32 Nus)
{
SysTick->LOAD=Nus*9;
//时间加载
SysTick->CTRL|=0x01;
//开始倒数
while(!(SysTick->CTRL&(1<<16))); //等待时间到达
SysTick->CTRL=0X00000000;
//关闭计数器
SysTick->VAL=0X00000000;
//清空计数器
}
unsigned char ResetDS18B20(void) { unsigned char resport; SetDQ(); Delay_us(50);
ResetDQ(); Delay_us(500); //500us (该时间的时间范围可以从480到960微秒) SetDQ(); Delay_us(40); //40us //resport = GetDQ(); while(GetDQ()); Delay_us(500); //500us SetDQ(); return resport; }
void DS18B20WriteByte(unsigned char Dat) { unsigned char i; for(i=8;i>0;i--) {
ResetDQ(); //在15u内送数到数据线上,DS18B20在15-60u读数 Delay_us(5); //5us if(Dat & 0x01) SetDQ(); else ResetDQ(); Delay_us(65); //65us SetDQ(); Delay_us(2); //连续两位间应大于1us Dat >>= 1; } }
ds18b20工作原理

ds18b20工作原理
DS18B20是一种数字温度传感器,它基于One-Wire总线协议进行通信。
其工作原理是利用温度对半导体器件电阻值的变化进行测量。
在DS18B20内部,有一个温度传感器、一个模数转换器和一个存储器。
在测量过程中,DS18B20内部的温度传感器会不断感知环境温度,并将温度转换为数字信号。
然后,模数转换器将数字信号转换成相应的数字代码,代表温度值。
这些数字代码通过One-Wire总线协议被传送给主控设备(如微控制器或电脑)进行处理。
DS18B20的One-Wire总线协议是一种串行通信协议,它使用单根数据线进行数据传输。
通信过程中,主控设备产生一个复位脉冲,然后从DS18B20传感器接收到ROM编号(唯一标识符)以便进行身份验证。
接下来,主控设备发送命令给传感器,比如读取温度值。
DS18B20会将温度值的数字代码通过数据线传输给主控设备,主控设备解析代码并将其转换为实际温度值。
DS18B20还具有一定的存储能力,在开启存储功能后,它可以将温度值存储在内部的存储器中。
这样,即使主控设备没有及时读取温度值,DS18B20也能够保存最新的温度数据。
总的来说,DS18B20通过测量半导体器件电阻值的变化来获取环境温度,并通过One-Wire总线协议将温度值传输给主控设备。
它的工作原理简单而可靠,在许多应用中被广泛使用。
STM32 实验22 DS18B20实验

} //从 DS18B20 读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void)
// read one bit
{
u8 data;
DS18B20_IO_OUT();//SET PA0 OUTPUT
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
DS18B20_IO_OUT(); //SET PA0 OUTPUT DS18B20_DQ_OUT=0; //拉低 DQ delay_us(750); //拉低 750us DS18B20_DQ_OUT=1; //DQ=1 delay_us(15); //15US } //等待 DS18B20 的回应 //返回 1:未检测到 DS18B20 的存在 //返回 0:存在 u8 DS18B20_Check(void) { u8 retry=0; DS18B20_IO_IN();//SET PA0 INPUT while (DS18B20_DQ_IN&&retry<200) {
DS18B20 的介绍就到这里,更详细的介绍,请大家参考 DS18B20 的技术手册。
3.22.2 硬件设计
由于开发板上标准配置是没有 DS18B20 这个传感器的,只有接口,所以大家需要自己焊接 一个 DS18B20 上去。
本节实验功能简介:开机的时候先检测是否有 DS18B20 存在,如果没有,则提示错误。 只有在检测到 DS18B20 之后才开始读取温度并显示在 LCD 上,如果发现了 DS18B20,则程 序每隔 200ms 左右读取一次数据,并把温度显示在 LCD 上。同样我们也是用 LED0 来指示程 序正在运行。
ds18b20程序设计傻瓜式讲解

ds18b20程序设计傻瓜式讲解
DS18B20 是一款数字温度传感器,可以直接读出被测温度,并采用 9 位数字量串行输出。
下面是一个简单的 DS18B20 程序设计讲解:
1. 初始化
在 DS18B20 通信过程中,首先需要初始化数据线,即将其置为高电平。
在初始化时,需要持续至少 480 微秒的高电平。
2. 跳过 ROM
在 DS18B20 中,每个传感器都有一个唯一的 ROM 序列号,可以通过跳过ROM 操作来避免对 ROM 进行操作。
具体操作是先发出一个低电平,然后持续至少 60 微秒的高电平。
3. 发送命令
在跳过 ROM 后,需要向传感器发送命令。
常用的命令有温度转换命令和读取温度命令。
温度转换命令是 0x44,读取温度命令是 0xBE。
4. 读取数据
在发送命令后,需要等待传感器响应。
传感器响应的标志是数据线上的低电平。
在低电平持续约 60-240 微秒后,数据线将变为高电平,此时可以开始读取数据。
每次读取一位数据后,需要将数据线置为低电平,等待传感器响应。
5. 数据解析
DS18B20 的数据由 9 位数字量组成,其中最高位是符号位。
如果最高位为0,则表示温度为正数;如果最高位为 1,则表示温度为负数。
其余 8 位为温度值,可以通过一定的计算公式将其转换为实际温度值。
以上就是 DS18B20 的程序设计流程。
需要注意的是,在实际应用中,还需要考虑数据传输的校验、错误处理等问题。
ds18b20温度传感器工作原理

ds18b20温度传感器工作原理DS18B20温度传感器是一种数字温度传感器,它可以实现远距离测温,并且具有高精度和可靠性。
它的工作原理主要是基于热敏电阻的温度测量原理,结合数字信号输出和单总线通信技术,使得其在各种工业和消费电子产品中得到了广泛的应用。
DS18B20温度传感器采用了微型封装技术,其外形小巧,安装方便,适用于各种恶劣环境。
其工作原理主要包括三个方面,温度测量原理、数字信号输出和单总线通信。
首先,DS18B20温度传感器的温度测量原理是基于热敏电阻的特性。
当温度发生变化时,热敏电阻的电阻值也会相应发生变化。
DS18B20内部集成了一个精密的模拟-数字转换器(ADC),可以将热敏电阻的电阻值转换为数字信号输出。
通过这种方式,DS18B20可以实现对温度的准确测量。
其次,DS18B20温度传感器通过数字信号输出来实现温度数据的传输。
它采用了1-Wire总线协议,通过一根数据线即可实现数据的传输和通信。
这种设计使得DS18B20在布线和连接方面更加简单和灵活。
最后,DS18B20温度传感器通过单总线通信来与主控设备进行数据交互。
它采用了独特的ROM存储器结构,每个传感器都有一个唯一的64位串行号码,可以通过这个号码来对传感器进行寻址和识别。
同时,DS18B20还具有多点测量、多传感器串联等特性,可以实现对多个传感器的同时管理和控制。
总的来说,DS18B20温度传感器的工作原理基于热敏电阻的温度测量原理,结合数字信号输出和单总线通信技术,实现了远距离、高精度、可靠性的温度测量和数据传输。
它在工业控制、环境监测、家用电器等领域都有着广泛的应用前景。
希望通过本文的介绍,能够更好地理解DS18B20温度传感器的工作原理和特性,为相关领域的应用提供参考和指导。
ds18b20温度传感器工作原理

ds18b20温度传感器工作原理
DS18B20温度传感器是一种数字温度传感器,它基于热电效
应来测量温度。
该传感器由一个精密的温度传感器和一个数字转换器组成。
以下是DS18B20温度传感器的工作原理:
1. 热电效应:DS18B20温度传感器利用热电效应来测量温度。
当两个不同材料的接触点形成温度梯度时,就会产生电动势。
传感器中的温度传感器部分采用的材料对温度变化非常敏感,因此产生的电动势可以反映出温度的变化。
2. 温度传感器:DS18B20温度传感器中的温度传感器部分是
由一个特殊的材料制成的。
该材料具有温度敏感性,当温度变化时,该材料会产生电动势。
这个电动势可以通过传感器的引脚进行读取和转换。
3. 数字转换器:DS18B20温度传感器具有内置的数字转换器。
这个数字转换器可以将从温度传感器获得的电压信号转换为数字信号。
数字信号可以直接读取和处理,而无需进行模拟信号转换。
4. 串行总线通信:DS18B20温度传感器通过一种称为One-
Wire总线的串行通信协议与主控制器进行通信。
传感器和主
控制器之间只需使用单一的数据线进行通信,使得传感器的连接变得简单方便。
总结起来,DS18B20温度传感器工作原理是利用热电效应测
量温度,并通过温度传感器和数字转换器来转换和读取温度信号。
该传感器通过One-Wire总线与主控制器进行通信。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
折腾了一晚上,才把DS18B20的驱动移植到STM32上来。
以前在51上使用过单个和多个连接的DS18B20,有现成的程序了,以为很快就能弄好,结果还是被卡住了,下面说下几个关键点吧:首先是延时的问题,STM32上若用软件延时的话不太好算时间,所以要么用定时器要么用SysTick这个定时器来完成延时的计算。
相比之下用SysTick来的简单方便点。
接着是STM32 IO脚的配置问题,因为51是双向的IO,所以作为输入输出都比较方便。
STM32的IO是准双向的IO,网上查了下资料,说将STM32的IO配置成开漏输出,然后外接上拉即可实现双向IO。
于是我也按规定做了,但调了老半天都不成功,是因为DS18B20没有响应的信号。
在烦躁之际只有试下将接DQ的IO分别拉低和拉高看能不能读入正确的信号。
结果果然是读入数据不对,原来我将IO配成开漏输出后相当然的以为读数据是用GPIO_ReadOutputDataBit(),这正是问题所在,后来将读入的函数改为GPIO_ReadInputDataBit()就OK 了。
现在温度是现实出来了,但跟我家里那台德胜收音机上显示的温度相差2度,都不知道是哪个准了,改天再找个温度计验证下。
下面引用一段DS18B20的时序描述,写的很详细:DS18B20的控制流程根据DS18B20的通信协议,DS18B20只能作为从机,而单片机系统作为主机,单片机控制DS18B20完成一次温度转换必须经过3个步骤:复位、发送ROM指令、发送RAM指令。
每次对DS18B20的操作都要进行以上三个步骤。
复位过程为:单片机将数据线拉低至少480uS,然后释放数据线,等待15-60uS让DS18B20接收信号,DS18B20接收到信号后,会把数据线拉低60-240uS,主机检测到数据线被拉低后标识复位成功;发送ROM指令:ROM指令表示主机对系统上所接的全部DS18B20进行寻址,以确定对那一个DS18B20进行操作,或者是读取某个DS18B20的ROM序列号。
发送RAM指令:RAM指令用于单片机对DS18B20内部RAM进行操作,如读取寄存器的值,或者设置寄存器的值。
具体的RAM和RAM指令请查阅DS18B20的数据手册。
下面简单介绍:1、ROM操作命令:DS18B20采用一线通信接口。
因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。
一旦总线检测到从属器件的存在,它便可以发出器件ROM操作指令,所有ROM操作指令均为8位长度,主要提供以下功能命令:1 )读ROM(指令码0X33H):当总线上只有一个节点(器件)时,读此节点的64位序列号。
如果总线上存在多于一个的节点,则此指令不能使用。
2 )ROM匹配(指令码0X55H):此命令后跟64位的ROM序列号,总线上只有与此序列号相同的DS18B20才会做出反应;该指令用于选中某个DS18B20,然后对该DS18B20进行读写操作。
3 )搜索ROM(指令码0XF0H):用于确定接在总线上DS18B20的个数和识别所有的64位ROM序列号。
当系统开始工作,总线主机可能不知道总线上的器件个数或者不知道其64位ROM序列号,搜索命令用于识别所有连接于总线上的64位ROM序列号。
4 )跳过ROM(指令码0XCCH):此指令只适合于总线上只有一个节点;该命令通过允许总线主机不提供64位ROM序列号而直接访问RAM,以节省操作时间。
5 )报警检查(指令码0XECH):此指令与搜索ROM指令基本相同,差别在于只有温度超过设定的上限或者下限值的DS18B20才会作出响应。
只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值,或者改变TH或TL的设置使得测量值再一次位于允许的范围之内。
储存在EEPROM内的触发器用于告警。
2、RAM指令DS18B20有六条RAM命令:1)温度转换(指令码0X44H):启动DS18B20进行温度转换,结果存入内部RAM。
2)读暂存器(指令码0XBEH):读暂存器9个字节内容,此指令从RAM 的第1个字节(字节0)开始读取,直到九个字节(字节8,CRC值)被读出为止。
如果不需要读出所有字节的内容,那么主机可以在任何时候发出复位信号以中止读操作。
3)写暂存器(指令码0X4EH):将上下限温度报警值和配置数据写入到RAM的2、3、4字节,此命令后跟需要些入到这三个字节的数据。
4)复制暂存器(指令码0X48H):把暂存器的2、3、4字节复制到EEPROM 中,用以掉电保存。
5)重新调E2RAM(指令码0XB8H):把EEROM中的温度上下限及配置字节恢复到RAM的2、3、4字节,用以上电后恢复以前保存的报警值及配置字节。
6)读电源供电方式(指令码0XB4H):启动DS18B20发送电源供电方式的信号给主CPU。
对于在此命令送至DS18B20后所发出的第一次读出数据的时间片,器件都会给出其电源方式的信号。
“0”表示寄生电源供电。
“1”表示外部电源供电。
下面是结合实际测试总结出来的DS18B20的操作流程:1、DS18B20的初始化(1)先将数据线置高电平“1”。
(2)延时(该时间要求的不是很严格,但是尽可能的短一点)。
(3)数据线拉到低电平“0”。
(4)延时490微秒(该时间的时间范围可以从480到960微秒)。
(5)数据线拉到高电平“1”。
(6)延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。
据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
(8)将数据线再次拉高到高电平“1”后结束。
2、DS18B20的写操作(1)数据线先置低电平“0”。
(2)延时确定的时间为2(小于15)微秒。
(3)按从低位到高位的顺序发送字节(一次只发送一位)。
(4)延时时间为62(大于60)微秒。
(5)将数据线拉到高电平,延时2(小于15)微秒。
(6)重复上(1)到(6)的操作直到所有的字节全部发送完为止。
(7)最后将数据线拉高。
3、 DS18B20的读操作(1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时2(小于15)微秒。
(5)将数据线拉高“1”,同时端口应为输入状态。
(6)延时4(小于15)微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时62(大于60)微秒。
顺便把程序也贴上来吧,给大家参考下。
使用的方法:只要调用一次 ds18b20_start() 来初始化DS18B20,然后每次读温度时直接调用 ds18b20_read()就可以了。
如ds18b20_start();while(1){for(i=1000000;i>0;i--);val = ds18b20_read();}[cpp]view plaincopy1//========================================================23// DS18B20.C By ligh45//========================================================67#include "STM32Lib//stm32f10x.h"8#include "DS18B20.h"9101112#define EnableINT()13#define DisableINT()1415#define DS_PORT GPIOA16#define DS_DQIO GPIO_Pin_117#define DS_RCC_PORT RCC_APB2Periph_GPIOA18#define DS_PRECISION 0x7f //精度配置寄存器 1f=9位; 3f=10位; 5f=11位; 7f=12位; 19#define DS_AlarmTH 0x6420#define DS_AlarmTL 0x8a21#define DS_CONVERT_TICK 10002223#define ResetDQ() GPIO_ResetBits(DS_PORT,DS_DQIO)24#define SetDQ() GPIO_SetBits(DS_PORT,DS_DQIO)25#define GetDQ() GPIO_ReadInputDataBit(DS_PORT,DS_DQIO)262728static unsigned charTempX_TAB[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};293031void Delay_us(u32 Nus)32{33 SysTick->LOAD=Nus*9; //时间加载34 SysTick->CTRL|=0x01; //开始倒数35while(!(SysTick->CTRL&(1<<16))); //等待时间到达36 SysTick->CTRL=0X00000000; //关闭计数器37 SysTick->VAL=0X00000000; //清空计数器38}39404142unsigned char ResetDS18B20(void)43{44 unsigned char resport;45 SetDQ();46 Delay_us(50);4748 ResetDQ();49 Delay_us(500); //500us (该时间的时间范围可以从480到960微秒)50 SetDQ();51 Delay_us(40); //40us52 //resport = GetDQ();53while(GetDQ());54 Delay_us(500); //500us55 SetDQ();56return resport;57}5859void DS18B20WriteByte(unsigned char Dat)60{61 unsigned char i;62for(i=8;i>0;i--)63 {64 ResetDQ(); //在15u内送数到数据线上,DS18B20在15-60u读数65 Delay_us(5); //5us66if(Dat & 0x01)67 SetDQ();68else69 ResetDQ();70 Delay_us(65); //65us71 SetDQ();72 Delay_us(2); //连续两位间应大于1us73 Dat >>= 1;74 }75}767778unsigned char DS18B20ReadByte(void)79{80 unsigned char i,Dat;81 SetDQ();82 Delay_us(5);83for(i=8;i>0;i--)84 {85 Dat >>= 1;86 ResetDQ(); //从读时序开始到采样信号线必须在15u内,且采样尽量安排在15u的最后87 Delay_us(5); //5us88 SetDQ();89 Delay_us(5); //5us90if(GetDQ())91 Dat|=0x80;92else93 Dat&=0x7f;94 Delay_us(65); //65us95 SetDQ();96 }97return Dat;98}99100101void ReadRom(unsigned char *Read_Addr)102{103 unsigned char i;104105 DS18B20WriteByte(ReadROM);106107for(i=8;i>0;i--)108 {109 *Read_Addr=DS18B20ReadByte();110 Read_Addr++;111 }112}113114115void DS18B20Init(unsigned char Precision,unsigned char AlarmTH,unsigned char AlarmTL)116{117 DisableINT();118 ResetDS18B20();119 DS18B20WriteByte(SkipROM);120 DS18B20WriteByte(WriteScratchpad);121 DS18B20WriteByte(AlarmTL);122 DS18B20WriteByte(AlarmTH);123 DS18B20WriteByte(Precision);124125 ResetDS18B20();126 DS18B20WriteByte(SkipROM);127 DS18B20WriteByte(CopyScratchpad);128 EnableINT();129130while(!GetDQ()); //等待复制完成 ///////////131}132133134void DS18B20StartConvert(void)135{136 DisableINT();137 ResetDS18B20();138 DS18B20WriteByte(SkipROM);139 DS18B20WriteByte(StartConvert);140 EnableINT();141}142143void DS18B20_Configuration(void)144{145 GPIO_InitTypeDef GPIO_InitStructure;146147 RCC_APB2PeriphClockCmd(DS_RCC_PORT, ENABLE);148149 GPIO_InitStructure.GPIO_Pin = DS_DQIO;150 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出151 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //2M时钟速度152 GPIO_Init(DS_PORT, &GPIO_InitStructure);153}154155156void ds18b20_start(void)157{158 DS18B20_Configuration();159 DS18B20Init(DS_PRECISION, DS_AlarmTH, DS_AlarmTL);160 DS18B20StartConvert();161}162163164unsigned short ds18b20_read(void)165{166 unsigned char TemperatureL,TemperatureH;167 unsigned int Temperature;168169 DisableINT();170 ResetDS18B20();171 DS18B20WriteByte(SkipROM);172 DS18B20WriteByte(ReadScratchpad);173 TemperatureL=DS18B20ReadByte();174 TemperatureH=DS18B20ReadByte();175 ResetDS18B20();176 EnableINT();177178if(TemperatureH & 0x80)179 {180 TemperatureH=(~TemperatureH) | 0x08;181 TemperatureL=~TemperatureL+1;182if(TemperatureL==0)183 TemperatureH+=1;184 }185186 TemperatureH=(TemperatureH<<4)+((TemperatureL&0xf0)>>4); 187 TemperatureL=TempX_TAB[TemperatureL&0x0f];188189 //bit0-bit7为小数位,bit8-bit14为整数位,bit15为正负位190 Temperature=TemperatureH;191 Temperature=(Temperature<<8) | TemperatureL;192193 DS18B20StartConvert();194195return Temperature;196}197198199200201202//============================================203204// DS18B20.H205206//============================================207208#ifndef __DS18B20_H209#define __DS18B20_H210211#define SkipROM 0xCC //跳过ROM212#define SearchROM 0xF0 //搜索ROM213#define ReadROM 0x33 //读ROM214#define MatchROM 0x55 //匹配ROM215#define AlarmROM 0xEC //告警ROM216217#define StartConvert 0x44 //开始温度转换,在温度转换期间总线上输出0,转换结束后输出1218#define ReadScratchpad 0xBE //读暂存器的9个字节219#define WriteScratchpad 0x4E //写暂存器的温度告警TH和TL220#define CopyScratchpad 0x48 //将暂存器的温度告警复制到EEPROM,在复制期间总线上输出0,复制完后输出1221#define RecallEEPROM 0xB8 //将EEPROM的温度告警复制到暂存器中,复制期间输出0,复制完成后输出1222#define ReadPower 0xB4 //读电源的供电方式:0为寄生电源供电;1为外部电源供电223224225void ds18b20_start(void);226unsigned short ds18b20_read(void);227228229#endif。