标题: DS18B20如何正确显示负温度 [打印本页]

作者: step11119    时间: 2018-7-26 15:58
标题: DS18B20如何正确显示负温度
从论坛找到了一个LCD1602万年历制作的资料,有温度显示功能。源程序里,负温度原来是显示乱码,而且小数显示并不正确,于是自己动手修改了一下程序。PS:C语言渣渣,刚刚自学。
修改了之后出现了以下些许问题:1、负号显示不出来,总是显示为0。
                                                2、温度值总是要比实际值小1摄氏度。
                                                3、C语言子函数返回值调用问题,f值的调用。
现将温度计算与温度显示函数附上,希望各位论坛的朋友能帮着出出主意。

温度读取与计算:
unsigned int ReadTemperature(void)//读取温度
{
        unsigned char a=0;
        unsigned char b=0;
        unsigned int t=0;
        int f;  //正负标志位
        float tt=0;
        Init_DS18B20();
        WriteOneChar(0xCC); // 跳过读序号列号的操作
        WriteOneChar(0x44); // 启动温度转换
        Init_DS18B20();
        WriteOneChar(0xCC); //跳过读序号列号的操作
        WriteOneChar(0xBE); //读取温度寄存器
        a=ReadOneChar();  //读低8位
        b=ReadOneChar(); //读高8位
        
        t=b;
        t<<=8;
        t=t|a;
        if((b&0x80)!=0)    // 高八位的第一位为1,表示为负
         {
        tt=(~t+1)*0.0625 ;
           f=1;                //温度为负,f=1;
          }
        else  
         {
        tt=t*0.0625;
        f=0           ;           //温度为正,f=0;
                   }
        t=tt*10+0.5;
return(t);
return(f);

        
}


温度显示函数
void write_temp(uchar add,uint dat)//向LCD写温度数据,并指定显示位置
{
        uint gw,sw,bw;
        int f;                     //这个f值需要特殊的调用语句么?
          switch(f)
          {
          case 1:
        bw="-";// 温度为负时,百位显示负号,这里有问题
        sw=(dat%1000)/100;//取得十位数字
        gw=(dat%1000)%100/10;//取得个位数字
        write_1602com(er+add);//er是头文件规定的值0x80+0x40
        write_1602dat(bw+0x30);
        write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码          shi=((const) temp%1000)/100
        write_1602dat(0x30+gw);
        break;
        case 0:
        bw=dat/1000;//取得百位
        sw=(dat%1000)/100;//取得十位数字
        gw=(dat%1000)%100/10;//取得个位数字
        write_1602com(er+add);//er是头文件规定的值0x80+0x40
        write_1602dat(0x30+bw);
        write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码          shi=((const) temp%1000)/100
        write_1602dat(0x30+gw);
        break;
        }

QQ图片20180726155202.png (83.06 KB, 下载次数: 63)

QQ图片20180726155202.png

作者: zl2168    时间: 2018-7-26 17:23
实例97  一线式DS18B20测温
作者: yousunny    时间: 2018-7-26 17:39

  bw="-";// 温度为负时,百位显示负号,这里有问题

      write_1602dat(bw+0x30);

应该是你码表转换问题了。要你1602上显示“-”,你看下ASCII码对照表要多少才是,我估计你的一出来


作者: 3073084142    时间: 2018-7-26 18:12
实例97  一线式DS18B20测温

作者: zl2168    时间: 2018-7-27 10:10
3073084142 发表于 2018-7-26 18:12
实例97  一线式DS18B20测温

实例97  一线式DS18B20测温

Proteus仿真一下,确认有效。 实例97 DS18B20测温.rar (51.78 KB, 下载次数: 152)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。


作者: ZHAIyl    时间: 2021-1-30 23:57
显示正温度值会错误正常吗
作者: ayld    时间: 2023-8-31 19:42
我也出现了这样的问题,正温度正常显示,负温度不能正常显示。不知道问题出现在哪里?
作者: Hephaestus    时间: 2023-8-31 20:15
1、负号显示不出来,总是显示为0。
你自己看看bw这个变量,赋值“-”之后又被你下面的语句改了。

2、温度值总是要比实际值小1摄氏度。
这是个向哪个方向取整的问题,你可以不管,简单+1就可以了。

3、C语言子函数返回值调用问题,f值的调用。
这里f就是个局部变量,使用就可以了,不需要调用。
作者: 快乐眼泪    时间: 2023-8-31 20:30
楼主的问题解决了吗?如果解决了能不能分享一下?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1