找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1152|回复: 5
收起左侧

51单片机数据类型问题

[复制链接]
ID:148119 发表于 2019-9-6 11:49 | 显示全部楼层 |阅读模式
我用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++;
                }
        }
}



回复

使用道具 举报

ID:235200 发表于 2019-9-6 19:14 | 显示全部楼层
程序中的i仅是作为延时的计数,确定DQ数据线高低电平的时长,至于i定义为8位和16位的不同,光从本子程序中看没有什么问题,需考虑整体程序中是否有中断影响i寄存器中的数据,造成延时不一致,是否符合一线制数据读写的时序
回复

使用道具 举报

ID:155507 发表于 2019-9-6 21:08 | 显示全部楼层

DS18B20的初始化时序
20160226001003200.jpg


DS18B20的读时序
20160226000929698.jpg

DS18B20的写时序
20160226003409974.jpg



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


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

回复

使用道具 举报

ID:67199 发表于 2019-9-6 21:47 | 显示全部楼层
同意楼上,i作为延时使用,编译器编译时int char的处理方式不同,编译出的代码长度也不同,运行时所用时间也就不同了,而一线制对时序要求有点严,造成不能正确读写DS18B20.
回复

使用道具 举报

ID:608774 发表于 2019-9-7 15:41 | 显示全部楼层

比较同意楼上的看法,应该将i重新定义一下或者多定义几个其他变量,这样编译器能够运行起来更快更方便,也不容易出错,子程序本身没有太大问题
回复

使用道具 举报

ID:213173 发表于 2019-9-8 06:07 | 显示全部楼层
在12M时钟条件下,CPU处理uint i; i++;需要3us,处理uchar i; i++;只需要1us。楼主改变i的数据类型也就改变了i++;作为小延时的时间。ds18b20对时序要求非常高,所以会出问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表