目录

0案例视频效果展示

1DHT11温度湿度传感器

1.1传感器简介

1.2引脚定义(从左到右,面对网格面)

1.3时序 & 校验(原理速览)

1.4常见故障排查

2 DHT11温度湿度传感器数据

2.1 DHT11温度湿度传感器数据格式

2.1.1数据格式

2.1.2例子

2.13注意

2.2 DHT11温度湿度传感器数据传输时序

2.3 DHT11的数据信号转换

2.4 DHT11温度湿度传感器数据传输时序实测

2.5 仿真过程可能遇到的问题

2.5.1 无法读取有效数据

2.5.2 数据失真

3基于AT89C52单片机的温湿度测量电路原理图

3.1连接电路

3.2设置元件参数:

4基于AT89C52单片机的温湿度测量控制程序

  7 硬件工程师笔试面试相关文章链接(部分链接)


0案例视频效果展示

例子:基于AT89C52单片机的温湿度传感器控制

8基于AT89C52单片机的温湿度传感器控制

摘要:DHT11温湿度传感器是一款低成本数字传感器,采用单总线协议通信,测量范围为0-50℃(±2℃精度)和20-90%RH(±5%RH精度)。供电电压3.3V-5.5V,建议5V供电,采样周期需≥1秒。其40bit数据帧包含湿度、温度整数部分(小数位固定为0)和校验和。使用时需注意DATA引脚需4.7kΩ上拉电阻,避免接线过长(>20m)和采样间隔过短。常见故障包括数据全零(上拉电阻问题)、固定值(校验失败)或异常值(传感器受潮)。文章还详细介绍了基于AT89C52单片机的硬件连接方案和软件实现流程,包括时序控制、数据校验及LCD1602显示程序。对于更高精度需求,建议升级至DHT22或SHT30系列传感器。

1DHT11温度湿度传感器

1.1传感器简介
 

功能:同时测量温度(0–50 °C)和相对湿度(20–90 %RH)。
数字输出:单总线(One-Wire)协议,不是 1-Wire,也不是 I²C,而是“自定义单线”。
供电:3.3 V–5.5 V 均可,但官方标称 5 V。
精度:温度 ±2 °C,湿度 ±5 %RH(典型值)。
采样周期:≥1 s;换句话说,两次读取必须间隔 1 秒以上,否则返回上一次数据。

1.2引脚定义(从左到右,面对网格面)

VCC(3.3–5 V)

DATA(单线 I/O,需上拉 4.7 kΩ 到 VCC)

NC(空脚,有时厂家把它当 GND,请查自己模块的丝印)

GND

1.3时序 & 校验(原理速览)
 

主机把 DATA 拉低 ≥18 ms → 拉高 20–40 μs → 切换到输入 → DHT11 回 80 μs 低 + 80 μs 高 → 开始 40 bit 数据,高位在前:
8 bit 湿度整数
8 bit 湿度小数
8 bit 温度整数
8 bit 温度小数
8 bit 校验和 = 前 4 字节之和的低 8 位

1.4常见故障排查

1读出来全是 0 或 NaN:
DATA 引脚没上拉,或上拉电阻太大/太小。
采样间隔 <1 s。
接线过长 >20 m,信号失真。

2温度固定 0 °C 或 25 °C:
校验和失败,库返回旧值。

3湿度 99 % 或 1 %:
传感器进水或长期高湿,塑料外壳结露。

4在 3.3 V 系统不稳定:
某些 DHT11 批次 3.3 V 边缘供电,换成 5 V 供电 + 电平转换。

5升级路线
精度:DHT22/AM2302(-40–80 °C,±0.5 °C,±2–3 %RH)。
长期稳定性:Sensirion SHT30/SHT31/SHT35(I²C 接口,±0.2 °C,±2 %RH)。
低功耗:SHTC3(1.8 V,睡眠 0.5 µA)。
工业级:AM2315C(防结露,RS485)。

2 DHT11温度湿度传感器数据

2.1 DHT11温度湿度传感器数据格式

