[RISC-V MCU 应用开发] 第七十章、CH32V103应用教程——DHT11的应用

[复制链接]
 楼主| RISCVLAR 发表于 2021-2-21 19:56 | 显示全部楼层 |阅读模式
本帖最后由 RISCVLAR 于 2021-2-21 19:56 编辑

CH32V103应用教程——DHT11的应用

本章教程主要进行温湿度传感器DHT11的应用,通过DHT11读取周围环境温湿度,并通过串口打印显示。

1、DHT11简介及相关函数介绍
DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5-95%RH,温度-20~+60℃。该传感器包括一个电阻式测湿元件和一个NTC测温元件,可通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。 DHT11与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O口。传感器内部湿度和温度数据40Bit的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。
关于DHT11具体信息,可参考其产品手册。

2、硬件设计
本章教程主要使用DHT11检测周围环境温湿度,具体连接方式如下:
  • DHT11的VCC、GND引脚与单片机VCC、GND引脚连接
  • DHT11的Dout引脚与单片机用户自定义引脚连接(此处为PA11)

3、软件设计
本章教程使用DHT11检测周围环境温湿度,具体程序如下:
dht11.h文件
  1. #ifndef __DHT11_H
  2. #define __DHT11_H

  3. #include "ch32v10x_GPIO.h"

  4. //IO方向设置
  5. #define DHT11_IO_IN()  {GPIOA->CFGHR&=0XFFFF0FFF;GPIOA->CFGHR|=8<<12;}
  6. #define DHT11_IO_OUT() {GPIOA->CFGHR&=0XFFFF0FFF;GPIOA->CFGHR|=3<<12;}

  7. //IO操作函数
  8. #define DHT11_DQ_IN  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)     //数据端口    PA11

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

  15. #endif
dht11.h文件主要进行相关定义和函数声明;
dht11.c文件

  1. #include "dht11.h"

  2. //复位DHT11
  3. void DHT11_Rst(void)
  4. {
  5.     DHT11_IO_OUT();                      //SET OUTPUT
  6.     GPIO_ResetBits(GPIOA,GPIO_Pin_11);   //拉低DQ
  7.     Delay_Ms(20);                        //拉低至少18ms

  8.     GPIO_SetBits(GPIOA,GPIO_Pin_11);     //DQ=1
  9.     Delay_Us(20);                        //主机拉高20~40us
  10. }

  11. //等待DHT11的回应
  12. //返回1:未检测到DHT11的存在
  13. //返回0:存在
  14. u8 DHT11_Check(void)
  15. {
  16.     u8 retry=0;
  17.     DHT11_IO_IN();                 //SET INPUT
  18.     while (DHT11_DQ_IN&&retry<100) //DHT11会拉低40~80us
  19.     {
  20.         retry++;
  21.         Delay_Us(1);
  22.     }
  23.     if(retry>=100)
  24.         return 1;
  25.     else
  26.         retry=0;
  27.     while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
  28.     {
  29.         retry++;
  30.         Delay_Us(1);
  31.     };
  32.     if(retry>=100)
  33.         return 1;
  34.     return 0;
  35. }

  36. //从DHT11读取一个位
  37. //返回值:1/0
  38. u8 DHT11_Read_Bit(void)
  39. {
  40.     u8 retry=0;
  41.     while(DHT11_DQ_IN&&retry<100) //等待变为低电平
  42.     {
  43.         retry++;
  44.         Delay_Us(1);
  45.     }
  46.     retry=0;
  47.     while(!DHT11_DQ_IN&&retry<100)//等待变高电平
  48.     {
  49.         retry++;
  50.         Delay_Us(1);
  51.     }
  52.     Delay_Us(40);                 //等待40us
  53.     if(DHT11_DQ_IN)
  54.         return 1;
  55.     else
  56.         return 0;
  57. }

  58. //从DHT11读取一个字节
  59. //返回值:读到的数据
  60. u8 DHT11_Read_Byte(void)
  61. {
  62.     u8 i,dat;
  63.     dat=0;
  64.     for (i=0;i<8;i++)
  65.      {
  66.         dat<<=1;
  67.         dat|=DHT11_Read_Bit();
  68.    }
  69.     return dat;
  70. }

  71. //从DHT11读取一次数据
  72. //temp:温度值(范围:0~50°)
  73. //humi:湿度值(范围:20%~90%)
  74. //返回值:0,正常;1,读取失败
  75. u8 DHT11_Read_Data(u8 *temp,u8 *humi)
  76. {
  77.     u8 buf[5];
  78.     u8 i;
  79.     DHT11_Rst();
  80.     if(DHT11_Check()==0)
  81.     {
  82.         for(i=0;i<5;i++)            //读取40位数据
  83.         {
  84.             buf[i]=DHT11_Read_Byte();
  85.         }
  86.         if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  87.         {
  88.             *humi=buf[0];
  89.             *temp=buf[2];
  90.         }
  91.     }
  92.     else
  93.         return 1;
  94.     return 0;
  95. }

  96. //初始化DHT11的IO口 DQ 同时检测DHT11的存在
  97. //返回1:不存在
  98. //返回0:存在
  99. u8 DHT11_Init(void)
  100. {
  101.     GPIO_InitTypeDef  GPIO_InitStructure;

  102.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能PA端口时钟

  103.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;             //PA11端口配置
  104.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出
  105.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  106.     GPIO_Init(GPIOA, &GPIO_InitStructure);                 //初始化IO口
  107.     GPIO_SetBits(GPIOA,GPIO_Pin_11);                       //PA11输出高

  108.     DHT11_Rst();                                           //复位DHT11
  109.     return DHT11_Check();                                  //等待DHT11的回应
  110. }

