DHT11温湿度传感器的使用
1、结构说明
1.1、引脚
此模块一个有3个引脚,分别为VCC,GND,DATA引脚。而DATA引脚则用于数据传输,且连接着一个上拉电阻,模块闲置的时候,引脚输入为高电平。
1.2、单向串行通信
此模块通信都是通过DATA这一个引脚,所以是在数据传输的时候是单向串行通信的。(1)一次完整的数据传输为40bit,高位先出。
①一次完整的数据传输为40bit,高位先出。
② 数据格式:
(8bit湿度整数数据 + 8bit湿度小数数据) + (8bi温度整数数据 + 8bit温度小数数据) + 8bit校验和
③数据传送正确时,校验和数据等于
“8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据”所得结果的末8位
1.3、通信时序
如下图:单片机想要使用此传感器时,将引脚连接好后,给DATA引脚输入一个低电平的起始信号。然后在给一个高电平用于等待响应。(为什么要给一个高电平用于等待响应喃?原因:因为DATA在闲置时连接着一个上拉电阻,在闲置时引脚输入为高电平,单片机给引脚一个低电平后用于起始信号,然后给高电平代表将引脚的控制权交给模块自己)如果模块检测到这个起始信号,则模块会给DATA引脚输出一个低电平的响应信号,然后开始给DATA引脚一个高电平的信号,准备发送数据。
单片机的起始信号的时间和模块应答的时间不同
单片机通过判断DATA引脚的高电平的持续时间,判断传输来的是0还是1。
2、代码程序
DHT11.c文件
#include <REGX52.H>
#include "Delay.h"
sbit dht = P3^3;
unsigned char Data[5];
char hum[9];
char tmper[9];
/*
模块的初始化
*/
void Dht_Init(void)
{
dht = 1;
dht = 0;
Delay30ms();//单片机发出起始信号
dht = 1;
Delay40us();
while(dht);//如果还在主机拉高,则卡在这里,当模块进入响应信号退出循环
while(!dht);//模块发出响应信号,则卡此循环,模块拉高,退出循环
while(dht);//进入模块DHT拉高,准备发送数据则卡在这里,开始传输数据退出循环
}
/*
读取模块的数据
*/
void Dht_Read(void)//读取数据
{
unsigned char i,j;
char flag;
char shuju;
Dht_Init();
for(i = 0; i<5; i++)
{
for(j = 0; j<8; j++)
{
while(!dht);//如果在低电平一直卡在这里,进入拉高时退出循环,然后判断拉高时间来断定是0还是1
Delay40us();//延迟40us后进行判断
if(dht == 0)
{
flag = 0;
}
else
{
flag = 1;
while(dht);
}
shuju = shuju << 1;//每次循环hum左移1位
shuju += flag;
}//循环8次后,hum就得到了8位二进制
Data[i] = shuju;
}//循环5次后,Data是40位二进制,代表这湿度,温度,校验位数据
}
void Dht_Humidity()//对湿度数据的处理
{
Dht_Read();
hum[0] = 'H';
hum[1] = ';';
//Data[0]的是湿度的整数数据
//Data[1]的是湿度的小数数据
hum[2] = Data[0] / 10 + '0';//转换位字符,方便显示
hum[3] = Data[0] % 10 + '0';
hum[4] = '.';
hum[5] = Data[1] / 10 + '0';
hum[6] = Data[1] % 10 + '0';
hum[7] = '%';
hum[8] = '\0';
}
void Dht_temper()//对温度数据的处理
{
Dht_Read();
tmper[0] = 'T';
tmper[1] = ';';
//Data[0]的是湿度的整数数据
//Data[1]的是湿度的小数数据
tmper[2] = Data[2] / 10 + '0';//转换位字符,方便显示
tmper[3] = Data[2] % 10 + '0';
tmper[4] = '.';
tmper[5] = Data[3] / 10 + '0';
tmper[6] = Data[3] % 10 + '0';
tmper[7] = 'C';
tmper[8] = '\0';
}
主函数main.c文件
#include <REGX52.H>
#include "Delay.h"
#include "dth.h"
#include "Uart.h"
extern char hum[9];//变量在dht.c文件里面
extern char tmper[9];
void main(void)
{
Delay1000ms();//DHT11的供电电压为3~5.5 V。传感器上电后,要等待 1s 以越过不稳定状态,在此期间无需发送任何指令。
while(1)
{
Dht_Humidity();
Delay30ms();
Dht_temper();
Delay30ms();
sendString(hum);
sendString(" ");
sendString(tmper);
sendString(" ");
}
}