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

目录

  • 硬知识
    • DHT11
    • DHT22
    • 通信协议
      • 读取步骤
    • 数据解读
      • DHT11
      • DHT22
  • 示例程序
    • DHT11_22.c
    • DHT11_22.h
  • 测试程序
    • main.c
    • 实验现象
      • 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》

  1. 典型应用电路中建议连接线长度短于5m时用4.7K上拉电阻,大于5m时根据实际情况降低上拉电阻的阻值。
  2. 使用3.3V电压供电时连接线尽量短,接线过长会导致传感器供电不足,造成测量偏差。
  3. 每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取2次,但不建议连续多次读取传感器,每次读取传感器间隔大于2秒即可获得准确的数据。
  4. 电源部分如有波动,会影响到温度。如使用开关电源,温度就会跳动。传感器上电后,要等待1s以越过不稳定状态,在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。

       引脚说明

  1. VDD:供电3.3~5.5V DC
  2. DATA:串行数据,单总线
  3. NC:空脚
  4. 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的数据,并触发一次信采集。
在这里插入图片描述

读取步骤

  1. 上电后(上电后要等待1S以越过不稳定状态,在此期间不能发送任何指令),测试环境温湿度数据,并记录数据,同时传感器的DATA数据线由上拉电阻拉高一直保持高电平;此时传感器的DATA引脚处于输入状态,时刻检测外部信号。
  2. 微处理器的I/O设置为输出同时输出低电平,且低电平保持时间不能小于18ms(最大不得超过30ms),然后微处理器的I/O设置为输入状态,由于上拉电阻,微处理器的I/O即传感器的DATA数据线也随之变高,等待传感器作出回答信号。
    在这里插入图片描述
  3. 传感器的DATA引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后传感器的DATA引脚处于输出状态,输出83微秒的低电平作为应答信号,紧接着输出87微秒的高电平通知外设准备接收数据,微处理器的I/O此时处于输入状态,检测到I/O有低电平(传感器回应信号)后,等待87微秒的高电平后的数据接收
    在这里插入图片描述
  4. 由传感器的DATA引脚输出40位数据,微处理器根据I/O电平的变化接收40位数据,位数据"0”的格式为:54微秒的低电平和23-27微秒的高电平,位数据"1"的格式为:54微秒的低电平加68-74微秒的高电平。
    在这里插入图片描述
  5. 结束信号:传感器的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~30msDHT_IO_L();delay_ms(20);DHT_IO_H();//总线由上拉电阻拉高 主机延时50usdelay_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 DHT11dht_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 DHT22dht_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 <STC89C5xRC.H>
#include <stdint.h>#define DHT11
//#define DHT22typedef struct 
{float RH;float Temp;
} DHT_data;#define DHT_IO_H() {P00=1;}
#define DHT_IO_L() {P00=0;}
#define DHT_IO_read() P00extern DHT_data DHT_Data;void DHT_Read(char *Str);#endif

测试程序

       stdint.h见【51单片机快速入门指南】1:基础知识和工程创建
       串口部分见【51单片机快速入门指南】3.3:USART 串口通信
       定时器的介绍和配置源码见【51单片机快速入门指南】3.2:定时器/计数器

       在头文件中选择使用的型号:
在这里插入图片描述

main.c

#include <STC89C5xRC.H>
#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 %f\r\n", DHT_Data.RH, DHT_Data.Temp);delay_ms(2000);}
}

实验现象

DHT11

在这里插入图片描述

DHT22

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获取编辑器两种方法

编辑器&#xff0c;是地图数据进行编辑的主要工具&#xff0c;这个Editor其实当一个新的地图开始时就创建了。事实上&#xff0c;其他ArcMap扩展对象也是在创建地图时产生的。 为了获得这个Editor&#xff0c;可以使用FindExtensionByCLSID 或者FindExtensionByName接口。 priv…

Redis持久化的简单介绍

Redis的强大功能很大程度上是由于其将所有数据都存储在内存中&#xff0c;为了使Redis在重启后仍能保证数据不丢失&#xff0c;需要将数据从内存中以某种形式持久化到硬盘中。 Redis支持两种方式的持久化&#xff0c;一种是RDB方式&#xff0c;一种是AOF方式。其中&#xff0c;…

图片响应式

img-responsive 编辑 本词条缺少概述图&#xff0c;补充相关内容使词条更完整&#xff0c;还能快速升级&#xff0c;赶紧来编辑吧&#xff01; img-responsive是图片响应式的意思&#xff0c;在Bootstrap框架中&#xff0c;有一个.img-responsive的CSS样式。应用这个样式以后…

【电路补习笔记】1、电阻的参数与选型

目录参数精度温度系数功率贴片电阻色环电阻传感器电阻老师的主页&#xff1a;唐老师讲电赛 视频地址&#xff1a;唐老师讲电赛之唐老师讲电子器件&#xff08;1&#xff09;电阻参数与选型 电阻按封装分为直插、贴片与印刷电阻&#xff08;有些电阻直接印刷在PCB上&#xff09;…

redis本地安装

redis在本地的安装及使用1、首先下载redis安装包&#xff0c;下载地址如下 http://pecl.php.net/package/redis/2.2.7/windows输入phpinfo()查看php版本进行相应的下载&#xff0c;注意版本2、下载完成后将php_redis.dll放到ext下&#xff0c;在php.ini中添加extensionphp_re…

