STC89C52+DHT11+LCD1602 Proteus 仿真完整教程

该文章已生成可运行项目,

一、教程概述

本教程专为单片机入门者设计,详细讲解如何在 Proteus 8 中搭建 STC89C52 单片机驱动 DHT11 温湿度传感器、LCD1602 液晶显示的仿真电路,搭配 Keil5 编写程序,实现温湿度数据的实时采集与显示。全程零实物、纯软件仿真,步骤清晰、截图导向(文中关键步骤标注仿真操作要点),代码可直接复制使用,适合作为入门实战项目或课程设计参考。

二、必备软件工具

软件名称版本要求核心用途下载渠道
Proteus8.6 及以上(推荐 8.15)搭建仿真电路、运行仿真官网或正规软件平台
Keil uVision5任意稳定版本编写 C 语言程序、生成.hex 文件官网(需安装 C51 编译器插件)
STC-ISP最新版本辅助确认单片机型号(可选)STC 单片机官网免费下载

三、仿真电路核心元件清单

元件名称Proteus 搜索关键词数量功能说明
STC89C52 单片机STC89C52RC1 片核心控制单元,处理传感器数据并驱动 LCD
DHT11 温湿度传感器DHT111 个采集环境温湿度(数字式单总线)
LCD1602 液晶LCD1602A1 块16 列 2 行字符显示,展示温湿度值
电位器POT-10K1 个调节 LCD1602 显示对比度
电阻RES-220Ω1 个LCD1602 背光限流,防止烧毁
电阻RES-4K71 个DHT11 数据引脚上拉,稳定通信
电源POWER1 个提供 5V 供电(仿真默认 5V)
接地GROUND若干电路共地,保证信号稳定

四、Proteus 仿真电路搭建步骤(图文详解)

1. 新建 Proteus 项目

  1. 打开 Proteus 软件,点击左上角「File」→「New Project」,输入项目名称(如 “STC89C52_DHT11_LCD1602”),选择保存路径,点击「Next」;
  2. 选择「Create a schematic from scratch」(从零创建原理图),点击「Next」;
  3. 无需添加 PCB 设计(仅仿真),直接点击「Next」,最后点击「Finish」,进入原理图编辑界面。

2. 添加核心元件

  1. 点击左侧工具栏「Pick Devices」(图标为 “P”),打开元件搜索窗口;
  2. 按以下顺序搜索元件,选中后点击「OK」添加到元件库面板:
    • 搜索 “STC89C52RC”:选择单片机型号;
    • 搜索 “DHT11”:温湿度传感器(无需额外配置);
    • 搜索 “LCD1602A”:1602 液晶(并行接口版本);
    • 搜索 “POT-10K”:10KΩ 电位器;
    • 搜索 “RES-220Ω”“RES-4K7”:限流电阻和上拉电阻;
    • 搜索 “POWER”“GROUND”:电源和接地。

3. 电路连接(核心步骤,按模块接线)

(1)LCD1602 与 STC89C52 连接
LCD1602 引脚功能连接对象(STC89C52 引脚)仿真接线要点
VSS电源地GROUND(地)所有地必须相连(共地原则)
VDD电源正极POWER(5V)仿真电源默认输出 5V,无需调整
VO对比度调节POT-10K(电位器中间脚)电位器另外两脚分别接 5V 和地
RS寄存器选择P2.0直接用导线连接,仿真无需考虑接触不良
RW读写控制P2.1读写控制引脚
EN使能控制P2.2关键控制引脚,接线不可错
D0数据 0 位P0.0数据总线1
D1数据 1 位P0.1数据总线2
D2数据 2 位P0.2数据总线3
D3数据 3 位P0.3数据总线4
D4数据 4 位P0.4数据总线5
D5数据 5 位P0.5数据总线6
D6数据 6 位P0.6数据总线7
D7数据 7 位P0.7数据总线8
A背光正极RES-220Ω → POWER(5V)电阻串联在背光回路,仿真也需限流
K背光负极GROUND(地)
(2)DHT11 与 STC89C52 连接
DHT11 引脚功能连接对象(STC89C52 引脚)仿真接线要点
VCC电源正极POWER(5V)DHT11 仿真需 5V 供电,3V 会无响应
DATA数据传输P2.3 + RES-4K7 → 5V上拉电阻必须接,否则通信不稳定
GND电源地GROUND(地)与单片机、LCD 共地

