关于数据移位问题
时间:10-02
整理:3721RD
点击:
小弟51单片机初学者,最近写了个DS18B20的测温程序,结果在向感温管发送指令时发现了个奇怪的问题,请各位大神瞧瞧咋回事。代码如下:
void Ds18b20WriteByte(uchar dat) //向DS18B20写字节函数
{
uchar i; //无符号字符型
for(i=0;i<8;i++)
{
DS18B20_DQ=0; //感温管数据线拉低电平
_nop_(); _nop_();
// DS18B20_DQ=(dat>>i) & (0x01); //代码A:用这句来向感温器传递数据,程序下载到单片后无法正常工作
DS18B20_DQ=dat & 0x01; //代码B:把代码A替换为这一句,并加上下面的 “dat>>1”;就可以正常工作
delay9us(5); //此处再延时61us
DS18B20_DQ=1;
dat>>=1; //代码B:这一句加上上面的 “DS18B20_DQ=dat & 0x01”,可正常工作;
_nop_();_nop_();
}
}
在debug对代码A、B分别进行跟踪调试,发现两种代码发送给DS18B20_DQ的内容是一样的,但代码A下载后就只显示个-000.05,无法正常工作,代码B就正常显示实际温度。鼓捣了半天了也没搞明白。
void Ds18b20WriteByte(uchar dat) //向DS18B20写字节函数
{
uchar i; //无符号字符型
for(i=0;i<8;i++)
{
DS18B20_DQ=0; //感温管数据线拉低电平
_nop_(); _nop_();
// DS18B20_DQ=(dat>>i) & (0x01); //代码A:用这句来向感温器传递数据,程序下载到单片后无法正常工作
DS18B20_DQ=dat & 0x01; //代码B:把代码A替换为这一句,并加上下面的 “dat>>1”;就可以正常工作
delay9us(5); //此处再延时61us
DS18B20_DQ=1;
dat>>=1; //代码B:这一句加上上面的 “DS18B20_DQ=dat & 0x01”,可正常工作;
_nop_();_nop_();
}
}
在debug对代码A、B分别进行跟踪调试,发现两种代码发送给DS18B20_DQ的内容是一样的,但代码A下载后就只显示个-000.05,无法正常工作,代码B就正常显示实际温度。鼓捣了半天了也没搞明白。
记得以后问题贴要选“问答”类别哦
不知道,可以学习,学习
DS18B20读逻辑0/1的步骤如下:
1.在读取的时候单片机拉低电平大约1us
2.单片机释放总线,然后读取总线电平。
3.这时候DS18B20会拉低/高电平。
4.读取电平过后,延迟大约40~45微妙
其中第4步,讲到延时大约40~45微妙,小编延时了61us,可以试下是否有问题(网上搜的,没有用过);还有就是,小编要先确定后面的解码处理没问题哦,希望能帮到你
不知道,可以学习,学习