找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7942|回复: 6
打印 上一主题 下一主题
收起左侧

菜鸟级的DHT11读取 单片机程序

  [复制链接]
跳转到指定楼层
楼主
ID:421538 发表于 2019-8-21 00:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
菜鸟初学C51单片机,不容易啊,仅与一步一步走来的菜鸟分享,大师们忽视!
今天刚收到某宝快递来的DHT11,马上焊接,早上就一直再看规格书,网上看别人的例程,以为很顺利,结果从下午4点开始,
一直弄到12点多,就是读不出数据,网上看了很多例程,就是不行。都快崩溃得想放弃了,最后还是有显示了
不敢独享,分享给很多像我一样的菜鸟
(参照:http://www.51hei.com/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 单片机教程网

快速回复 返回顶部 返回列表