ds18b20溫度采集實(shí)驗(yàn),ds18b20如何采集溫度
chanong
3、DS18B20的時(shí)序分析
DS18B20是單總線(xiàn),通過(guò)DQ引腳進(jìn)行輸入和輸出,需要根據(jù)時(shí)序圖連續(xù)工作才能實(shí)現(xiàn)某些功能。
(1)ds18b20復(fù)位時(shí)序及功能實(shí)現(xiàn)
通過(guò)復(fù)位信號(hào),可以檢測(cè)DS18B20是否正常工作,并通知DS18B20準(zhǔn)備通信。
(1) 4412 將DQ 引腳拉低,復(fù)位周期開(kāi)始。
(2) DQ 引腳保持低電平480us 至960us,然后釋放總線(xiàn)。
(3)4412延遲16us到60us等待DS18B20響應(yīng)。
(4) DS18B20 通過(guò)在60us 到240us 之間將DQ 引腳拉低來(lái)指示響應(yīng)。
4412讀取DQ引腳的電平,低電平表示初始化完成。
(5) DS18B20 響應(yīng)信號(hào)結(jié)束后,總線(xiàn)釋放,DQ 引腳被上拉電阻拉高,結(jié)束復(fù)位周期。
實(shí)現(xiàn)ds18b20的復(fù)位代碼。
無(wú)效DS18_Reset()
{
GPK1.PUD=0; //GPK1_1禁用下拉
GPK1.CON=(GPK1.CON ~(0xF 4)) |0x1 4; //將GPK1_1 設(shè)置為輸出引腳
GPK1.DAT=~(0x1 1); //將GPK1_1 設(shè)置為輸出“0”并將DQ 引腳拉低
Late_us(700); //延遲600us
GPK1.DAT |=0x1 1; //GPK1_1釋放總線(xiàn)
GPK1.CON=~(0xF 4); //將GPK1_1 設(shè)置為輸入引腳
while(GPK1.DAT(0x1 1)); //等待DS18B20響應(yīng)信號(hào)(DQ引腳低電平)
while(!(GPK1.DAT (0x1 1)));
//等待DS18B20的響應(yīng)信號(hào)完成(DQ引腳高電平)
(2)ds18b20寫(xiě)入時(shí)序及功能實(shí)現(xiàn)
如果需要從DS18B20寫(xiě)入數(shù)據(jù),必須嚴(yán)格遵守DS18B20的寫(xiě)入時(shí)序進(jìn)行操作。
向DS18B20寫(xiě)邏輯0操作:
(1) 4412 將DQ 引腳拉低,寫(xiě)周期開(kāi)始。
(2) DQ 引腳保持低電平約15us。
(3) DQ 引腳保持低電平20us 至45us。
(4) 釋放總線(xiàn)。
向DS18B20 寫(xiě)入邏輯1 操作。
(1) 4412 將DQ 引腳拉低,寫(xiě)周期開(kāi)始。
(2) DQ 引腳保持低電平超過(guò)1us 后,DQ 引腳變?yōu)楦唠娖娇偣?5us。
(3) DQ 引腳將保持高電平20us 至45us。
(4) 釋放總線(xiàn)。
實(shí)現(xiàn)向DS18B20寫(xiě)入字節(jié)碼。
void DS18_Write(無(wú)符號(hào)字符數(shù)據(jù))
{
無(wú)符號(hào)字符i;
GPK1.CON=(GPK1.CON ~(0xF 4)) |0x1 4; //將GPK1_1 設(shè)置為輸出引腳
for(i=0; i 8; i++)
{
GPK1.DAT |=0x1 1; //設(shè)置GPK1_1輸出1
Late_us(1); //1us 延遲
GPK1.DAT=~(0x1 1); //設(shè)置GPK1_1輸出0形成下降沿
Late_us(12); //延遲12us,大于1us但小于15us
if(data0x1) //如果數(shù)據(jù)低位為1
GPK1.DAT |=0x1 1; //設(shè)置GPK1_1輸出1
Late_us(40); //延遲40us
data=data 2; //數(shù)據(jù)右移1位
}
(3)ds18b20寫(xiě)入時(shí)序及功能實(shí)現(xiàn)
如果需要從DS18B20讀取數(shù)據(jù),必須嚴(yán)格按照DS18B20的讀取時(shí)序進(jìn)行。
(1) 通過(guò)4412 將DQ 引腳拉低,開(kāi)始讀取周期。
(2) DQ引腳低電平保持1us以上,然后釋放該引腳。
(3) 4412 在讀取DQ 引腳上的數(shù)據(jù)時(shí)有幾個(gè)us 的延遲(考慮物理級(jí)響應(yīng)時(shí)間)。
注:根據(jù)圖中MASTER SAMPLES指令,從低電平轉(zhuǎn)換開(kāi)始,離開(kāi)物理電平轉(zhuǎn)換時(shí)間,后續(xù)對(duì)DQ引腳的4412讀操作必須在15us內(nèi)完成。
(4) 15us 后讀時(shí)隙結(jié)束時(shí),DQ 引腳通過(guò)外部上拉電阻恢復(fù)為高電平。
4412 延遲45us 等待讀周期完成。
讀1字節(jié)數(shù)據(jù)代碼到DS18B20的實(shí)現(xiàn):
無(wú)符號(hào)字符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 設(shè)置為輸出引腳
GPK1.DAT |=0x1 1; //設(shè)置GPK1_1輸出1
GPK1.DAT=~(0x1 1); //設(shè)置GPK1_1輸出0并形成下降沿
GPK1.DAT |=0x1 1; //GPK1_1釋放總線(xiàn)
GPK1.CON=~(0xF 4); //將GPK1_1 設(shè)置為輸出引腳
Temp=1; //接受變量并右移1位
if(GPK1.DAT (0x1 1)) //如果DQ為1,則讀取DQ引腳
Temp |=0x80; //接受變量Temp,高1
Late_us(30); //延遲30us
}
返回溫度。
//返回接受變量
}
關(guān)于嵌入式物聯(lián)網(wǎng)有很多東西需要學(xué)**,但要小心,學(xué)**錯(cuò)誤的路線(xiàn)和內(nèi)容可能會(huì)讓你付出更高的薪水。
免費(fèi)共享約150GB的數(shù)據(jù)包。學(xué)**內(nèi)容、訪談、項(xiàng)目都比較新、廣泛。據(jù)估計(jì),在網(wǎng)上購(gòu)買(mǎi)某些魚(yú)至少要花費(fèi)幾十美元。
掃碼進(jìn)群并接收信息








