下載手機汽配人

并行采集DS18B20(一個IO接一個傳感器),串口傳輸?shù)缴衔粰C

并行采集DS18B20(一個IO接一個傳感器),串口傳輸?shù)缴衔粰C,如果一個傳感器壞了,不工作了(實際被我拔下來),在上位機上顯示其他通道是正常的,而這路的溫度就從拔下來的那個時刻的溫度就一直不變化了,為什么是這樣的?
提問者:網(wǎng)友 2018-08-27
最佳回答
其實我也發(fā)現(xiàn)了,當(dāng)時沒在意。隨便找了個程序看看,發(fā)現(xiàn)uint Get_Tmp() 是onewire讀兩次賦值給 a b,但一直沒有清0的操作,如果讀失敗則 a b 值沒被改變。建議18B20 初始化時,賦值給 a b,取值是個很大或很小的數(shù),然后程序判斷是否超范圍,是則觸發(fā)報警 uint Get_Tmp() // 獲取溫度 get the temperature { float tt; uchar a,b; Init_Ds18b20(); // 初始化 Write_One_Byte(0xcc); // 忽略 ROM 指令 Write_One_Byte(0x44); // 溫度轉(zhuǎn)換指令 Init_Ds18b20(); // 初始化 Write_One_Byte(0xcc); // 忽略 ROM 指令 Write_One_Byte(0xbe); // 讀暫存器指令 a = Read_One_Byte(); // 讀取到的第一個字節(jié)為溫度 LSB b = Read_One_Byte(); // 讀取到的第一個字節(jié)為溫度 MSB temp = b; // 先把高八位有效數(shù)據(jù)賦于 temp temp <<= 8; // 把以上 8 位數(shù)據(jù)從 temp 低八位移到高八位 temp = temp|a; // 兩字節(jié)合成一個整型變量 tt = temp*0.0625; // 得到真實十進(jìn)制溫度值 // 因為 DS18B20 可以精確到 0.0625 度 // 所以讀回數(shù)據(jù)的最低位代表的是 0.0625 度 temp = tt*10+0.5; // 放大十倍 // 這樣做的目的將小數(shù)點后第一位也轉(zhuǎn)換 為可顯示數(shù)字 // 同時進(jìn)行一個四舍五入操作。 return temp; } uint Get_Tmp() // 獲取溫度 get the temperature { float tt; uchar a,b; Init_Ds18b20(); // 初始化 Write_One_Byte(0xcc); // 忽略 ROM 指令 Write_One_Byte(0x44); // 溫度轉(zhuǎn)換指令 Init_Ds18b20(); // 初始化 Write_One_Byte(0xcc); // 忽略 ROM 指令 Write_One_Byte(0xbe); // 讀暫存器指令 a = Read_One_Byte(); // 讀取到的第一個字節(jié)為溫度
回答者:網(wǎng)友
產(chǎn)品精選
搜索問答
還沒有汽配人賬號?立即注冊

我要提問

汽配限時折扣

本頁是網(wǎng)友提供的關(guān)于“并行采集DS18B20(一個IO接一個傳感器),串口傳輸?shù)缴衔粰C”的解答,僅供您參考,汽配人網(wǎng)不保證該解答的準(zhǔn)確性。