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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

菜鳥級的DHT11讀取 單片機程序

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

評分

參與人數 2黑幣 +60 收起 理由
ping264888 + 10 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:295932 發表于 2019-8-21 10:25 | 只看該作者
多動腦勤動手,下個大師就是你,加油!
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天射夜夜操 | 99热在这里只有精品 | 欧美另类日韩 | 成人乱人乱一区二区三区软件 | 亚洲精色 | 观看av | 国产免费高清 | 免费人成激情视频在线观看冫 | 亚洲综合婷婷 | 成人片免费看 | 欧美精品影院 | 久久久久久久香蕉 | 免费色网址 | 国产一区二区三区在线 | 国产精品久久久久久久久久久免费看 | 亚洲一区中文字幕 | 美女黄色在线观看 | 国产真实精品久久二三区 | 91精品国产综合久久国产大片 | 男女羞羞视频在线观看 | 欧美中文字幕一区二区三区亚洲 | 欧美精品一区二区免费 | 97精品国产一区二区三区 | 亚洲精品国产偷自在线观看 | 五月天婷婷综合 | 国产精品久久久久久238 | 男人的天堂中文字幕 | 国产99久久久国产精品 | 亚洲黄色av网站 | 99久久精品免费看国产高清 | 国产成人免费视频网站高清观看视频 | 亚洲精品一区国产精品 | 成人黄视频在线观看 | 夜夜爆操 | 91国产视频在线 | 一区二区在线不卡 | 在线欧美日韩 | 亚洲一区中文字幕 | 中文字幕在线视频观看 | 激情一区二区三区 | 97伦理电影网 |