找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1501|回复: 5
打印 上一主题 下一主题
收起左侧

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++;
                }
        }
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

使用道具 举报

板凳
ID:155507 发表于 2019-9-6 21:08 | 只看该作者

DS18B20的初始化时序



DS18B20的读时序


DS18B20的写时序




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


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

回复

使用道具 举报

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

使用道具 举报

5#
ID:608774 发表于 2019-9-7 15:41 | 只看该作者

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

使用道具 举报

6#
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 单片机教程网

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