初始化經過測試,這樣才行的,DS18B20有嚴格的時序時間。
下面的延時是精確的才行。
/*******************************************************************************
* 函 數 名 : ds18b20Init
* 函數功能 : 初始化
* 輸 入 : 無
* 輸 出 : 初始化成功返回1,失敗返回0
*******************************************************************************/
uchar ds18b20Init()
{
uchar i=0;
DSPORT = 0; //將總線拉低480us~960us
delay520us();
DSPORT = 1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
delay22us(); //這里非常重要,測試只有10-35us才有效,超過就返回不了啦,(現在取中間值22us)while延時的話要i最低=4開始才有效while(i--)
while(DSPORT) //等待DS18B20拉低總線 也就是檢測DQ引腳狀態
{
delayms(1);
i++;
if(i>5)//等待>5MS
{
return 0;//初始化失敗
}
}
delay520us(); //等待520us讓ds18b20釋放總線
return 1; //初始化成功
}
|