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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10167|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区免费电影 | 天天操夜夜爽 | 久久久青草婷婷精品综合日韩 | 欧美日韩综合视频 | 亚洲免费在线观看 | 亚洲一二三区在线观看 | 色婷婷综合成人av | 粉嫩粉嫩芽的虎白女18在线视频 | 中国美女一级黄色片 | 成人免费大片黄在线播放 | 毛片在线免费播放 | 久久成人免费 | 日本一区二区视频 | 国产精品入口麻豆www | 国产黄色大片在线观看 | 国产精品久久久久久久久久久久冷 | 视频一区二区中文字幕日韩 | 91资源在线 | 欧美一区二区三区在线播放 | 一级黄色日本片 | pacopacomama在线| 色综合久久天天综合网 | 久久精品中文字幕 | 成年无码av片在线 | 精品久久久久久亚洲综合网 | 国产一区二区精品 | 国产在线精品免费 | 九久久 | 日韩在线h | 黄色香蕉视频在线观看 | 亚洲午夜精品久久久久久app | 欧美三区视频 | 91免费版在线观看 | 国产视频在线一区二区 | 欧美男人天堂 | 国产日韩一区二区三区 | 国产成人精品在线播放 | 在线免费看91 | 成人综合视频在线观看 | 中文字幕在线视频观看 | 国产成人综合亚洲欧美94在线 |