|
DS18B20 的位讀寫時序,如圖:
當(dāng)要給 DS18B20 寫入 0 的時候,單片機直接將引腳拉低,持續(xù)時間大于 60us 小于 120us
就可以了。圖上顯示的意思是,單片機先拉低 15us 之后,DS18B20 會在從 15us 到 60us 之間
的時間來讀取這一位,DS18B20 最早會在 15us 的時刻讀取,典型值是在 30us 的時刻讀取,
最多不會超過 60us,DS18B20 必然讀取完畢,所以持續(xù)時間超過 60us 即可。
當(dāng)要給 DS18B20 寫入 1 的時候,單片機先將這個引腳拉低,拉低時間大于 1us,然后馬
上釋放總線,即拉高引腳,并且持續(xù)時間也要大于 60us。和寫 0 類似的是,DS18B20 會在
15us 到 60us 之間來讀取這個 1。
發(fā)送即寫入一個字節(jié)的數(shù)據(jù)程序如下。
void Write18B20(unsigned char dat)
{
unsigned char mask;
EA = 0; //禁止總中斷
for (mask=0x01; mask!=0; mask<<=1) //低位在先,依次移出 8 個 bit
{
IO_18B20 = 0; //產(chǎn)生 2us 低電平脈沖
_nop_();
_nop_();
if ((mask&dat) == 0) //輸出該 bit 值
IO_18B20 = 0;
else
IO_18B20 = 1;
DelayX10us(6); //延時 60us
IO_18B20 = 1; //拉高通信引腳
}
EA = 1; //重新使能總中斷
}
疑問:“單片機先拉低 15us 之后,DS18B20 會在從 15us 到 60us 之間
的時間來讀取這一位,DS18B20 最早會在 15us 的時刻讀取,典型值是在 30us 的時刻讀取,
最多不會超過 60us,DS18B20 必然讀取完畢,所以持續(xù)時間超過 60us 即可。”但程序沒有反映出15us后讀取0啊?按18B20要求,控制器寫“0“和“1”的時序都不一樣,但程序好像沒有分開來寫?
|
|