久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10035|回復: 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, 下載次數: 63)

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲免费人成在线视频观看 | 国内精品视频在线观看 | 久久国产精品久久久久 | 亚洲一区二区三区桃乃木香奈 | 天天躁日日躁狠狠躁2018小说 | 免费在线视频精品 | 日韩福利在线 | 91精品国产91久久久久福利 | 操久久 | 欧美日韩三级在线观看 | 麻豆国产一区二区三区四区 | 久色网 | 福利视频一区二区 | 久久久久久国产精品免费 | 亚洲国产精品视频 | 国产成人在线一区二区 | 久久久久久亚洲精品 | 日韩视频区 | 亚洲a视频 | 日韩一级免费看 | 国产伊人精品 | 亚洲性在线 | 91国内精精品久久久久久婷婷 | 日韩一区av | 国内精品视频 | 欧美在线日韩 | 91视频进入| 亚州视频在线 | 蜜桃视频在线观看免费视频网站www | 成人精品视频99在线观看免费 | 伊人色综合久久天天五月婷 | 一区二区三区视频免费观看 | 夜夜夜操 | 99一区二区| 久久精品青青大伊人av | 国产成人精品免高潮在线观看 | 人人九九精 | 干干干日日日 | 色啪网| 国产精品精品视频一区二区三区 | 嫩草国产 |