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