一、DS18B20簡介
DS18B20是常用的數字溫度計。DS18B20數字溫度計提供9至12位(可配置)溫度讀數,表明該設備的溫度。
信息通過單總線接口被發送到DS18B20或從DS18B20發出,因此從中央微處理器到DS18B20只有需要一個線(和地線)。
讀,寫和進行溫度轉換所需要的電源,可以由數據線本身來提供,無需外部電源。 由于每個DS18B20含有唯一的序列號,多個DS18B20可以掛載在一條單總線上。這允許在許多不同的地方,放置溫度傳感器。
這個功能是非常有用的,可以應用在包括HVAC環境控制,建筑物內部的溫度感應, 設備或機械,過程監測和控制等領域。
二、DS18B20硬件連接
DS18B20引腳圖 DS18B20 原理圖
DS18B20 有三個引腳。根據原理圖可知,DS18B20采用了外部供電的連接方式,而DQ引腳上拉10k電阻。DQ引腳連接在4412芯片的GPK1_1 引腳上面。
GND | 地 |
DQ | 數據線 |
VDD | 電源(可選) |
三、DS18B20時序分析
DS18B20是一個單總線,輸入和輸出都是通過DQ引腳,我們需要根據時序圖,不斷的操作DQ這個引腳,實現具體的功能。
(一)ds18b20復位時序和函數實現
通過復位信號,可以檢測DS18B20是否工作正常,并通知DS18B20準備通信。
(1)4412拉低DQ引腳,復位周期開始。
(2)DQ引腳上的低電平保持480us—960us 的時間,然后釋放總線。
(3)4412延時16us—60us等待DS18B20應答。
(4)DS18B20拉低DQ引腳60us—240us,表示應答。
4412讀取DQ引腳電平,如果是低電平,表示初始化完成。
(5)DS18B20應答信號結束后,釋放總線,DQ引腳被上拉電阻拉高,復位周期結束。
實現ds18b20的復位代碼:
void DS18_Reset()
{
GPK1.PUD = 0; //GPK1_1 禁止上下拉
GPK1.CON = (GPK1.CON & ~(0xF << 4)) | 0x1 << 4; //設置GPK1_1為輸出引腳
GPK1.DAT &= ~(0x1 << 1); //設置GPK1_1 輸出‘0’,拉低DQ引腳
delay_us(700); //延時 600us
GPK1.DAT |= 0x1 << 1; //GPK1_1釋放總線
GPK1.CON &= ~(0xF << 4); //設置GPK1_1為輸入引腳
while(GPK1.DAT & (0x1 << 1)); //等待DS18B20應答信號 (DQ引腳低電平)
while(!(GPK1.DAT & (0x1 << 1)));
//等待DS18B20應答信號結束(DQ引腳高電平)
}
(二)ds18b20寫時序和函數實現
當我們需要從DS18B20寫數據的時候,必須嚴格DS18B20的寫時序,進行操作。
向DS18B20寫邏輯0操作:
(1)4412拉低DQ引腳,寫周期開始。
(2)DQ引腳保持低電平15us左右。
(3)DQ引腳繼續保持低電平20us--45us。
(4)釋放總線。
向DS18B20寫邏輯1操作:
(1)4412拉低DQ引腳,寫周期開始。
(2)DQ引腳上的低電平保持大于1us后,拉高DQ引腳 ,總共15us。
(3)DQ引腳繼續保持高電平20us—45us
(4)釋放總線。
實現向DS18B20寫入一個字節代碼:
void DS18_Write(unsigned char data)
{
unsigned char i;
GPK1.CON = (GPK1.CON & ~(0xF << 4)) | 0x1 << 4; //設置GPK1_1為輸出引腳
for(i = 0; i < 8; i++)
{
GPK1.DAT |= 0x1 << 1; //設置GPK1_1 輸出1
delay_us(1); //延時1us
GPK1.DAT &= ~(0x1 << 1); //設置GPK1_1 輸出0形成下降沿
delay_us(12); //延時12us,大于1us小于15us
if(data & 0x1) //如果數據低位為1
GPK1.DAT |= 0x1 << 1; //設置GPK1_1 輸出1
delay_us(40); //延時40us
data = data >> 2; //數據右移1位
}
}
(三)ds18b20寫時序和函數實現
當我們需要從DS18B20讀數據的時候,必須嚴格DS18B20的讀時序,進行操作。
(1)通過4412拉低DQ引腳,讀周期開始。
(2)DQ引腳上的低電平至少保持1us 的時間,然后釋放引腳。
(3)4412延時幾us(留物理電平反應時間),讀取DQ引腳的數據。
注意:根據圖中MASTER SAMPLES指示,從拉低電平轉換開始,留給物理電平轉換時間,到后4412的對DQ引腳讀取操作應給在15us之內完成。
(4)15us后讀時隙結束時,DQ引腳將通過外部上拉電阻拉回高電平。
4412延時45us等待讀周期結束。
實現向DS18B20讀入一個字節數據代碼:
unsigned char DS18_Read()
{
unsigned char i, Temp = 0; //初始化接受變量Temp為0
for(i = 0; i < 8; i++)
{
GPK1.CON = (GPK1.CON & ~(0xF << 4)) | 0x1 << 4; //設置GPK1_1為輸出引腳
GPK1.DAT |= 0x1 << 1; //設置GPK1_1 輸出1
GPK1.DAT &= ~(0x1 << 1); //設置GPK1_1 輸出0,形成下降沿
GPK1.DAT |= 0x1 << 1; //GPK1_1釋放總線
GPK1.CON &= ~(0xF << 4); //設置GPK1_1為輸出引腳
Temp >>= 1; //接受變量右移1位
if(GPK1.DAT & (0x1 << 1)) //讀取DQ引腳,如果DQ為1
Temp |= 0x80; //接受變量Temp,高位置1
delay_us(30); //延時30us
}
return Temp;
//返回接受變量
}