51单片机DS18B20与中断冲突解决方式
应用场所
在使用51单片机DS18B20的过程中,总会遇到中断(这里的中断主要是指定时器中断和串口中断)与其时序产生冲突,从而导致读取不稳定的情况发生。
问题原因
DS18B20串行读取数据时候要按严格时序;由于它是单线的通信,一根线上即发数据又发时序,一般都是单片机去DS18B20去读取数据,则单片机是主控,DS18B20是从机,通过单片机对它进行设置和读取数据。而如果在使用其同时引入了中断,则会打断DS18B20单总线的时序。
解决方式
1、在DS18B20读取同时关闭中断,然后在温度读取结束后再将其打开。(此方法对中断准确使用有一定的影响)
例:
int Ds18b20ReadTemp()
{
int temp = 0;
uchar tmh, tml;
TR0=0;//关闭定时器
Ds18b20ChangTemp(); //先写入转换命令
Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令
tml = Ds18b20ReadByte(); //读取温度值共16位,先读低字节
tmh = Ds18b20ReadByte(); //再读高字节
temp = tmh;
temp <<= 8;
temp |= tml;
TR0=1;//打开定时器
return temp;
}
2、延长执行中断时间,使DS18B20时序受影响最小(可减低DS18B20和中断的冲突)
以定时器中断为例:
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0 = 0x4C; //定时50ms
TL0 = 0x00;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}