![]() |
發(fā)布時間: 2021-9-14 18:46
正文摘要:附上關于DS18B20操作的部分源碼讀到temp是錯誤的!!! 然后我單獨檢驗讀到的MSB和LSB的值,結果竟然是一樣的。。。 搞了好久還沒有解決,只能請教大佬們了/////////////////////////////////////// AVR16 8M ... |
其實就是瞠序和判斷的問題,我發(fā)過一個類似的貼,你找找。 |
主機拉低總線480-960us后釋放總線,由上拉電阻拉高總線,過15-60us 18b20會拉低總行 所以延時68us后等待18b20拉低, |
wzl570 發(fā)表于 2021-9-15 08:02 不是啊,你仔細看看你的代碼: DQ_ON;//1 DQ_IN;//輸入 delay_us(68); if(PINA & 0X80) flag = 0; else flag = 1;//初始化成功 delay_us(420); return flag; 你是直接 68 us 后 判斷,是不是高電平, 你壓根沒有管, 68us 之前,有沒有過 低電平。換句話說,就算前面一直是高電平,你也是判斷的初始化成功, 而初始化成功的關鍵是, 68us 之前,必須出現(xiàn)過低電平,這么說你能理解么? 所以,你的判斷邏輯 應該是, 拉高電平后,1us 之后 等待低電平,接受到低電平后,計時60us 后再判斷是否變高電平,是的話,才算初始化成功。 |
好久了還是卡在讀到的高位和低位數(shù)據(jù)是一樣的,在25°C時MSB是144,LSB也是![]() ![]() ![]() |
188610329 發(fā)表于 2021-9-14 20:31 我讀了啊 if(PINA&0x80)//68us后還是高電平的話沒有初始成功返回0 flag = 0; else flag = 1;//若是低電平,成功,返回1 //如果延時沒有太大誤差那么第一次拉低電平>480us再次拉高電平的68us后這段時間是DS18B20返回初始信息的時間。實際我也單獨測試了初始化函數(shù),確實返回成功標志flag = 1; //是不是我哪里了解錯了 |
你初始化的判斷, 有點問題…… DQ_IN;//輸入 delay_us(68); if(PINA & 0X80) flag = 0; else flag = 1;//初始化成功 delay_us(420); return flag; 你沒有去讀 18B20 的低點平……,你怎么確認初始化成功了? 也許壓根沒有拉低過呢?要先讀到低電平然后他又變高電平,才是他告訴你,初始化已經(jīng)成功,你傻等60微妙直接讀到高電平?jīng)]用的。 |
Powered by 單片機教程網(wǎng)