久久综合精品无码一区二区三区|精品日韩一区二区视频播放|亚洲欧洲日韩国内高清|在线视频亚洲一区

下載手機汽配人

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

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

我要提問

汽配限時折扣

本頁是網友提供的關于“并行采集DS18B20(一個IO接一個傳感器),串口傳輸?shù)缴衔粰C”的解答,僅供您參考,汽配人網不保證該解答的準確性。
乳山市| 乌鲁木齐市| 家居| 武冈市| 陆川县| 孟连| 温泉县| 尼玛县| 济南市| 勐海县| 华安县| 临桂县| 灌南县| 静安区| 赤城县| 红原县| 台州市| 汉寿县| 景洪市| 澜沧| 邵阳县| 阳信县| 高邮市| 昔阳县| 定兴县| 通渭县| 辽中县| 岐山县| 微山县| 若羌县| 饶阳县| 通州区| 景德镇市| 嘉义市| 勐海县| 瑞昌市| 吕梁市| 灌阳县| 巴南区| 凌源市| 邯郸县|