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();

可以单独写成一个函数,方便使用。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
zxq6
1楼-- · 2020-01-23 15:33
谢谢提醒。
joystring
2楼-- · 2020-01-23 16:02
帮顶,顺便赚块莫元
wxty
3楼-- · 2020-01-23 20:43
不明觉厉。
黑夜之狼
4楼-- · 2020-01-24 00:35
 精彩回答 2  元偷偷看……
7802848
5楼-- · 2020-01-24 06:34
没用过 不知道这个东西适合用在什么场合 成本如何
Michael_STM
6楼-- · 2020-01-24 09:01
mark 一下

一周热门 更多>