DHT11模块
上电后等待1s稳定状态,输入接上拉输入
发送数据格式如图
起始信号
发'0'时间间隔
代码如下
//DHT11.c
#include "DHT11.h"
void DHT11_Config(u8 Mode)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
if(Mode == 1)
{
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
DHT11_High();
}
else if(Mode == 0)
{
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
}
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
u8 DHT11_Read(u8* H, u8* T)
{
u8 DATA[5] ={0};
u8 i,j;
DHT11_Config(DHT11_OUT_mode);
delay_ms(1000); //初始化高点平输出,等待1s稳定
DHT11_low(); //发送起始信号
delay_ms(20);
DHT11_High(); //拉高,设置输入等待回应
DHT11_Config(DHT11_Din_Mode);
while(DHT11_Pin() == 1); // 等待 DHT11 响应信号 -- 默认上拉输入为高电平
while(DHT11_Pin() == 0); // 等待 响应 信号结束
for( i=0; i<5; i++)
{
for(j=0; j<8; j++)
{
while(DHT11_Pin() == 1); //等待 DHT拉高结束
while(DHT11_Pin() == 0); //开始等待高电平,判断1--0
delay_us(30); // '0'时间为 26-28us '1'为 70us
DATA[i]<<=1; //初始为0左移不变
if(DHT11_Pin()== 1)
DATA[i]++; //若为1,加一,下次开始左移一位
}
}
if(DATA[4] == DATA[3]+DATA[2]+DATA[1]+DATA[0])
{
*H = DATA[0];
*T = DATA[2];
return 0;
}
return 1;
}
//DHT11.h
//sys.h 只需包含 单片机头文件和延时头文件即可
#ifndef _DHT11_H_
#define _DHT11_H_
#include "sys.h"
#define DHT11_High() GPIO_SetBits(GPIOA,GPIO_Pin_12)
#define DHT11_low() GPIO_ResetBits(GPIOA,GPIO_Pin_12)
#define DHT11_Pin() GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)
#define DHT11_OUT_mode 1
#define DHT11_Din_Mode 0
void DHT11_Config(u8 Mode);
u8 DHT11_Read(u8* H, u8* T);
#endif
//main.c
#include "sys.h"
#include "DHT11.h"
int main()
{
DHT11_Config(DHT11_OUT_mode);
uart_init(115200);
u8 H,T;
printf("串口初始化成功\r\n");
while(1)
{
DHT11_Read(&H,&T);
printf("%d,%d\r\n",H,T);
delay_ms(200);
//MODBUS_ReceiveDeal();
}
}