DHT11 一次完整的“应答帧”固定 40 bit(5 Byte),数据按 高位在前(MSB first 顺序一次性从 DATA 脚发出。

2.1.1数据格式

字节序号

位宽

含义

取值范围

说明

Byte0

8 bit

湿度整数部分

0x00–0xFF (实际 0–90)

8 位无符号

Byte1

8 bit

湿度小数部分

0x00

DHT11 永远为 0(保留位)

Byte2

8 bit

温度整数部分

0x00–0xFF (实际 0–50)

8 位无符号

Byte3

8 bit

温度小数部分

0x00

DHT11 永远为 0(保留位)

Byte4

8 bit

校验和

0x00–0xFF

Byte0+Byte1+Byte2+Byte3 的低 8 位

2.1.2例子


主机收到的 40 bit 原始数据为:
0010 0011 0000 0000 0001 1001 0000 0000 0010 1100
按字节划分:
Byte0 = 0x23 = 35 → 湿度整数 = 35 %
Byte1 = 0x00 → 湿度小数 = 0 → 湿度 = 35.0 %
Byte2 = 0x19 = 25 → 温度整数 = 25 °C
Byte3 = 0x00 → 温度小数 = 0 → 温度 = 25.0 °C
Byte4 = 0x2C = 44,校验和正确(0x23+0x00+0x19+0x00 = 0x3C → 低 8 位 0x3C?不对,这里举例值仅作演示,实际必须等于前 4 字节和)。

2.13注意


DHT11 没有负数表示,如需负温请改用 DHT22/AM2302。
小数位固定为 0,所以有效分辨率分别是 1 %RH 和 1 °C。

2.2 DHT11温度湿度传感器数据传输时序

DHT11温湿度传感器的数据传输时序如上图所示,首先设备上电,默认位高电平

(主机信号)然后,主机至少拉低18ms,再拉高20-40us,等待DHT11的响应信号

(DHT11信号(包含响应信号和数据信号))DHT11的响应信号先拉低40-50us,然后DHT11的响应信号再拉高40-50us,然后等待DHT11的数据信号

2.3 DHT11的数据信号转换

DHT11的数据信号转换如上图所示,一次完整的“应答帧”固定40 bit(5 Byte),每一bit数据开始都为12-14us的低电平(1bit数据的开始标志);然后将模拟量(电压值)转换为二进制数,

当高电平持续时间为26-28us时,表示二进制“0”,当高电平持续时间为116-118us时,表示二进制“1”,这样就将1bit模拟量转化为数字量。

2.4 DHT11温度湿度传感器数据传输时序实测

DHT11温度湿度传感器数据传输时序如上图所示,低电平部分表示:主机读数据请求信号

高电平部分表示:数据采样间隙

高电平和低电平之间部分:DHT11信号(包含响应信号和数据信号)

DHT11data引脚信号(包含响应信号和数据信号)局部放大如上图所示

再放大如上图所示

DHT11信号(包含响应信号和数据信号)如上图所示,与理论相差不多

2.5 仿真过程可能遇到的问题

2.5.1 无法读取有效数据

如上图所示,DHT11信号(包含响应信号和数据信号)未进行响应,所示一直为高电平。

解决措施:

主机至少拉低18ms,即延时18ms以上

2.5.2 数据失真

如上图所示,数据存在较多噪声,读取时会读错。

解决措施:

如上图所示,加上拉电阻。

3基于AT89C52单片机的温湿度测量电路原理图

3.1连接电路

按照上面的电路图连接各元件

DHT11的DATA引脚接P3.0,并添加10kΩ上拉电阻到VCC

LCD1602的RS、E分别接P2.0、P2.2

LCD1602的RW接P2.1

LCD1602的数据口D0-D7接P0.0-P0.7

P0口添加排阻上拉到VCC

添加11.0592MHz晶振和30pF电容到XTAL1和XTAL2

添加10kΩ电阻和10μF电解电容构成复位电路

3.2设置元件参数:

双击AT89C52,设置晶振频率为11.0592MHz

双击DHT11,可以设置初始温湿度值用于测试

4基于AT89C52单片机的温湿度测量控制程序

如上图所示,控制程序能够实现AT89C52单片机读取DHT11温湿度传感器数据并在LCD1602显示屏上显示。

//头文件与位定义
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P3^0;   //DTH11 data线
uchar rec_dat1[4];   //DTH11 湿度数据
uchar rec_dat2[4];   //DTH11 温度数据bit fg=1;sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;
//ms延时函数
int delay(unsigned char xms)
{unsigned char x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);return 0;
}
//DHT11  us延时函数
void DHT11_delay_us(uchar n)
{while(--n);
}
//DHT11  ms延时函数
void DHT11_delay_ms(uint z)
{uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);
}//LCD写命令
int write_com(unsigned char com)
{RS = 0;RW = 0;P0 = com;delay(5);EN = 1;delay(5);EN = 0;return 0;
}
//LCD初始化		
int LCD_init()
{EN = 0;write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口write_com(0X0C);//设置开显示,不显示光标write_com(0X06);//写一个字符时,整屏右移write_com(0X01);//清屏return 0;
}
//LCD写数据
int write_date(unsigned char data1)
{RS = 1;RW = 0;P0 = data1;delay(5);EN = 1;delay(5);EN = 0;return 0;
}
//LCD显示
void LCD_send(unsigned char i,unsigned char j,unsigned char str[],unsigned char n)
{//输入:显示行数i,列数j,输出字符,输出字符长度nunsigned char x=0;if(i==1){write_com(0x80+j);}else{write_com(0x80+0x40+j);}for(x=0;x<n;x++){write_date(str[x]);delay(150);}
}//DHT11开始
void DHT11_start()
{//开始信号 低电平18us以上 高电平20-40usData=1;DHT11_delay_us(2);Data=0;DHT11_delay_ms(40);//延时18ms以上Data=1;DHT11_delay_us(30);//延时20-40us
}
//DHT11接收字节
uchar DHT11_rec_byte()      //接收一个byte(8bit)
{//处理响应信号 低电平40-50us高电平40-50usuchar i,dat=0;for(i=0;i<8;i++)    //从高到低依次接收8位数据{         while(!Data);   //等40-50us//通过高电平持续时间分别0和1(二进制)//低电平为bit位分割DHT11_delay_us(10);     //延时60us,如果还为高则数据为1,否则为0//数据信号dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位if(Data==1)    //数据为1时,使dat加1来接收数据1dat+=1;//分割Bit位数据while(Data);  //等待数据线拉低   }  return dat;
}
//DHT11接收数据
void DHT11_receive()      //接收40bit数据(5byte)
{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);  //拉高后延时80usR_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_dat1[0]='0'+(RH/10);rec_dat1[1]='0'+(RH%10);rec_dat1[2]='R';rec_dat1[3]='H';
//温度处理rec_dat2[0]='0'+(TH/10);rec_dat2[1]='0'+(TH%10);rec_dat2[2]=0xdf;rec_dat2[3]=0x43;//摄氏度符号}
}//主函数
void main()   
{   LCD_init();//LCD初始化LCD_send(1,0,"HUM:",4);//湿度标题LCD_send(2,0,"TEM:",4);//温度标题DHT11_delay_ms(100);    //DHT11上电后1s内不发送指令  while(1)   {   DHT11_receive();//DHT11接收数据LCD_send(1,5,rec_dat1,4);//LCD数据显示LCD_send(2,5,rec_dat2,4);//LCD数据显示}   
}   

  7 硬件工程师笔试面试相关文章链接(部分链接)

