这次我们来看一个非常经典的单片机综合实训题目:三路抢答器。很多学校《单片机原理与应用》《微机原理》课程设计都会选这个题,网上也有各种版本,但大部分资料要么只有代码,要么只有原理图,缺少一套能在 Proteus 里直接仿真、配合 Keil 烧录验证的完整流程。这篇文章就围绕“三路抢答器设计 Proteus 仿真设计”展开,把硬件电路、程序逻辑、Proteus 仿真步骤、Keil 工程配置、常见问题一次讲清楚。
先说结论:这个项目的门槛不高,51 单片机 + Proteus 8 + Keil 5 就能跑通,不需要买开发板,也不需要额外的元器件成本。你可以在 Proteus 里完成按键输入、LED 指示、数码管显示、蜂鸣器提示、复位控制,甚至扩展出抢答计时和违规判断功能。对课程设计、毕业设计预研、或者刚学单片机想找项目练手的同学来说,都很合适。
本文会带读者完成以下内容:
- 分析三路抢答器的功能需求和电路结构
- 在 Proteus 中完成元器件选型、原理图绘制和仿真连接
- 使用 Keil 5 编写 51 单片机 C 语言程序,并生成 HEX 文件
- 将 HEX 文件加载到 Proteus 单片机中运行
- 进行功能测试:正常抢答、锁定、复位、计时扩展
- 整理常见仿真问题和排查方法
1. 三路抢答器核心功能与项目规格
三路抢答器虽然名字里带“抢答器”,但它并不只是三个按键加三个灯。一个完整的课程设计版本,通常要包含以下几个核心模块:
| 功能模块 | 说明 |
|---|---|
| 抢答输入 | 3 个按键,分别代表 1 号、2 号、3 号选手或队伍 |
| 抢答锁定 | 一旦有人按下按键,其他按键不再响应,直到主持人复位 |
| 选手指示 | 通过 LED 或数码管显示当前抢答成功的选手编号 |
| 抢答计时 | 显示抢答剩余时间或抢答后答题倒计时 |
| 超时判断 | 在允许抢答时间内无人按键,提示超时 |
| 复位控制 | 主持人按下复位键,系统回到待抢答状态 |
| 声音提示 | 抢答成功或超时时,蜂鸣器发出提示音 |
从 Proteus 仿真设计的角度看,这些功能全部可以在软件中实现。其核心控制器件是 51 系列单片机,比如 AT89C51 或 AT89C52,这两种型号在 Proteus 元件库中都可以直接找到。显示器件可以选择 7 段数码管(共阴或共阳)或 LCD1602,简单版本用数码管就够了,扩展版本才用 LCD。
下表是这套设计的规格速览:
| 项目项 | 说明 |
|---|---|
| 主控芯片 | AT89C51 / AT89C52(51 单片机) |
| 按键数量 | 3 个抢答按键 + 1 个复位按键 |
| 输出显示 | LED 指示灯 + 数码管显示编号 |
| 声音输出 | 有源蜂鸣器或无源蜂鸣器 |
| 仿真软件 | Proteus 8.x(支持 8.17、8.15 等版本) |
| 编译环境 | Keil 5(uVision 5) |
| 编程语言 | C 语言 |
| 烧录方式 | Proteus 中直接加载 HEX 文件 |
| 硬件成本 | 仅 Proteus 软件,无需实物元器件 |
| 难度等级 | 中等,适合单片机课程设计 |
从材料看,Proteus 的版本兼容性比较重要。不同版本打开工程时,如果元件库版本不一致,会出现元件找不到或仿真崩溃的情况。建议统一使用 Proteus 8.17 或同版本打开工程,并且在 Keil 中生成目标芯片匹配的 HEX 文件。
2. 适用场景与使用边界
这套三路抢答器 Proteus 仿真设计,最直接的使用场景是课程设计和单片机入门项目。很多电子信息类、自动化类专业的学生,会在《单片机原理及应用》课程中遇到这个题目。使用 Proteus 做仿真,可以避免硬件焊接和元器件采购的问题,也能快速验证程序逻辑。对于老师来说,仿真工程也比实物更方便检查和评分。
除了课程设计,这个项目还可以用于以下场景:
- 单片机竞赛培训的入门练习
- 学习 51 单片机外部中断、定时器、数码管动态扫描
- 验证“抢答器”类控制逻辑的程序框架
- 为后续扩展多路抢答器、计时计分抢答器做基础版本
使用边界也要说明。Proteus 仿真无法完全模拟真实硬件中的按键抖动、电源噪声、蜂鸣器驱动电流等问题。仿真通过不代表实物一定稳定,尤其是按键消抖逻辑,在仿真中可能看不出差异,但做成实物后必须严格处理。另外,如果只是用 Proteus 仿真,不需要真实烧录;如果后续要做实物,还需要焊接能力、下载器和测量工具。
合规方面,使用 Proteus 软件时应安装正版或授权版本,避免使用来历不明的破解补丁和激活工具。题目的完整工程和代码如果是参考他人开源资料,发布或提交作业时应注明来源,不直接照搬。
3. 三路抢答器电路设计与元器件清单
在 Proteus 中设计三路抢答器,首先需要明确电路结构。整体来看,系统由单片机最小系统、按键输入电路、LED 指示电路、数码管显示电路、蜂鸣器提示电路组成。
3.1 元器件清单
下表是 Proteus 仿真中常用的元件清单,所有元件都可以在 Proteus 元件关键字中搜索到。
| 元件名称 | Proteus 搜索关键字 | 数量 | 作用 |
|---|---|---|---|
| AT89C51 | AT89C51 | 1 | 主控单片机 |
| 电阻 | RES | 若干 | 限流、上拉 |
| 按键 | BUTTON | 4 | 3 个抢答键 + 1 个复位键 |
| LED | LED-RED / LED-GREEN / LED-YELLOW | 3 | 选手指示灯 |
| 7 段数码管 | 7SEG-MPX4-CC 或 7SEG-MPX4-CA | 1 | 显示选手编号和计时 |
| 共阳/共阴数码管 | 7SEG-COM-CAT-... | 可选 | 单个数码管 |
| 有源蜂鸣器 | BUZZER | 1 | 声音提示 |
| 晶振 | CRYSTAL | 1 | 12MHz |
| 电容 | CAP | 若干 | 复位电路、晶振电路 |
| 电解电容 | CAP-ELEC | 1 | 复位电路 |
3.2 单片机最小系统
AT89C51 的最小系统包括电源、复位电路和晶振电路。Proteus 中通常可以直接连接 VCC 和 GND,不需要额外画出电源电路。复位电路使用 10uF 电容和 10kΩ 电阻,接 RST 引脚。晶振电路使用 12MHz 晶振,接 XTAL1 和 XTAL2,配合两个 30pF 电容接地。
3.3 按键输入电路
三路抢答器的输入部分为三个按键,分别接到单片机三个 I/O 口。按键一端接 I/O 口,另一端接地。单片机内部或外部配置上拉电阻,按键按下时,I/O 口读到低电平。
需要注意按键的编号映射关系。比如:
| 按键 | 选手编号 | 单片机引脚 |
|---|---|---|
| K1 | 1 号 | P1.0 |
| K2 | 2 号 | P1.1 |
| K3 | 3 号 | P1.2 |
| K4 | 复位 | P1.3 或 P3.2 |
3.4 显示电路
最简单的显示方案是使用三个 LED,分别对应三路选手。抢答成功后,对应的 LED 亮起。为了显示选手编号,可以再加一个共阳或共阴数码管,通过 P0 或 P2 口控制段码,P2 或 P3 口控制位选。数码管显示选手编号 1、2、3,可以直观看出谁抢到了答题权。
3.5 蜂鸣器电路
蜂鸣器可以接在 P1.4 口,通过三极管驱动。在 Proteus 仿真中,有时可以直接用 BUZZER 元件连接 I/O 口,但为了接近实物,还是建议加入 NPN 三极管(如 2N2222)和限流电阻。这样仿真更真实,后面转实物也更方便。
4. 三路抢答器 Proteus 仿真环境准备
在开始绘制原理图之前,先确认一下 Proteus 和 Keil 的安装情况。Proteus 主要有 7 和 8 两个大版本,8.x 的界面和元件库更丰富,也更适合单片机仿真。从常见情况看,Proteus 8.17 是比较新的版本,可以直接打开大多数旧版本工程,但旧版本不一定能打开新版本保存的工程,这一点要特别注意。
4.1 安装检查清单
| 检查项 | 要求 |
|---|---|
| Proteus 版本 | Proteus 8.x,建议 8.17 或 8.15 |
| Keil 版本 | Keil uVision 5,支持 C51 编译器 |
| 操作系统 | Windows 10 / Windows 11 |
| 单片机模型 | AT89C51 / AT89C52 |
| 编译输出 | HEX 文件 |
| 仿真文件 | .pdsprj 或 .DSN 工程文件 |
如果电脑上还没有安装 Keil 的 C51 支持包,可能在编译 51 工程时会报错“Target not created”,需要先安装 C51 编译器,或者在 Keil 中正确选择芯片型号为 AT89C51。
4.2 创建 Proteus 工程
第一次创建工程时,可以按下面的步骤操作:
- 打开 Proteus 8,点击“File” -> “New Project”。
- 输入工程名称和保存路径。
- 在原理图编辑界面中,点击左侧“Component Mode”图标,再点击“P”打开元件库。
- 在关键字中搜索 AT89C51,双击添加到对象列表。
- 依次添加电阻、按键、LED、数码管、蜂鸣器等元件。
- 将元件放置到原理图中,调整位置。
很多版本中,左侧工具栏的“Component Mode”用于放置元件,“Virtual Instruments Mode”用于放置虚拟仪器,比如示波器、逻辑分析仪等。这个项目不需要虚拟仪器,主要使用基本元件。
5. 三路抢答器程序设计思路
三路抢答器的核心逻辑并不复杂,但要把功能做得完整,需要想清楚状态切换。整个系统可以分成以下三种状态:
| 状态 | 说明 | 进入条件 |
|---|---|---|
| 待抢答状态 | 系统等待选手按键,数码管显示“0”,LED 全灭 | 系统初始上电或主持人按下复位键 |
| 抢答成功状态 | 某一位选手按键有效,系统锁定,显示对应编号,对应 LED 亮起 | 三个抢答键中任意一个被按下 |
| 超时状态 | 在设定的抢答时间(如 10 秒)内无人按键,系统提示超时 | 定时时间到,没有任何按键按下 |
在程序实现中,可以使用查询方式,也可以使用外部中断方式。查询方式更直观,适合课程设计;外部中断方式更接近真实抢答器,但理解起来稍微复杂一点。
5.1 查询方式
查询方式的思路是:主循环不断读取 P1 口低三位,判断哪一个按键按下。如果检测到低电平,则进入锁定状态,保存选手编号,更新显示和 LED,然后屏蔽后续按键。
核心代码如下:
#include <reg51.h> sbit K1 = P1^0; sbit K2 = P1^1; sbit K3 = P1^2; sbit BEEP = P1^4; sbit LED1 = P2^0; sbit LED2 = P2^1; sbit LED3 = P2^2; unsigned char code table[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; unsigned char winner = 0; bit locked = 0; void delay(unsigned int t) { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 120; j++); } void display(unsigned char num) { P0 = table[num]; } void beep() { unsigned char i; for (i = 0; i < 3; i++) { BEEP = 0; delay(100); BEEP = 1; delay(100); } } void main() { P0 = 0x00; P2 = 0x00; display(0); while (1) { if (!locked) { if (K1 == 0) { delay(10); if (K1 == 0) { winner = 1; locked = 1; } } else if (K2 == 0) { delay(10); if (K2 == 0) { winner = 2; locked = 1; } } else if (K3 == 0) { delay(10); if (K3 == 0) { winner = 3; locked = 1; } } } if (locked) { display(winner); if (winner == 1) LED1 = 0; if (winner == 2) LED2 = 0; if (winner == 3) LED3 = 0; beep(); while (1); } } }这个版本是最基础的三路抢答逻辑。进入锁定后会进入死循环,直到单片机复位。实际项目中,可以让复位键重新把 locked 置 0,而不是依赖单片机硬件复位。
5.2 带计时的扩展版本
如果要加入抢答倒计时功能,就需要使用定时器。常见方案是设定 10 秒抢答时间,10 秒内无按键则超时。使用定时器 0 产生 50ms 中断,累计 20 次为 1 秒,在中断中刷新倒计时。
核心代码如下:
#include <reg51.h> sbit K1 = P1^0; sbit K2 = P1^1; sbit K3 = P1^2; sbit K4 = P1^3; sbit BEEP = P1^4; unsigned char code table[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; unsigned char sec = 10; unsigned char t50ms = 0; bit locked = 0; bit timeout = 0; unsigned char winner = 0; void timer0_init() { TMOD = 0x01; TH0 = (65536 - 46080) / 256; TL0 = (65536 - 46080) % 256; ET0 = 1; EA = 1; TR0 = 1; } void timer0_isr() interrupt 1 { TH0 = (65536 - 46080) / 256; TL0 = (65536 - 46080) % 256; t50ms++; if (t50ms >= 20) { t50ms = 0; if (!locked && !timeout && sec > 0) { sec--; } if (sec == 0) { timeout = 1; } } }这里使用的是 12MHz 晶振,定时器 0 工作在方式 1,50ms 定时初值按 12MHz 计算是 0x3CB0。具体初值计算方式为65536 - 50000,因为 12MHz 晶振下的机器周期是 1μs,50ms 对应 50000 个机器周期。
5.3 使用外部中断的版本
如果希望按键响应更快,可以把三个抢答按键接到外部中断引脚 P3.2(INT0)和 P3.3(INT1),但 51 单片机只有两个外部中断,三个按键不够分配。更合理的做法是,把三个按键通过“或门”或二极管并联后接到 INT0,进入中断后读取 P1 口判断具体哪个按键按下。
这种方案程序稍微复杂一些,但更符合“抢答”的实时性要求。
6. Proteus 仿真与 Keil 联调步骤
Proteus 仿真本身不直接运行 C 语言,它需要 HEX 文件。所以整个流程是:先在 Keil 中写 C 代码,编译生成 HEX 文件,然后在 Proteus 中双击单片机,加载 HEX 文件,点击运行。
6.1 Keil 工程配置
在 Keil 中创建工程的步骤如下:
- 打开 Keil uVision5,点击“Project” -> “New uVision Project”。
- 输入工程名称,保存。
- 在弹出的 Select Device 对话框中,选择 Atmel -> AT89C51。
- 点击“Options for Target”(魔术棒图标)。
- 在“Output”选项卡中,勾选“Create HEX File”。
- 编写 C 代码,点击“Build”编译。
- 编译成功后,在工程目录的 Objects 文件夹下生成 .hex 文件。
如果编译报错C51 not installed,通常是因为 Keil 只安装了 MDK-ARM,没有安装 C51 支持包。需要安装 Keil C51 版,也就是带“C51”字样的安装包。
6.2 Proteus 中加载 HEX 文件
在 Proteus 中,双击原理图中的 AT89C51 芯片,打开 Edit Component 对话框。在 Program File 一栏中,选择 Keil 生成的 HEX 文件,点击 OK。然后点击仿真运行按钮,即可看到仿真结果。
如果程序没有运行,先检查以下几点:
- 是否已加载 HEX 文件
- 晶振频率是否设置为 12MHz
- 复位电路是否正常
- 电源 VCC 和 GND 是否连接
- 单片机型号是否与 Keil 中一致
6.3 仿真测试流程
启动仿真后,可以按以下流程测试:
- 初始状态:数码管显示 0,三个 LED 全灭。
- 按下 K1,数码管显示 1,LED1 亮起。
- 按下 K2,数码管仍显示 1,LED1 仍亮,表示锁定有效。
- 按下复位键,数码管恢复显示 0,所有 LED 灭,系统回到待抢答状态。
- 等待超过 10 秒不按键,蜂鸣器响,显示超时提示。
在 Proteus 中,按键可以通过鼠标点击操作。如果需要测试同时按下多个按键,可以按住键盘上的 Ctrl 再点击按键,但仿真环境毕竟和真实硬件不同,建议逐个测试即可。
7. 三路抢答器功能测试与效果验证
功能测试是 Proteus 仿真设计中最重要的环节。很多同学代码写完了,运行却不正常,多数情况下是电路连接错误或 HEX 文件没有正确加载。下面按功能模块给出测试方法和判断标准。
7.1 基础抢答测试
| 测试项 | 操作 | 预期结果 |
|---|---|---|
| 1 号抢答 | 按下 K1 | 数码管显示 1,LED1 亮 |
| 2 号抢答 | 按下 K2 | 数码管显示 2,LED2 亮 |
| 3 号抢答 | 按下 K3 | 数码管显示 3,LED3 亮 |
| 多键同时按下 | 同时按 K1 和 K2 | 只有先判定的一路有效 |
| 抢答后的锁定 | 1 号抢答成功后按 K2 | 显示仍为 1,不切换到 2 |
这里需要注意,无论用查询方式还是中断方式,程序内部都会有一个“锁定标志”。一旦某个按键被成功判定,后面所有按键都应该被忽略。这是抢答器区别于普通按键输入的关键。
7.2 复位功能测试
在抢答锁定状态下,按下复位键。复位有两种实现方式:
- 硬件复位:按键直接接单片机 RST 引脚,按下后单片机重启。
- 软件复位:按键接普通 I/O 口,程序检测到低电平后手动清除锁定标志。
软件复位更容易控制,推荐在课程设计中使用。复位后需要恢复初始变量:
winner = 0; locked = 0; timeout = 0; sec = 10; t50ms = 0; P0 = 0x00; P2 = 0x00;7.3 数码管显示测试
数码管显示是排查问题比较多的部分。如果使用 4 位一体数码管,需要区分共阳和共阴。共阳数码管的段码和共阴数码管不同,混用会导致显示乱码。
共阴数码管段码表:
unsigned char code table[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F // 9 };如果 Proteus 中的数码管是共阳,需要把段码取反,也就是0xC0、0xF9、0xA4等。最简单的做法是先在 Proteus 中选中数码管,查看其“Common Cathode”还是“Common Anode”属性,再选择对应的段码表。
7.4 蜂鸣器测试
蜂鸣器在有源和无源两种。有源蜂鸣器通电即响,无源蜂鸣器需要给方波信号才能发声。Proteus 中的 BUZZER 元件通常是有源蜂鸣器,只要给它高电平或低电平,就会鸣响。无源蜂鸣器需要用定时器产生频率可变的方波信号,实现“滴滴”声。
在本项目中,抢答成功可以用短促的“滴”声提示,超时可以用持续声音提示。具体响铃时间可以通过延时函数控制。
8. 三路抢答器常见问题与排查方法
下面整理 Proteus 仿真和 Keil 编译过程中最常见的几个问题。这些问题在课程设计中反复出现,提前了解可以节省大量排查时间。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Proteus 打开工程提示元件缺失 | 版本不一致或元件库路径变化 | 查看缺失元件名称 | 用同版本 Proteus 重新放置元件 |
| Keil 编译报 Target not created | 未安装 C51 编译器或未勾选 Create HEX File | 检查 Output 选项卡 | 安装 C51 编译器,勾选 HEX 输出 |
| 加载 HEX 后单片机不运行 | HEX 文件未加载或芯片型号不匹配 | 双击芯片查看 Program File 栏 | 重新选择 HEX 文件,核对芯片型号 |
| 数码管显示乱码 | 共阳共阴段码表选错 | 查看 Proteus 数码管类型 | 更换段码表 |
| 按键按下没反应 | I/O 口配置错误或上拉电阻缺失 | 检查按键连接和程序引脚定义 | 将按键接到正确引脚并加上拉电阻 |
| 按下第一个键后第二个键也有效 | 程序未设置锁定标志 | 检查主循环逻辑 | 加入 locked 标志并判断 |
| 蜂鸣器不响 | 蜂鸣器类型选错或驱动电路不对 | 检查蜂鸣器两脚电平 | 改用有源蜂鸣器或加三极管驱动 |
| 定时倒计时不准 | 晶振频率和定时器初值不匹配 | 核对晶振和初值参数 | 按 12MHz 重新计算初值 |
| 仿真速度很慢 | 电脑性能不足或仿真频率设置过高 | 观察 CPU 使用率 | 关闭无关软件,降低仿真频率 |
| 程序直接进入 while(1) 出不来了 | 锁定后没有提供软件复位出口 | 检查复位逻辑 | 加入按键复位,清除锁定标志 |
8.1 关于 Proteus 版本的一些注意点
Proteus 8.17 是目前较多使用的版本,可以打开大部分新的工程文件。但是旧版本 Proteus 7 的 .DSN 文件和 Proteus 8 的 .pdsprj 文件并不完全通用。如果从网上下载了工程,打开时提示“This project was saved with a newer version of Proteus”,说明对方使用的版本比你当前的高,安装新版本再打开。
另外,Proteus 元件库中搜索元件时,关键字要准确。比如 AT89C51 可以直接输入“AT89C51”,但如果搜索“89C51”也可能搜到兼容型号。按键通常使用“BUTTON”,数码管使用“7SEG-MPX4-CC”表示 4 位共阴数码管,“7SEG-MPX4-CA”表示 4 位共阳数码管。这些关键字在网上教程中出现频率很高,可以记下来。
8.2 关于 Keil 工程的一些注意点
Keil 中默认优化等级可能影响程序行为。如果在 Proteus 中仿真结果和逻辑预期不符,可以把 Keil 的优化等级调整为 Level 0,也就是不优化,避免编译器对循环或延时函数进行过度优化。
设置路径:Options for Target -> C51 -> Optimize -> Level 0。
这一点在单片机仿真中经常遇到,尤其是代码里有显式延时函数或位操作时,优化级别过高会导致延时时间变化,甚至某些 I/O 操作被优化掉。
9. 三路抢答器扩展方向与最佳实践
三路抢答器做完基础版本后,可以根据课程设计或竞赛需求继续扩展。下面是几个常见的扩展方向。
9.1 扩展为多路抢答器
三路可以扩展为四路、六路、八路甚至更多。扩展的思路是增加按键输入,同时增加 I/O 口数量。如果单片机引脚不够,可以使用 8255A 可编程并行接口芯片,或者使用移位寄存器 74HC165 扩展输入,使用 74HC595 扩展输出。
多路抢答器更适合大型比赛场景,但 Proteus 仿真中如果只是增加几个按键,改动并不大。核心逻辑仍然是锁定第一个按键。
9.2 增加计分功能
在抢答器的基础上,可以增加两到三组分数显示。选手抢答成功后,裁判按键加分或扣分,分数通过数码管显示。这个扩展需要增加按键数量,同时程序需要维护多个分数变量。
计分功能适合作为毕业设计的进阶版本。它的难点在于数码管动态扫描,要同时显示多组分数,刷新频率必须足够高,否则会出现闪烁。
9.3 增加违规抢答检测
如果比赛要求“主持人发出开始指令后选手才能抢答”,可以在程序中设置一个“允许抢答标志位”。主持人按下“开始”键之前,所有抢答按键都无效,并标记为违规状态。这个功能在真实比赛中有实用价值,也更容易让课程设计拿高分。
实现思路:
bit allow_answer = 0; void main() { while (1) { if (start_key == 0) { allow_answer = 1; } if (allow_answer) { // 正常抢答判断 } else { // 检测到按键则记录违规选手编号 } } }9.4 使用 LCD1602 显示提示信息
基础的数码管只能显示数字,如果想让界面更友好,可以用 LCD1602 液晶屏显示“Player 1”“Time: 10”等文字。LCD1602 在 Proteus 中可以直接搜索到,程序上需要使用 LCD 驱动函数。这样做的优点是信息展示更丰富,缺点是程序复杂度明显提高。
10. 三路抢答器 Proteus 仿真设计总结
三路抢答器是单片机课程设计中的经典题目,难度适中,逻辑清晰,非常适合在 Proteus 中完成仿真验证。通过这个项目,可以完整练习单片机 I/O 操作、按键消抖、锁定逻辑、数码管显示、定时器中断、蜂鸣器控制等核心知识点。
真正开始做的时候,建议按下面顺序推进:
- 先在纸上画出功能流程图,明确状态切换。
- 在 Proteus 中搭建最小系统,先用一个 LED 测试单片机是否工作。
- 加入按键输入,用查询方式实现最基本的三路抢答。
- 加入锁定标志,确保抢答后不响应其他按键。
- 加入数码管显示,把按键对应的编号显示出来。
- 最后加入蜂鸣器和倒计时功能。
如果仿真跑不通,优先检查 Hex 文件是否加载、单片机是否上电、按键引脚是否连接正确。程序逻辑上的问题,可以使用 Proteus 的单步调试功能,在 Debug 菜单中打开 8051 CPU 寄存器窗口和变量窗口,观察变量变化。
这个项目的扩展空间也很大,从三路抢答器一路扩展到八路抢答器、带计分抢答器、带违规检测抢答器,都可以作为更完整的课程设计或毕业设计题目。建议先把基础版本跑通,再根据时间决定要不要继续扩展。