奥松电子有限公司 www.aosong.com
DHT11 数字湿温度传感器的原理和应用范例
概述:DHT11 是广州奥松有限公司生产的一款湿温度一体化的数字传感器。
该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位
单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿
度和温度。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个
I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用
校验和方式进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电
源电压下,工作平均最大电流 0.5mA。
性能指标和特性如下:
工作电压范围:3.5V-5.5V
工作电流 :平均 0.5mA
湿度测量范围:20-90%RH
温度测量范围:0-50℃
湿度分辨率 :1%RH 8位
温度分辨率 :1℃ 8 位
采样周期 :1S
单总线结构
与 TTL 兼容(5V)
管脚排列如下:
引脚说明:
Vcc 正电源
Dout 输出
NC 空脚
GND 地
1、应用电路连接说明
DHT11 数字湿温度传感器连接方法极为简单。第一脚接电源正,第四脚接电源地端。
数据端为第二脚。可直接接主机(单片机)的 I/O 口。为提高稳定性,建议在数据端和电源
正之间接一只 4.7K 的上拉电阻。第三脚为空脚,此管脚悬空不用。
- 1 -
奥松电子有限公司 www.aosong.com
2、DHT11 数据结构
DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输
入输出双向传输。其数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,具
体格式在下面说明。
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bit温度整数数据+8bit温度小数数据
+8bit校验和
校验和数据为前四个字节相加。
传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间
应该分开处理。如果,某次从传感器中读取如下5Byte数据:
byte4 byte3 byte2 byte1 byte0
00101101 00000000 00011100 00000000 01001001
整数 小数 整数 小数 校验和
校验和
湿度 温度
由以上数据就可得到湿度和温度的值,计算方法:
humi (湿度)= byte4 . byte3=45.0 (%RH)
temp (温度)= byte2 . byte1=28.0 ( ℃)
jiaoyan(校验)= byte4+ byte3+ byte2+ byte1=73(=humi+temp)(校验正确)
注意:DHT11 一次通讯时间最大3ms,主机连续采样间隔建议不小于100ms。
3、DHT11的传输时序
3.1、DHT11 开始发送数据流程
主机发送开始信号后,延时等待 20us-40us 后读取 DH11T 的回应信号,读取
总线为低电平,说明 DHT11 发送响应信号,DHT11 发送响应信号后,再把总线拉
高,准备发送数据,每一 bit 数据都以低电平开始,格式见下面图示。如果读取响应
信号为高电平,则 DHT11 没有响应,请检查线路是否连接正常。
- 2 -
奥松电子有限公司 www.aosong.com
3.2 主机复位信号和 DHT11 响应信号
3.3 数字‘0’信号表示方法
3.4 数字‘1’信号表示方法
- 3 -
奥松电子有限公司 www.aosong.com
4、实例应用
4.1 硬件描述
本项目采用两个三位一体共阳数码管做为湿度,温度显示模块。采用 ATMEL 公司的
ATmega8 做为主控芯片,详细如图 4.1 所示。
4.2 管脚分配
设备
传感器(HDT11)
管脚
PC5
S2(温度显示)
S1(湿度显示)
LED[1..8]
P3
P4
P5
LED[1..8]
P1
P2
Pm3
PB[0..7]
PC3
PD5
PD4
PB[0..7]
PD7
PD6
PD0
图 4.1 典型实例原理图
- 4 -
奥松电子有限公司 www.aosong.com
/*原程序清单如下所示,本程序在 ICCAVR 6.31A 下测试通过。*/
/*************************************************************************
编译环境 :ICCAVR
功能:读取湿温度传感器 DTH11 数据并显示
公司:奥松电子有限公司
芯片:Mega 8
晶振:内部 8.0000MHz
创建人:木工
修改 :宁佐文
**************************************************************************/
#include
#include
typedef unsigned char U8; // defined for unsigned 8-bits integer variable
typedef signed char S8; // defined for signed 8-bits integer variable
typedef unsigned int U16; // defined for unsigned 16-bits integer variable
typedef signed int S16; // defined for signed 16-bits integer variable
typedef unsigned long U32; // defined for unsigned 32-bits integer variable
typedef signed long S32; // defined for signed 32-bits integer variable
typedef float F32; // single precision floating point variable (32bits)
typedef double F64; // double precision floating point variable (64bits)
/**************************************************************************
数码管显示赋值区
***************************************************************************/
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define num_ _a|_b|_c|_d|_e|_f|_dp
_g //灭的数码管
_a|_d|_e|_f|_g
_c|_f
_e|_f
_a|_d|_e
_b|_e
_b
_d|_e|_f|_g
0x00
_e
0x01
0x02
0x04
0x08
0x10
0x20
0x40
0x80
_a
_b
_c
_d
_e
_f
_g
_dp
num0
num1
num2
num3
num4
num5
num6
num7
num8
num9
- 5 -
奥松电子有限公司 www.aosong.com
#define num_11 _a|_d|_e|_f
#define num_E _b|_c|_dp // Err 代码
#define num_r _a|_b|_c|_d|_f|_dp
#define dc2 0x04
#define dc3 0x08
#define dd 0x03
#define dd4 0x10
#define dd5 0x20
#define dd6 0x40
#define dd7 0x80
#define dd2 0x04
#define dd3 0x08 //数码管控制端口
#define led1 dc3 //使用时要先将数码管全熄灭掉
#define led2 dd5
#define led3 dd4
#define led4 dd7
#define led5 dd6
#define led6 dd2
U8 PLAY[6]={0,0,0,0,0,0};
unsigned char Flag = 0;
unsigned int u16ReadDownStreamTimer;
const U8 LED[14]={num0,num1,num2,num3,num4,num5,num6,num7,num8,num9,
num_,num_11,num_E,num_r }; //数码管笔形码数组
//函数声明:
void init_devices(void);
void time1_start(void);
void port_init(void);
void timer0_init(void);
void timer1_init(void);
void Delay(unsigned int i);
void DelayNS (U16 dly) ;
//*****************************************************************************
// 显示模块
//*****************************************************************************
void Display (void)
{
U8 i;
{
DDRD |= 0XFC;
PORTD&=0x03;
for(i=0;i<=5;i++)
- 6 -
奥松电子有限公司 www.aosong.com
DDRC |= 0X0C;
PORTC&=0xF3;
Delay(10);
switch(i)
{
case 0: PORTC|=led1;break;
case 1: PORTD|=led2;break;
case 2: PORTD|=led3;break;
case 3: PORTD|=led4;break;
case 4: PORTD|=led5;break;
case 5: PORTD|=led6;break;
default :break;
}
PORTB=LED[PLAY[i]] ; //送数据
if((i==0)|(i==2)|(i==3)|(i==5)) //消小数点
{
PORTB|=0x80;
}
DelayNS(1);
}
PORTD&=0x03;
PORTC&=0xF3;
}
//*****************************************************************************
// delay()
//*****************************************************************************
void DelayNS (U16 dly) //延时子程序 1.010ms
{
}
void Delay(unsigned int i)
{
}
void delay1N(unsigned int Dcount)
{
while(Dcount--)
{
NOP();NOP();NOP();
}
}
void Timer2_Delay150ms(void) // Timer 2
U16 i;
for ( ; dly>0; dly--)WDR();
for (i=0; i<1131; i++);
while(i--);
- 7 -
奥松电子有限公司 www.aosong.com
{
TCCR2 = 0x00;
TCNT2 = 0xDE;
TIFR |= 0X40;
TCCR2 = 0x02;
}
//*****************************************************************************
// 系统初始化函数
//*****************************************************************************
void init_devices(void)
{
CLI();
port_init();
timer0_init();
TIMSK = 0x05;
SEI();
}
//*****************************************************************************
// 端口初始化
//*****************************************************************************
void port_init(void)
{
DDRB = 0xFF;
PORTB = 0x00;
DDRC = 0x0C;
PORTC = 0x03;
DDRD = 0xF0;
PORTD = 0x00;
}
//*****************************************************************************
//TIMER0 initialize - prescale:256
// desired value: 1mSec
// actual value: 0.992mSec (0.8%)
//*****************************************************************************
void timer0_init(void)
{
TCCR0 = 0x00;
TCNT0 = 0xE1;
TCCR0 = 0x04;
}
//*****************************************************************************
//TIMER2 initialize - prescale:8
// WGM: Normal
// desired value: 35uSec
- 8 -