今天用STM32芯片驱动一个18B20,本来很简单的时序,结果硬是整了一天,读回来的温度数据,第一个字节是对的,第二个字节却总是一个固定的0x03,反复检查时序没有发现问题,后来试着将一个局部变量赋了初值,结果正常了。。。
那个局部变量就是用来保存读出的温度数据的,代码如下:
uint8_t B20General_ReadByte(B20_StructTypeDef *B20_StructTemp)
{
uint8_t B20_Num1,B20_Num2;
for(B20_Num1=8;B20_Num1>0;B20_Num1--)
{
Timer2_Delayus(2);
B20General_PinSwitch(B20_StructTemp,OUT); //切换写
B20General_PinOutput(B20_StructTemp,LOW); //拉低
Timer2_Delayus(2);
B20_Num2>>=1;
B20General_PinSwitch(B20_StructTemp,IN); //切换为读
B20General_PinOutput(B20_StructTemp,HIGH); //拉高
Timer2_Delayus(11);
if (B20General_PinInput(B20_StructTemp))
B20_Num2|=0x80;
Timer2_Delayus(55);
}
B20General_PinSwitch(B20_StructTemp,OUT); //切换写
return B20_Num2;
}
之前一直认为,右移(>>)后前面是补0的,所以程序中只判断了读到1的情况,结果却总是不正常,后来将B20_Num2的变量初始化为0,就正常了,然后再改回原来的情况调试观察,发现若B20_Num2的最高位不为0时,右移后移进来的位有时是1,有时是0。。。
之后在网上查了一下,说是根据机器或环境不同,右移进来的位的说法也不一样,这个之前还真没注意过啊,看来以后还是不能偷懒,要注意程序中的严谨性,要不然找问题,很麻烦。。。
|