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,并傳回溫度值。