本帖最后由 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,串口打印如下:
2、当已检测到DHT11,串口打印如下:
|