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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DHT11溫濕度傳感器測得的溫濕度都是00?求解答

[復制鏈接]
跳轉到指定樓層
樓主
2黑幣
顯示出來是這樣的



這是主函數:
  1. #include <reg52.h>
  2. #include "LCD1602.h"
  3. #include "stdio.h"

  4. unsigned char str1[2],str2[2];

  5. bit flag1s = 0;          //1s定時標志
  6. unsigned char T0RH = 0;  //T0重載值的高字節
  7. unsigned char T0RL = 0;  //T0重載值的低字節

  8. void ConfigTimer0(unsigned int ms);

  9. extern void UartDriver();
  10. extern void ConfigUART(unsigned int baud);
  11. extern void UartRxMonitor(unsigned char ms);
  12. extern void UartWrite(unsigned char *buf, unsigned char len);
  13. extern unsigned char RH_data,TH_data;

  14. void main ()
  15. {
  16.     EA = 1;            //開總中斷
  17.     ConfigTimer0(1);   //配置T0定時1ms
  18.     ConfigUART(9600);  //配置波特率為9600
  19.     InitLcd1602();     //初始化液晶

  20.     DHT11_start();
  21.     LcdShowStr(0,0,"Humi:");
  22.     LcdShowStr(0,1,"Temp:");
  23.     while (1)
  24.     {
  25.         UartDriver();  //調用串口驅動

  26.         if(flag1s)
  27.         {
  28.             flag1s=0;
  29.             DHT11_receive();
  30.             str1[0]=(char)(0x30+RH_data/10); //濕度整數部分
  31.             str1[1]=(char)(0x30+RH_data%10);                                
  32.             str2[0]=(char)(0x30+TH_data/10); //溫度整數部分
  33.             str2[1]=(char)(0x30+TH_data%10);     
  34.             LCD_Write_Char(6,0,str1[0]);
  35.             LCD_Write_Char(7,0,str1[1]);
  36.             LcdShowStr(9,0,"%");

  37.             LCD_Write_Char(6,1,str1[0]);
  38.             LCD_Write_Char(7,1,str1[1]);
  39.             LcdShowStr(9,1,"C");
  40.         }

  41.     }
  42. }

  43. /* 串口動作函數,根據接收到的命令幀執行響應的動作
  44.    buf-接收到的命令幀指針,len-命令幀長度 */
  45. void UartAction(unsigned char *buf, unsigned char len)
  46. {
  47.   //  buf[len++] = '\r';  //有效命令被執行后,在原命令幀之后添加
  48.   //  buf[len++] = '\n';  //回車換行符后返回給上位機,表示已執行
  49. //   UartWrite(buf, len);
  50. //UartWrite(buf, len);
  51. }

  52. /* 配置并啟動T0,ms-T0定時時間 */
  53. void ConfigTimer0(unsigned int ms)
  54. {
  55.     unsigned long tmp;  //臨時變量
  56.    
  57.     tmp = 11059200 / 12;      //定時器計數頻率
  58.     tmp = (tmp * ms) / 1000;  //計算所需的計數值
  59.     tmp = 65536 - tmp;        //計算定時器重載值
  60.     tmp = tmp + 32;           //補償中斷響應延時造成的誤差
  61.     T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節
  62.     T0RL = (unsigned char)tmp;
  63.     TMOD &= 0xF0;   //清零T0的控制位
  64.     TMOD |= 0x01;   //配置T0為模式1
  65.     TH0 = T0RH;     //加載T0重載值
  66.     TL0 = T0RL;
  67.     ET0 = 1;        //使能T0中斷
  68.     TR0 = 1;        //啟動T0
  69. }
  70. /* T0中斷服務函數,執行串口接收監控和蜂鳴器驅動 */
  71. void InterruptTimer0() interrupt 1
  72. {
  73.     static unsigned char tmr1s = 0;
  74.     TH0 = T0RH;  //重新加載重載值
  75.     TL0 = T0RL;
  76.     UartRxMonitor(1);  //串口接收監控
  77.     tmr1s++;
  78.     if (tmr1s >= 100)  //定時1s
  79.     {
  80.         tmr1s = 0;
  81.         flag1s = 1;
  82.     }
  83. }

  84. 這是DHT11程序:

  85. #include "DHT11.h"

  86. //sbit Temp_data=P2^1;

  87. unsigned char RH_data,TH_data;

  88. unsigned int rec_dat[4];
  89. //DHT11起始信號

  90. void DHT11_delay_us(unsigned char n)
  91. {
  92.     while(--n);
  93. }

  94. //延時ms
  95. void DHT11_delay_ms(unsigned int z)
  96. {
  97.    unsigned int i,j;
  98.    for(i=z;i>0;i--)
  99.       for(j=110;j>0;j--);
  100. }

  101. void DHT11_start()   
  102. {
  103.     Temp_data=1;
  104.     DHT11_delay_us(2);
  105.     Temp_data=0;
  106.     DHT11_delay_ms(20);
  107.     Temp_data=1;   
  108.     DHT11_delay_us(13);
  109.    
  110. }

  111. //接收一個字節
  112. unsigned char DHT11_rec_byte()
  113. {   
  114.     unsigned char i,dat;
  115.     for(i=0;i<8;i++)
  116.     {
  117.             while(!Temp_data);
  118.           DHT11_delay_us(8);
  119.             dat<<=1;
  120.             if(Temp_data==1)
  121.             {
  122.                 dat+=1;
  123.             }
  124.             while(Temp_data);
  125.     }
  126.     return dat;
  127. }

  128. //接收溫濕度數據
  129. void DHT11_receive()
  130. {
  131.     unsigned int R_H,R_L,T_H,T_L;
  132.     unsigned char RH,RL,TH,TL,revise;
  133.    
  134.     DHT11_start();
  135.     Temp_data=1;
  136.     if(Temp_data==0)
  137.     {
  138.         while(Temp_data==0);   //等待拉高     
  139.         DHT11_delay_us(40);  //拉高后延時80us
  140.         
  141.         R_H=DHT11_rec_byte();    //接收濕度高八位  
  142.         R_L=DHT11_rec_byte();    //接收濕度低八位  
  143.         T_H=DHT11_rec_byte();    //接收溫度高八位  
  144.         T_L=DHT11_rec_byte();    //接收溫度低八位
  145.         revise=DHT11_rec_byte(); //接收校正位

  146.         DHT11_delay_us(25);    //結束

  147.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  148.         {
  149.             RH=R_H;
  150.             RL=R_L;
  151.             TH=T_H;
  152.             TL=T_L;
  153.    
  154.         }
  155.         /*數據處理,方便顯示*/
  156.      /*   rec_dat[0]=RH;
  157.         rec_dat[1]=RL;
  158.         rec_dat[2]=TH;
  159.         rec_dat[3]=TL;*/

  160.         RH_data=RH;
  161.         TH_data=TH;
  162.     }
  163. }
  164. 這是Uart.c程序:

  165. #include <reg52.h>

  166. bit flagFrame = 0;  //幀接收完成標志,即接收到一幀新數據
  167. bit flagTxd = 0;    //單字節發送完成標志,用來替代TXD中斷標志位
  168. unsigned char cntRxd = 0;   //接收字節計數器
  169. unsigned char pdata bufRxd[64];  //接收字節緩沖區

  170. extern void UartAction(unsigned char *buf, unsigned char len);

  171. /* 串口配置函數,baud-通信波特率 */
  172. void ConfigUART(unsigned int baud)
  173. {
  174.     SCON  = 0x50;  //配置串口為模式1
  175.     TMOD &= 0x0F;  //清零T1的控制位
  176.     TMOD |= 0x20;  //配置T1為模式2
  177.     TH1 = 256 - (11059200/12/32)/baud;  //計算T1重載值
  178.     TL1 = TH1;     //初值等于重載值
  179.     ET1 = 0;       //禁止T1中斷
  180.     ES  = 1;       //使能串口中斷
  181.     TR1 = 1;       //啟動T1
  182. }
  183. /* 串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度 */
  184. void UartWrite(unsigned char *buf, unsigned char len)
  185. {
  186.     while (len--)  //循環發送所有字節
  187.     {
  188.         flagTxd = 0;      //清零發送標志
  189.         SBUF = *buf++;    //發送一個字節數據
  190.         while (!flagTxd); //等待該字節發送完成
  191.     }
  192. }
  193. /* 串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度 */
  194. unsigned char UartRead(unsigned char *buf, unsigned char len)
  195. {
  196.     unsigned char i;
  197.    
  198.     if (len > cntRxd)  //指定讀取長度大于實際接收到的數據長度時,
  199.     {                  //讀取長度設置為實際接收到的數據長度
  200.         len = cntRxd;
  201.     }
  202.     for (i=0; i<len; i++)  //拷貝接收到的數據到接收指針上
  203.     {
  204.         *buf++ = bufRxd[i];
  205.     }
  206.     cntRxd = 0;  //接收計數器清零
  207.    
  208.     return len;  //返回實際讀取長度
  209. }
  210. /* 串口接收監控,由空閑時間判定幀結束,需在定時中斷中調用,ms-定時間隔 */
  211. void UartRxMonitor(unsigned char ms)
  212. {
  213.     static unsigned char cntbkp = 0;
  214.     static unsigned char idletmr = 0;

  215.     if (cntRxd > 0)  //接收計數器大于零時,監控總線空閑時間
  216.     {
  217.         if (cntbkp != cntRxd)  //接收計數器改變,即剛接收到數據時,清零空閑計時
  218.         {
  219.             cntbkp = cntRxd;
  220.             idletmr = 0;
  221.         }
  222.         else                   //接收計數器未改變,即總線空閑時,累積空閑時間
  223.         {
  224.             if (idletmr < 30)  //空閑計時小于30ms時,持續累加
  225.             {
  226.                 idletmr += ms;
  227.                 if (idletmr >= 30)  //空閑時間達到30ms時,即判定為一幀接收完畢
  228.                 {
  229.                     flagFrame = 1;  //設置幀接收完成標志
  230.                 }
  231.             }
  232.         }
  233.     }
  234.     else
  235.     {
  236.         cntbkp = 0;
  237.     }
  238. }
  239. /* 串口驅動函數,監測數據幀的接收,調度功能函數,需在主循環中調用 */
  240. void UartDriver()
  241. {
  242.     unsigned char len;
  243.     unsigned char pdata buf[40];

  244.     if (flagFrame) //有命令到達時,讀取處理該命令
  245.     {
  246.         flagFrame = 0;
  247.         len = UartRead(buf, sizeof(buf));  //將接收到的命令讀取到緩沖區中
  248.         UartAction(buf, len);  //傳遞數據幀,調用動作執行函數
  249.     }
  250. }
  251. /* 串口中斷服務函數 */
  252. void InterruptUART() interrupt 4
  253. {
  254.     if (RI)  //接收到新字節
  255.     {
  256.         RI = 0;  //清零接收中斷標志位
  257.         if (cntRxd < sizeof(bufRxd)) //接收緩沖區尚未用完時,
  258.         {                            //保存接收字節,并遞增計數器
  259.             bufRxd[cntRxd++] = SBUF;
  260.         }
  261.     }
  262.     if (TI)  //字節發送完畢
  263.     {
  264.         TI = 0;   //清零發送中斷標志位
  265.         flagTxd = 1;  //設置字節發送完成標志
  266.     }
  267. }

