DHT11数字温湿度传感器
简单介绍:
- DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。产品为 4 针单排引脚封装
接口说明:
- 建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。
电源引脚:
- DHT11的供电电压为 3-5.5V。传感器上电后,要等待1s 以越过不稳定状态在此期间无需发送任何指令。
- 电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。
串行接口 (单线双向)
- DATA 用于单片机与 DHT11之间的通讯和同步
- 采用单总线数据格式
- 一次通讯时间4ms左右
- 数据分小数部分和整数部分,当前小数部分用于以后扩展,现读出为零。
数据传输格式:
- 一次完整的数据传输为40bit,高位先出。
- 数据格式:
8bit湿度整数数据 + 8bit湿度小数数据 + 8bit 温度整数数据 + 8bit温度小数数据 + 8bit校验和 - 数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
通讯过程:
- 通讯总过程:
- 通讯起始阶段:
- 总线空闲状态为高电平
- 需采集数据时,主机把总线拉低等待DHT11响应(须大于18毫秒,保证DHT11能检测到起始信号。)
- DHT11接收到主机的开始信号后,等待主机开始信号结束。
- 主机发送开始信号结束后,转为输入模式(即拉高电平)延时等待20-40us。
- 主机读取DHT11的响应信号,若总线处于低电平,表示DHT11开始响应。
- DHT11开始响应80us后拉高总线80us
- 然后开始传输0_1信号。
- 0_1信号的表示
数据0的表示如下:
数据1表示如下:
显然0_1信号都是先由50us的低电平开始,再由高电平的时间长短表示0或1。
DHT11引脚说明:
代码:
#include<reg52.h>
sbit DHTIO=P1^1;
//humidity 湿度
//temperature 温度
//integer 整数
//decimal 小数
unsigned char humidity_interger=0,humidity_decimal;
unsigned char temperature_integer=0,temperature_decimal;
unsigned char check;
void delay20ms()
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=222;b>0;b--)
for(a=40;a>0;a--);
}
void delay40us()
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=4;a>0;a--);
}
void dht_start()
{
DHTIO=1; //初始高电平
delay40us();
DHTIO=0; //主机拉低电平
delay20ms(); //保持电平时间大于18ms
DHTIO=1; //主机拉高电平
delay40us(); //延迟等待20-40us等待从机响应
}
unsigned char recieve_data()
{
unsigned char i,flag,data_byte;
for(i=0;i<8;i++)
{
flag=2;
while((!DHTIO)&&flag++);//等待从机发出50us低电平结束
delay40us(); //延时超过26us-28us不超过70us
data_byte=data_byte<<1;
if(DHTIO) //如果此时dhtio为1则表示此时从机输出数据为1否则说明此时从机输出数据为0
{
data_byte|=0x01;
flag=2;
while((DHTIO)&&flag++);//等待剩下的高电平结束
}
if(!flag)
break;
}
return data_byte;
}
void dht_take_sample()
{
unsigned char flag;
dht_start();
if(!DHTIO) //从机发出响应信号
{
flag=2;
while((!DHTIO)&&flag++);//检测从机发出80us低电平是否结束
flag=2;
while((DHTIO)&&flag++); //检测从机发出80us高电平是否结束
//开始采集数据
humidity_interger=recieve_data(); //采集湿度整数部分
humidity_decimal=recieve_data(); //采集湿度小数部分
temperature_integer=recieve_data(); //采集温度整数部分
temperature_decimal=recieve_data(); //采集温度小数部分
check=recieve_data(); //采集校验位
DHTIO=1; //采集数据后主机拉高电平
}
}
unsigned char get_humidity()
{
return humidity_interger;
}
unsigned char get_temperature()
{
return temperature_integer;
}