DHT11模块简介如下:
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用甚至最为苛刻的应用场合的最佳选择。
相关参数:
供电电压: 3.3~5.5V DC
输 出: 单总线数字信号
测量范围: 湿度20-90%RH, 温度0~50℃
测量精度: 湿度+-5%RH, 温度+-2℃
分 辨 率: 湿度1%RH, 温度1℃
dht11.h代码如下:我用了寄存器的方式对引脚进行控制,如何用寄存器的方式可以参考相关芯片的数据手册
我接的是3.3V电压
例:DHT11_IO_IN() {GPIOG->CRH&=0xffff0fff; GPIOG->CRH|=0x00008000;}是将该引脚设置为上/下拉输入模式
库函数表达为 GPIO_Mode_IPD/U
#ifndef __DHT11_H
#define __DHT11_H
#include "sys.h"
//#IO方向设置
#define DHT11_IO_IN() {GPIOG->CRH&=0xffff0fff; GPIOG->CRH|=0x00008000;}//8<<12
#define DHT11_IO_OUT() {GPIOG->CRH&=0xffff0fff; GPIOG->CRH|=0x00003000;}//3<<12
//IO操作
#define DHT11_DQ_OUT PGout(11) //数据端口 PG11
#define DHT11_DQ_IN PGin(11) //数据端口 PG11
//
//#define DHT11_Set GPIO_SetBits(GPIOG, GPIO_Pin_11)
//#define DHT11_Rset GPIO_ResetBits(GPIOG, GPIO_Pin_11)
//#define DHT11_DQ_OUT GPIO_ReadOutputDataBit(GPIOG, GPIO_Pin_11)
//#define DHT11_DQ_IN GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_11)
//函数
u8 DHT11_Init(void);
void DHT11_Rst(void); //复位DHT11
u8 DHT11_Check(void); //等待DHT11的回应
u8 DHT11_Read_Bit(void); //读取一个位bit
u8 DHT11_Read_Byte(void); //读取一个字节
u8 DHT11_Read_Data(u8 *temp, u8 *humi); //从DHT11读取一次数据
#endif
dht11.c代码如下:
从dht11传感器获取温湿度的过程主要可以分为:首先对引脚进行初始化,这里我采用的是半双工通信的方式;其次主机发送信号响应模块,检测模块是否存在,存在的话对数据进行逐位读取。
#include "dht11.h"
#include "delay.h"
u8 DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruce;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PG端口时钟
GPIO_InitStruce.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStruce.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStruce.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStruce);
GPIO_SetBits(GPIOG, GPIO_Pin_11);
DHT11_Rst();
return DHT11_Check();
}
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //SET OUTPUT
DHT11_DQ_OUT=0; //拉低
//DHT11_Rset;
delay_ms(30); //拉低至少18ms
DHT11_DQ_OUT=1; //DQ=1
//DHT11_Set;
delay_us(30); //主机拉高20-40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{
u8 retry=0;
DHT11_IO_IN();
delay_us(20);
while(DHT11_DQ_IN&&retry<80) //DHT11会拉低40-80us
{
retry++;
delay_us(1);
};
//printf("retry=%d\n",retry);
if(retry>=80)
return 1;
else
retry=0;
while(!DHT11_DQ_IN&&retry<80) //DHT11拉低后会再次拉高40-80us
{
retry++;
delay_us(1);
};
if(retry>=80)
return 1;
return 0;
}
//读取一个位bit
//返回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(45); //等待40us
if(DHT11_DQ_IN)
return 1;
else
return 0;
}
//读取一个字节
//返回值:dat
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~50C), humi:湿度值(范围0~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])
{
//printf("OK\n");
*humi=buf[0];
*temp=buf[2];
}
}
else
return 1;
return 0;
}
main.c代码如下:
int main(void)
{
u8 t=0;
u8 temperature; //温度
u8 humidity; //湿度
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
LCD_Init();
POINT_COLOR=RED;
while(DHT11_Init()) //检测DHT11是否存在
{
LCD_ShowString(30,130,200,16,16,"DHT11 ERROR");
delay_ms(200);
LCD_Fill(30,130,239,130+16,WHITE);
delay_ms(200);
}
POINT_COLOR=BLUE;
LCD_ShowString(30,130,200,16,16,"DHT11 OK");
LCD_ShowString(30,150,200,16,16,"Temp: C");
LCD_ShowString(30,170,200,16,16,"Humi: %");
while(1)
{
if(t%10==0) //每100ms读取一次
{
DHT11_Read_Data(&temperature, &humidity); //读取温湿度值
LCD_ShowNum(30+40,150,temperature,2,16); //显示温度
LCD_ShowNum(30+40,170,humidity,2,16); //显示湿度
}
delay_ms(10);
t++;
if(t==20)
{
t=0;
LED0=!LED0;
}
}
}