标题: 51单片机数据类型问题 [打印本页]

作者: Magic_D    时间: 2019-9-6 11:49
标题: 51单片机数据类型问题
我用51单片机驱动ds18b20读取温度,写传感器驱动程序使如果把i定义为unsigned int程序可以正确读出温度数据,但是如果把i定义为unsigned char程序高八位低八位全部只能读出255,并没有发现什么原因,个人认为问题出现在溢出上,但是不知道哪里出现了溢出,希望各位可以指导学习一下。
void Write_One_Byte(uchar dat)
{
        uint i;
        uchar j;
        bit testb;
        for(j=1;j<=8;j++)
        {
                testb=dat&0x01;
                dat=dat>>1;
                if(testb)
                {
                        DQ=0;
                        i++;
                        i++;
                         DQ=1;
                        i=8;
                        while(i>0)
                                i--;
                }
                else
                {
                        DQ=0;
                        i=8;
                        while(i>0)
                                i--;
                        DQ=1;
                        i++;
                        i++;
                }
        }
}




作者: csmyldl    时间: 2019-9-6 19:14
程序中的i仅是作为延时的计数,确定DQ数据线高低电平的时长,至于i定义为8位和16位的不同,光从本子程序中看没有什么问题,需考虑整体程序中是否有中断影响i寄存器中的数据,造成延时不一致,是否符合一线制数据读写的时序
作者: angmall    时间: 2019-9-6 21:08

DS18B20的初始化时序



DS18B20的读时序


DS18B20的写时序




变量改了 延时改了  缩短了
unsigned int  2字节unsigned char 一个字节   处理的时间基本上是缩短了,肯定出问题的


最重要的就是学会看数据手册


作者: lyxing    时间: 2019-9-6 21:47
同意楼上,i作为延时使用,编译器编译时int char的处理方式不同,编译出的代码长度也不同,运行时所用时间也就不同了,而一线制对时序要求有点严,造成不能正确读写DS18B20.
作者: 63536439    时间: 2019-9-7 15:41

比较同意楼上的看法,应该将i重新定义一下或者多定义几个其他变量,这样编译器能够运行起来更快更方便,也不容易出错,子程序本身没有太大问题
作者: wulin    时间: 2019-9-8 06:07
在12M时钟条件下,CPU处理uint i; i++;需要3us,处理uchar i; i++;只需要1us。楼主改变i的数据类型也就改变了i++;作为小延时的时间。ds18b20对时序要求非常高,所以会出问题。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1