更多文章可前往主页观看

1、硬件工程师笔面试真题汇总(2025版本)_硬件工程师面试题-CSDN博客https://blog.csdn.net/XU157303764/article/details/140742900?spm=1011.2415.3001.5331硬件工程师笔试面试高频考点汇总——(2025版)_电容或者电感对锁存器的影响-CSDN博客https://blog.csdn.net/XU157303764/article/details/1488349782、硬件工程师笔试面试汇总(2025版本)_硬件工程师面试题-CSDN博客https://blog.csdn.net/XU157303764/article/details/1419048583、硬件工程师笔试面试学习汇总——器件篇目录(2025版本)_【【硬件工程师炼成之路】器件篇(更新中。。。)-CSDN博客https://blog.csdn.net/XU157303764/article/details/142316204

硬件工程师笔记——电子器件汇总大全-CSDN博客https://blog.csdn.net/XU157303764/article/details/147342935?spm=1011.2415.3001.5331Multisim14使用教程详尽版--(2025最新版)-CSDN博客https://blog.csdn.net/XU157303764/article/details/147197406?spm=1011.2415.3001.5331

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

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

相关文章

JavaScript箭头函数与普通函数:两种工作方式的深度解析

文章目录JavaScript箭头函数与普通函数&#xff1a;两种"工作方式"的深度解析 &#x1f3f9;&#x1f19a;&#x1f468;&#x1f4bc;引言&#xff1a;为什么需要箭头函数&#xff1f;核心区别全景图对比表格&#xff1a;箭头函数 vs 普通函数关系示意图一、this绑定…

