如何根據時序編寫呢(以下時序的延時條件很重要,下面講解不再強調)
第一點:寫時序
寫0,寫1可以分開操作,但是也是可以統一編程的,如何統一;
我們先看寫時序,
1.主設備先拉低數據線,左(寫0)右(寫1)是一致的;
2.15us內出現分歧,分歧出現在寫1,波形出現了變化,此時要看寫1;
3.寫1在15us內被電阻上拉導致波形變化了,說明了什么呢,數據的變化導致了數據線上的波形未能維持原狀,數據這時候可以傳輸了(可能數據線此時被釋放,這里可以大家自行測試,本人測試是此時釋放的數據線,注意延時不能過長,本人加延時出錯,不加延時現象正確)
所以這部分應該這樣編程:
定義數據線是DQ;
DQ = 0;
delayus(2);//看寫1時序,主設備拉低要有1us,這段時間寫0和寫1一致
DQ = (bit)data;
取發送數據低1位發送到數據線(DQ)
寫0和寫1都要至少60us延時,
此時主設備釋放數據線
DQ = 1;//看寫0時序
在來3us才進行下一位數據傳輸
重復8次一循環發送一字節數據
第二點:讀時序
首先主設備拉低數據線大於1us
DQ = 0;
delayus(2);
15us內緊接着數據線被釋放(后面波形會變化的原因),讀0(左)會拉低數據線,讀1(右)會拉高數據線,並且主設備會完成讀取操作。
DQ = 1;
數據線上的數據存儲到tempdata ;//8次一循環按位組合成字節
等待60us再加3us進入循環
最后返回出去就行了。
很多人讀取到的數據可能是“85”,這種現象說明時序操作正確。(+85攝氏度是DS18B20在上電復位后在溫度寄存器內的對應數字量),多讀幾次即可。