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

二、必备软件工具
| 软件名称 | 版本要求 | 核心用途 | 下载渠道 |
|---|---|---|---|
| Proteus | 8.6 及以上(推荐 8.15) | 搭建仿真电路、运行仿真 | 官网或正规软件平台 |
| Keil uVision5 | 任意稳定版本 | 编写 C 语言程序、生成.hex 文件 | 官网(需安装 C51 编译器插件) |
| STC-ISP | 最新版本 | 辅助确认单片机型号(可选) | STC 单片机官网免费下载 |
三、仿真电路核心元件清单
| 元件名称 | Proteus 搜索关键词 | 数量 | 功能说明 |
|---|---|---|---|
| STC89C52 单片机 | STC89C52RC | 1 片 | 核心控制单元,处理传感器数据并驱动 LCD |
| DHT11 温湿度传感器 | DHT11 | 1 个 | 采集环境温湿度(数字式单总线) |
| LCD1602 液晶 | LCD1602A | 1 块 | 16 列 2 行字符显示,展示温湿度值 |
| 电位器 | POT-10K | 1 个 | 调节 LCD1602 显示对比度 |
| 电阻 | RES-220Ω | 1 个 | LCD1602 背光限流,防止烧毁 |
| 电阻 | RES-4K7 | 1 个 | DHT11 数据引脚上拉,稳定通信 |
| 电源 | POWER | 1 个 | 提供 5V 供电(仿真默认 5V) |
| 接地 | GROUND | 若干 | 电路共地,保证信号稳定 |
四、Proteus 仿真电路搭建步骤(图文详解)
1. 新建 Proteus 项目
- 打开 Proteus 软件,点击左上角「File」→「New Project」,输入项目名称(如 “STC89C52_DHT11_LCD1602”),选择保存路径,点击「Next」;
- 选择「Create a schematic from scratch」(从零创建原理图),点击「Next」;
- 无需添加 PCB 设计(仅仿真),直接点击「Next」,最后点击「Finish」,进入原理图编辑界面。
2. 添加核心元件
- 点击左侧工具栏「Pick Devices」(图标为 “P”),打开元件搜索窗口;
- 按以下顺序搜索元件,选中后点击「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. 电路搭建完成检查
- 所有元件的 GND 引脚必须连接到同一 GROUND(共地),否则仿真会出现数据乱码;
- 核对关键引脚:LCD1602 的 D0~D7 对应 P0,DHT11 的 DATA 对应 P2.3+4.7K 上拉电阻;
- 电位器接线正确(中间脚接 LCD1602 的 VO,两端接 5V 和地),用于调节 LCD 对比度。
5. 仿真电路预览(文字描述)
- 核心:STC89C52 单片机居中,左侧连接 DHT11(带 4.7K 上拉电阻),右侧连接 LCD1602(带 220Ω 背光电阻和 10K 电位器);
- 电源:POWER 模块为所有元件供 5V,GROUND 模块作为公共地;
五、Keil5 程序编写与.hex 文件生成
1. 新建 Keil 项目
- 打开 Keil uVision5,点击「Project」→「New μVision Project」,输入项目名称(与 Proteus 项目一致),选择保存路径;
- 搜索芯片型号 “STC89C52RC”,选中后点击「OK」;
- 弹出 “Copy Standard 8051 Startup Code” 窗口,选择「Yes」(添加启动文件),项目创建完成。
2. 编写程序(完整代码,含详细注释)
- 右键点击项目中的「Source Group 1」,选择「Add New Item to Group」,新建「C File」(文件名如 “main.c”),点击「Add」;
- 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 文件(仿真核心文件)
- 点击 Keil 工具栏「Options for Target」(图标为 “魔术棒”);
- 切换到「Output」选项卡,勾选「Create HEX File」,点击「OK」;
- 点击工具栏「Build」(编译)或「Rebuild」(重新编译),底部输出窗口显示 “0 Errors, 0 Warnings” 即为编译成功,在项目文件夹中生成「.hex」文件(如 “main.hex”)。
六、Proteus 加载程序与仿真运行
1. 加载.hex 文件到单片机
- 在 Proteus 原理图中,双击 STC89C52 单片机,弹出「Edit Component」窗口;
- 在「Program File」选项后点击「...」,选择 Keil 生成的「.hex」文件;
- 其他参数默认(晶振默认 12MHz,与程序延时匹配),点击「OK」完成加载。
2. 启动仿真与操作
- 点击 Proteus 左下角「Start Simulation」按钮(图标为三角形,类似播放器播放键),启动仿真;
- 观察 LCD1602 屏幕:先显示 “Simulating...”,2 秒后清屏,随后显示温湿度值(如 “Temp: 25 C”“Humi: 60 % RH”);
- 调节电位器:若 LCD 显示过暗或过亮,右键点击电位器,选择「Adjust」,拖动滑块调节对比度,直到显示清晰;
- 停止仿真:点击左下角「Stop Simulation」按钮(正方形图标)。

3. 仿真数据修改(可选,测试不同场景)
DHT11 在 Proteus 中默认输出固定温湿度,若需修改数据:
- 点击 DHT11 传感器,下方按钮,选择温度或者湿度,通过点击加减改变其数值;
- 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Ω 电阻到背光回路 |
八、仿真拓展与优化
- 增加实时时钟:添加 DS1302 芯片,在 LCD 上显示 “日期 + 时间 + 温湿度”,仿真中可修改时钟参数;
- 报警功能:添加 LED 灯(LED-RED)和蜂鸣器(BUZZER),设置温湿度阈值(如温度 > 30℃),超标时 LED 闪烁、蜂鸣器报警;
- 串口输出:在 Proteus 中添加虚拟串口(VIRTUAL TERMINAL),修改程序将温湿度数据发送到串口,仿真中查看串口输出;
- 传感器替换:将 DHT11 替换为 DHT22(搜索 “DHT22”),修改程序中数据读取逻辑,实现更高精度温湿度显示。

424

被折叠的 条评论
为什么被折叠?



