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();
可以单独写成一个函数,方便使用。 谢谢提醒。 帮顶,顺便赚块莫元 不明觉厉。 mark 没用过 不知道这个东西适合用在什么场合 成本如何 mark 一下 终于发了个不水的帖子,鼓励鼓励 不明觉厉 MARK一下。谢谢提醒。 不错,以前都是傻等傻等,再读数据。
页:
[1]