uchar ReadByte_DS18B20(void)
{
uchar i = 0, byte = 0;
for (i = 0; i < 8; i++)
{
DS18B20 = 0; //拉低总线,通知DS18B20
byte >>= 1; //将得到的数据移入次高位————————————(1)
DS18B20 = 1; //释放总线,等待DS18B20发送数据
_nop_();
if (DS18B20 == 1) //如果数据为1,将byte最高位置1,否则为0
byte |= 0x80;
DelayUs(2); //此处可以不必拉高总线,DS18B20传送完后会自动释放总线
}
return byte;
}
这是发现错误后改正的
uchar ReadByte_DS18B20(void)
{
uchar i = 0, byte = 0;
for (i = 0; i < 8; i++)
{
DS18B20 = 0; //拉低总线,通知DS18B20
_nop_();
_nop_();
DS18B20 = 1; //释放总线,等待DS18B20发送数据
_nop_();
if (DS18B20 == 1) //如果数据为1,将byte最高位置1,否则为0
byte |= 0x80;
byte >>= 1; //将得到的数据移入次高位————————(2)
DelayUs(2); //此处可以不必拉高总线,DS18B20传送完后会自动释放总线
}
return byte;
}
这个是错误的写法
如上面两个标注点可以看到,两者的不同仅在于byte>>=1这条语句的位置。
如果是按照第二种写法,当i=7时,如果最高位置1,此时得到的字节应该是完整、正确的,但是由于byte>>=1,最高位变次高位,数据错误,所以结果出错。
之所以会特意写出这个错误,是因为我已经在这个地方绊倒了两次了。所以不得不提醒自己。