【51单片机快速入门指南】6.4:DHT11、DHT22单总线温湿度传感器

发布者:atech123最新更新时间:2022-07-14 来源: csdn关键字:51单片机  快速入门  DHT11  DHT22 手机看文章 扫描二维码
随时随地手机看文章

STC89C52

Windows 10 20H2

Proteus 8 Frofessional v8.9 SP2

Keil uVision V5.29.0.0

PK51 Prof.Developers Kit Version:9.60.0.0


硬知识

摘自《温湿度模块 DHT11产品手册》、《数字温湿度传感器 DHT22》


典型应用电路中建议连接线长度短于5m时用4.7K上拉电阻,大于5m时根据实际情况降低上拉电阻的阻值。

使用3.3V电压供电时连接线尽量短,接线过长会导致传感器供电不足,造成测量偏差。

每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取2次,但不建议连续多次读取传感器,每次读取传感器间隔大于2秒即可获得准确的数据。

电源部分如有波动,会影响到温度。如使用开关电源,温度就会跳动。传感器上电后,要等待1s以越过不稳定状态,在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。

       引脚说明


VDD:供电3.3~5.5V DC

DATA:串行数据,单总线

NC:空脚

GND:接地,电源负极

DHT11

       DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。

在这里插入图片描述
在这里插入图片描述

DHT22

       DHT22数字温湿度传感器是一款含有己校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT22传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。

在这里插入图片描述
在这里插入图片描述

通信协议

       器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接一个约4.7kΩ的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。

       DATA用于微处理器与传感器之间的通讯和同步,采用单总线数据格式,一次传送40位数据,高位先出。

数据格式:

8bit湿度高位数据+8bit湿度低位数据+8bit温度高位数据+8bit温度低位数据+8bit校验位。

校验位数据定义:

       校验位等于8bit湿度高位数据+8bit湿度低位数据+8bit温度高位数据+8bit温度低位数据所得结果的末8位。

在这里插入图片描述

数据时序图

       用户主机(MCU)发送一次开始信号后,传感器从低功耗模式转换到高速模式,待主机开始信号结束后,传感器发送响应信号,送出40bit的数据,并触发一次信采集。

在这里插入图片描述

读取步骤

上电后(上电后要等待1S以越过不稳定状态,在此期间不能发送任何指令),测试环境温湿度数据,并记录数据,同时传感器的DATA数据线由上拉电阻拉高一直保持高电平;此时传感器的DATA引脚处于输入状态,时刻检测外部信号。


微处理器的I/O设置为输出同时输出低电平,且低电平保持时间不能小于18ms(最大不得超过30ms),然后微处理器的I/O设置为输入状态,由于上拉电阻,微处理器的I/O即传感器的DATA数据线也随之变高,等待传感器作出回答信号。

在这里插入图片描述

传感器的DATA引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后传感器的DATA引脚处于输出状态,输出83微秒的低电平作为应答信号,紧接着输出87微秒的高电平通知外设准备接收数据,微处理器的I/O此时处于输入状态,检测到I/O有低电平(传感器回应信号)后,等待87微秒的高电平后的数据接收

在这里插入图片描述

由传感器的DATA引脚输出40位数据,微处理器根据I/O电平的变化接收40位数据,位数据"0”的格式为:54微秒的低电平和23-27微秒的高电平,位数据"1"的格式为:54微秒的低电平加68-74微秒的高电平。

在这里插入图片描述

结束信号:传感器的DATA引脚输出40位数据后,继续输出低电平54微秒后转为输入状态,由于上拉电阻随之变为高电平。但传感器内部重测环境温湿度数据,并记录数据,等待外部信号的到来。

在这里插入图片描述

数据解读

DHT11

在这里插入图片描述

DHT22

在这里插入图片描述

示例程序

DHT11_22.c

#include "DHT11_22.h"


void delay_ms(int i);

void delay_10us(uint8_t n);


DHT_data DHT_Data = {0};


void DHT_Read(DHT_data *dht_data)

