微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ds18b20温度为 -16度 时 显示为零 求解

ds18b20温度为 -16度 时 显示为零 求解

时间:10-02 整理:3721RD 点击:

当温度为零下16度的时候,显示为零,检查了半天,不知道什么情况,求大神解惑啊!
//获取温度数据,并处理
        Init_DS18B20();
        WriteOneChar(0xCC); // 跳过读序号列号的操作
        WriteOneChar(0x44); // 启动温度转换
        Init_DS18B20();
        WriteOneChar(0xCC); //跳过读序号列号的操作
        WriteOneChar(0xBE); //读取温度寄存器
        a=ReadOneChar();   //连续读两个字节数据   //读低8位
        b=ReadOneChar();                          //读高8位
        
        if((b&0xf8)!=0x00)  //负温度处理
        {
                b=~b;
                a=~a+1;
                flag=1;
        }
        else flag=0;
        t=b;
        t<<=8;
        t=t|a;                         //两字节合成一个整型变量。
        tt=t*0.0625;          //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
        t= tt*10+0.5;         //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
        
下面是显示
void DSY_DISPLAY(uint x)
{
        uint Hundred,Ten,One,Dot1;
        P0=0xff;
        P2=0x00;
        
        Hundred=x/1000;
        Ten=x%1000/100;
        One=x%100/10;
        Dot1=x%10;
        P2=0x08;
        if(flag) P0=0xbf;
        else if(Hundred) P0=DSY_CODE[Hundred];
        else P0=0xff;
        
        delay1ms(10);
        
        P2=0x04;
        if (Ten==0 && Hundred==0) P0=0xff;
        P0=DSY_CODE[Ten];
        delay1ms(10);
        P2=0x02;
        P0=DSY_CODE[One];        
        delay1ms(10);
        P2=0x02;
        P0=0x7f;
        delay1ms(10);
        P2=0x01;
        P0=DSY_CODE[Dot1];
        delay1ms(10);        
               
}
        

自己顶啊
*****************…………………………………………………………

再顶啊…………………………不要沉啊

是不是数据类型的问题啊…………没有人遇到这个问题吗,大神们帮帮忙啊

你的读写程序呢

18b20的重点在于它的读写程序,如果读写出错,其他的都没用

找到问题了,是我的负数标记那里出了问题,
现在改成这样了
                if(t&(1<<15))        //如果温度为负数,则取原码
                {
                        t=~t;
                        t+=1;
                        flag=1;           //标志为负数
                }


下面是我的读写程序,是在网上找的
unsigned char ReadOneChar()//读一个字节
{
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {
                DS = 0; // 给脉冲信号
                dat>>=1;
                DS = 1; // 给脉冲信号
                if(DS) dat|=0x80;
                tmpDelay(4);
        }
        return(dat);
}
void WriteOneChar(unsigned char dat)//写一个字节
{
        unsigned char i=0;
        for (i=8; i>0; i--)
        {
                DS = 0;
                DS = dat&0x01;
                tmpDelay(5);
                DS = 1;
                dat>>=1;
        }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top