基于FS4412的DS18B20溫度采集(ji)編程實(shi)現(1-時序分(fen)析)
時(shi)間:2018-09-20 來源(yuan):未知
一、DS18B20簡介
DS18B20是常用(yong)的數(shu)字溫度(du)計(ji)。DS18B20數(shu)字溫度(du)計(ji)提供9至12位(wei)(可配置)溫度(du)讀數(shu),表明該設備的溫度(du)。
信息通過(guo)單總線(xian)接口被發送到DS18B20或從(cong)DS18B20發出(chu),因此從(cong)中央微(wei)處理器到DS18B20只(zhi)有(you)需要一(yi)個線(xian)(和地線(xian))。
讀,寫和進行(xing)溫(wen)度(du)轉(zhuan)換(huan)所需(xu)要的(de)電源(yuan),可(ke)以由(you)數據(ju)線本身(shen)來提(ti)供,無(wu)需(xu)外(wai)部電源(yuan)。 由(you)于每個DS18B20含有唯一(yi)的(de)序列號(hao),多個DS18B20可(ke)以掛載在一(yi)條單總(zong)線上。這允許在許多不同的(de)地方,放置溫(wen)度(du)傳感器(qi)。
這個(ge)功能是非(fei)常有用的,可以應用在(zai)包括(kuo)HVAC環境(jing)控(kong)制(zhi),建筑物內部的溫(wen)度感應, 設備或機械,過程監(jian)測和控(kong)制(zhi)等領域。
二、DS18B20硬件連接

DS18B20引腳圖 DS18B20 原理(li)圖
DS18B20 有三個(ge)引(yin)(yin)腳(jiao)(jiao)。根據原理圖可(ke)知(zhi),DS18B20采用了外部供電(dian)的(de)連(lian)接方式,而DQ引(yin)(yin)腳(jiao)(jiao)上拉10k電(dian)阻。DQ引(yin)(yin)腳(jiao)(jiao)連(lian)接在4412芯片(pian)的(de)GPK1_1 引(yin)(yin)腳(jiao)(jiao)上面。
| GND | 地 |
| DQ | 數據線 |
| VDD | 電源(可選) |
三、DS18B20時序分(fen)析(xi)
DS18B20是一個單總線,輸(shu)入和(he)輸(shu)出都是通過DQ引腳,我們需要根據時序圖,不斷的操(cao)作DQ這個引腳,實現具體的功能。
(一)ds18b20復位時(shi)序(xu)和函數實現

通(tong)(tong)過復位(wei)信(xin)號,可以檢測DS18B20是否工作正常,并(bing)通(tong)(tong)知(zhi)DS18B20準備通(tong)(tong)信(xin)。
(1)4412拉低DQ引腳,復(fu)位(wei)周期開始。
(2)DQ引(yin)腳上的(de)低電平保持480us—960us 的(de)時間,然后釋(shi)放總線。
(3)4412延時16us—60us等待(dai)DS18B20應(ying)答(da)。
(4)DS18B20拉(la)低DQ引腳60us—240us,表示應(ying)答。
4412讀(du)取(qu)DQ引腳電(dian)平,如果是(shi)低電(dian)平,表示初始(shi)化完成。
(5)DS18B20應答信號結束后(hou),釋放總(zong)線,DQ引腳被上拉(la)電阻拉(la)高,復位周期結束。
實現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寫時序(xu)和函(han)數實現(xian)

當我們需要從DS18B20寫(xie)數據的(de)時候,必須(xu)嚴格DS18B20的(de)寫(xie)時序(xu),進行操作。
向(xiang)DS18B20寫邏(luo)輯0操作:
(1)4412拉低(di)DQ引(yin)腳,寫周期開(kai)始。
(2)DQ引腳保(bao)持(chi)低電平15us左右。
(3)DQ引(yin)腳繼續(xu)保持低(di)電平20us--45us。
(4)釋放總線(xian)。
向DS18B20寫邏輯1操作:
(1)4412拉低DQ引腳,寫周期開始。
(2)DQ引(yin)腳上(shang)的低(di)電平保(bao)持大于1us后,拉(la)高(gao)DQ引(yin)腳 ,總共(gong)15us。
(3)DQ引腳(jiao)繼續保(bao)持高電平20us—45us
(4)釋放總線。
實(shi)現(xian)向DS18B20寫(xie)入一個(ge)字節代(dai)碼:
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寫時序和(he)函數實現

當我們需要從DS18B20讀(du)數據的(de)時候,必須嚴(yan)格DS18B20的(de)讀(du)時序,進行操作(zuo)。
(1)通過4412拉(la)低DQ引(yin)腳(jiao),讀周期(qi)開始。
(2)DQ引腳(jiao)(jiao)上的低(di)電(dian)平(ping)至少保持(chi)1us 的時間,然(ran)后釋(shi)放引腳(jiao)(jiao)。
(3)4412延(yan)時幾us(留(liu)物理電平反應時間(jian)),讀取DQ引腳的(de)數據。
注意:根(gen)據(ju)圖中MASTER SAMPLES指示(shi),從拉低電平轉(zhuan)換開始(shi),留給物理電平轉(zhuan)換時間,到后4412的對DQ引腳讀取操作應給在15us之內完成(cheng)。
(4)15us后讀(du)時隙結束時,DQ引腳將(jiang)通過(guo)外(wai)部上(shang)拉電(dian)(dian)阻拉回(hui)高電(dian)(dian)平。
4412延時45us等待讀(du)周期結束。
實現(xian)向(xiang)DS18B20讀(du)入一個(ge)字節數據代碼:
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;
//返回接受變量
}