DS18B20遇忙检测的一个认识误区

2020-01-23 14:36发布

最近在使用DS18B20温度传感器,发现网上不少例程中,对于DS18B20遇忙检测的方法是错误的。
大家知道,DS18B20在温度转换、复制RAM、召回EEPROM等操作的过程中是需要时间的,不能马上回送数据,这时候就需要检测DS18B20忙不忙,返回0表示忙,返回1表示就绪。
很多例程是这样写的:
if (DQ)
        ready();
else
        busy();

其实这是错误的,就算正在忙,DQ脚并不会输出0,而是一直输出1,这是单总线的特性,如果一直占用着,总线上其它人就用不了了,所以信号传输完会立即恢复总线为1。
正确的遇忙检测,是需要一个完整的读时段:
        DQ = 0;                //拉低总线,开始读时段
        DQ = 1;                //释放总线,准备读数据
        _nop_();                //等待总线信号稳定
        _nop_();
        CY = DQ;                //读出状态值
        Delay_60us();        //延时60us
       
        if (CY)
                ready();
        else
                busy();

可以单独写成一个函数,方便使用。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。