关于数据移位问题

2019-07-15 10:34发布

小弟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就正常显示实际温度。鼓捣了半天了也没搞明白。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
狼烟客
2019-07-15 17:40
DS18B20读逻辑0/1的步骤如下:
1.在读取的时候单片机拉低电平大约1us
2.单片机释放总线,然后读取总线电平。
3.这时候DS18B20会拉低/高电平。
4.读取电平过后,延迟大约40~45微妙

其中第4步,讲到延时大约40~45微妙,楼主延时了61us,可以试下是否有问题(网上搜的,没有用过);还有就是,楼主要先确定后面的解码处理没问题哦,希望能帮到你

一周热门 更多>