恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
四人智力竞赛抢答器设计:从锁存逻辑到单片机实现
首页
资讯中心
/
四人智力竞赛抢答器设计:从锁存逻辑到单片机实现
四人智力竞赛抢答器设计:从锁存逻辑到单片机实现
发布时间:2026/10/15 5:05:18
简介这份四人智力竞赛抢答器完整课程设计面向电子信息、自动化等专业学生及需要完成课程设计或电子制作实践的读者围绕抢答器这一典型数字电路课题提供完整方案。资源包共1个doc文档约857KB内容涵盖前言、总体方案设计与论证、单元模块设计、主要器件介绍、系统功能调试、总结体会及附录等章节结构完整、便于按模块查阅。设计从硬件与软件两方面展开硬件采用74373、14599等锁存器辅以逻辑门实现第一抢答者信息的存储与信号阻断用555定时器配合减法计数器完成倒计时用十进制可逆计数器实现答对加10分、答错扣10分的计分功能软件部分则探讨以单片机或微控制器实现无线抢答的思路。文中还给出各单元电路分别设计、调试再合成的流程并附有器件原理与调试方法适合作为课程设计参考与数字电路综合练习。目前已有4723人学习下载。1. 四人智力竞赛抢答器从“谁先按下”到“谁先锁存”的工程真相做过四人智力竞赛抢答器课程设计的人大多经历过同一个翻车现场台上四位选手几乎同时拍下按钮数码管却显示两个甚至三个“1”裁判盯着电路板一脸茫然。问题不在按钮也不在选手手速而在于你用的锁存逻辑根本没处理“同时到达”这件事。四人智力竞赛抢答器完整课程设计这个题目表面是数字电路入门作业实际考的是三件事第一如何用硬件或单片机在微秒级判定按键先后第二如何做到“一人抢中、全员锁死”不给后来者任何可乘之机第三抢答倒计时、违规检测、分数显示这些附加功能怎么在不增加太多成本的前提下塞进去。它适合电子、自动化、计算机相关专业正在做课设的学生也适合想用一块开发板把数字逻辑、中断、定时器、显示驱动串起来练一遍的入门工程师。常见实现路线有两条纯 74 系列芯片搭的硬件方案和单片机加按键扫描的软件方案。前者练逻辑后者练代码选哪条取决于你的课设验收老师看重什么。2. 硬件方案与软件方案怎么选先看验收标准再看你手头有什么2.1 纯数字芯片方案74LS373 74LS148 的经典组合纯硬件方案的核心思路是用编码器把四路按键转成二进制码再用锁存器把第一个到达的信号钉死。常见做法是 74LS1488-3 优先编码器负责判断哪一路先按下74LS373三态输出锁存器负责把编码结果锁住同时用一个与非门产生锁存使能信号一旦锁存成功就封锁后续输入。这个方案的优点是逻辑透明示波器一挂就能看到信号竞争过程答辩时容易讲清楚“为什么先按下的能赢”。缺点是 74LS148 的输入是低电平有效按键需要上拉电阻而且编码器本身有传播延迟四路同时按下时输出不稳定需要额外加 RC 滤波或施密特触发器整形。我一般会建议在按键和编码器之间加一级 74LS14 施密特反相器把机械抖动的毛刺压掉否则锁存器可能锁到抖动产生的假信号。2.2 单片机方案STC89C52 或 STM32 的按键扫描与中断单片机方案更灵活成本也更低。用 STC89C52 这类 51 单片机四个按键接 P3.2 到 P3.5其中一路接外部中断 INT0其余三路用轮询。抢答开始时开中断任意按键触发中断后在中断服务函数里读 P3 口状态判断是哪一路然后立即关闭中断并置忙标志。这个方案的关键在于中断响应时间——51 单片机从触发到进入 ISR 大约需要 3 到 8 个机器周期晶振 12MHz 时约 1 到 2 微秒足够区分人手不可能达到的“同时按下”。如果用 STM32可以用 EXTI 外部中断加 NVIC 优先级响应更快还能顺便做倒计时和 LCD 显示。选型建议如果课设要求“必须用数字芯片搭建”那就老老实实走 74 系列如果允许用单片机优先选 STC89C52资料多、烧录简单、成本不到十块钱。2.3 两种方案的参数对比与适用场景对比项纯数字芯片方案单片机方案判定精度受编码器延迟限制约 10-20ns受中断响应限制约 1-2μs同时按下处理需额外防抖电路否则输出不稳软件消抖逻辑可控附加功能倒计时、计分需额外芯片定时器显示驱动代码实现调试难度信号竞争肉眼可见但改逻辑要重新布线改代码即可但中断优先级容易踩坑成本约 15-25 元约 10-15 元适合场景数字电路课程强调门级逻辑单片机课程强调中断与定时器提示如果验收老师明确要求“不能使用可编程器件”那就不要碰单片机否则答辩时会被追问“你这还算数字电路课设吗”。3. 用 STC89C52 跑通四人抢答最小系统、按键扫描与锁存逻辑3.1 硬件连线四个按键、一位数码管和蜂鸣器怎么接先确认最小系统STC89C52 加 11.0592MHz 晶振复位电路用 10μF 电容加 10k 电阻电源 5V。四个按键一端接地另一端分别接 P3.2、P3.3、P3.4、P3.5同时各接一个 10k 上拉电阻到 VCC。这样按下时对应引脚为低电平松开为高电平。数码管用共阳一位管段选接 P0 口位选直接接地只显示一位。蜂鸣器用 PNP 三极管驱动基极接 P2.0发射极接 VCC集电极接蜂鸣器正极蜂鸣器负极接地。抢答开始时 P2.0 输出低电平三极管导通蜂鸣器响。按键按下后 P2.0 拉高蜂鸣器停。这个连线方式的好处是按键低电平有效与 51 单片机中断下降沿触发天然匹配不需要额外反相。3.2 按键扫描与中断服务函数谁先按下谁先锁#include reg52.h sbit KEY1 P3^2; // 选手1按键接INT0 sbit KEY2 P3^3; // 选手2按键 sbit KEY3 P3^4; // 选手3按键 sbit KEY4 P3^5; // 选手4按键 sbit BUZZ P2^0; // 蜂鸣器控制 unsigned char winner 0; // 0表示无人抢答1-4表示对应选手 bit locked 0; // 锁存标志1表示已有人抢中 void delay_ms(unsigned int ms) { unsigned int i, j; for(i 0; i ms; i) for(j 0; j 110; j); } void ext_int0_isr() interrupt 0 { if(locked) return; // 已锁存直接退出 delay_ms(10); // 软件消抖 if(KEY1 0) { // 确认选手1按下 winner 1; locked 1; BUZZ 1; // 关蜂鸣器 } } void main() { IT0 1; // INT0下降沿触发 EX0 1; // 使能INT0中断 EA 1; // 开总中断 BUZZ 0; // 抢答开始蜂鸣器响 while(1) { if(!locked) { if(KEY2 0) { delay_ms(10); if(KEY2 0) { winner 2; locked 1; BUZZ 1; } } if(KEY3 0) { delay_ms(10); if(KEY3 0) { winner 3; locked 1; BUZZ 1; } } if(KEY4 0) { delay_ms(10); if(KEY4 0) { winner 4; locked 1; BUZZ 1; } } } // 此处可添加数码管显示winner的代码 } }这段代码的逻辑是选手1走外部中断响应最快选手2、3、4走主循环轮询但一旦locked置1轮询不再生效。中断服务函数里先判断locked避免重复进入然后延时10ms消抖再确认按键确实按下。参数说明delay_ms(10) 的10ms是机械按键典型抖动时间太小消抖不干净太大可能漏掉快速连按。IT01 设置下降沿触发因为按键按下是电平从高到低。EA1 是总中断使能缺了它中断永远不会进。注意如果四位选手同时按下中断和轮询可能在同一时刻竞争但由于中断优先级高于主循环选手1永远优先。如果课设要求绝对公平可以把四路都接到中断引脚但51单片机只有两个外部中断需要扩展。3.3 数码管显示与倒计时用定时器 T0 做 1 秒基准unsigned char code seg_code[] {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // 共阳数码管0-9段码 unsigned char countdown 30; // 30秒倒计时 unsigned char tick 0; void timer0_isr() interrupt 1 { TH0 (65536 - 50000) / 256; // 50ms定时 TL0 (65536 - 50000) % 256; tick; if(tick 20) { // 20 * 50ms 1秒 tick 0; if(countdown 0) countdown--; } } void main() { TMOD 0x01; // T0工作方式116位定时 TH0 (65536 - 50000) / 256; TL0 (65536 - 50000) % 256; ET0 1; // 使能T0中断 EA 1; TR0 1; // 启动定时器 // ... 其余初始化 while(1) { if(locked) { P0 seg_code[winner]; // 显示抢中选手编号 } else { P0 seg_code[countdown % 10]; // 显示倒计时个位 } } }定时器 T0 设为 50ms 中断一次累计 20 次就是 1 秒。countdown 初始 30每次减 1减到 0 时如果还没人抢答可以触发超时处理比如蜂鸣器长响。参数说明TH0/TL0 的计算公式是 (65536 - 定时时间/机器周期)11.0592MHz 晶振下机器周期约 1.085μs50ms 对应约 46080 个计数所以初值约 19456。seg_code 数组是共阳数码管段码如果用的是共阴管需要取反。注意数码管显示和按键扫描都在主循环里如果显示刷新太慢会影响按键响应建议把显示刷新放在定时器中断里或者用更快的扫描频率。4. 抢答器避坑指南从“同时按下显示两个1”到“蜂鸣器一直响”4.1 现象两位选手几乎同时按下数码管显示两个不同的数字原因按键消抖时间不一致或者中断和轮询同时检测到按键。选手1走中断选手2走轮询如果选手2的按键在中断消抖的10ms内被轮询到winner会被覆盖。解决在轮询里也加 locked 判断并且把 winner 的赋值放在 locked 置1之后确保一旦锁存就不再修改。更彻底的做法是四路都用中断或者用硬件锁存器。4.2 现象抢答开始后蜂鸣器一直响按下按键也不停原因蜂鸣器控制引脚初始电平设错。如果 BUZZ 接 PNP 三极管低电平导通高电平截止。代码里 BUZZ0 是响BUZZ1 是停。如果初始化时忘了给 BUZZ 赋值或者按键按下后没有把 BUZZ 拉高蜂鸣器就会一直响。解决在 main 函数开头明确 BUZZ0 表示开始在中断和轮询里确认按键后立即 BUZZ1。4.3 现象倒计时不走或者走得特别快原因定时器初值计算错误或者晶振频率和代码里假设的不一致。常见错误是用 12MHz 的初值去跑 11.0592MHz 的晶振导致定时偏慢约 8%。解决先确认晶振频率再按公式重算 TH0/TL0。如果不确定可以用示波器测 P1.0 翻转周期反推定时是否准确。4.4 现象按键按下后数码管闪烁或者显示乱码原因数码管段选和位选共用端口或者显示刷新和按键扫描冲突。如果 P0 口既接段选又接按键上拉按键按下时 P0 电平被拉低数码管会灭。解决段选和按键分开端口或者用锁存器隔离。另外共阳数码管段码写错也会显示乱码对照段码表逐位检查。4.5 现象抢答成功后其他选手再按按钮winner 会变原因locked 标志只在中断里判断主循环轮询没有检查 locked。解决把 locked 的判断加到所有按键处理分支的最前面并且用原子操作——在 51 里就是先关中断再改 locked改完再开中断防止中断和主循环同时写。注意如果课设要求“抢答后显示抢答时间”需要额外加一个计时变量在锁存瞬间读取定时器计数值再换算成毫秒。这个功能在纯数字芯片方案里很难做建议直接选单片机方案。5. 从课设到可演示作品加一个“违规检测”和“分数累计”的进阶技巧课设验收时老师往往不只看“谁先按下”还会问“如果有人提前按了怎么办”“能不能记分”。这两个需求其实可以用同一套逻辑扩展。违规检测的思路是在主持人宣布“开始”之前如果任何按键被按下就判定为违规直接锁定该选手并扣分。实现方法是在 main 循环里加一个状态机用 start_flag 表示抢答是否开始start_flag0 时检测到按键就置违规标志start_flag1 时才进入正常抢答流程。分数累计更简单用一个 unsigned char score[4] 数组每次抢中后对应选手加 1 分数码管轮流显示或通过按键切换显示。我一般会建议把这两个功能做成“加分项”不要影响基础抢答逻辑的稳定性。具体代码片段如下unsigned char score[4] {0, 0, 0, 0}; bit start_flag 0; // 0表示未开始1表示已开始 bit violate 0; // 违规标志 void check_violate() { if(!start_flag) { if(KEY1 0 || KEY2 0 || KEY3 0 || KEY4 0) { delay_ms(10); if(KEY1 0 || KEY2 0 || KEY3 0 || KEY4 0) { violate 1; BUZZ 0; // 违规报警 delay_ms(500); BUZZ 1; } } } } void add_score(unsigned char player) { if(player 1 player 4) { score[player - 1]; } }这段代码里start_flag 由主持人通过一个独立按键控制按下后置1并启动倒计时。违规检测只在 start_flag0 时生效检测到按键就报警并锁定不允许进入正常抢答。add_score 在 winner 确定后调用把分数存进数组。显示分数时可以用一个按键切换查看四位选手的得分或者用四位数码管分别显示。这个扩展的代价是多用一个按键和几行代码但能让课设从“及格”变成“优秀”。最后说一个我自己的习惯每次焊完板子先不插芯片用万用表测一遍电源和地有没有短路再插芯片上电。这个动作救过我至少三次希望帮到你。本文还有配套的精品资源点击获取