硬體上加了一個10K上拉電阻,已經試過4.7K及兩個4.7K并聯,供電3.3V,不加上拉電阻是不能讀出資料的。
讀取代碼:
unsigned char Ds18b20Read(void)
{
unsigned char Value = 0x00;
unsigned int i;
// ds18b20IO_1();
// Ds18b20Delay(3);
for(i=0;i<8;i++)
{
Value >>= 1;
//拉低
Ds18b20OutputInitial();
ds18b20IO_0();
Ds18b20Delay(3);
//釋放
ds18b20IO_1();
Ds18b20Delay(3);
if(P2IN & BIT2)
Value |= 0x80;
Ds18b20Delay(60);
}
return Value;
}
讀取:
Ds18b20Initial();
Ds18b20Write(0xcc); // 跳過讀序號列號的操作
Ds18b20Write(0x44); // 啟動溫度轉換
Ds18b20Delay(2000);
Ds18b20Initial();
Ds18b20Write(0xcc); //跳過讀序號列號的操作
Ds18b20Write(0xbe); //讀取溫度暫存器等(共可讀9個暫存器) 前兩個就是溫度
V1 = Ds18b20Read(); //低位
V2 = Ds18b20Read(); //高位
中間加了2000us的延時,試過800ms及200us各試驗資料,波形:


從復位后的應答看,設備是可以正常回應的,而且這個設備替換過,應該不是設備問題,為啥這個回復的資訊都是高電平,是哪里接錯了致使18B20不能接低,還是延時問題時序不對?求指點
uj5u.com熱心網友回復:
程式中沒有體現Ds18b20Delay(3);的延時時間,樓主可以參考下時序圖看看是否時序有問題
uj5u.com熱心網友回復:
18B20對時歇的長短要求比較高,應盡量準確uj5u.com熱心網友回復:
感謝兩位回復。我自己感覺,我應該是出在讀上,但是卻無從下手了,我對兩個延時更改了一下,如下:unsigned char Value = 0x00;
unsigned int i;
ds18b20IO_1();
Ds18b20Delay(3);
for(i=0;i<8;i++)
{
Value >>= 1;
//拉低
Ds18b20OutputInitial();
ds18b20IO_0();
Ds18b20Delay(10);
//釋放
ds18b20IO_1();
Ds18b20Delay(3);
if(P2IN & BIT2)
Value |= 0x80;
Ds18b20Delay(47);
Ds18b20Delay(3);
}
return Value;
。說一下我對這個讀時序的理解:
1,主機為輸出拉低,延時10us
2,釋放改為輸入,延時3us等待穩定
3,讀取,1與2的延時要小于15us
4,延時47,湊夠讀時隙的60us
5,恢復延時3us
我這樣理解對嗎?
另一個問題,手冊上看,轉換資料是12位約750ms,但是查看了很多的代碼中沒有這么長,是不是會有影響,或者說本次讀取的資料,是上次的轉換的結果?

謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257935.html
標籤:單片機/工控
上一篇:eNSP [USG3000-interzone-trust-untrust]detect java-blocking 2010 ^ Error: Too ma
下一篇:簡單C語言指標
