18b20温度传感器读一个字节问题

来源:百度知道 编辑:UC知道 时间:2024/09/23 05:23:13
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
其中我不明白的是,dat>>=1;为什么要右移一位, if(DQ)
dat|=0x80;这个语句又是为什么?
请高手指点一下,谢谢

先解释dat|=0x80;这条语句
都知道18B20在串行传输数据时是先传低位的所以将读到的数据从左往右移直到最先读的那位移到最低位才结束,比如dat的值是01010000B 假设传输的下一位是1 那么就将01010000B与10000000(0x80)进行与 那么最高位就是变成1了 这样在dat>>=1;循环往右移 就会把本来在高位的数 移到低位了 也就是最先读到的数据最终会被移到低位的 不知这样说明不明白。
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
这是编程技巧的问题,其实应该这样的:
dat>>=1;
DQ = 0; // 给脉冲信号
_NOP();
DQ = 1; // 给脉冲信号
将移位语句夹在中间只是耗了1个时钟周期而已。