Xcode模拟器和真机生成的日志查看(ios必知必会)

在进行实际代码开发的过程中&#xff0c;我们会生成一些plist文件&#xff0c;但是如何在调试过程中查看这些plist文件是否被成功生成以及生成的内容是否正确&#xff1f; 如果查看模拟器生成的日志和真机生成的日志到底如何查看&#xff1f; DEMO 首先生成一个plist文件 NSArr…

【Net】测试网络、查看IP

http://www.speedtest.cn/ 转载于:https://www.cnblogs.com/flydkPocketMagic/p/7380400.html

WordPress 不同分类目录调用不同模板的方法

https://www.jb51.net/cms/275887.html wordpress不同分类调用不同模板文件 用wordpress做站特别是企业站的时候&#xff0c;多个分类的内容不同需要显示的页面也不一样&#xff0c;比如有些分类显示的是产品缩略图&#xff0c;有些显示的是公司新闻公告等&#xff0c;此时需要…

【电路补习笔记】2、电容的参数与选型

目录分类无极性电容有极性电容电解电容钽电容参数精度温度系数材质耐压温度范围ESRESL电容并联高频特性焊盘&#xff08;PAD&#xff09;和旁路电容的放置老师的主页&#xff1a;唐老师讲电赛 视频地址&#xff1a;唐老师讲电赛之唐老师讲电子器件&#xff08;1&#xff09;电容…

【转】测试工程师日常工作需要关注的问题

在互联网公司追求价值最大化、成本最低化的今日&#xff0c;很多互联网公司开始提倡高的开发测试比率&#xff0c;工程师都有必要提升自己的贡献、产能&#xff0c;我们也需要将一些问题融入到工作中&#xff0c;在做中寻找答案。 跳出自己的小圈子&#xff0c;甚至跳出测试角色…

SQL 必知必会·笔记14更新和删除数据

1. 更新数据 基本的UPDATE语句&#xff0c;由三部分组成&#xff1a; 要更新的表列名和它们的新值确定要更新那些行的过滤条件更新单列示例&#xff1a; 1 UPDATE Customers 2 SET cust_email kimthetoystore.com 3 WHERE cust_id 1000000005; 更新多列的示例&#xff1a; 1 …

1005:I Think I Need a Houseboat-poj

1005:I Think I Need a Houseboat 总时间限制: 1000ms内存限制: 65536kB描述Fred Mapper is considering purchasing some land in Louisiana to build his house on. In the process of investigating the land, he learned that the state of Louisiana is actually shrinkin…

【电路补习笔记】3、电感的参数与选型

目录分类电感的模型参数精度直流电阻&#xff08;DCR&#xff09;通流能力&#xff08;Irms&#xff09;自谐振频率&#xff08;SRF&#xff09;饱和电流&#xff08;Isat&#xff09;标号老师的主页&#xff1a;唐老师讲电赛 视频地址&#xff1a;唐老师讲电赛之唐老师讲电子器…

八排序算法

概述 排序有内部排序和外部排序。内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据非常大&#xff0c;一次不能容纳所有的排序记录。在排序过程中须要訪问外存。 我们这里说说八大排序就是内部排序。 当n较大。则应採用时间复杂度为O(nlog2n)的排序方法…

wordpress CAS

https://wordpress.org/plugins/authorizer/#description 安装 Authorizer 插件&#xff0c;待测试。

poj 3436 (最大流)

题意&#xff1a;每台电脑共有p种零件&#xff0c;现在有n台机器&#xff0c;给出n台机器每台需要的一些种类零件当原料(0代表不需要&#xff0c;1代表必须要&#xff0c;2代表可有可无&#xff09;和输出的产品零件。问怎么安排生产线使生产出来零件可以组装的电脑最多。 思路…

web前端java script BOM学习笔记2017.8.1

DOM: document object model 文档对象模型提供了一套可以访问和修改HTML文档内容的方法访问&#xff1a;获取修改&#xff1a;设置1 JS要去操作HTML元素&#xff0c;必须要先用JS找到他&#xff0c;转换为JS的DOM对象操作&#xff1a;a 标签属性b css属性c 元素内容2 找对象的方…

【电路补习笔记】4、二极管的参数与选型

目录常用二极管二极管的结构与特性结构参数最大整流电流IFI_FIF​最大反向工作电压URU_RUR​反向电流IRI_RIR​最高工作频率fMf_MfM​应用常见应用单相整流电路单相半波整流电路单相桥式整流电路稳压管稳压管的伏安特性参数稳压值UZU_ZUZ​稳定电流IZI_ZIZ​额定功耗PZP_ZPZ​动…

wordpress 自定义字段

https://codex.wordpress.org/Using_Custom_Fields 显示自定义字段 <&#xff1f;php the_meta&#xff08;&#xff09;; &#xff1f;> 获取自定义字段

@font-face 使用过程

格式&#xff1a; TureTpe(.ttf)格式&#xff1a; .ttf字体是Windows和Mac的最常见的字体&#xff0c;是一种RAW格式&#xff0c;因此他不为网站优化,支持这种字体的浏览器有【IE9,Firefox3.5,Chrome4,Safari3,Opera10,iOS Mobile Safari4.2】 OpenType(.otf)格式&#xff1a;…