最近在使用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();
可以单独写成一个函数,方便使用。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>