{

    uint8_t DHT_timeout_count, i, j;

uint8_t data_temp[6];

uint8_t DHT_Byte;

    //主机拉低18~30ms

    DHT_IO_L();

    delay_ms(20);

    DHT_IO_H();

    //总线由上拉电阻拉高 主机延时50us

    delay_10us(5);

    //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行

    if(!DHT_IO_read())  

    {

        //判断从机是否发出 80us 的低电平响应信号是否结束

        DHT_timeout_count = 0;

        while(!DHT_IO_read())

        {

            delay_10us(1);

            if(++DHT_timeout_count >= 10)

                return;

        }

        //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

        DHT_timeout_count = 0;

        while(DHT_IO_read())

        {

            delay_10us(1);

            if(++DHT_timeout_count >= 10)

                return;

        }

for(i = 0; i < 5; ++i)

{

for(j = 0, DHT_Byte = 0; j < 8; ++j)

{

DHT_Byte <<= 1;

DHT_timeout_count = 0;

while(!DHT_IO_read())

{

delay_10us(1);

if(++DHT_timeout_count >= 10)

{

DHT_Byte = 0;

break;

}

}

delay_10us(3); //跳过数据0的时间段,只检测数据为1时的电平

if(DHT_IO_read())

{

++DHT_Byte;

while(DHT_IO_read())

{

delay_10us(1);

if(++DHT_timeout_count >= 10)

{

DHT_Byte = 0;

break;

}

}

}

}

data_temp[i] = DHT_Byte;

}

for(i = 0, data_temp[5] = 0; i < 4; ++i)

data_temp[5] += data_temp[i];

if(data_temp[5] == data_temp[4]) //数据解读

{

#ifdef DHT11

dht_data->RH = data_temp[0] + (data_temp[1] & 0x0f)/10.;

dht_data->Temp = data_temp[2] + (data_temp[3] & 0x0f)/10.;

if(data_temp[3] & 0x80)

dht_data->Temp *= -1;

#endif

#ifdef DHT22

dht_data->RH = ((int16_t)data_temp[0] << 8 | data_temp[1])/10.;

dht_data->Temp = ((int16_t)(data_temp[2] & 0x7f) << 8 | data_temp[3])/10.;

if(data_temp[2] & 0x80)

dht_data->Temp *= -1;

#endif

}

    }

}


DHT11_22.h

#ifndef DHT11_22_H

#define DHT11_22_H


#include

#include


#define DHT11

//#define DHT22


typedef struct 

{

float RH;

float Temp;

} DHT_data;


#define DHT_IO_H() {P00=1;}

#define DHT_IO_L() {P00=0;}

#define DHT_IO_read() P00


extern DHT_data DHT_Data;


void DHT_Read(char *Str);


#endif


测试程序

       stdint.h见【51单片机快速入门指南】1:基础知识和工程创建

       串口部分见【51单片机快速入门指南】3.3:USART 串口通信

       定时器的介绍和配置源码见【51单片机快速入门指南】3.2:定时器/计数器


       在头文件中选择使用的型号:

在这里插入图片描述

main.c

#include

#include "intrins.h"

#include "stdint.h"

#include "USART.h"

#include "TIM.h"

#include "DHT11_22.h"


void Delay1ms() //@22.1184MHz

{

unsigned char i, j;


_nop_();

i = 4;

j = 146;

do

{

while (--j);

} while (--i);

}


void delay_ms(int i)

{

while(i--)

Delay1ms();

}


uint8_t TIM0_Counter = 0;

void delay_10us(uint8_t n)

{

TL0 = TH0;

TIM0_Counter = n;

while(TIM0_Counter > 1);

}


void main(void)

{

USART_Init(USART_MODE_1, Rx_ENABLE, STC_USART_Priority_Lowest, 22118400, 115200, DOUBLE_BAUD_ENABLE, USART_TIMER_1);

Timer_Init(TIMER_0, TIMER_MODE_2, GATE_DISABLE, CLK_Internal, 22118400, 10, STC_TIM_Priority_Highest); //定时器配置为10us中断一次,8位重装载


delay_ms(1500);

while(1)

{

DHT_Read(&DHT_Data);

printf("%f %frn", DHT_Data.RH, DHT_Data.Temp);

delay_ms(2000);

}

}


实验现象

DHT11

在这里插入图片描述

DHT22

在这里插入图片描述

关键字:51单片机  快速入门  DHT11  DHT22 引用地址:【51单片机快速入门指南】6.4:DHT11、DHT22单总线温湿度传感器

上一篇:【51单片机快速入门指南】7:片上EEPROM
下一篇:【51单片机快速入门指南】6.3.1:使用1-WIRE搜索算法搜索单总线上所有DS18B20的ID

推荐阅读最新更新时间:2024-11-05 13:16

