爱板网论坛

查看: 562|回复: 0

[原创] 涂鸦TYDE3.0开发板试用5----DHT11读取温湿度

[复制链接]

主题

好友

174

积分

童生

  • TA的每日心情
    郁闷
    2018-6-14 11:23
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2018-3-3 22:09:41 |显示全部楼层
    上一篇调通了OLED后,由于有DHT11模块,就有协议一个关于DHT11的程序,读取温湿度信息,废话不多说,现在就将读取温湿度的代码贴上

    代码:
    DHT11.c
    1. #include "dht11.h"
    2. #include "delay.h"

    3. /**
    4. **  DHT11输出
    5. **/
    6. void DHT11_IO_OUT(void)
    7. {
    8.     GPIO_InitTypeDef GPIO_InitStructer;
    9.     GPIO_InitStructer.GPIO_Pin= GPIO_Pin_6;
    10.     GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
    11.     GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
    12.     GPIO_Init(GPIOA, &GPIO_InitStructer);
    13. }


    14. /**
    15. ** DHT11输入
    16. **/
    17. void DHT11_IO_IN(void)
    18. {
    19.     GPIO_InitTypeDef GPIO_InitStructer;
    20.     GPIO_InitStructer.GPIO_Pin= GPIO_Pin_6;
    21.     GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
    22.     GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IPU;
    23.     GPIO_Init(GPIOA, &GPIO_InitStructer);
    24. }
    25.    
    26. //复位DHT11
    27. void DHT11_Rst(void)          
    28. {                 
    29.         DHT11_IO_OUT();         //SET OUTPUT
    30.   DHT11_DQ_OUT=0;         //拉低DQ
    31.   delay_ms(20);            //拉低至少18ms
    32.   DHT11_DQ_OUT=1;         //DQ=1
    33.         delay_us(30);             //主机拉高20~40us
    34. }
    35. //等待DHT11的回应
    36. //返回1:未检测到DHT11的存在
    37. //返回0:存在
    38. u8 DHT11_Check(void)           
    39. {   
    40.         u8 retry=0;
    41.         DHT11_IO_IN();//SET INPUT         
    42.     while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
    43.         {
    44.                 retry++;
    45.                 delay_us(1);
    46.         };         
    47.         if(retry>=100)return 1;
    48.         else retry=0;
    49.     while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
    50.         {
    51.                 retry++;
    52.                 delay_us(1);
    53.         };
    54.         if(retry>=100)return 1;            
    55.         return 0;
    56. }
    57. //从DHT11读取一个位
    58. //返回值:1/0
    59. u8 DHT11_Read_Bit(void)                          
    60. {
    61.         u8 retry=0;
    62.         while(DHT11_DQ_IN&&retry<100)//等待变为低电平
    63.         {
    64.                 retry++;
    65.                 delay_us(1);
    66.         }
    67.         retry=0;
    68.         while(!DHT11_DQ_IN&&retry<100)//等待变高电平
    69.         {
    70.                 retry++;
    71.                 delay_us(1);
    72.         }
    73.         delay_us(40);//等待40us
    74.         if(DHT11_DQ_IN)return 1;
    75.         else return 0;                  
    76. }
    77. //从DHT11读取一个字节
    78. //返回值:读到的数据
    79. u8 DHT11_Read_Byte(void)   
    80. {        
    81.     u8 i,dat;
    82.     dat=0;
    83.         for (i=0;i<8;i++)
    84.         {
    85.                    dat<<=1;
    86.             dat|=DHT11_Read_Bit();
    87.     }                                                    
    88.     return dat;
    89. }
    90. //从DHT11读取一次数据
    91. //temp:温度值(范围:0~50°)
    92. //humi:湿度值(范围:20%~90%)
    93. //返回值:0,正常;1,读取失败
    94. u8 DHT11_Read_Data(u8 *temp,u8 *humi)   
    95. {        
    96.         u8 buf[5];
    97.         u8 i;
    98.         DHT11_Rst();
    99.         if(DHT11_Check()==0)
    100.         {
    101.                 for(i=0;i<5;i++)//读取40位数据
    102.                 {
    103.                         buf[i]=DHT11_Read_Byte();
    104.                 }
    105.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    106.                 {
    107.                         *humi=buf[0];
    108.                         *temp=buf[2];
    109.                 }
    110.         }else return 1;
    111.         return 0;            
    112. }
    113. //初始化DHT11的IO口 DQ 同时检测DHT11的存在
    114. //返回1:不存在
    115. //返回0:存在             
    116. u8 DHT11_Init(void)
    117. {
    118.         GPIO_InitTypeDef  GPIO_InitStructure;

    119.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOG时钟

    120.   //GPIOF9,F10初始化设置
    121.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;
    122.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    123.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
    124.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
    125.        
    126.         DHT11_Rst();
    127.        
    128.         return DHT11_Check();
    129. }

    复制代码
    DHT11.h
    1. #ifndef __DHT11_H
    2. #define __DHT11_H
    3. #include "sys.h"   

    4. ////IO操作函数                                                                                          
    5. #define        DHT11_DQ_OUT PAout(6) //数据端口
    6. #define        DHT11_DQ_IN  PAin(6)  //数据端口

    7. u8 DHT11_Init(void);//初始化DHT11
    8. u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度
    9. u8 DHT11_Read_Byte(void);//读出一个字节
    10. u8 DHT11_Read_Bit(void);//读出一个位
    11. u8 DHT11_Check(void);//检测是否存在DHT11
    12. void DHT11_Rst(void);//复位DHT11   

    13. void DHT11_IO_OUT(void);
    14. void DHT11_IO_IN(void);

    15. #endif

    复制代码
    读取到的温湿度信息:

    这是室内温湿度:
    4.png


    下面是我想DHT11哈了一口气之后的温湿度:
    3.png


    附上完整的代码,有需要的小伙伴请自行下载:
    DHT11.zip (6.03 MB, 下载次数: 0)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /4 下一条

    手机版|爱板网

    GMT+8, 2018-6-22 17:25 , Processed in 0.114963 second(s), 13 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-5   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001056号

    Powered by Discuz!

    返回顶部