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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6944|回復: 15
打印 上一主題 下一主題
收起左側

如何使液晶屏顯示小數點后兩位?附單片機代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:819671 發表于 2021-4-22 16:40 來自手機 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
100黑幣
這是溫度檢測上下限可調keil的程序,現在是液晶屏顯示后三位,怎么只讓液晶屏顯示小數點后兩位,求大神解答

IMG_20210422_153632.jpg (829.77 KB, 下載次數: 111)

IMG_20210422_153632.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:819671 發表于 2021-4-22 18:50 | 只看該作者
  1. #include<reg52.h>
  2. #include"stdio.h"

  3. typedef unsigned char uint8;
  4. typedef unsigned int uint16;

  5. /***************************************************/

  6. sbit RS =P2^6;       //LCD1602的數據命令選擇
  7. sbit RW = P2^5;
  8. sbit EN_LCD =P2^7;   //LCD1602的使能信號

  9. sbit BUZZER = P1^5;

  10. sbit K1          = P3^0;        //右
  11. sbit K2   =        P3^1;        //加
  12. sbit K3   = P3^2;        //減


  13. /****************DS18B20引腳**********************/
  14. sbit DS18B20 = P3^7;  //DS18B20數據端
  15. /***********************************************************/
  16. /******************************************************/

  17. void delay(uint16 time);        // 延時函數(6us單位)               
  18. void lcd_ini();                         // LCD1602的初始化
  19. void lcd_order(uint8 date);                // 向LCD1602的寫1個指令
  20. void lcd_data(uint8 date);                // 向LCD1602的寫1個指令

  21. void xie1602(uint8 add,uint8 daa); //寫數據

  22. void xianshi1();//顯示溫度

  23. uint8 ds18_ini();        //ds18B20初使化函數
  24. void ds18_write(uint8 date);   //功能向DS18B20中寫入一個數據
  25. uint8 ds18_read();                           //功能從DS18B20中讀出一個數據并返回。
  26. void ds18_check();                           //起動DS18B20行進溫度采集,并返回當前溫度(tmp)
  27. void xiugai();                 //修改報警范圍

  28. long  tmp=0;      //儲存溫度值
  29. long  t_h=37, t_l=10;          // 溫度的上限和下限


  30. bit tmp_hb = 0;  tmp_lb = 0;     //溫度上下限調節指示變量

  31. void panduan();                   //判斷報警
  32. uint8 hodometer[]= "  H:00   L: 00  ";
  33. uint8 temp[]=           "  wendu:00.00   ";
  34. uint16 ji = 0;
  35. uint8 ku=0;         //biaozhiwei

  36. void main()
  37. {
  38.         lcd_ini();
  39.         ds18_ini();        //ds18B20初使化
  40.            ds18_write(0xcc);  //跳過序列號
  41.            ds18_write(0x44);  //啟動溫度轉換
  42.          xie1602(4,t_h);
  43.          xie1602(12,t_l);
  44.         while(1)
  45.         {
  46.                 ds18_check();  //從DS18B20中讀出溫度
  47.                 xianshi1();
  48.                 xiugai();
  49.                 panduan();               
  50.         }
  51. }

  52. void xie1602(uint8 add,uint8 daa)
  53. {
  54.         lcd_order(0x80+add);
  55.         lcd_data(0x30+daa/10);
  56.         lcd_data(0x30+daa%10);
  57. }

  58. //判斷是否在報警范圍內
  59. void panduan()
  60. {
  61.         if(tmp<(t_l*1000)||tmp>(t_h*1000)&&t_l>=0)
  62.         {
  63.                 BUZZER = 0;
  64.                 delay(10);
  65.         }
  66.         else if(t_l<0&&tmp>(t_h*1000))
  67.         {
  68.                 BUZZER = 1;       
  69.         }
  70.         else
  71.                 BUZZER = 1;
  72. }


  73. //選擇修改的內容
  74. void xiugai()
  75. {        uint8 jj;
  76.         uint8 i = 0;
  77.         BUZZER = 1;
  78.        
  79.         if(K1==0)
  80.         {
  81.                 while(!K1);
  82.                 while(1)
  83.                 {
  84.                         lcd_order(0x0f);  //開啟光標顯示
  85.                         lcd_order(0x80+5);//光標顯示位置
  86.                         if(K2 == 0)                        //判斷加按鍵按下
  87.                         {
  88.                                 while(K2 == 0);                  //等待按鍵釋放
  89.                                         t_h++;                         //溫度上限加1
  90.                                         xie1602(4,t_h);          //將溫度上限顯示出來
  91.                         }
  92.                         if(K3 == 0)                                   //判斷減按鍵按下
  93.                         {
  94.                                 while(K3 == 0);                        //等待按鍵釋放
  95.                                 if(t_h>t_l)                                //判斷 溫度上限大于溫度下限
  96.                                         t_h--;
  97.                                 xie1602(4,t_h);                         //將溫度上限顯示出來
  98.                         }
  99.                         if(K1 == 0)                           //后面的注釋類似
  100.                         {
  101.                                 while(K1 == 0);
  102.                                 while(1)
  103.                                 {
  104.                                         lcd_order(0x0f);
  105.                                         lcd_order(0x80+13);       
  106.                                         if(K2 == 0)
  107.                                         {
  108.                                                 while(K2 == 0);
  109.                                                 if(t_l<t_h&&t_l>=0)
  110.                                                 {
  111.                                                         lcd_order(0x80+11);
  112.                                                         lcd_data(' ');
  113.                                                         t_l++;
  114.                                                         xie1602(12,t_l);
  115.                                                 }
  116.                                                 else {
  117.                                                         t_l++;
  118.                                                         jj = ~t_l;
  119.                                                         xie1602(12,jj);
  120.                                                 }
  121.                                         }
  122.                                         if(K3 == 0)
  123.                                         {
  124.                                                 while(K3 == 0);
  125.                                                 if(t_l>(-50))
  126.                                                 {
  127.                                                         t_l--;
  128.                                                         if(t_l<0)
  129.                                                                 jj = ~t_l;
  130.                                                 }
  131.                                                 if(t_l>=0)
  132.                                                 {
  133.                                                         lcd_order(0x80+11);
  134.                                                         lcd_data(' ');
  135.                                                         xie1602(12,t_l);
  136.                                                 }
  137.                                                 if(t_l<0)
  138.                                                 {       
  139.                                                         xie1602(12,jj);
  140.                                                         lcd_order(0x80+11);
  141.                                                         lcd_data('-');
  142.                                                 }
  143.                                         }
  144.                                         if(K1 == 0)
  145.                                         {
  146.                                                 while(K1 == 0);
  147.                                                 goto loop;
  148.                                         }               
  149.                                 }
  150.                         }
  151.                 }                               
  152.         }
  153.         loop:BUZZER = 1;       
  154. }

  155. /**********************************************
  156. 函數名:delay
  157. 行參  :time 延時基數
  158. 功能  :用while延時
  159. ************************************************/
  160. // 延時函數(1ms單位)
  161. void delay(uint16 time)
  162. {
  163.         while(time--);
  164. }
  165. /**********************************************
  166. 函數名:lcd_ini
  167. 功能  :LCD1602的初始化
  168. ************************************************/
  169. void lcd_ini()
  170. {
  171.         uint8 i;
  172.                 RW = 0;
  173.           lcd_order(0x38);          //設置1602的顯示光標功能
  174.           delay(100);                  
  175.           lcd_order(0x0e);          //顯示開及光標設置
  176.           delay(100);
  177.           lcd_order(0x06);          //顯示光標移動設置
  178.           delay(100);
  179.           lcd_order(0x01);          //顯示清屏
  180.           delay(100);
  181.           lcd_order(0x80);
  182.                   for(i = 0;i<16;i++)
  183.                         lcd_data(hodometer[i]);
  184.   }


  185. /**********************************************
  186. 函數名:lcd_order
  187. 行參  :date 要定入的指令
  188. 功能  :向LCD1602的寫1個指令
  189. ************************************************/
  190. void lcd_order(uint8 date)
  191. {
  192.   RS=0;                  //選擇寫指令  
  193.   EN_LCD=0;          //使能初使化
  194.   P0=date;          //發送指令
  195.   EN_LCD=1;          //開使能
  196.   delay(100);          //延時
  197.   EN_LCD=0;          //關使能
  198. }
  199. /**********************************************
  200. 函數名:lcd_order
  201. 行參  :date 要定入的指令
  202. 功能  :向LCD1602的寫1個指令
  203. ************************************************/
  204. void lcd_data(uint8 date)
  205. {
  206.   RS=1;                  //選擇寫數據  
  207.   EN_LCD=0;          //使能初使化
  208.   P0=date;          //發送指令
  209.   EN_LCD=1;          //開使能
  210.   delay(100);          //延時
  211.   EN_LCD=0;          //關使能
  212. }

  213. /*************************************************************
  214.                                               DS18B20
  215. **************************************************************/
  216. /****************************************
  217. 函數名:    ds18_ini
  218. 功能:      對DS18B20進行初使化,
  219.             若DS18B20是好的則返回1
  220.                         若DS18B20是環的則返回0
  221. ****************************************/
  222. //ds18B20初使化函數,可根據資料上的時序來寫
  223. uint8 ds18_ini()
  224. {
  225.   uint8 ans;
  226.   DS18B20 = 1;
  227.   delay(1);
  228.   DS18B20 = 0;
  229.   delay(100);
  230.   DS18B20 = 1;
  231.   delay(6);
  232.   ans = DS18B20;
  233.   delay(100);
  234.    if(!ans)
  235.      return 1;
  236.   else
  237.      return 0;
  238. }

  239. /**********************************
  240. 函數名:    ds18_write
  241. 函數行參:  date(向ds18b20寫入的數據)
  242. 功能:      功能向DS18B20中寫入一個數據
  243. ***********************************/
  244. void ds18_write(uint8 date)
  245. {
  246.   uint8 i;
  247.   DS18B20=1;
  248.   delay(1);
  249.   for(i=0;i<8;i++)        //根據時序將數據從低到高一位一位發送出來
  250.        {
  251.                     DS18B20 = 0;
  252.                  if(date&0x01) //從低到高取出數據的每位
  253.                  DS18B20 = 1;
  254.                  else
  255.                  DS18B20 = 0;
  256.                  delay(10);
  257.                  DS18B20 = 1;
  258.                  date>>=1;
  259.                  delay(1);
  260.                  
  261.            }


  262. }

  263. /*************************************************
  264. 函數名:    ds18_read
  265. 函數返回值:rate(從ds18b20中讀出的數據)
  266. 功能:      功能從DS18B20中讀出一個數據并返回。
  267. *************************************************/
  268. uint8 ds18_read()
  269. {
  270.   uint8 i,date = 0;
  271.   DS18B20 = 1;                  //釋放總線
  272.   delay(1);
  273.   for(i = 0;i < 8;i ++)          //根據時序將數據從低到高一位一位接收
  274.        {  
  275.              
  276.               DS18B20 = 0;
  277.                   date >>= 1;
  278.                   DS18B20 = 1;
  279.                   if(DS18B20)
  280.                      date |= 0x80;         //將date的一位置1
  281.                   delay(8);
  282.                   DS18B20 = 1;
  283.                   delay(1);
  284.           
  285.            }
  286.    return date;                          //返回讀出的數
  287. }
  288. /************************************************************
  289. 函數名:     ds18_check
  290. 函數返回值: tmp(當前溫度)
  291. 功能:       起動DS18B20行進溫度采集,并返回當前溫度(tmp)
  292. *************************************************************/
  293. void ds18_check()
  294. {
  295.   uint8 date1,date2;
  296.   float ta;
  297.   if(ds18_ini())
  298.     {
  299.           
  300.           ds18_write(0xcc);          //跳過序列號
  301.           ds18_write(0x44);          // 啟動溫度轉換
  302.           ds18_ini();                  // 復位
  303.           ds18_write(0xcc);          //跳過序列號
  304.           ds18_write(0xbe);          // 啟動讀取溫度
  305.           date1 = ds18_read();   //讀取兩個溫度字節
  306.           date2 = ds18_read();
  307.           tmp=date2;
  308.           tmp<<=8;
  309.           tmp=tmp|date1;
  310.           ta=tmp*0.0625;
  311.           tmp=ta*1000;
  312.         }


  313. }

  314. void xianshi1()
  315. {
  316.         uint8 i;
  317.         temp[8]=0x30+tmp/10000;
  318.         temp[9]=0x30+tmp/1000%100;
  319.         temp[11]=0x30+tmp/100%100;
  320.         temp[12]=0x30+tmp/10%100;
  321.         temp[13]=0x30+tmp%10;
  322.         lcd_order(0x80+0x40);
  323.         for(i = 0;i<16;i++)
  324.                 lcd_data(temp[i]);       
  325. }
