文章目录
- 一、DGT11
- 二、DHT11使用
-
- [ 1、原理图](# 1、原理图)
- [ 2、数据传输](# 2、数据传输)
- [ 3、时序图](# 3、时序图)
- 三、代码实例
-
- [ 1、DHT11.h](# 1、DHT11.h)
- [ 2、mian.c](# 2、mian.c)
- [ 3、实例](# 3、实例)
一、DGT11
DHT11 是一款湿温度一体化的数字传感器。

该传感器包括一个电阻式测湿元件和一个 NTC测温元件,并与一个高性能 8 位单片机相连接。
通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。
DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个 I/O 口。
传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。
DHT11 功耗很低,5V 电源电压下,工作平均最大电流 0.5mA。
DHT11 的技术参数如下:
工作电压范围:3.3V -5.5V
工作电流 :平均 0.5mA
输出:单总线数字信号
测量范围:湿度 20~90%RH,温度 0~50℃
精度 :湿度±5%,温度±2℃
分辨率 :湿度 1%,温度 1℃
二、DHT11使用
1、原理图
DHT11有三条有效引脚:
DATA ------ P33
GND ------ 地
VCC ------ 5V

2、数据传输
C51发送序列指令给到DHT11模块,模块一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据 + 8bit湿度小数数据 + 8bit温度整数数据 + 8bit温度小数数据 + 8bit校验和。
3、时序图
通讯过程

测试是否存在是否正常

时序图分析:
vcc刚开始处于 1 位 → vcc拉低至少18ms→vcc拉高20-40us→DHT响应信号,将高电平拉低持续80us(在40--80us之间读取:低电平------模块存在)→DHT拉高信号80us→DHT拉低信号开始传送数据。
三、代码实例
LCD1602显示温湿度传感器DTH11的温度与湿度。
1、DHT11.h
c
#define uchar unsigned char
#define uint unsigned int
sbit Data=P1^6;
uchar rec_dat[9];
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(30);
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte()
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
while(!Data);
DHT11_delay_us(8);
dat<<=1;
if(Data==1)
dat+=1;
while(Data);
}
return dat;
}
void DHT11_receive()
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0);
DHT11_delay_us(40);
R_H=DHT11_rec_byte();
R_L=DHT11_rec_byte();
T_H=DHT11_rec_byte();
T_L=DHT11_rec_byte();
revise=DHT11_rec_byte();
DHT11_delay_us(25);
if((R_H+R_L+T_H+T_L)==revise)
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
rec_dat[0]='0'+(RH/10);
rec_dat[1]='0'+(RH%10);
rec_dat[2]=' ';
rec_dat[3]=' ';
//温度
rec_dat[4]='0'+(TH/10);
rec_dat[5]='0'+(TH%10);
rec_dat[6]=' ';
}
}
2、mian.c
c
#include <reg52.h>
#include "LCD1602.h"
#include "DTH11.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar wendu [4];
uchar sidu [4];
uchar i;
int j;
void main()
{
LCD_Init();
LCD_ShowString(1, 1, "sidu:");
LCD_ShowString(2, 1, "wendu:");
while(1)
{
DHT11_delay_ms(100);
DHT11_receive();
for(i=0;i<7;i++)
{
if(i<=2)
{
sidu[i]= rec_dat[i]; //读取湿度
}
else
{
wendu[i-4] = rec_dat[i];
}
}
wendu[3] = '\0';sidu[2] = '\0';//字符串结尾
LCD_ShowString(1, 10,sidu);
LCD_ShowString(1, 13,"%");
LCD_ShowString(2, 10,wendu);
LCD_ShowString(2, 12," C");
}
}
3、实例
