查看: 1243|回复: 0
收起左侧

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

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-4-30 20:54:35 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-9-10 18:01 编辑

    本章教程主要进行温湿度传感器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,串口打印如下:
    CH32V CH573单片机芯片-第七十章:CH32V103应用教程——DHT11的应用risc-v单片机中文社区(1)
    2、当已检测到DHT11,串口打印如下:
    CH32V CH573单片机芯片-第七十章:CH32V103应用教程——DHT11的应用risc-v单片机中文社区(2)

    69、DHT11(温湿度传感器)应用.rar
    CH32V CH573单片机芯片-第七十章:CH32V103应用教程——DHT11的应用risc-v单片机中文社区(3) 69、DHT11(温湿度传感器)应用.rar (471.7 KB, 下载次数: 15)
    链接:https://pan.baidu.com/s/1eJc9Qg9Az-W5bW9-ALkgFQ
    提取码:aw1l
    复制这段内容后打开百度网盘手机App,操作更方便哦







    上一篇:第六十九章:CH32V103应用教程——IIC-硬件IIC驱动OLED
    下一篇:第七十一章:CH32V103应用教程——温湿度及RTC显示
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-20 02:38 , Processed in 0.871309 second(s), 48 queries .

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