DS18B20温度传感器编程注意事项
问题:在用定时器扫描按键的时候,CPU会每隔20毫秒处理一次中断,而此时与DS18B20通信的单总线里,发送与接收的延时是必须遵守的,延时时间是定死的,若刚好在通信延时的时候去处理中断响应,则通信会被打乱,在项目里的现象就是LCD温度显示不稳定,会有残影,而如果不使用定时器扫描按键,当按住按钮不松手时,CPU会卡死在循环里,无法与DS18B20通信,无论温度怎么变化,都无法显示变动结果解决办法:按
·
DS18B20温度报警器项目注意事项
问题:在用定时器扫描按键的时候,CPU会每隔20毫秒处理一次中断,而此时与DS18B20通信的单总线里,发送与接收的延时是必须遵守的,延时时间是定死的,若刚好在通信延时的时候去处理中断响应,则通信会被打乱,在项目里的现象就是LCD温度显示不稳定,会有残影,而如果不使用定时器扫描按键,当按住按钮不松手时,CPU会卡死在循环里,无法与DS18B20通信,无论温度怎么变化,都无法显示变动结果
解决办法:按理来说使用定时器扫描按键是比较合理的,可以在单总线的起始信号,发送一个字,接收一个字时序函数中都在开始通信前关闭中断EA = 0,在通信完成后再开启中断EA = 1,这样温度就显示正常了
/**
* @brief 主机发送一位
* @param 要发送的数据位
* @retval无
*/
void OneWier_SendBit(unsigned char Bit)
{
unsigned char i;
EA = 0; //关闭中断
OneWire_DQ = 0;
i = 4;while (--i); //延时10us
OneWire_DQ = Bit;
i = 24;while (--i); //延时50us
OneWire_DQ = 1;
EA = 1; //打开中断
}
不足:使用关闭所有中断的方法比较粗暴,如果在多模块联动的情况下很难平衡,其实也可以改为只关闭ET0中断,但关闭中断这种做法在按键扫描这种时序不高的情况下才适合,如果是时钟定时关闭中断的话必定会对逻辑产生影响,时间就不对
综述:单总线通信比较鸡肋,使用的是绝对时间,在通信过程中是不允许被中断的,不像I2C有独立的时钟线,时钟和中断是同时停止的,处理完中断后再回来开始时钟
更多推荐
所有评论(0)