rain73 发表于 2014-6-15 00:47:03

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

最近在使用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();

可以单独写成一个函数,方便使用。

zxq6 发表于 2014-6-15 08:31:57

谢谢提醒。

joystring 发表于 2014-6-16 08:23:13

帮顶,顺便赚块莫元

wxty 发表于 2014-6-16 08:37:30

不明觉厉。

黑夜之狼 发表于 2014-6-16 09:00:10

mark      

7802848 发表于 2014-6-16 09:06:49

没用过 不知道这个东西适合用在什么场合 成本如何

Michael_STM 发表于 2014-6-16 09:07:38

mark 一下

dongmakuaibu 发表于 2014-6-16 11:42:45

终于发了个不水的帖子,鼓励鼓励

liujingbin 发表于 2014-6-16 11:49:45

不明觉厉

天行者 发表于 2014-6-16 12:55:37

MARK一下。谢谢提醒。

n0831 发表于 2014-6-16 13:10:25

不错,以前都是傻等傻等,再读数据。
页: [1]
查看完整版本: DS18B20遇忙检测的一个认识误区