復制代碼

這是網友的程序 求解
回復

使用道具 舉報

板凳
ID:819671 發表于 2021-4-22 18:55 | 只看該作者
我自己改成這樣好像也不對是亂碼請大神幫忙解決

B%MNN2R[4YWJZIXAAR85)M7.png (39.09 KB, 下載次數: 117)

B%MNN2R[4YWJZIXAAR85)M7.png
回復

使用道具 舉報

地板
ID:819671 發表于 2021-4-22 21:40 | 只看該作者
沒人嗎
回復

使用道具 舉報

5#
ID:213173 發表于 2021-4-22 22:17 | 只看該作者
鶴見川 發表于 2021-4-22 18:55
我自己改成這樣好像也不對是亂碼請大神幫忙解決

給你一個ds18b20+LCD1602顯示2位小數的示例參考,但在實踐中顯示1位小數足以,末位小數頻繁變化看的不太舒服。
ds18b20溫度LCD顯示 仿真.zip (106.94 KB, 下載次數: 51)

評分

參與人數 1黑幣 +5 收起 理由
鶴見川 + 5

查看全部評分

回復

使用道具 舉報

6#
ID:819671 發表于 2021-4-22 22:24 | 只看該作者
wulin 發表于 2021-4-22 22:17
給你一個ds18b20+LCD1602顯示2位小數的示例參考,但在實踐中顯示1位小數足以,末位小數頻繁變化看的不太 ...

