DS18B20温度传感器
①介绍
DS18B20数字温度传感器提供9到12-Bit摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能。DS18B20采用的1-Wire通信即仅采用一个数据线(以及地)与微控制器进行通信。该传感器的温度检测范围为-55℃至+125℃,并且在温度传感器的超过-10℃至85℃之外时还具有±0.5℃的精度。此外,DS18B20可以直接由数据线供电而不需要外部电源供电。
在工作时,DS18B20将外部的温度信息转换成数字信号,存放到其内部的Scratchpad中,Scratchpad内存分布如下图1所示。可见,Scratchpad中共有9个字节,使用单片机读出其中的温度,即读取器前两个字节Byte0和Byte1。
图1 DS18B20内存分布图
在Byte0和Byte1中储存着温度的信息,通过了解Byte0和Byte1的存储信息的格式,可以将其中内部的存储信息转换为我们想要的温度信息。Byte0和Byte1存储信息的格式如下图2所示。由此可知,在LSB(byte0)中包括了八位二进制的温度数据。在MSB(byte1)中的高五位存放符号信息,第三位接LSB(byte0)存放剩余的三位二进制温度数据。要注意的是,温度信息在该寄存器中以补码形式存储,所以当温度为负值时,应考虑到转换关系。
图2 温度寄存器格式图
②使用流程
在使用DS18B20传输温度数据的过程中,其主要操作便是通过发送指令对温度传感器进行操作并读取数据。传输的顺序可以分为三步骤,下图3所示为DS18B20文档中对于其传输序列的解释。第一步是对其进行初始化,然后要在数据交换前输入ROM指令。最后对DS18B20传输指令并进行后续读取操作。
图3 DS18B20数据传输顺序
以实验中用到的读取温度值的函数进行介绍,函数主体如下所示。
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); // ds1820 start convert
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc); // skip rom
DS18B20_Write_Byte(0xbe); // convert
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0; //温度为负
}else temp=1; //温度为正
tem=TH; //获得高八位
tem<<=8;
tem+=TL; //获得低八位
tem=(float)tem*0.625; //转换
if(temp)return tem; //返回温度值
else return -tem;
}
首先应进行初始化。在DS18B20上电时,处于一种不工作的状态,如果在此时对其存储器进行读取数据,此时读到的是DS18B20的默认值,为85℃。如果想要DS18B20开始读取环境的温度,需要对其发送一个CONVERT T指令。同样,在发送CONVERT T指令时也应该遵循以上的三个步骤。以下为DS18B20的初始化函数。
void DS18B20_Start(void)
{
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc); // skip rom
DS18B20_Write_Byte(0x44); // convert
}
在对DS18B20发送了CONVERT T指令后,其开始测量温度。测量需要一段时间,故需要有一段时间的延时处理,等待DS18B20测量温度。可通过调用DS18B20的初始化函数实现延时的功能。
此后先后对DS18B20传输”0xcc”(skip rom)指令以及”0xbe”指令。再使用”DS18B20_Read_Byte()”函数读取两个字节的信息(即LSB和MSB)。此后将TH于TL转换为u8数据temp,并返回温度值。