4. 电路搭建完成检查

  1. 所有元件的 GND 引脚必须连接到同一 GROUND(共地),否则仿真会出现数据乱码;
  2. 核对关键引脚:LCD1602 的 D0~D7 对应 P0,DHT11 的 DATA 对应 P2.3+4.7K 上拉电阻;
  3. 电位器接线正确(中间脚接 LCD1602 的 VO,两端接 5V 和地),用于调节 LCD 对比度。

5. 仿真电路预览(文字描述)

  • 核心:STC89C52 单片机居中,左侧连接 DHT11(带 4.7K 上拉电阻),右侧连接 LCD1602(带 220Ω 背光电阻和 10K 电位器);
  • 电源:POWER 模块为所有元件供 5V,GROUND 模块作为公共地;

五、Keil5 程序编写与.hex 文件生成

1. 新建 Keil 项目

  1. 打开 Keil uVision5,点击「Project」→「New μVision Project」,输入项目名称(与 Proteus 项目一致),选择保存路径;
  2. 搜索芯片型号 “STC89C52RC”,选中后点击「OK」;
  3. 弹出 “Copy Standard 8051 Startup Code” 窗口,选择「Yes」(添加启动文件),项目创建完成。

2. 编写程序(完整代码,含详细注释)

  1. 右键点击项目中的「Source Group 1」,选择「Add New Item to Group」,新建「C File」(文件名如 “main.c”),点击「Add」;
  2. lcd1602.c(部分)
/*******************************************************************************
* 函 数 名       : lcd1602_show_string
* 函数功能		 : LCD1602显示字符
* 输    入       : x,y:显示坐标,x=0~15,y=0~1;
				   str:显示字符串
* 输    出    	 : 无
*******************************************************************************/
void lcd1602_show_string(u8 x,u8 y,u8 *str)
{
	u8 i=0;

	if(y>1||x>15)return;//行列参数不对则强制退出

	if(y<1)	//第1行显示
	{	
		while(*str!='\0')//字符串是以'\0'结尾,只要前面有内容就显示
		{
			if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示
			{
				lcd1602_write_cmd(0x80+i+x);//第一行显示地址设置	
			}
			else
			{
				lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行显示地址设置	
			}
			lcd1602_write_data(*str);//显示内容
			str++;//指针递增
			i++;	
		}	
	}
	else	//第2行显示
	{
		while(*str!='\0')
		{
			if(i<16-x) //如果字符长度超过第二行显示范围,则在第一行继续显示
			{
				lcd1602_write_cmd(0x80+0x40+i+x);	
			}
			else
			{
				lcd1602_write_cmd(0x80+i+x-16);	
			}
			lcd1602_write_data(*str);
			str++;
			i++;	
		}	
	}				
}

3.lcd1602.h

/**
 ****************************************************************************************************
 * @file        lcd1602.h
 * @author      送外卖的工程师
 * @version     V1.0
 * @date        2025-11-23
 * @brief       屏幕驱动代码
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:STC89C52
 *     CSDN:送外卖的工程师
 * 技术指导VX:wmz14026
 * 淘宝店铺:小马科技
 * 闲鱼店铺:送外卖的工程师
 *
 * 修改说明
 * V1.0.0.251123
 * 第一次发布
 * 注:长期接各种项目设计,提供仿真、实物、原理图、PCB、代码工程、后期指导、操作视频、
   说明文档、各种报告、后期指导等。
 ****************************************************************************************************
 */
#ifndef _lcd1602_H
#define _lcd1602_H
#include "public.h"

//LCD1602数据口4位和8位定义,若为1,则为LCD1602四位数据口驱动,反之为8位
#define LCD1602_4OR8_DATA_INTERFACE	0	//默认使用8位数据口LCD1602

//管脚定义
sbit LCD1602_RS=P2^0;//数据命令选择
sbit LCD1602_RW=P2^1;//读写选择
sbit LCD1602_E=P2^2; //使能信号
#define LCD1602_DATAPORT P0	//宏定义LCD1602数据端口


//函数声明
void lcd1602_init(void);
void lcd1602_clear(void);
void lcd1602_show_string(u8 x,u8 y,u8 *str);
#endif

4.DHT11.c(部分)

//接收温湿度数据
void DHT11_receive()
{

	DHT11_start();
	Temp_data=1;
	if(Temp_data==0)
	{
		while(Temp_data==0);   //等待拉高     
        DHT11_delay_us(40);  //拉高后延时85us
		
        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_dat[0]=RH;
        rec_dat[1]=RL;
        rec_dat[2]=TH;
        rec_dat[3]=TL;
	}	
}

5.DHT11.h

