
关于DS18B20读一个字节的问题。
Read_one_byte(void){uchari=0;uchardat=0;for(i=8;i>0;i++){DQ=0;dat>>=1;DQ=1;if(DQ)dat|...
Read_one_byte(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay(4);
}
return (dat);
}
在这个读一个字节的程序中,好像只有当DQ为高电平的时候才进行处理,那么我想知道这个程序是如何读低电平的?因为我现在通过硬件仿真发现8次循环之中都进了if函数,也就是读出来的数始终是0xff,这是为什么呢?还有就是为什么DQ拉低之后,dat要右移一位? 展开
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay(4);
}
return (dat);
}
在这个读一个字节的程序中,好像只有当DQ为高电平的时候才进行处理,那么我想知道这个程序是如何读低电平的?因为我现在通过硬件仿真发现8次循环之中都进了if函数,也就是读出来的数始终是0xff,这是为什么呢?还有就是为什么DQ拉低之后,dat要右移一位? 展开
展开全部
我想你是没注意到一个地方:dat>>1;这句在循环的一开始,也就是说,每一次读一位数据开始时,dat就右移一位,高位自动补0,所以只有当读到1时才为dat高位赋值为1,否则继续保持之前补上的数据0;其次,DQ=1,这是做输入用的,而硬件仿真时没有考虑进硬件,所以仿真结果只会是全1,而真正运行结果肯定是从硬件上读出数据来;右移的目的是让数据能正确拼装,因为读是先读最低位,最后读最高位,所以要右移以便在下一次能装入高一位的数据。
希望我的回答能帮助到你。
希望我的回答能帮助到你。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询