找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 8881|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

菜鳥級(jí)的DHT11讀取 單片機(jī)程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:421538 發(fā)表于 2019-8-21 00:30 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
菜鳥初學(xué)C51單片機(jī),不容易啊,僅與一步一步走來的菜鳥分享,大師們忽視!
今天剛收到某寶快遞來的DHT11,馬上焊接,早上就一直再看規(guī)格書,網(wǎng)上看別人的例程,以為很順利,結(jié)果從下午4點(diǎn)開始,
一直弄到12點(diǎn)多,就是讀不出數(shù)據(jù),網(wǎng)上看了很多例程,就是不行。都快崩潰得想放棄了,最后還是有顯示了
不敢獨(dú)享,分享給很多像我一樣的菜鳥
(參照:http://www.torrancerestoration.com/bbs/dpj-154092-1.html,fumily 發(fā)表于 2019-3-23 18:57)感謝作者fumily
/*****************************************************************************
*MCU 型號(hào):STC15W404AS
*開發(fā)環(huán)境:Keil uVision5
*晶震頻率:11.0592MHZ      
*完成日期:2019-08-20
*程序功能:DHT11讀取
/********************定義數(shù)據(jù)*************************/
  1. #include <STC15F2K60S2.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char //無符號(hào)字符型類型數(shù)據(jù)
  4. #define uint unsigned int //無符號(hào)整型數(shù)據(jù)
  5. uchar dat_r[4];          //用于存放從DHT11讀取到的數(shù)值
  6. sbit DATA=P3^3;   //定義數(shù)據(jù)線,DHT11的2腳,2腳要上拉5.1K電阻
  7. /*-------30US延時(shí)---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延時(shí)----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延時(shí)-----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啟動(dòng)函數(shù)
  52. 調(diào)  用:無
  53. 參  數(shù):無
  54. 返回值:無
  55. 結(jié)  果:DHT11開始工作
  56. 備  注:
  57. **********************************************************************************************/
  58. void DHT11_start()                 // 主機(jī)控制DHT11開始工作
  59. {
  60.    DATA=1;                         // 主線空閑狀態(tài)
  61.    _nop_();
  62.    _nop_();
  63.    DATA=0;                         // 主機(jī)發(fā)送開始工作信號(hào)
  64.    Delay20ms();   //延時(shí)18ms以上
  65.    DATA=1;                         // 拉高并延時(shí)等待DHT11響應(yīng)
  66.    Delay30us();
  67. }
  68. /*********************************************************************************************
  69. 函數(shù)名:DHT11讀數(shù)據(jù)函數(shù)
  70. 調(diào)  用:? = DHT11_rec_byte();
  71. 參  數(shù):無
  72. 返回值:
  73. 結(jié)  果:讀DHT11數(shù)據(jù)并保存到dat
  74. 備  注:
  75. **********************************************************************************************/
  76. uchar DHT11_rec_byte()      //接收一個(gè)字節(jié)
  77. {
  78.    uchar i,dat=0;
  79.   for(i=0;i<8;i++)         //從高到低依次接收8位數(shù)據(jù)
  80.    {         
  81.       while(!DATA);        //等待50us低電平過去
  82.       Delay30us();
  83.           Delay30us();     //延時(shí)60us,如果還為高則數(shù)據(jù)為1,否則為0
  84.       dat<<=1;             //左移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時(shí)直接移位
  85.       if(DATA==1)          //數(shù)據(jù)為1時(shí),使dat加1來接收數(shù)據(jù)1
  86.          dat+=1;
  87.       while(DATA);         //等待數(shù)據(jù)線拉低   
  88.     }  
  89.     return dat;
  90. }
  91. /*********************************************************************************************
  92. 函數(shù)名:接收DHT11的40位的數(shù)據(jù)并校驗(yàn)
  93. 調(diào)  用:? = DHT11_receive();
  94. 參  數(shù):無
  95. 返回值:無
  96. 結(jié)  果:結(jié)果保存到dat_r[i]中
  97. 備  注:
  98. **********************************************************************************************/
  99. void DHT11_receive()      //接收40位的數(shù)據(jù)
  100. {
  101.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  102.     DHT11_start();                 // 主機(jī)控制DHT11開始工作
  103.     if(DATA==0)
  104.     {
  105.         while(DATA==0);           //等待拉高     
  106.         Delay30us();
  107.         Delay30us();
  108.         Delay30us();             //拉高后延時(shí)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();    //結(jié)束[/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ù)據(jù)處理,方便顯示*/
  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ù)據(jù),可變波特率
  133. AUXR |= 0x04;
  134. //AUXR |= 0x01;             //串口1選擇定時(shí)器2為波特率發(fā)生器
  135. T2L =0xE0;   // 65536-(11059200/4/9600);                //設(shè)定定時(shí)初值
  136. T2H =0xFE;   // (65536-(11059200/4/9600))>>8;           //設(shè)定定時(shí)初值
  137. AUXR |= 0x10;
  138. }
  139. /*===========串口發(fā)送函數(shù)(字節(jié))=======================================*/
  140. void Uartsend_1(unsigned char send)
  141. {
  142. SBUF=send;                                                //發(fā)送數(shù)據(jù)
  143. while(!TI);                                               //等待前一幀數(shù)據(jù)發(fā)送完畢
  144. TI=0;                                                     //復(fù)位標(biāo)志位
  145. }
  146. //----------串口發(fā)送函數(shù)(字符串)-----------------------------------------
  147. void PrintString(unsigned char code *puts)    //發(fā)送一串字符串
  148. {
  149.     for (; *puts != 0;   
  150.    puts++)  Uartsend_1(*puts);         //遇到停止符0結(jié)束
  151. }
  152. /*********************************************************************************************
  153. 函數(shù)名:主函數(shù)
  154. 調(diào)  用:無
  155. 參  數(shù):無
  156. 返回值:無
  157. 結(jié)  果:讀DHT11數(shù)據(jù)并送到1602顯示
  158. 備  注:
  159. **********************************************************************************************/
  160. void main (void)
  161. {
  162.         UartInit();
  163.         Delay20ms();
  164.         while(1)
  165.         {
  166.                 Delay1s();            //經(jīng)測試,兩次連讀要至少延時(shí)80ms        
  167.                 DHT11_receive();//接受數(shù)據(jù)
  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. }
復(fù)制代碼

評(píng)分

參與人數(shù) 2黑幣 +60 收起 理由
ping264888 + 10 贊一個(gè)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:365802 發(fā)表于 2019-8-21 09:42 | 只看該作者
51有你更精彩
回復(fù)

使用道具 舉報(bào)

板凳
ID:295932 發(fā)表于 2019-8-21 10:25 | 只看該作者
多動(dòng)腦勤動(dòng)手,下個(gè)大師就是你,加油!
回復(fù)

使用道具 舉報(bào)

地板
ID:390243 發(fā)表于 2019-11-2 19:21 | 只看該作者
非常棒,多謝多謝
回復(fù)

使用道具 舉報(bào)

5#
ID:928284 發(fā)表于 2022-2-12 19:44 | 只看該作者
非常好,實(shí)踐出真知。
回復(fù)

使用道具 舉報(bào)

6#
ID:66287 發(fā)表于 2022-6-2 08:55 | 只看該作者
持之以恒,終將成老怪。
回復(fù)

使用道具 舉報(bào)

7#
ID:442196 發(fā)表于 2022-6-7 21:30 | 只看該作者
多思考
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表