DS18B20温度负数显示问题

尼娅和大家 2020-05-22 03:35:49

int Read_tem()
{
uint t;
uchar a,b;
DS18B20();
delay(1);
Write(0xcc); //跳过
Write(0x44); //温度转换
DS18B20();
delay(1);
Write(0xcc); //跳过
Write(0xbe); //读温度寄存器
a=Read(); //低八位
b=Read(); //高八位
t=b;
t<<=8; //左移
t=t|a;
return t;
}



uint tem_change()
{

float tp;
tem=Read_tem();
if(tem<0)
{
tem=tem-1;
tem=~tem;
tp=tem*0.0625;
tem=tp*10+0.5;
return 1;
}
else
{
tp=tem*0.0625;
tem=tp*10+0.5;
return 0;
}
}

void display_tempt(uint x)
{
uchar i,j,k;
i=tem/100;
j=tem%100/10;
k=tem%100%10;

if(x) //x=1温度为负
{
write_com(0xc0+5);
write_data('-');
}
else
{
write_com(0xc0+6);
}
write_data(disp[i]);
write_data(disp[j]);
write_data('.');
write_data(disp[k]);
if(tem<100)
{
BUZ=1;
}
if(tem>=100)
{
BUZ=0;
}
}
...全文
2346 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2020-07-01
  • 打赏
  • 举报
回复
直接 tp=tem*0.0625; 即可,无需判断正负
  • 打赏
  • 举报
回复
在Read_tem()函数中,第15行对温度是否正负没有进行判断处理,你获取不到正确的负温度值。
  • 打赏
  • 举报
回复
u8 TL,TH,temp; uint tem; float tValue; TL = NS18B20_Read_Byte(); // LSB TH = NS18B20_Read_Byte(); // MSB if(TH > 7) { //温度为负值 TH = ~TH; TL = ~TL; tem = (TH<<8 ) + TL + 1; temp = 0; //温度为负 } else { tem = (TH<<8 ) + TL; temp = 1; //温度为正 } if(temp) tValue =(float)tem * 0.0625; else tValue = (-1) * (float)tem * 0.0625; return tValue; 试试看看。

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