【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

相关推荐
欢乐熊嵌入式编程9 小时前
WIFI协议全解析08:WiFi连接背后的握手过程,你的设备是如何“入网”的
网络·嵌入式硬件·智能路由器·wifi协议·wifi连接
cat_milk9 小时前
【STM32】STM32F103系列USB大坑 二
stm32·单片机·嵌入式硬件
范纹杉想快点毕业9 小时前
zynq 开发系列 新手入门:GPIO 连接 MIO 控制 LED 闪烁(SDK 端代码编写详解)
c语言·笔记·stm32·单片机·嵌入式硬件·mcu·物联网
Coision.10 小时前
硬件:51单片机的按键、中断、定时器、PWM及蜂鸣器
linux·嵌入式硬件·51单片机
世微 如初12 小时前
AP5414:高效灵活的LED驱动解决方案,点亮创意生活
单片机·嵌入式硬件
茯苓gao13 小时前
变频器实习DAY42 VF与IF电机启动方式
笔记·嵌入式硬件·学习
苏州向日葵13 小时前
freertos下printf(“hello\r\n“)和printf(“hello %d\r\n“,i)任务堆栈消耗有何区别
单片机
7yewh14 小时前
STM32 IIC SPI 驱动 LPS22HB LPS系列通用
stm32·单片机·嵌入式硬件
小憩-14 小时前
【stm32】定时器中断与定时器外部时钟
stm32·单片机·嵌入式硬件