一、DHT11
1、DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 传感器。
2、测量范围
3、DHT11硬件层
4、DHT11协议层
DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一 次通讯时间4ms左右,数据分小数部分和整数部分。
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据 +8bit校验和
校验和 = 8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据的后8位
5、通讯时序
1)MCU发送起始信号
总线空闲状态位高电平,主机把总线电平拉低(至少18Ms),等待DHT11响应。
数据引脚设置为输出模式
然后,总线拉高(20~40us)等待DHT11返回响应
2)读取DHT11响应
数据引脚设置为输入模式
当检测到起始信号之后,将总线拉低(80us),再拉高80 us作为响应
3)DHT11发送40bit的数据
高位在前的传输
DHT数据:信号0/1 判断 保存 校验
DHT结束信号:从机发送50us的低电平 主机拉高进入空闲状态
0信号判断:发送50us的低电平 发送26-28us高电平
1信号判断:发送50us的低电平 发送70us高电平
代码:
DHT11.h
#ifndef _DHT11_H_
#define _DHT11_H_
#include "stm32f10x.h"
#define DHT_H GPIO_SetBits(GPIOG,GPIO_Pin_11)//高电平
#define DHT_L GPIO_ResetBits(GPIOG,GPIO_Pin_11)//低电平
#define DHT_INT GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_11)//
extern uint8_t Tem;
extern uint8_t Hum;
void Dht11_Config(void);
uint8_t Dht11_GetVal(void);
#endif
DHT11.C
#include "dht11.h"
#include "delay.h"
uint8_t Tem=0;
uint8_t Hum=0;
//PG11
void Gpio_Config(uint8_t flag)
{
//打开引脚时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure={0};//定义结构体
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度
if(flag==1)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
else if(flag==0)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOG, &GPIO_InitStructure);
}
void Dht11_Config(void)
{
Gpio_Config(1);//输出模式
DHT_H;//输出高电平
Delay_ms(1000);
}
uint8_t Dht11_GetVal(void)
{
uint8_t num[5] = {0};
//起始信号
Gpio_Config(1);
DHT_L;Delay_ms(25);
DHT_H;
//Delay_ms(10);
//检测响应信号
Gpio_Config(0);
DHT_Num=0;
while(DHT_INT==1)
{
if(DHT_Num>=100)
return 0;
}
DHT_Num=0;
while(DHT_INT==0)
{
if(DHT_Num>=100)
return 0;
}
//接收数据
for(uint8_t i=5;i>0;i--)
{
for(uint8_t j=0;j<8;j++)
{
//等待54us低电平到来
DHT_Num=0;
while(DHT_INT==1)
{
if(DHT_Num>=100)
return 0;
}
//等待高电平到来
DHT_Num=0;
while(DHT_INT==0)
{
if(DHT_Num>=100)
return 0;
}
Delay_us(40);
if(DHT_INT==1)//数据“1”
num[i-1] |= 0x1<<(7-j);
else//数据“0”
num[i-1] &= ~(0x1<<(7-j));
}
}
Gpio_Config(1);
DHT_H;
//校验
if(num[4]+num[3]+num[2]+num[1] == num[0])
{
Tem = num[2];//整数部分温度
Hum = num[4];//整数部分湿度
return 1;
}
else
return 0;
}