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