我們老大強制要后兩位小數顯示 請問這個程序能更改成顯示兩位嗎求大佬幫助 我自己改改出來顯示亂碼
回復

使用道具 舉報

7#
ID:819671 發表于 2021-4-22 22:29 | 只看該作者
wulin 發表于 2021-4-22 22:17
給你一個ds18b20+LCD1602顯示2位小數的示例參考,但在實踐中顯示1位小數足以,末位小數頻繁變化看的不太 ...

參考了您的但是改出來還是亂碼我懵了
回復

使用道具 舉報

8#
ID:160500 發表于 2021-4-22 22:30 | 只看該作者
好好看看ds18b20的datasheet就明白了
回復

使用道具 舉報

9#
ID:213173 發表于 2021-4-23 05:45 | 只看該作者
鶴見川 發表于 2021-4-22 22:29
參考了您的但是改出來還是亂碼我懵了



回復

使用道具 舉報

10#
ID:89515 發表于 2021-4-23 07:50 來自手機 | 只看該作者
你圖片的分解方法就很好啊,只要溫度不大于100,直接將第三位小數緩存不要就行了
回復

使用道具 舉報

11#
ID:585428 發表于 2021-4-23 07:53 | 只看該作者
沒看你的代碼。但是我分享下思路,溫度讀出來以后,將溫度*100,比如21.12*100=2112。然后你可以取余將21和12分別用÷和%的方法提取出來放在數組內,然后,顯示的時候,你顯示21然后顯示一個小數點,然后顯示12。只要你溫度傳感器精度夠,想顯示幾位小數都沒問題。
回復

