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');}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
读出来的原始数据应该是对的,毕竟有一半显示是对的
按你说的将负数取反加一,结果之前异常的地方 编程)*+,-./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位温度处理后 返回从左往右第二位为个位
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;
是合并后的数值来判断正负
一周热门 更多>