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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5376|回復(fù): 3
收起左側(cè)

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

[復(fù)制鏈接]
ID:685767 發(fā)表于 2020-4-19 20:24 | 顯示全部樓層 |閱讀模式
2黑幣
顯示出來是這樣的
JQ5~MWOZQ7PP[$RJYQ8YD6G.png


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

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

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

  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();  //調(diào)用串口驅(qū)動

  26.         if(flag1s)
  27.         {
  28.             flag1s=0;
  29.             DHT11_receive();
  30.             str1[0]=(char)(0x30+RH_data/10); //濕度整數(shù)部分
  31.             str1[1]=(char)(0x30+RH_data%10);                                
  32.             str2[0]=(char)(0x30+TH_data/10); //溫度整數(shù)部分
  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. /* 串口動作函數(shù),根據(jù)接收到的命令幀執(zhí)行響應(yīng)的動作
  44.    buf-接收到的命令幀指針,len-命令幀長度 */
  45. void UartAction(unsigned char *buf, unsigned char len)
  46. {
  47.   //  buf[len++] = '\r';  //有效命令被執(zhí)行后,在原命令幀之后添加
  48.   //  buf[len++] = '\n';  //回車換行符后返回給上位機(jī),表示已執(zhí)行
  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;      //定時器計數(shù)頻率
  58.     tmp = (tmp * ms) / 1000;  //計算所需的計數(shù)值
  59.     tmp = 65536 - tmp;        //計算定時器重載值
  60.     tmp = tmp + 32;           //補(bǔ)償中斷響應(yīng)延時造成的誤差
  61.     T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節(jié)
  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中斷服務(wù)函數(shù),執(zhí)行串口接收監(jiān)控和蜂鳴器驅(qū)動 */
  71. void InterruptTimer0() interrupt 1
  72. {
  73.     static unsigned char tmr1s = 0;
  74.     TH0 = T0RH;  //重新加載重載值
  75.     TL0 = T0RL;
  76.     UartRxMonitor(1);  //串口接收監(jiān)控
  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. //接收一個字節(jié)
  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. //接收溫濕度數(shù)據(jù)
  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);    //結(jié)束

  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.         /*數(shù)據(jù)處理,方便顯示*/
  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;  //幀接收完成標(biāo)志,即接收到一幀新數(shù)據(jù)
  167. bit flagTxd = 0;    //單字節(jié)發(fā)送完成標(biāo)志,用來替代TXD中斷標(biāo)志位
  168. unsigned char cntRxd = 0;   //接收字節(jié)計數(shù)器
  169. unsigned char pdata bufRxd[64];  //接收字節(jié)緩沖區(qū)

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

  171. /* 串口配置函數(shù),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. /* 串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度 */
  184. void UartWrite(unsigned char *buf, unsigned char len)
  185. {
  186.     while (len--)  //循環(huán)發(fā)送所有字節(jié)
  187.     {
  188.         flagTxd = 0;      //清零發(fā)送標(biāo)志
  189.         SBUF = *buf++;    //發(fā)送一個字節(jié)數(shù)據(jù)
  190.         while (!flagTxd); //等待該字節(jié)發(fā)送完成
  191.     }
  192. }
  193. /* 串口數(shù)據(jù)讀取函數(shù),buf-接收指針,len-指定的讀取長度,返回值-實(shí)際讀到的長度 */
  194. unsigned char UartRead(unsigned char *buf, unsigned char len)
  195. {
  196.     unsigned char i;
  197.    
  198.     if (len > cntRxd)  //指定讀取長度大于實(shí)際接收到的數(shù)據(jù)長度時,
  199.     {                  //讀取長度設(shè)置為實(shí)際接收到的數(shù)據(jù)長度
  200.         len = cntRxd;
  201.     }
  202.     for (i=0; i<len; i++)  //拷貝接收到的數(shù)據(jù)到接收指針上
  203.     {
  204.         *buf++ = bufRxd[i];
  205.     }
  206.     cntRxd = 0;  //接收計數(shù)器清零
  207.    
  208.     return len;  //返回實(shí)際讀取長度
  209. }
  210. /* 串口接收監(jiān)控,由空閑時間判定幀結(jié)束,需在定時中斷中調(diào)用,ms-定時間隔 */
  211. void UartRxMonitor(unsigned char ms)
  212. {
  213.     static unsigned char cntbkp = 0;
  214.     static unsigned char idletmr = 0;

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

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

復(fù)制代碼

回復(fù)

使用道具 舉報

ID:584814 發(fā)表于 2020-4-20 11:23 | 顯示全部樓層
理論上講,程序抄來抄去不應(yīng)該有問題,查器件或連線試試。
回復(fù)

使用道具 舉報

ID:393699 發(fā)表于 2020-4-22 15:47 | 顯示全部樓層
重點(diǎn)抓下延時函數(shù)有沒有問題,有條件的上個示波器或邏輯分析儀看下時序就知道了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产a级黄色录像 | 亚洲经典一区 | 99re在线视频观看 | 中文字幕一区在线观看视频 | 国产ts人妖系列高潮 | 国内精品久久影院 | 久久四虎 | 国家一级黄色片 | 国产日韩精品在线 | 亚洲第一在线 | 天天干天天想 | 国产精品成人一区二区三区 | 亚洲日本乱码在线观看 | 日韩国产欧美视频 | 狠狠av | 日韩一区二区三区在线视频 | 一区二区三区在线播放 | 久草www | 国产一区二区影院 | 亚洲情侣视频 | 免费一区二区三区 | 久久国产精品视频免费看 | 国产日韩欧美一区 | 日韩精品免费播放 | 久久久久久国产精品mv | 日韩欧美国产综合 | 亚州激情 | 一区二区视频免费观看 | 九九热免费视频在线观看 | 免费看91 | 免费在线成人 | 黄色一级免费 | 国产精品久久久久久久7777 | 伊人伊人| 久久久久成人精品 | 涩涩视频网站在线观看 | 国产免费福利 | 久久久久久免费精品一区二区三区 | 久久专区 | 操射视频 | 欧美福利在线 |