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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4055|回復: 6
收起左側

52單片機DS18B20測溫,lcd一直顯示為-0.06,求大佬解答

[復制鏈接]
ID:818709 發表于 2021-12-9 18:08 | 顯示全部樓層 |閱讀模式

仿真圖

仿真圖

代碼如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. sbit DQ = P1^0;            //DS18B20數據口
  5. uchar FLAG=1;   //正負溫度標志

  6. unsigned char TMPH,TMPL;

  7. //這三個引腳參考資料
  8. sbit E=P2^2;                //1602使能引腳
  9. sbit RW=P2^1;                //1602讀寫引腳      
  10. sbit RS=P2^0;                //1602數據/命令選擇引腳


  11. void delay_1()
  12. {
  13.         int i,j;
  14.         for(i=0; i<=10; i++)
  15.         for(j=0; j<=2; j++)
  16. ;
  17. }


  18. // 1602命令函數
  19. void enable(uchar del)
  20. {
  21.         P0 = del;
  22.         RS = 0;
  23.         RW = 0;
  24.         E = 0;
  25.         delay_1();
  26.         E = 1;
  27.         delay_1();
  28. }


  29. void write(uchar del)
  30. {
  31.         P0 =del;
  32.         RS = 1;
  33.         RW = 0;
  34.         E = 0;
  35.         delay_1();
  36.         E = 1;
  37.         delay_1();
  38. }

  39. // 1602初始化,請參考1602的資料
  40. void L1602_init(void)
  41. {
  42.         enable(0x01);
  43.         enable(0x38);
  44.         enable(0x0c);
  45.         enable(0x06);
  46.         enable(0xd0);
  47. }


  48. //改變液晶中某位的值,如果要讓第一行,第五個字符顯示"b" ,調用該函數如下 L1602_char(1,5,'b')
  49. void L1602_char(uchar hang,uchar lie,char sign)
  50. {
  51.         uchar a;
  52.         if(hang == 1) a = 0x80;
  53.         if(hang == 2) a = 0xc0;
  54.         a = a + lie - 1;
  55.         enable(a);
  56.         write(sign);
  57. }

  58. //改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下L1602_string(1,5,"ab cd ef;")
  59. void L1602_string(uchar hang,uchar lie,uchar *p)
  60. {
  61.         uchar a;
  62.         if(hang == 1) a = 0x80;
  63.         if(hang == 2) a = 0xc0;
  64.         a = a + lie - 1;
  65.         enable(a);
  66.         while(1)
  67.         {
  68.                 if(*p == '\0') break;
  69.                 write(*p);
  70.                 p++;
  71.         }
  72. }

  73. void delay(uint N)
  74. {
  75.         int i;
  76.         for(i=0; i<N; i++)
  77.         ;
  78. }

  79. Init_Ds18b20()
  80. {
  81.    bit Status_Ds18b20;
  82.    DQ=1;
  83.    DQ=0;
  84.    delay(250);
  85.    DQ=1;
  86.    delay(20);
  87.    if(!DQ)
  88.      Status_Ds18b20=0;
  89.         else
  90.          Status_Ds18b20=1;
  91.    delay(250);
  92.    DQ=1;
  93.    return Status_Ds18b20;
  94. }
  95. uchar Read_Ds18b20()
  96. {
  97.    uchar i=0,dat=0;
  98.    for(i=0;i<8;i++)
  99.      {
  100.            DQ=1;
  101.            DQ=0;
  102.            dat>>=1;
  103.            DQ=1;
  104.            if(DQ)
  105.              dat|=0x80;
  106.            DQ=1;
  107.            delay(25);
  108.          }
  109.            return dat;
  110. }

  111. void Witie_Ds18b20(uchar dat)
  112. {
  113.    uchar i=0;
  114.    for(i=0;i<8;i++)
  115.    {
  116.           DQ=1;
  117.           dat>>=1;
  118.           DQ=0;
  119.           DQ=CY;
  120.           delay(25);
  121.           DQ=1;
  122.    }
  123. }

  124. void chuli()
  125. {
  126.                   uint temp;
  127.             float tem;
  128.                 Init_Ds18b20();                                        //復位
  129.                 Witie_Ds18b20(0xcc);                 //寫跳過ROM命令
  130.                 Witie_Ds18b20(0x44);                    //開啟溫度轉換
  131.                 Init_Ds18b20();      
  132.                 Witie_Ds18b20(0xcc);
  133.                 Witie_Ds18b20(0xbe);            //讀暫存器
  134.                 TMPL = Read_Ds18b20();
  135.                 TMPH = Read_Ds18b20();

  136.                 temp = TMPH;
  137.                 temp <<= 8;      
  138.                 temp = temp | TMPL;
  139.                 if(TMPH>=8)
  140.                 {
  141.                    temp=~temp+1;
  142.                    FLAG=1;
  143.                 }
  144.                 else FLAG=0;         
  145.                 tem=temp*0.0625;
  146.                 temp=tem*100;

  147.                 if((temp/10000)==0)                                 //當高位為0時不顯示0
  148.                      L1602_char(2,5,' ');
  149.                 else
  150.                      L1602_char(2,5,temp/10000 + 48);
  151.                 if((temp/10000)==0&&(temp/1000%10)==0)                                 //當高位為0時不顯示0
  152.                      L1602_char(2,6,' ');
  153.                 else
  154.                      L1602_char(2,6,temp/1000%10 + 48);
  155.             L1602_char(2,7,temp/100%10 + 48);

  156.             L1602_char(2,8,0x2e);         
  157.                 L1602_char(2,9,temp/10%10 + 48);
  158.                 L1602_char(2,10,temp%10 + 48);         
  159.                 L1602_char(2,11,0xdf);                   //溫度符號C前的圈
  160.                 if(FLAG==1)
  161.                           L1602_char(2,4,0x2d); //輸出-號
  162.                 else
  163.                     L1602_char(2,4,0x2b); //輸出+號
  164. }
  165. void main()
  166. {
  167. //        float tt;
  168. //        uint temp;
  169.         P2 = 0x00;
  170.         L1602_init();
  171.         L1602_string(1,1,"  DS18B20 TEST  ");
  172.         L1602_string(2,1,"           C");
  173.         while(1)
  174.         {
  175.         chuli();      
  176.         }
  177. }
