找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9043|回复: 8
打印 上一主题 下一主题
收起左侧

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, 下载次数: 49)

QQ图片20180726155202.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2018-7-26 17:23 | 只看该作者
实例97  一线式DS18B20测温
回复

使用道具 举报

板凳
ID:308437 发表于 2018-7-26 17:39 | 只看该作者

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

      write_1602dat(bw+0x30);

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

回复

使用道具 举报

地板
ID:379569 发表于 2018-7-26 18:12 | 只看该作者
实例97  一线式DS18B20测温
回复

使用道具 举报

5#
ID:111634 发表于 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案例,用于仿真实验操作,电路与程序真实可靠可信可行。

回复

使用道具 举报

6#
ID:688993 发表于 2021-1-30 23:57 | 只看该作者
显示正温度值会错误正常吗
回复

使用道具 举报

7#
ID:40039 发表于 2023-8-31 19:42 | 只看该作者
我也出现了这样的问题,正温度正常显示,负温度不能正常显示。不知道问题出现在哪里?
回复

使用道具 举报

8#
ID:883242 发表于 2023-8-31 20:15 | 只看该作者
1、负号显示不出来,总是显示为0。
你自己看看bw这个变量,赋值“-”之后又被你下面的语句改了。

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

3、C语言子函数返回值调用问题,f值的调用。
这里f就是个局部变量,使用就可以了,不需要调用。
回复

使用道具 举报

9#
ID:399179 发表于 2023-8-31 20:30 来自手机 | 只看该作者
楼主的问题解决了吗?如果解决了能不能分享一下?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表