蓝光三维扫描技术赋能内衣胸垫设计:从精准制造到个性化体验的革新之旅

在竞争激烈的内衣市场中&#xff0c;产品设计的精准性、舒适度和个性化已成为品牌制胜的关键。传统内衣设计依赖主观经验与样品反复调整&#xff0c;不仅周期长、成本高&#xff0c;且难以实现对复杂胸型的精准适配。为应对这一挑战&#xff0c;某知名内衣品牌采用新拓三维XTOM…

内存保护单元MPU

一、介绍内存保护单元 是一种硬件模块&#xff0c;通常集成在处理器内核中&#xff0c;用于管理和管理对内存的访问&#xff0c;以提高系统的可靠性和安全性。它的核心任务是保护。想象一下&#xff0c;一个操作系统中有多个任务在运行&#xff1a;* 任务A的代码 bug 可能会错误…

【Kubernetes知识点】监控升级,备份及Kustomize管理

目录 1.举例说明K8s中都有哪些常规的维护管理操作。 2.如何升级K8s到新的版本&#xff1f;在升级过程中应该注意哪些事项&#xff1f; 3.解释ETCD及其备份和恢复的过程。 4.Kustomization在Kubernetes中的作用 1.举例说明K8s中都有哪些常规的维护管理操作。 集群状态监控…

《Effective Java》第4条:通过私有构造器强化不可实例化的能力

说明&#xff1a; 关于本博客使用的书籍&#xff0c;源代码Gitee仓库 和 其他的相关问题&#xff0c;请查看本专栏置顶文章&#xff1a;《Effective Java》第0条&#xff1a;写在前面&#xff0c;用一年时间来深度解读《Effective Java》这本书 正文&#xff1a; 原文P15&am…

20.Linux进程信号(一)

信号: 产生->保存->处理一、预备知识信号vs信号量->没有任何关系什么叫做信号&#xff1f;中断我们正在做的事情&#xff0c;是一种事件的异步通知机制。同步和异步理解&#xff1a;同步指事件发生具有一定的顺序性&#xff08;如命名管道中服务端读方式打开会阻塞&am…

【C++】Vector核心实现:类设计到迭代器陷阱

vector 模拟实现代码的核心下面从类设计、核心接口、内存安全、常见陷阱、测试场景5 个维度&#xff0c;提炼需重点掌握的知识点&#xff0c;覆盖面试高频考点与实践易错点&#xff1a;一、类结构与成员变量&#xff08;基础框架&#xff09;vector 的核心是通过三个迭代器&…

并发编程指南 内存模型

文章目录5.1 内存模型5.1.1 对象和内存位置5.1.2 对象、内存位置和并发5.1.3 修改顺序5.1 内存模型 内存模型&#xff1a;一方面是内存布局&#xff0c;另一方面是并发。并发的基本结构很重要&#xff0c;特别是低层原子操作。因为C所有的对象都和内存位置有关&#xff0c;所以…

血缘元数据采集开放标准:OpenLineage Integrations Compatibility Tests Structure

OpenLineage 是一个用于元数据和血缘采集的开放标准&#xff0c;专为在作业运行时动态采集数据而设计。它通过统一的命名策略定义了由作业&#xff08;Job&#xff09;、运行实例&#xff08;Run&#xff09;和数据集&#xff08;Dataset&#xff09; 组成的通用模型&#xff0…

执行一条select语句期间发生了什么?

首先是连接器的工作&#xff0c;嗯&#xff0c;与客户端进行TCP三次握手建立连接&#xff0c;校验客户端的用户名和密码&#xff0c;如果用户名和密码都对了&#xff0c;那么就会检查该用户的权限&#xff0c;之后执行的所有SQL语句都是基于该权限接着客户端就可以向数据库发送…

