向DS18B20读一字节数据, dat>>=1; if(DQ) dat|=0x80; 怎么理解

/****************************向DS18B20读一字节数据**********************
入口参数:
出口参数:dat
***********************************************************************/
ReadOneChar(void) //向DS18B20读一字节数据
{
unsigned char i=0; //定义符号变量i
unsigned char dat=0; //定义符号变量dat
for(i=8;i>0;i--) //8位计数器
{
DQ=1; //DQ先置高
delay(1); // 延时
DQ=0; //发送复位脉冲,主机开始读0时间片
dat>>=1; //复合赋值运算,等效dat=dat>>1(dat=dat右移一位后的值)
DQ=1;
if(DQ)
dat|=0x80; //按位或然后赋值给dat,读取数据最高位为1
delay(4);
}
return(dat);
}
另外dat的数据不是0吗,右移不还是0吗,也就是data不变啊?data的数据和什么寄存器有关吗,是8位还是几位,与DQ有什么关系,如何读取数据,并赋值。还有dat|=0x80; 也只是读高位啊,那其它位呢???

DS18B20的读操作
  (1)将数据线拉高“1”。=> DQ =1
  (2)延时2微秒。
  (3)将数据线拉低“0”。=>DQ = 0
  (4)延时15微秒。
  (5)将数据线拉高“1”。
  (6)延时15微秒。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-01
DAT向右移一位dat>>=1;
如果DQ=0则高位补0 if(DQ)
否则补一
dat|=0x80本回答被提问者采纳
相似回答