復制代碼



硬件沒問題,應該就是程序問題,求大佬解答

回復

使用道具 舉報

ID:96682 發表于 2021-12-9 20:49 來自手機 | 顯示全部樓層
就按這圖真做硬件沒問題?
回復

使用道具 舉報

ID:818709 發表于 2021-12-10 00:14 來自手機 | 顯示全部樓層
wc86110 發表于 2021-12-9 20:49
就按這圖真做硬件沒問題?

求大佬解答 剛學習不久
回復

使用道具 舉報

ID:213173 發表于 2021-12-10 09:23 | 顯示全部樓層
程序沒有嚴重問題,主要是DS18B20讀寫時序不對導致讀出錯誤信息,還有點不簡潔。 無標題.jpg

  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. sbit DQ = P1^0;            //DS18B20數據口
  5. uchar FLAG=1;   //正負溫度標志

  6. unsigned char TMPH,TMPL;

  7. //這三個引腳參考資料
  8. sbit E=P2^2;                //1602使能引腳
  9. sbit RW=P2^1;                //1602讀寫引腳      
  10. sbit RS=P2^0;                //1602數據/命令選擇引腳


  11. void delay(uchar N)
  12. {
  13.         while(--N);
  14. }

  15. void delay_1()
  16. {
  17.         delay(245);
  18.         delay(245);
  19. }


  20. // 1602命令函數
  21. void enable(uchar del)
  22. {
  23.         P0 = del;
  24.         RS = 0;
  25.         RW = 0;
  26.         E = 0;
  27.         delay_1();
  28.         E = 1;
  29.         delay_1();
  30. }


  31. void write(uchar del)
  32. {
  33.         P0 =del;
  34.         RS = 1;
  35.         RW = 0;
  36.         E = 0;
  37.         delay_1();
  38.         E = 1;
  39.         delay_1();
  40. }

  41. // 1602初始化,請參考1602的資料
  42. void L1602_init(void)
  43. {
  44.         enable(0x01);
  45.         enable(0x38);
  46.         enable(0x0c);
  47.         enable(0x06);
  48.         enable(0xd0);
  49. }


  50. //改變液晶中某位的值,如果要讓第一行,第五個字符顯示"b" ,調用該函數如下 L1602_char(1,5,'b')
  51. void L1602_char(uchar hang,uchar lie,char sign)
  52. {
  53.         uchar a;
  54.         if(hang == 1) a = 0x80;
  55.         if(hang == 2) a = 0xc0;
  56.         a = a + lie - 1;
  57.         enable(a);
  58.         write(sign);
  59. }

  60. //改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下L1602_string(1,5,"ab cd ef;")
  61. void L1602_string(uchar hang,uchar lie,uchar *p)
  62. {
  63.         uchar a;
  64.         if(hang == 1) a = 0x80;
  65.         if(hang == 2) a = 0xc0;
  66.         a = a + lie - 1;
  67.         enable(a);
  68.         while(1)
  69.         {
  70.                 if(*p == '\0') break;
  71.                 write(*p);
  72.                 p++;
  73.         }
  74. }

  75. bit Init_Ds18b20()
  76. {
  77.         bit Status_Ds18b20;
  78.         DQ=1;
  79.         delay(5);
  80.         DQ=0;
  81.         delay(200);
  82.         delay(200);
  83.         DQ=1;
  84.         delay(50);
  85.         Status_Ds18b20=DQ;
  86.         delay(25);
  87.         return Status_Ds18b20;
  88. }

  89. uchar Read_Ds18b20()
  90. {
  91.         uchar i=0,dat=0;
  92.         for(i=0;i<8;i++)
  93.         {
  94.                 DQ=0;
  95.                 dat>>=1;
  96.                 DQ=1;
  97.                 if(DQ)
  98.                 dat|=0x80;
  99.                 delay(25);
  100.         }
  101.         return dat;
  102. }

  103. void Witie_Ds18b20(uchar dat)
  104. {
  105.         uchar i=0;
  106.         for(i=0;i<8;i++)
  107.         {
  108.                 DQ=0;
  109.                 DQ=dat&0x01;
  110.                 delay(25);
  111.                 DQ=1;
  112.                 dat>>=1;
  113.         }
  114.         delay(25);
  115. }

  116. void chuli()
  117. {
  118.         uint temp;
  119.         float tem;
  120.         Init_Ds18b20();              //復位
  121.         Witie_Ds18b20(0xcc);         //寫跳過ROM命令
  122.         Witie_Ds18b20(0x44);         //開啟溫度轉換
  123.         Init_Ds18b20();      
  124.         Witie_Ds18b20(0xcc);
  125.         Witie_Ds18b20(0xbe);         //讀暫存器
  126.         TMPL = Read_Ds18b20();
  127.         TMPH = Read_Ds18b20();

  128.         temp = TMPH;
  129.         temp <<= 8;      
  130.         temp = temp | TMPL;

  131.         if(TMPH>8)
  132.         {
  133.                 temp=~temp+1;
  134.                 FLAG=1;
  135.         }
  136.         else FLAG=0;         
  137.         tem=temp*0.0625;
  138.         temp=tem*100;
  139.        
  140.         if((temp/10000)==0)                    //當高位為0時不顯示0
  141.                 L1602_char(2,5,' ');
  142.         else
  143.                 L1602_char(2,5,temp/10000 + 48);
  144.         if((temp/10000)==0&&(temp/1000%10)==0) //當高位為0時不顯示0
  145.                 L1602_char(2,6,' ');
  146.         else
  147.                 L1602_char(2,6,temp/1000%10 + 48);
  148.         L1602_char(2,7,temp/100%10 + 48);       
  149.         L1602_char(2,8,0x2e);         
  150.         L1602_char(2,9,temp/10%10 + 48);
  151.         L1602_char(2,10,temp%10 + 48);         
  152.         L1602_char(2,11,0xdf);                  //溫度符號C前的圈
  153.         if(FLAG==1)
  154.         L1602_char(2,4,0x2d); //輸出-號
  155.         else
  156.         L1602_char(2,4,0x2b); //輸出+號
  157. }
  158. void main()
  159. {
  160. //        float tt;
  161. //        uint temp;
  162. //        P2 = 0x00;
  163.         L1602_init();
  164.         L1602_string(1,1,"  DS18B20 TEST  ");
  165.         L1602_string(2,1,"           C");
  166.         while(1)
  167.         {
  168.                 chuli();      
  169.         }
  170. }
復制代碼



回復

使用道具 舉報

ID:818709 發表于 2021-12-10 11:42 | 顯示全部樓層
wulin 發表于 2021-12-10 09:23
程序沒有嚴重問題,主要是DS18B20讀寫時序不對導致讀出錯誤信息,還有點不簡潔。

謝謝謝謝 感謝大佬
回復

使用道具 舉報

ID:139866 發表于 2021-12-11 16:03 | 顯示全部樓層
這個數據不是-0.06,是-0.0625
回復

使用道具 舉報

ID:994053 發表于 2021-12-24 14:20 | 顯示全部樓層
DS18B20讀寫時序不對
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区久久 | 99精品免费在线观看 | 久久精品综合 | 在线播放一区 | 精品一区视频 | 中文字幕不卡在线观看 | 一区二区三区电影在线观看 | www.国产日本 | 久久精品一二三影院 | 一区二区三区四区五区在线视频 | 成人免费视频网址 | 天堂男人av | 欧美日在线 | a级片www| 日韩欧美高清dvd碟片 | 久久久久久免费毛片精品 | 欧美日韩国产一区二区三区 | 激情网五月天 | 综合五月 | 中文字幕国产精品 | 国产高清视频在线观看 | 亚洲精品黄色 | 毛片免费观看 | 亚洲一区二区三区高清 | 青青草免费在线视频 | www.99热.com| 91国内视频在线 | 欧美日韩在线综合 | 国产1区2区在线观看 | 中文天堂在线观看 | 天天综合网天天综合色 | 91精品在线播放 | 国产电影一区二区在线观看 | 盗摄精品av一区二区三区 | 特一级毛片 | 欧美色性 | 久久久久久国产精品mv | 免费黄色在线 | 精品久久久久久亚洲国产800 | 天天曰天天曰 | 天天干国产 |