復制代碼

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

使用道具 舉報

沙發
ID:584814 發表于 2020-4-20 11:23 | 只看該作者
理論上講,程序抄來抄去不應該有問題,查器件或連線試試。
回復

使用道具 舉報

板凳
ID:393699 發表于 2020-4-22 15:47 | 只看該作者
重點抓下延時函數有沒有問題,有條件的上個示波器或邏輯分析儀看下時序就知道了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 性色在线 | 粉嫩一区二区三区四区公司1 | 欧美中文在线 | 另类专区亚洲 | 男人天堂手机在线视频 | 久久久久久久久久一区 | 欧美黑人一区二区三区 | 亚洲 自拍 另类 欧美 丝袜 | 视频一区在线观看 | 一区二区三区视频在线观看 | 亚洲精品女人久久久 | www.国产| 亚洲精品乱码久久久久久按摩观 | 欧洲免费视频 | 欧美激情va永久在线播放 | 久草青青草 | 国产传媒在线观看 | 久久一久久 | 狠狠狠色丁香婷婷综合久久五月 | 亚洲午夜精品 | 视频二区在线观看 | 欧美一级在线免费观看 | 91久久看片 | a级毛片国产 | 成人精品一区二区三区中文字幕 | 三区在线观看 | 日韩成人在线观看 | 日韩视频中文字幕 | 99热这里有精品 | 黄色免费网址大全 | 成人无遮挡毛片免费看 | 日韩精品| 日韩图区| 国产在线中文字幕 | 国产福利在线 | 精品美女 | 婷婷丁香综合网 | 国产精品视频一区二区三区四蜜臂 | 久久网一区二区 | 成人国产一区二区三区精品麻豆 | 日本不卡免费新一二三区 |