dht11.c文件主要进行DHT11的初始化、复位、数据读取等配置;
main.c文件
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name          : main.c
  3. * Author             : WCH
  4. * Version            : V1.0.0
  5. * Date               : 2020/04/30
  6. * Description        : Main program body.
  7. *******************************************************************************/

  8. /*
  9. *@Note
  10. 环境温湿度读取:
  11. 本章教程使用温湿度传感器(DHT11)读取周围环境温湿度并通过串口调试助手打印显示。
  12. */

  13. #include "debug.h"
  14. #include "dht11.h"


  15. /* Global typedef */

  16. /* Global define */

  17. /* Global Variable */


  18. /*******************************************************************************
  19. * Function Name  : main
  20. * Description    : Main program.
  21. * Input          : None
  22. * Return         : None
  23. *******************************************************************************/
  24. int main(void)
  25. {
  26.     u8 t=0;
  27.     u8 temperature;
  28.     u8 humidity;

  29.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  30.         Delay_Init();
  31.         USART_Printf_Init(115200);

  32.         printf("SystemClk:%d\r\n",SystemCoreClock);
  33.         printf("This is DHT11 example\r\n");

  34.         if(DHT11_Init())
  35.         {
  36.             printf("未检测到DHT11!\r\n");
  37.             Delay_Ms(10);
  38.         }
  39.         else
  40.         {
  41.             printf("已检测到DHT11!\r\n");
  42.             while(1)
  43.             {
  44.                 if(t%100==0)//每100ms读取一次
  45.                 {
  46.                     DHT11_Read_Data(&temperature,&humidity);  //读取温湿度值
  47.                     printf("Temp=%d\n",temperature);          //显示温度
  48.                     printf("Humi=%d\n",humidity);             //显示湿度
  49.                 }
  50.                 Delay_Ms(50);
  51.                 t++;
  52.             }
  53.         }

  54.         while(1);

  55. }

main.c文件主要进行函数初始化、DHT11的检测以及温湿度的读取。

4、下载验证
将编译好的程序下载到开发版并复位,串口打印如下:
1、当未检测到DHT11,串口打印如下:
图片1.png    
2、当已检测到DHT11,串口打印如下:
图片2.png

  

69、DHT11(温湿度传感器)应用.rar

471.7 KB, 下载次数: 274

51xlf 发表于 2021-2-21 20:21 | 显示全部楼层
物联网常用的设备了。           
51xlf 发表于 2021-2-21 20:30 | 显示全部楼层
在开发一个wifi就齐全了。   
xinpian101 发表于 2021-2-22 10:09 | 显示全部楼层
这个用的非常多,收藏。
明天真的好 发表于 2021-2-23 16:18 | 显示全部楼层
物联网常用的温度传感器设备哦。
嵌入小菜菜 发表于 2021-2-23 16:24 | 显示全部楼层
问一下,这个探头现在的价格是多少钱?

评论

这个不清楚,老早之前买的,你可以去淘宝看看  发表于 2021-2-23 16:26
dongnanxibei 发表于 2021-3-13 15:43 | 显示全部楼层
这个传感器用的挺多的。
jcky001 发表于 2021-3-16 14:31 | 显示全部楼层
这个用的非常多,收藏。
usysm 发表于 2021-4-6 20:15 | 显示全部楼层
DHT11的延时是怎么确定的呢   

评论

可参考此篇帖子:https://blog.csdn.net/weixin_44306626/article/details/109732179  发表于 2021-4-9 10:36
typeof 发表于 2021-4-6 20:15 | 显示全部楼层
这个是做物联网的前提。   
kkzz 发表于 2021-4-6 20:17 | 显示全部楼层
文件怎么下载不了呢   

评论

直接点击附件下载试试  发表于 2021-4-9 10:37
htmlme 发表于 2021-4-6 20:17 | 显示全部楼层
推荐个定时器延时吧。   

评论

使用systick写的延时函数即可  发表于 2021-4-9 10:38
pklong 发表于 2021-4-6 20:17 | 显示全部楼层
以前都是使用DS18B20测量温度的。  
touser 发表于 2021-4-6 20:17 | 显示全部楼层
            
uytyu 发表于 2021-4-6 20:18 | 显示全部楼层
谢谢版主分享的资料了。   
iyoum 发表于 2021-4-6 20:18 | 显示全部楼层
CH32V103应用教程真不错呢。  
杨寅辉 发表于 2021-4-18 19:03 | 显示全部楼层
DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5-95%RH,温度-20~+60℃。
redone 发表于 2021-6-22 15:03 | 显示全部楼层
这个好,常用传感器
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

296

帖子

44

粉丝
快速回复 在线客服 返回列表 返回顶部

133

主题

296

帖子

44

粉丝
快速回复 在线客服 返回列表 返回顶部