element el-select 默认选中数组的第一个对象

背景&#xff1a;在使用element组件的时候&#xff0c;我们期望默认选中第一个数值。这里我们默认下拉列表绑定的lable是中文文字&#xff0c;value绑定的是数值。效果展示&#xff1a;核心代码&#xff1a;<template><el-select v-model"selectValue" plac…

【论文阅读】LightThinker: Thinking Step-by-Step Compression (EMNLP 2025)

论文题目&#xff1a;LightThinker: Thinking Step-by-Step Compression 论文来源&#xff1a;EMNLP 2025&#xff0c;CCF B 论文作者&#xff1a; 论文链接&#xff1a;https://arxiv.org/abs/2502.15589 论文源码&#xff1a;https://github.com/zjunlp/LightThinker 一、…

ABAQUS多尺度纤维增强混凝土二维建模

本案例是通过ABAQUS对论文Study on the tensile and compressive mechanical properties of multi-scale fiber-reinforced concrete: Laboratory test and mesoscopic numerical simulation&#xff08;https://doi.org/10.1016/j.jobe.2024.108852&#xff09;中纤维增强混凝…

C++ ---- 模板的半特化与函数模板的偏特化

在 C 中&#xff0c;模板提供了一种强大的泛型编程方式&#xff0c;使得我们能够编写类型无关的代码。然而&#xff0c;在实际使用中&#xff0c;有时我们需要根据具体的类型或类型组合对模板进行定制&#xff0c;这时就需要用到模板的特化。本文将介绍半模板特化和函数模板的偏…

为何 React JSX 循环需要使用 key

key 是 React 用于识别列表中哪些子元素被改变、添加或删除的唯一标识符 它帮助 React 更高效、更准确地更新和重新渲染列表 1、核心原因&#xff1a;Diff算法与性能优化 React 的核心思想之一是通过虚拟 DOM (Virtual DOM) 来减少对真实 DOM 的直接操作&#xff0c;从而提升性…

Jetson AGX Orin平台R36.3.0版本1080P25fps MIPI相机图像采集行缺失调试记录

1.前言 主板:AGX Orin 官方开发套件 开发版本: R36.3.0版本 相机参数如下: 相机硬件接口: 2. 梳理大致开发流程 核对线序/定制相机转接板 编写camera driver驱动 编写camera dts配置文件 调camera参数/测试出图 前期基本流程就不多介绍了直接讲正题 3. 问题描述 …

力扣hot100:螺旋矩阵(边界压缩,方向模拟)(54)

在解决螺旋矩阵问题时&#xff0c;我们需要按照顺时针螺旋顺序遍历矩阵&#xff0c;并返回所有元素。本文将分享两种高效的解决方案&#xff1a;边界收缩法和方向模拟法。题目描述边界收缩法边界收缩法通过定义四个边界&#xff08;上、下、左、右&#xff09;来模拟螺旋遍历的…

[嵌入式embed][Qt]Qt5.12+Opencv4.x+Cmake4.x_用Qt编译linux-Opencv库 测试

[嵌入式embed][Qt]Qt5.12Opencv4.xCmake4.x_用Qt编译linux-Opencv库 & 测试前文:准备环境安装qt-opencv必备库git-clone opencv库编译opencv库特殊:opencv编译的include,编译出来后多嵌套了一层文件夹,手工处理下改为include/opencv2测试demo新建项目QOpencv3.promain.cpp百…

百度智能云「智能集锦」自动生成短剧解说,三步实现专业级素材生产

备受剪辑压力困扰的各位自媒体老板、MCN 同学们、投放平台大佬们&#xff0c;解放双手和大脑的好机会它来了&#xff01; 在这个数字化飞速发展的时代&#xff0c;智能技术正以前所未有的速度改变着我们的生活与工作方式。百度智能云&#xff0c;作为智能科技的引领者&#xf…

FPGA笔试面试常考问题及答案汇总

经历了无数的笔试面试之后&#xff0c;不知道大家有没有发现FPGA的笔试面试还是有很多共通之处和规律可循的。所以一定要掌握笔试面试常考的问题。FPGA设计方向&#xff08;部分题目&#xff09;1. 什么是同步逻辑和异步逻辑&#xff1f;同步逻辑 是指在同一个时钟信号的控制下…