標題: 菜鳥級的DHT11讀取 單片機程序 [打印本頁]

作者: lhxr    時間: 2019-8-21 00:30
標題: 菜鳥級的DHT11讀取 單片機程序
菜鳥初學C51單片機,不容易啊,僅與一步一步走來的菜鳥分享,大師們忽視!
今天剛收到某寶快遞來的DHT11,馬上焊接,早上就一直再看規(guī)格書,網上看別人的例程,以為很順利,結果從下午4點開始,
一直弄到12點多,就是讀不出數(shù)據,網上看了很多例程,就是不行。都快崩潰得想放棄了,最后還是有顯示了
不敢獨享,分享給很多像我一樣的菜鳥
(參照:http://www.torrancerestoration.com/bbs/dpj-154092-1.html,fumily 發(fā)表于 2019-3-23 18:57)感謝作者fumily
/*****************************************************************************
*MCU 型號:STC15W404AS
*開發(fā)環(huán)境:Keil uVision5
*晶震頻率:11.0592MHZ      
*完成日期:2019-08-20
*程序功能:DHT11讀取
/********************定義數(shù)據*************************/
  1. #include <STC15F2K60S2.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char //無符號字符型類型數(shù)據
  4. #define uint unsigned int //無符號整型數(shù)據
  5. uchar dat_r[4];          //用于存放從DHT11讀取到的數(shù)值
  6. sbit DATA=P3^3;   //定義數(shù)據線,DHT11的2腳,2腳要上拉5.1K電阻
  7. /*-------30US延時---11.0592MHz(Copy自STC-ISP(v6.86).exe)----------------------------*/
  8. void Delay30us()               
  9. {
  10. unsigned char i;
  11. _nop_();
  12. _nop_();
  13. i = 80;
  14. while (--i);
  15. }
  16. /*-------20MS延時----11.0592MHz(Copy自STC-ISP(v6.86).exe)---------------------------*/
  17. void Delay20ms()               
  18. {
  19. unsigned char i, j, k;
  20. _nop_();
  21. _nop_();
  22. i = 1;
  23. j = 216;
  24. k = 35;
  25. do
  26. {
  27.   do
  28.   {
  29.    while (--k);
  30.   } while (--j);
  31. } while (--i);
  32. }
  33. /*-------1S延時-----11.0592MHz(Copy自STC-ISP(v6.86).exe)--------------------------*/
  34. void Delay1s()               
  35. {
  36. unsigned char i, j, k;
  37. _nop_();
  38. _nop_();
  39. i = 43;
  40. j = 6;
  41. k = 203;
  42. do
  43. {
  44.   do
  45.   {
  46.    while (--k);
  47.   } while (--j);
  48. } while (--i);
  49. }
  50. /*********************************************************************************************
  51. 函數(shù)名:DHT11啟動函數(shù)
  52. 調  用:無
  53. 參  數(shù):無
  54. 返回值:無
  55. 結  果:DHT11開始工作
  56. 備  注:
  57. **********************************************************************************************/
  58. void DHT11_start()                 // 主機控制DHT11開始工作
  59. {
  60.    DATA=1;                         // 主線空閑狀態(tài)
  61.    _nop_();
  62.    _nop_();
  63.    DATA=0;                         // 主機發(fā)送開始工作信號
  64.    Delay20ms();   //延時18ms以上
  65.    DATA=1;                         // 拉高并延時等待DHT11響應
  66.    Delay30us();
  67. }
  68. /*********************************************************************************************
  69. 函數(shù)名:DHT11讀數(shù)據函數(shù)
  70. 調  用:? = DHT11_rec_byte();
  71. 參  數(shù):無
  72. 返回值:
  73. 結  果:讀DHT11數(shù)據并保存到dat
  74. 備  注:
  75. **********************************************************************************************/
  76. uchar DHT11_rec_byte()      //接收一個字節(jié)
  77. {
  78.    uchar i,dat=0;
  79.   for(i=0;i<8;i++)         //從高到低依次接收8位數(shù)據
  80.    {         
  81.       while(!DATA);        //等待50us低電平過去
  82.       Delay30us();
  83.           Delay30us();     //延時60us,如果還為高則數(shù)據為1,否則為0
  84.       dat<<=1;             //左移位使正確接收8位數(shù)據,數(shù)據為0時直接移位
  85.       if(DATA==1)          //數(shù)據為1時,使dat加1來接收數(shù)據1
  86.          dat+=1;
  87.       while(DATA);         //等待數(shù)據線拉低   
  88.     }  
  89.     return dat;
  90. }
  91. /*********************************************************************************************
  92. 函數(shù)名:接收DHT11的40位的數(shù)據并校驗
  93. 調  用:? = DHT11_receive();
  94. 參  數(shù):無
  95. 返回值:無
  96. 結  果:結果保存到dat_r[i]中
  97. 備  注:
  98. **********************************************************************************************/
  99. void DHT11_receive()      //接收40位的數(shù)據
  100. {
  101.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  102.     DHT11_start();                 // 主機控制DHT11開始工作
  103.     if(DATA==0)
  104.     {
  105.         while(DATA==0);           //等待拉高     
  106.         Delay30us();
  107.         Delay30us();
  108.         Delay30us();             //拉高后延時80us
  109.         R_H=DHT11_rec_byte();    //接收濕度高八位  
  110.         R_L=DHT11_rec_byte();    //接收濕度低八位  
  111.         T_H=DHT11_rec_byte();    //接收溫度高八位  
  112.         T_L=DHT11_rec_byte();    //接收溫度低八位
  113.         revise=DHT11_rec_byte(); //接收校正位[/i][/color][/font][/u][i]
  114. [u][font=宋體][color=#336699]        Delay30us();    //結束[/color][/font][/u]
  115. [u][font=宋體][color=#336699]        if((R_H+R_L+T_H+T_L)==revise)   //校正
  116.         {
  117.             RH=R_H;
  118.             RL=R_L;
  119.             TH=T_H;
  120.             TL=T_L;
  121.         }
  122.         /*數(shù)據處理,方便顯示*/
  123.         dat_r[0]='0'+(RH/10);
  124.         dat_r[1]='0'+(RH%10);
  125.         dat_r[2]='0'+(TH/10);
  126.         dat_r[3]='0'+(TH%10);
  127.     }
  128. }
  129. /*========串口初始化函數(shù)=================================================*/
  130. void UartInit()                                [url=]//9600bps@11.0592MHz[/url]
  131. {
  132. SCON = 0x50;                //8位數(shù)據,可變波特率
  133. AUXR |= 0x04;
  134. //AUXR |= 0x01;             //串口1選擇定時器2為波特率發(fā)生器
  135. T2L =0xE0;   // 65536-(11059200/4/9600);                //設定定時初值
  136. T2H =0xFE;   // (65536-(11059200/4/9600))>>8;           //設定定時初值
  137. AUXR |= 0x10;
  138. }
  139. /*===========串口發(fā)送函數(shù)(字節(jié))=======================================*/
  140. void Uartsend_1(unsigned char send)
  141. {
  142. SBUF=send;                                                //發(fā)送數(shù)據
  143. while(!TI);                                               //等待前一幀數(shù)據發(fā)送完畢
  144. TI=0;                                                     //復位標志位
  145. }
  146. //----------串口發(fā)送函數(shù)(字符串)-----------------------------------------
  147. void PrintString(unsigned char code *puts)    //發(fā)送一串字符串
  148. {
  149.     for (; *puts != 0;   
  150.    puts++)  Uartsend_1(*puts);         //遇到停止符0結束
  151. }
  152. /*********************************************************************************************
  153. 函數(shù)名:主函數(shù)
  154. 調  用:無
  155. 參  數(shù):無
  156. 返回值:無
  157. 結  果:讀DHT11數(shù)據并送到1602顯示
  158. 備  注:
  159. **********************************************************************************************/
  160. void main (void)
  161. {
  162.         UartInit();
  163.         Delay20ms();
  164.         while(1)
  165.         {
  166.                 Delay1s();            //經測試,兩次連讀要至少延時80ms        
  167.                 DHT11_receive();//接受數(shù)據
  168.      //RH:XX%
  169.      PrintString("RH:");
  170.      Uartsend_1(dat_r[0]);
  171.      Uartsend_1(dat_r[1]);
  172.      PrintString("%;  ");
  173.      //TMP:XXC
  174.      PrintString("Tempreture:");   
  175.      Uartsend_1(dat_r[2]);
  176.      Uartsend_1(dat_r[3]);
  177.      Uartsend_1(0xdf);
  178.      PrintString("C  ");
  179.      Delay1s();

  180.                
  181.         }
  182. }
復制代碼


作者: ping264888    時間: 2019-8-21 09:42
51有你更精彩
作者: huaohui    時間: 2019-8-21 10:25
多動腦勤動手,下個大師就是你,加油!
作者: LOGLOG6    時間: 2019-11-2 19:21
非常棒,多謝多謝

作者: lsg0280    時間: 2022-2-12 19:44
非常好,實踐出真知。
作者: bhjyqjs    時間: 2022-6-2 08:55
持之以恒,終將成老怪。
作者: 小萌新51    時間: 2022-6-7 21:30
多思考




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1