【Protues仿真】基于AT89C52单片机的温湿度测量

目录

0案例视频效果展示

1DHT11温度湿度传感器

1.1传感器简介

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

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

1.4常见故障排查

[2 DHT11温度湿度传感器数据](#2 DHT11温度湿度传感器数据)

[2.1 DHT11温度湿度传感器数据格式](#2.1 DHT11温度湿度传感器数据格式)

2.1.1数据格式

2.1.2例子

2.13注意

[2.2 DHT11温度湿度传感器数据传输时序](#2.2 DHT11温度湿度传感器数据传输时序)

[2.3 DHT11的数据信号转换](#2.3 DHT11的数据信号转换)

[2.4 DHT11温度湿度传感器数据传输时序实测](#2.4 DHT11温度湿度传感器数据传输时序实测)

[2.5 仿真过程可能遇到的问题](#2.5 仿真过程可能遇到的问题)

[2.5.1 无法读取有效数据](#2.5.1 无法读取有效数据)

[2.5.2 数据失真](#2.5.2 数据失真)

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

3.1连接电路

3.2设置元件参数:

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

[7 硬件工程师笔试面试相关文章链接(部分链接)](#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 信号 (包含响应信号和数据信号)

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

再放大如上图所示

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显示屏上显示。

objectivec 复制代码
//头文件与位定义
#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,输出字符,输出字符长度n
	unsigned 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-40us
   Data=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-50us
   uchar 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来接收数据1
         dat+=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);  //拉高后延时80us
        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_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

相关推荐
代码游侠7 小时前
ARM开发——阶段问题综述(二)
运维·arm开发·笔记·单片机·嵌入式硬件·学习
DLGXY7 小时前
STM32——旋转编码器计次(七)
stm32·单片机·嵌入式硬件
羽获飞7 小时前
从零开始学嵌入式之STM32——3.使用寄存器点亮一盏LED灯
单片机·嵌入式硬件
浩子智控8 小时前
商业航天计算机抗辐射设计
单片机·嵌入式硬件
独处东汉12 小时前
freertos开发空气检测仪之输入子系统结构体设计
数据结构·人工智能·stm32·单片机·嵌入式硬件·算法
czy878747512 小时前
机智云 MCU OTA可以对MCU程序进行无线远程升级。
单片机·嵌入式硬件
A9better14 小时前
嵌入式开发学习日志52——二值与计数信号量
单片机·嵌入式硬件·学习
日更嵌入式的打工仔16 小时前
(实用向)中断服务程序(ISR)的优化方向
笔记·单片机
想放学的刺客16 小时前
单片机嵌入式试题(第25)嵌入式系统可靠性设计与外设驱动异常处理
stm32·单片机·嵌入式硬件·mcu·物联网
wotaifuzao17 小时前
STM32+FreeRTOS 长期可维护架构设计(事件驱动篇)-- 告别“屎山”代码
c语言·stm32·嵌入式硬件·freertos·状态机·事件驱动·嵌入式架构