用89S51单片机P1^0出1KHZ和500HZ的音频信号
用89S51单机P1^0出1KHZ和500HZ的音频信号要求1KHZ信号响100ms,500HZ信号响200ms 交替进行P1^7接一 开关 进行控制当开关闭合响警报信号当开关断开时警报停止编写程序如下 #include reg52.h #define uchar unsigned char sbit K =P1^7; sbit out =P1^0; void main ( ) {while ( 1) {if (K ==0) uchar i ; for (i =200;i >0;i --) {m _500HZ ( ); } for (i =200;i >0;i --) {m _1KHZ ( ); } } } } void m _5
[单片机]
8051单片机波特率计算公式(配套C语言例程)
8051单片机使用定时器1工作在方式2的情况下作为串口波特率发生器,其波特率=(2smod /32)×(定时器T1溢出率),其中smod是PCON 7 ,表示是否波特率加倍,Fsoc是系统的晶振大小。 波特率公式中:T1溢出率=溢出周期的倒数;溢出周期=(256-TH1)×12/Fosc; 最终公式: 波特率:Baud=(2smod × Fsoc)/(32 ×12×(256-TH1)) 我们一般不太关注波特率的计算,而是关心选用的传输速度(波特率)去反算定时器1(自动重装模式)的初值(TH1),所以将上面的公式导一下,得到TH1的公式: TH1=256-(Fsoc×2smod)/(12×32×Baud) 下面针对
[单片机]
55-基于51单片机的温度检测报警系统
具体实现功能 系统由STC89C51单片机+液晶1602显示+DS18B20温度传感器+按键模块+报警模块构成。 具体功能: (1)采用DS18B20温度传感器测温并用LCD1602显示; (2)按键为设置按键、加键和减键。可设置上下限温度报警值; (3)当温度超过设定的上或下限时,相应的指示灯亮,蜂鸣器报警; (4)温度测量范围0到99.9摄氏度,精度为0.1摄氏度。 设计背景 随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与了解环境温度。特别地,高温情况下极易造成火灾,例如,在机房中,电脑等设备发热快,若在短时间内机房温度升高,超出了设备正常温度,就会导致系统瘫痪或产生火灾。在这
[单片机]
55-基于<font color='red'>51单片机</font>的温度检测报警系统
51单片机 LCD1602显示
引脚图 #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int #define out P0 sbit RS=P2^7; sbit RW=P2^6; sbit E=P2^5; void lcd_initial(void); //LCD初始化函数 void check_busy(void); //检查是否忙碌函数 void write_command(uchar com); //写命令函数 void write_data(uchar dat); //写数据函数 void string(
[单片机]
<font color='red'>51单片机</font> LCD1602显示
分析C51单片机的一些误区和注意事项
简介:常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个变量。怎么取得这个变量的地址?要用指针。 1) C忌讳绝对定位。常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个变量。怎么取得这个变量的地址?要用指针。比如unsigned char data x;后,x的地址就是&x, 你只要查看这个参数,就可以在程序中知道具体的地址了。所以俺一看见要使用绝对定位的人,第一印象就是:这大概是个初学者。 2) 设
[单片机]
基于51单片机控制的数字可调高效开关稳压电源设计
为研究模拟PWM与数字电路相结合后的优点,本文设计实现了一个由51单片机控制的输出可调的高效开关稳压电源。通过理论分析设计了基于BOOST升压电路的DC-DC变换器、PWM控制芯片及其外围电路、单片机最小系统以及键盘/显示电路。通过仿真和实际电路调试使该电源实现稳压、限流、输出设定和输出值的显示功能。结果证明模拟PWM与数字电路相结合后,可以在不牺牲模拟控制所具备的精度和无限分辨率的情况下,提供数字控制所具有的特性。
[电源管理]
基于<font color='red'>51单片机</font>控制的数字可调高效开关稳压电源设计
基于51单片机16X32LED点阵显示屏程序设计
51单片机16X32LED点阵显示屏由单片机最小系统、行驱动电路74HC154、列驱运电路74HC595组成,实现汉字、数字的显示。电路简单。程序中以20个汉字作为显示示例。资料含51单片机C语言源程序、PROTEUS7.8仿真源文件。附送取模软件及取模说明文档,方便你自己更换显示内容。显示移动速度可在程序中进行设置。 #include REG51.H #define FOSC 12 //定义晶振频率 #define INIT_TH0 0x3C //定时器T0初始值 #define INIT_TL0 0xB0 #define TMOD_T00 0x
[单片机]
基于<font color='red'>51单片机</font>16X32LED点阵显示屏程序设计
一种简单基于51单片机的电子密码锁设计应用
单片机电子密码锁的背景和设计特点 在高科技迅速发展的今天,人们已经发明了密码锁、电子锁和激光锁等多种形式。这些锁在传统钥匙的基础上,利用磁场、声波和光束等多种方式来控制锁的开启和关闭,从而有效地增强了锁的安全性,保护了人们的生命财产和安全,有效地防止盗贼的光顾。 单片机 又称为单片微电脑或者单片微型计算机,它有效的集合了中央处理器、只读存储器、随机存取存储器和输入输出端口等计算机功能部件。计算机体积庞大,不易携带,导致单片机的应运而生,电子密码锁就是在单片机的外部接上简单的电路,人为的写入程序来完成其核心部分,这样不仅能够缩小锁的体积还能够降低成本,保持精度,并且能够有效的升级和改善 电子密码锁 。 单片机密码锁的系统设计
[电源管理]
一种简单基于<font color='red'>51单片机</font>的电子密码锁设计应用
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved