欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

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

查看數: 4613 | 評論數: 6 | 收藏 1
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2021-12-9 18:08

正文摘要:

代碼如下: #include<reg52.h> #define uchar unsigned char #define uint  unsigned int sbit DQ = P1^0;            //DS18B20數據口 uchar FLAG=1 ...

回復

ID:994053 發表于 2021-12-24 14:20
DS18B20讀寫時序不對
ID:139866 發表于 2021-12-11 16:03
這個數據不是-0.06,是-0.0625
ID:818709 發表于 2021-12-10 11:42
wulin 發表于 2021-12-10 09:23
程序沒有嚴重問題,主要是DS18B20讀寫時序不對導致讀出錯誤信息,還有點不簡潔。

謝謝謝謝 感謝大佬
ID:213173 發表于 2021-12-10 09:23
程序沒有嚴重問題,主要是DS18B20讀寫時序不對導致讀出錯誤信息,還有點不簡潔。

  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 00:14
wc86110 發表于 2021-12-9 20:49
就按這圖真做硬件沒問題?

求大佬解答 剛學習不久
ID:96682 發表于 2021-12-9 20:49
就按這圖真做硬件沒問題?

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表