初始化经过测试,这样才行的,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; //初始化成功
}
|