在DS18B20按鍵設(shè)定上下限溫度報(bào)警系統(tǒng)中,遇到的最大問(wèn)題,就是在測(cè)溫過(guò)程中偶爾溫度會(huì)跳變幾十、幾百甚至變成2000度,究其原因,就是其中用到的中斷程序,18b20有嚴(yán)格的讀寫(xiě)時(shí)序,過(guò)程中不可以被打斷。否則就會(huì)出現(xiàn)上述數(shù)據(jù)。
解決問(wèn)題的辦法也很假單。只需要在讀溫度是關(guān)閉中斷,讀完之后開(kāi)啟中斷就可以了。
/*------------------------------------------------
讀取溫度
------------------------------------------------*/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
EA=0;//關(guān)閉中斷
Init_DS18B20();
WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作
WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
EA=1;//開(kāi)啟中斷
return(t);
}
===================原因解析======================
1 初始化總線(xiàn)時(shí)序
手冊(cè)上只給出了單片機(jī)拉低總線(xiàn)的最短時(shí)間480us,注意,這里并未給出最大時(shí)間,所以在這480us 時(shí)間內(nèi)不必關(guān)中斷,即使被中斷了,也只是延長(zhǎng)了拉低時(shí)間而已。
下一段是單片機(jī)釋放總線(xiàn)到18B20拉低總線(xiàn)作為響應(yīng)的時(shí)間,15~60us。這段是要關(guān)中斷了(其實(shí)如果中斷函數(shù)執(zhí)行時(shí)間非常短,比如3us,不關(guān)中斷也是可以的)。
再下一段是等待18B20釋放總線(xiàn),同樣不必關(guān)中斷。
2 讀總線(xiàn)
讀總線(xiàn)的最小時(shí)間60us,其實(shí)只要單片機(jī)采樣之后就可以開(kāi)中斷了,剩下的時(shí)間就沒(méi)有那么嚴(yán)格的要求了
3 寫(xiě)總線(xiàn)
寫(xiě)總線(xiàn)的最小時(shí)間同樣是60us,為了保證18B20能讀到正確數(shù)據(jù),這段時(shí)間都要關(guān)中斷
綜上所述,其實(shí)在總線(xiàn)操作過(guò)程中,關(guān)中斷的最長(zhǎng)時(shí)間是60us其余時(shí)間都不必關(guān)中斷。這對(duì)于要進(jìn)行數(shù)碼管動(dòng)態(tài)掃描這樣實(shí)時(shí)性較高的應(yīng)用還是可以滿(mǎn)足要求的。