[RISC-V MCU 应用开发]

第七十章、CH32V103应用教程——DHT11的应用

[复制链接]
4238|21
手机看帖
扫描二维码
随时随地手机跟帖
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文件
#ifndef __DHT11_H
#define __DHT11_H

#include "ch32v10x_GPIO.h"

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

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

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

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

#include "dht11.h"

//复位DHT11
void DHT11_Rst(void)
{
    DHT11_IO_OUT();                      //SET OUTPUT
    GPIO_ResetBits(GPIOA,GPIO_Pin_11);   //拉低DQ
    Delay_Ms(20);                        //拉低至少18ms

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

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{
    u8 retry=0;
    DHT11_IO_IN();                 //SET INPUT
    while (DHT11_DQ_IN&&retry<100) //DHT11会拉低40~80us
    {
        retry++;
        Delay_Us(1);
    }
    if(retry>=100)
        return 1;
    else
        retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
    {
        retry++;
        Delay_Us(1);
    };
    if(retry>=100)
        return 1;
    return 0;
}

//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void)
{
    u8 retry=0;
    while(DHT11_DQ_IN&&retry<100) //等待变为低电平
    {
        retry++;
        Delay_Us(1);
    }
    retry=0;
    while(!DHT11_DQ_IN&&retry<100)//等待变高电平
    {
        retry++;
        Delay_Us(1);
    }
    Delay_Us(40);                 //等待40us
    if(DHT11_DQ_IN)
        return 1;
    else
        return 0;
}

//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)
{
    u8 i,dat;
    dat=0;
    for (i=0;i<8;i++)
     {
        dat<<=1;
        dat|=DHT11_Read_Bit();
   }
    return dat;
}

//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
    u8 buf[5];
    u8 i;
    DHT11_Rst();
    if(DHT11_Check()==0)
    {
        for(i=0;i<5;i++)            //读取40位数据
        {
            buf[i]=DHT11_Read_Byte();
        }
        if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
        {
            *humi=buf[0];
            *temp=buf[2];
        }
    }
    else
        return 1;
    return 0;
}

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

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

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

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

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

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

#include "debug.h"
#include "dht11.h"


/* Global typedef */

/* Global define */

/* Global Variable */


/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Return         : None
*******************************************************************************/
int main(void)
{
    u8 t=0;
    u8 temperature;
    u8 humidity;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        Delay_Init();
        USART_Printf_Init(115200);

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

        if(DHT11_Init())
        {
            printf("未检测到DHT11!\r\n");
            Delay_Ms(10);
        }
        else
        {
            printf("已检测到DHT11!\r\n");
            while(1)
            {
                if(t%100==0)//每100ms读取一次
                {
                    DHT11_Read_Data(&temperature,&humidity);  //读取温湿度值
                    printf("Temp=%d\n",temperature);          //显示温度
                    printf("Humi=%d\n",humidity);             //显示湿度
                }
                Delay_Ms(50);
                t++;
            }
        }

        while(1);

}

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

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

  

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

471.7 KB

使用特权

评论回复

相关帖子

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 | 显示全部楼层
问一下,这个探头现在的价格是多少钱?

使用特权

评论回复
评论
RISCVLAR 2021-2-23 16:26 回复TA
这个不清楚,老早之前买的,你可以去淘宝看看 
dongnanxibei| | 2021-3-13 15:43 | 显示全部楼层
这个传感器用的挺多的。

使用特权

评论回复
jcky001| | 2021-3-16 14:31 | 显示全部楼层
这个用的非常多,收藏。

使用特权

评论回复
usysm| | 2021-4-6 20:15 | 显示全部楼层
DHT11的延时是怎么确定的呢   

使用特权

评论回复
评论
RISCVLAR 2021-4-9 10:36 回复TA
可参考此篇帖子:https://blog.csdn.net/weixin_44306626/article/details/109732179 
typeof| | 2021-4-6 20:15 | 显示全部楼层
这个是做物联网的前提。   

使用特权

评论回复
kkzz| | 2021-4-6 20:17 | 显示全部楼层
文件怎么下载不了呢   

使用特权

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

使用特权

评论回复
评论
RISCVLAR 2021-4-9 10:38 回复TA
使用systick写的延时函数即可 
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 | 显示全部楼层
这个好,常用传感器

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

293

帖子

34

粉丝