DS18B20 51单片机仿真温度显示每隔8位整数 显示错误

2019-07-15 08:21发布

int tmpget()//获取DS18B20温度{
        int temp;        float tt;
        dsreset();//复位与应答        tmpwritebyte(0xcc);//允许不通过匹配温度计编码直接操作(总线上只有一个DS18B20)        tmpwritebyte(0xbe);//从暂存器中读取数据,第一字节为温度低8位,第二字节为温度高8位        tmp_L8=tmpreadbyte();//读取温度低8位        tmp_H8=tmpreadbyte();//读取温度高8位                temp=tmp_H8;        temp=temp<<8;        temp=temp | tmp_L8;//将高低8位都放入temp中                tt=temp*0.0625;//根据分辨率算出温度        temp=tt*100;        return temp;//将高低8位温度处理后 返回从左往右第三位位为个位        }
void display(int temperature)//LCD温度显示函数{        uchar table_temp[4];        LCD_WRITE_COM(0x80);//从初始位开始显示        if(temperature<0)        {                LCD_WRITE_DATA('-');//负温度显示负                temperature*=-1;//将负温度转为正温度便于显示        }        else                LCD_WRITE_DATA('+');//负温度显示正                table_temp[0]=temperature/10000%10;//温度百位        table_temp[1]=temperature/1000%10;//温度十位        table_temp[2]=temperature/100%10;//温度个位        table_temp[3]=temperature/10%10;//温度小数点后第一位                if(table_temp[0]==0)        {                LCD_WRITE_DATA(' ');                if(table_temp[1]==0)                        LCD_WRITE_DATA(' ');                else                        LCD_WRITE_DATA(table_temp[1]+'0');        }        else        {                LCD_WRITE_DATA(table_temp[0]+'0');                LCD_WRITE_DATA(table_temp[1]+'0');        }
        LCD_WRITE_DATA(table_temp[2]+'0');        LCD_WRITE_DATA('.');        LCD_WRITE_DATA(table_temp[3]+'0');        LCD_WRITE_DATA(0xdf);        LCD_WRITE_DATA('C');}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
awellpoint
1楼-- · 2019-07-15 15:22
人中狼 发表于 2018-5-26 08:41
应该是数据计算时出错了,DS18B20的数据应该先区分正负,对于负数要先进行处理,就是取反再加一,然后才能计算温度值,另外可以显示DS18B20读出的原始数据,看看是不是读出来的数据就有变化

读出来的原始数据应该是对的,毕竟有一半显示是对的

按你说的将负数取反加一,结果之前异常的地方 编程)*+,-./0       8位变动了
        if(tmp_H8==0xff)
        {
                temp=~temp+1;
                flag=0;
        }
        else
                flag=1;
       
        tt=temp*0.0625;
        temp=tt*10+0.5;
        return temp;//将高低8位温度处理后 返回从左往右第二位为个位
人中狼
2楼-- · 2019-07-15 20:45
应该是
temp=tmp_H8;
        temp=temp<<8;
        temp=temp | tmp_L8;//将高低8位都放入temp中
if(temp < 0)
        {
                temp=~temp+1;
                flag=0;
        }
        else
                flag=1;

tt=temp*0.0625;
是合并后的数值来判断正负
人中狼
3楼-- · 2019-07-15 22:14
最好还是对比一下读出来的原始数据,再看看有没有例如中断程序等干扰了DS8B20的操作时序
yulanhao
4楼-- · 2019-07-16 00:17
 精彩回答 2  元偷偷看……
yulanhao
5楼-- · 2019-07-16 02:56
去我的空间里,下载压缩吧,源代码+proteus。刚整出来,废了好几天功夫
yulanhao
6楼-- · 2019-07-16 03:26
去我的空间里,下载压缩吧,源代码+proteus。刚整出来,废了好几天功夫

一周热门 更多>