/**
 ****************************************************************************************************
 * @file        dht11.c
 * @author      送外卖的工程师
 * @version     V1.0
 * @date        2025-11-23
 * @brief       DHT11温湿度传感器 驱动代码
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:STC89C52
 *     CSDN:送外卖的工程师
 * 技术指导VX:wmz14026
 * 淘宝店铺:小马科技
 * 闲鱼店铺:送外卖的工程师
 *
 * 修改说明
 * V1.0.0.251201
 * 第一次发布
 * 注:长期接各种项目设计,提供仿真、实物、原理图、PCB、代码工程、后期指导、操作视频、
   说明文档、各种报告、后期指导等。
 ****************************************************************************************************
 */


#ifndef __DHT11_H__
#define __DHT11_H__
#include "reg52.h"
#include "intrins.h"
#include "stdio.h"
#include "public.h"



sbit Temp_data=P2^3;


extern u16 rec_dat[9];


void DHT11_receive();
#endif

3. 生成.hex 文件(仿真核心文件)

  1. 点击 Keil 工具栏「Options for Target」(图标为 “魔术棒”);
  2. 切换到「Output」选项卡,勾选「Create HEX File」,点击「OK」;
  3. 点击工具栏「Build」(编译)或「Rebuild」(重新编译),底部输出窗口显示 “0 Errors, 0 Warnings” 即为编译成功,在项目文件夹中生成「.hex」文件(如 “main.hex”)。

六、Proteus 加载程序与仿真运行

1. 加载.hex 文件到单片机

  1. 在 Proteus 原理图中,双击 STC89C52 单片机,弹出「Edit Component」窗口;
  2. 在「Program File」选项后点击「...」,选择 Keil 生成的「.hex」文件;
  3. 其他参数默认(晶振默认 12MHz,与程序延时匹配),点击「OK」完成加载。

2. 启动仿真与操作

  1. 点击 Proteus 左下角「Start Simulation」按钮(图标为三角形,类似播放器播放键),启动仿真;
  2. 观察 LCD1602 屏幕:先显示 “Simulating...”,2 秒后清屏,随后显示温湿度值(如 “Temp: 25 C”“Humi: 60 % RH”);
  3. 调节电位器:若 LCD 显示过暗或过亮,右键点击电位器,选择「Adjust」,拖动滑块调节对比度,直到显示清晰;
  4. 停止仿真:点击左下角「Stop Simulation」按钮(正方形图标)。

3. 仿真数据修改(可选,测试不同场景)

DHT11 在 Proteus 中默认输出固定温湿度,若需修改数据:

  1. 点击 DHT11 传感器,下方按钮,选择温度或者湿度,通过点击加减改变其数值;
  2. LCD 会显示修改后的温湿度值。

七、仿真常见问题与排查(重点!)

问题现象可能原因解决方法
LCD1602 有背光但无字符1. 对比度调节不当;2. LCD 引脚接线错误;3. 程序初始化失败1. 调节电位器滑块;2. 核对 RS、EN、D0~D7 接线;3. 检查 Keil 程序是否编译成功
显示 “DHT11 Error!”1. DHT11 DATA 引脚未接上拉电阻;2. 数据引脚接线错误;3. 仿真时序不匹配1. 添加 4.7KΩ 上拉电阻(DATA→电阻→5V);2. 确认 DATA 接 P2.3;3. 无需修改延时
温湿度显示乱码1. 共地错误(部分元件未接地);2. 校验和计算错误1. 检查所有元件 GND 是否连接到同一 GROUND;2. 重新编译 Keil 程序(复制完整代码)
仿真启动后无反应1. 单片机未加载.hex 文件;2. 电源未连接1. 双击单片机重新加载.hex 文件;2. 确认 STC89C52 的 VCC 接 POWER、GND 接地
LCD 背光不亮1. 背光引脚 A 未接 5V;2. 220Ω 限流电阻遗漏1. 检查 LCD1602 的 A 引脚接 5V;2. 添加 220Ω 电阻到背光回路

八、仿真拓展与优化

  1. 增加实时时钟:添加 DS1302 芯片,在 LCD 上显示 “日期 + 时间 + 温湿度”,仿真中可修改时钟参数;
  2. 报警功能:添加 LED 灯(LED-RED)和蜂鸣器(BUZZER),设置温湿度阈值(如温度 > 30℃),超标时 LED 闪烁、蜂鸣器报警;
  3. 串口输出:在 Proteus 中添加虚拟串口(VIRTUAL TERMINAL),修改程序将温湿度数据发送到串口,仿真中查看串口输出;
  4. 传感器替换:将 DHT11 替换为 DHT22(搜索 “DHT22”),修改程序中数据读取逻辑,实现更高精度温湿度显示。
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

送外卖的工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值