DHT11 数字湿温度传感器原理应范例
概述:DHT11 广州奥松限公司生产款湿温度体化数字传感器
该传感器包括电阻式测湿元件 NTC 测温元件高性 8 位
单片机相连接通单片机等微处理器简单电路连接够实时采集湿
度温度DHT11 单片机间采简单单总线进行通信仅仅需
IO 口传感器部湿度温度数 40Bit 数次性传单片机数采
校验方式进行校验效保证数传输准确性DHT11 功耗低5V 电
源电压工作均电流 05mA
性指标特性:
z 工作电压范围:35V55V
z 工作电流 :均 05mA
z 湿度测量范围:20-90%RH
z 温度测量范围:0-50℃
z 湿度分辨率 :1%RH 8位
z 温度分辨率 :1℃ 8 位
z 采样周期 :1S
z 单总线结构
z TTL 兼容(5V)
脚排列:
引脚说明:
Vcc 正电源
Dout 输出
NC 空脚
GND
1应电路连接说明
DHT11数字湿温度传感器连接方法极简单第脚接电源正第四脚接电源端
数端第二脚直接接机(单片机) IO 口提高稳定性建议数端电源
正间接 47K 拉电阻第三脚空脚脚悬空
1 奥松电子限公司 wwwaosongcom
2DHT11 数结构
DHT11数字湿温度传感器采单总线数格式单数引脚端口完成输
入输出双传输数包5Byte(40Bit)组成数分数部分整数部分具
体格式面说明
次完整数传输40bit高位先出
数格式:8bit湿度整数数+8bit湿度数数
+8bit温度整数数+8bit温度数数
+8bit校验
校验数前四字节相加
传感器数输出未编码二进制数数(湿度温度整数数)间
应该分开处理果某次传感器中读取5Byte数:
byte4 byte3 byte2 byte1 byte0
00101101 00000000 00011100 00000000 01001001
整数 数 整数 数 校验
湿度 温度 校验
数湿度温度值计算方法:
humi (湿度) byte4 byte3450 (%RH)
temp (温度) byte2 byte1280 ( ℃)
jiaoyan(校验) byte4+ byte3+ byte2+ byte173(humi+temp)(校验正确)
注意:DHT11次通讯时间3ms机连续采样间隔建议100ms
3DHT11传输时序
31DHT11 开始发送数流程
机发送开始信号延时等 20us40us 读取 DH11T 回应信号读取
总线低电说明 DHT11 发送响应信号DHT11 发送响应信号总线拉
高准备发送数 bit 数低电开始格式见面图示果读取响应
信号高电 DHT11 没响应请检查线路否连接正常
2 奥松电子限公司 wwwaosongcom
32 机复位信号 DHT11 响应信号
33 数字0’信号表示方法
34 数字1’信号表示方法
3 奥松电子限公司 wwwaosongcom
4实例应
41 硬件描述
项目采两三位体阳数码做湿度温度显示模块采 ATMEL 公司
ATmega8 做控芯片详细图 41 示
42 脚分配
设备 脚
传感器(HDT11) PC5
LED[18] PB[07]
P3 PC3
P4 PD5 S2(温度显示)
P5 PD4
LED[18] PB[07]
P1 PD7
P2 PD6 S1(湿度显示)
Pm3 PD0
图 41 典型实例原理图
4 奥松电子限公司 wwwaosongcom
*原程序清单示程序 ICCAVR 631A 测试通*
*************************************************************************
编译环境 :ICCAVR
功:读取湿温度传感器 DTH11 数显示
公司:奥松电子限公司
芯片:Mega 8
晶振:部 80000MHz
创建:木工
修改 :宁佐文
**************************************************************************
#include
#include
typedef unsigned char U8 defined for unsigned 8bits integer variable
typedef signed char S8 defined for signed 8bits integer variable
typedef unsigned int U16 defined for unsigned 16bits integer variable
typedef signed int S16 defined for signed 16bits integer variable
typedef unsigned long U32 defined for unsigned 32bits integer variable
typedef signed long S32 defined for signed 32bits integer variable
typedef float F32 single precision floating point variable (32bits)
typedef double F64 double precision floating point variable (64bits)
**************************************************************************
数码显示赋值区
***************************************************************************
#define _a 0x01
#define _b 0x02
#define _c 0x04
#define _d 0x08
#define _e 0x10
#define _f 0x20
#define _g 0x40
#define _dp 0x80
#define num0 _g 灭数码
#define num1 _a|_d|_e|_f|_g
#define num2 _c|_f
#define num3 _e|_f
#define num4 _a|_d|_e
#define num5 _b|_e
#define num6 _b
#define num7 _d|_e|_f|_g
#define num8 0x00
#define num9 _e
#define num_ _a|_b|_c|_d|_e|_f|_dp
5 奥松电子限公司 wwwaosongcom
#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]{000000}
unsigned char Flag 0
unsigned int u16ReadDownStreamTimer
const U8 LED[14]{num0num1num2num3num4num5num6num7num8num9
num_num_11num_Enum_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
for(i0i<5i++)
{
DDRD | 0XFC
PORTD&0x03
6 奥松电子限公司 wwwaosongcom
DDRC | 0X0C
PORTC&0xF3
Delay(10)
switch(i)
{
case 0 PORTC|led1break
case 1 PORTD|led2break
case 2 PORTD|led3break
case 3 PORTD|led4break
case 4 PORTD|led5break
case 5 PORTD|led6break
default break
}
PORTBLED[PLAY[i]] 送数
if((i0)|(i2)|(i3)|(i5)) 消数点
{
PORTB|0x80
}
DelayNS(1)
}
PORTD&0x03
PORTC&0xF3
}
*****************************************************************************
delay()
*****************************************************************************
void DelayNS (U16 dly) 延时子程序 1010ms
{
U16 i
for ( dly>0 dly)WDR()
for (i0 i<1131 i++)
}
void Delay(unsigned int i)
{
while(i)
}
void delay1N(unsigned int Dcount)
{
while(Dcount)
{
NOP()NOP()NOP()
}
}
void Timer2_Delay150ms(void) Timer 2
7 奥松电子限公司 wwwaosongcom
{
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 prescale256
desired value 1mSec
actual value 0992mSec (08)
*****************************************************************************
void timer0_init(void)
{
TCCR0 0x00
TCNT0 0xE1
TCCR0 0x04
}
*****************************************************************************
TIMER2 initialize prescale8
WGM Normal
desired value 35uSec
8 奥松电子限公司 wwwaosongcom
actual value 34000uSec (29)
*****************************************************************************
void timer2_init(void)
{
TCCR2 0x00
ASSR 0x00
TCNT2 0xDE
OCR2 0x22
TCCR2 0x02
}
*****************************************************************************
定时器 TIMER0 中断
*****************************************************************************
#pragma interrupt_handler timer0_ovf_isr10
void timer0_ovf_isr(void)
{
TCNT0 0xE1
u16ReadDownStreamTimer++
}
*****************************************************************************
main() function
*****************************************************************************
void main(void)
{
U16 u16Flag 超时计数
unsigned char iiii
unsigned long u32I 接收数时变量
unsigned long ReceiveValue 0 接收数包变量
unsigned long ReceiveValue1 0 接收校验变量
unsigned int ReceiveHighByte 分解数包 湿度
unsigned int ReceiveLowByte 分解数包 温度
WDR()
DelayNS(2) 提高稳定性延时
init_devices()
timer2_init()
u16ReadDownStreamTimer 0
DDRC & ~0X20
PORTC | 0X20
while(1)
{
Display() 显示
WDR()
if(u16ReadDownStreamTimer > 1000) 1s 采集次
{
9 奥松电子限公司 wwwaosongcom
if(iiii 0)
{
DDRC | 0X20
PORTC & ~0X20 发送 0
iiii++
u16ReadDownStreamTimer 991
}
else
{
iiii 0
delay1N(200) 延时等方响应
DDRC & ~0X20 输入
PORTC | 0X20 拉高
delay1N(40) 延时等方响应
if((PINC&0X20)) 检测方否响应
{
u16Flag 0
while(((PINC&0X20)) && ((u16Flag++)<50000))
等响应低电拉高 拉高开始传输数
ReceiveValue 0
ReceiveValue1 0
u16Flag 0
while((PINC&0X20) && ((u16Flag++)<50000))
等数 第'0'出现
for(u32I0x80000000 u32I>0 u32I>>1)
4 字节数 湿度(8+8)+温度(8+8)32(Bit)
{
u16Flag 0
while(((PINC&0X20))&& ((u16Flag++)<30))
Timer2_Delay150ms()
u16Flag 0
while((PINC&0X20) && ((u16Flag++)<300))
if(TIFR&0x40)
{
ReceiveValue | u32I
}
}
for(u32I0x80 u32I>0 u32I>>1) 1 BYTE 校验字节
{
u16Flag 0
while(((PINC&0X20))&& ((u16Flag++)<30))
Timer2_Delay150ms()
u16Flag 0
while((PINC&0X20) && ((u16Flag++)<300))
10 奥松电子限公司 wwwaosongcom
if(TIFR&0x40)
{
ReceiveValue1 | u32I
}
}
DDRC | 0X20 输出
PORTC | 0X20 高拉
ReceiveLowByte (unsigned int )( ReceiveValue&0x0000FFFF)
ReceiveHighByte ReceiveValue>>16
if((U8)(*((U8*)(&ReceiveHighByte)+1)+*((U8*)(&ReceiveLowByte)+1))
*(U8 *)(&ReceiveValue1))
{ 校验
PLAY[3] *((U8*)(&ReceiveHighByte) + 1)10
PLAY[4] *((U8*)(&ReceiveHighByte) + 1)10
PLAY[2] 0
PLAY[0] *((U8*)(&ReceiveLowByte) + 1)10
PLAY[1] *((U8*)(&ReceiveLowByte) + 1)10
PLAY[5] 0
}
else 校验正确显示 6 8
{
PLAY[0] 8 PLAY[1] 8
PLAY[2] 8 PLAY[3] 8
PLAY[4] 8 PLAY[5] 8
}
}
else 没检测信号 发送 Err 显示
{
PLAY[0] 12PLAY[1] 13PLAY[2] 13
PLAY[3] 12PLAY[4] 13PLAY[5] 13
}
DDRC | 0X20
PORTC | 0X20
u16ReadDownStreamTimer 0 清定时计数位
}
}
else 没等
{
DelayNS(1)DelayNS(1)
DelayNS(1)DelayNS(1)
}
}
}
*************************************END************************************
11
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档