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,最高位变次高位,数据错误,所以结果出错。
之所以会特意写出这个错误,是因为我已经在这个地方绊倒了两次了。所以不得不提醒自己。