使用道具 舉報

12#
ID:390416 發表于 2021-4-23 09:47 | 只看該作者
回復

使用道具 舉報

13#
ID:905171 發表于 2021-4-23 12:04 | 只看該作者
本帖最后由 真皮沙發 于 2021-4-23 13:25 編輯

小數乘100化整數,再顯示,中間加小數點
回復

使用道具 舉報

14#
ID:905171 發表于 2021-4-23 12:06 | 只看該作者
void xianshi1()
{
        uint8 i;
        long a;
        a=tmp*100;
        temp[8]=0x30+a/10000;
        temp[9]=0x30+a/1000%10;
        temp[11]=0x30+a/100%10;
        temp[12]=0x2e;
        temp[13]=0x30+a/10%10;
        temp[14]=0x30+a%10;
        lcd_order(0x80+0x40);
        for(i = 0;i<16;i++)
                lcd_data(temp[i]);      
}
回復

使用道具 舉報

15#
ID:137736 發表于 2022-9-18 10:46 | 只看該作者
先乘上100,注意要轉換成int類型,否則取余錯誤。
回復

使用道具 舉報

16#
ID:137736 發表于 2022-9-18 10:50 | 只看該作者
先乘上100,將浮點數強制轉換成int類型,然后才能取余,分離每位數,否則錯誤。顯示時中間加上小數點。末尾數字跳動時可以用平均值濾波。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品亚洲成在人线 | 天天看天天干 | 国产不卡一区在线观看 | 亚洲国产高清免费 | 日韩精品一区二区三区第95 | 天天操天天射天天 | 国产精品久久久久久久久 | av在线免费观看网站 | 国产成人99久久亚洲综合精品 | 狠狠视频| 色香蕉在线 | 国产精品久久一区二区三区 | 97国产精品 | 国产日韩精品在线 | 91国内外精品自在线播放 | 欧美精品91爱爱 | 亚洲97| 国产成人精品一区二区三 | 日韩手机在线看片 | 黄色三级在线播放 | 一级片免费在线观看 | 日韩欧美国产一区二区三区 | 国产精品福利网 | 日韩综合网 | 中文字幕在线第二页 | 免费观看成人av | 亚洲一区二区三区福利 | 一级a毛片| 色综合99 | 国产精成人 | 欧美综合久久 | av在线免费观看网址 | 国产精品久久久久久久久久不蜜臀 | 亚州激情 | 中文字幕亚洲精品 | 亚洲看片网站 | 亚洲欧美高清 | 久久国产精品免费一区二区三区 | 国产精品久久久久久吹潮 | 久久久久久www | 日韩高清中文字幕 |