简介:一份面向数字电子技术课程设计的完整投弹游戏机设计文档,适合高校电子、自动化等专业学生参考,尤其适用于课程设计选题为“投弹游戏机”的读者。文档以任务书、鉴定表、目录、前言和正文章节的形式,完整呈现了基于555定时器、CD4017计数器和CD4001门电路的投弹游戏机设计全过程,涵盖系统整体设计、方案选择、系统组成及工作原理、仿真与调试、结果分析等模块,并对LED顺序点亮、移动速度可变、投中后发出1000Hz庆贺声等核心功能给出了明确实现思路。资源包仅含1个doc文档,大小206KB,内容结构清晰,覆盖设计原理、Multisim仿真分析、制作调试过程与设计总结,便于读者快速掌握从电路原理到系统实现的完整脉络。该文档已有205人学习下载,适合需要完成数电课程设计任务或理解数字逻辑电路实际应用的人群使用。 数电课程设计题目里,"投弹游戏机"属于看着像玩具、实际上最考基本功的那一类。任务描述通常就一句话:设计一个能模拟投弹命中目标的数字逻辑游戏。但真动手以后你会发现,这句话背后藏着一整套完整的小型数字系统——要用计数器制造一个会来回跑的目标,要用比较逻辑判断炸弹和目标是否撞在一起,还要用触发器管住整个游戏的开始、飞行和结束。说穿了,它考评的就是你把现实规则翻译成组合逻辑和时序逻辑的能力,这也是数电课设最有价值的地方。
这篇文章把我做这个题目时的完整思路、芯片选型、关键电路和踩坑记录都整理出来,照着做能出实物,也足够应付答辩时老师的连环追问。
1. 先把"投弹游戏"翻译成数字电路的四种信号
1.1 游戏规则定稿与信号映射
我做的版本规则如下,你可以根据自己的想法增减难度:
- 8个LED排成一行,编号0到7,绿色灯是目标,红色灯是炸弹。
- 目标灯在LED上来回移动,速度快慢由时钟决定。
- 玩家按一次投弹键,红色炸弹灯从0号位出发向右逐格飞行。
- 炸弹飞行的途中,如果某一刻和目标灯出现在同一格,判定命中,屏幕分数加1。
- 炸弹飞到7号位还没命中,判定落空,扣一条命。
- 初始3条命,扣完游戏结束。
把规则翻译成电路信号,本质就是四件事。
目标位置是一个随时间变化的数,范围0到7,所以用计数器输出三位二进制数。炸弹位置是另一个从0往7增长的数,也用计数器。两个位置相等,就是两个三位二进制数相同,交给组合逻辑比较。能不能投弹,则取决于炸弹是不是正在飞行,这是一个只有两种状态的状态信号,用触发器锁存。
课程设计答辩时老师最爱问的第一个问题通常是:你拿计数器、触发器、比较器这些器件,怎么对应游戏里这些元素?上面这套映射就是标准答题框架。
1.2 系统模块划分与器件选型总览
整个系统可以切成几个清晰的模块,我给出一份直接能用的器件清单:
| 模块 | 推荐芯片 | 作用 |
|---|---|---|
| 时钟源 | NE555 | 产生基础方波信号 |
| 目标移动 | 74LS191 | 可逆计数器,让目标在0~7之间来回 |
| 目标显示 | 74LS138 | 3-8译码器,驱动目标LED |
| 炸弹移动 | 74LS161 | 4位二进制计数器,复用低3位 |
| 炸弹显示 | 74LS138 | 3-8译码器,驱动炸弹LED |
| 投弹状态 | 74LS74 | D触发器,锁存"飞行中/空闲"状态 |
| 命中比较 | 74LS85 | 4位比较器,判断两个位置是否相等 |
| 计分与生命 | 74LS192 × 2 | 可逆计数器,分别做加分和减命 |
| 数码管驱动 | 74LS47 × 2 | BCD码转七段码,驱动共阳数码管 |
| 辅助逻辑门 | 74LS08、74LS32、74LS04、74LS266 | 组合逻辑配合 |
这里要特别说明为什么用74LS系列而不是CMOS的74HC系列。74LS是TTL逻辑,驱动能力对LED和面包板都友好,价格便宜,实验室库存最常见,课程设计的焊接和调试资料也基本都以它为例。唯一要注意的是TTL输入悬空时会呈现高电平,这在后文调试章节会专门说。
2. 会来回跑的目标:可逆计数器如何制造移动光点
2.1 为什么选计数器加译码器而不是移位寄存器
很多初学者第一反应是用移位寄存器做流水灯,让那个"1"在灯排上跑来跑去。这个思路不是不行,但有一个致命问题:移位寄存器输出的是一堆并行的位置信号,你要判断炸弹和目标是不是同一格,还得把这些位置信号重新编码成二进制数才能比较,多绕一步。
计数器方案就聪明得多。计数器天然输出二进制数,目标在哪一格直接编码在QA、QB、QC三根线上。后续命中判定拿这三根线和炸弹的三根线直接做比较,干净利落。显示端用一片74LS138把二进制编码展开成8个独立位置信号,LED自然就亮起来了。所以计数器加译码器,是这个题目里面最顺手的结构。
2.2 用74LS191实现目标来回折返
如果只是让目标从0循环到7再跳回0,用74LS161就够了,但游戏体验很差,目标没有任何预判难度。我建议用74LS191可逆计数器,让目标在0到7之间来回折返,动作更自然,玩家也必须看准目标运动方向再出手。
74LS191的方向控制端是U/D,低电平加计数,高电平减计数。所以核心问题是:在什么条件下切换方向?
答案写在位置边界上:当计数器的值等于0时,下一步必须加计数;当值等于7时,下一步必须减计数。
位置0的判断用或非门组合,QA、QB、QC全为0时输出1;位置7用三输入与门,三个位全为1时输出1。这两个信号控制一个D触发器记录当前方向,触发器的输出直接接到191的U/D端。有人会问:直接让U/D由0和7的组合逻辑驱动不是更省吗?不行,因为如果既不在0也不在7,方向要保持上一个状态,必须用触发器锁存。
这里有个细节坑容易踩:方向切换必须用组合逻辑立刻生效,不能等下个时钟沿再变。如果方向信号晚一个周期才翻转,计数器走到0之后又加回1,看起来就像在边界卡了一下。解决办法是让0/7检测电路直接进入方向触发器的D端或异步置位复位端,一旦边界条件成立就立刻换向。
2.3 目标显示的译码与LED接法
计数器输出的三位二进制数,送入74LS138的A、B、C输入端,138会把对应的输出脚拉低。很多同学第一次接LED时习惯把LED阳极接输出脚,结果发现灯不亮,或者全亮,原因就是没搞清138的输出极性。
74LS138的输出是低电平有效,也就是说选中的那一脚输出低电平,其他脚高电平。所以LED必须这样接:LED阳极接VCC,经过一个330欧姆限流电阻,阴极接译码器对应输出脚。低电平从LED阴极灌入,构成通路,灯亮。反过来的接法只有某些特殊的驱动芯片才适用。
目标移动的时钟频率我建议从1Hz到5Hz可调,用NE555配合可调电阻实现。太慢像死机,太快玩家根本反应不过来,调到一个"看着想打又容易打偏"的节奏最合适。
3. 投弹时机怎么控制:消抖、状态锁存与使能端
3.1 按键消抖的三个方案与取舍
机械按键按下和松开的时候,触点会来回弹跳十几毫秒。如果不做处理,你按一次投弹键,系统可能判定成按了三次甚至更多,炸弹乱飞,分数乱跳。这个问题在纯仿真里永远不会暴露,一到实物焊接阶段就原形毕露。
我试过三种消抖方案:
第一种是RC低通消抖,按键输出接一个100纳法到1微法的电容到地,再加一个上拉电阻,信号经过施密特触发器整形后送入后级。优点是电路简单,缺点是效果取决于按键弹跳时间,遇到劣质按键容易消不干净。
第二种是D触发器单脉冲方案。按键信号作为D触发器的时钟或者异步置位端,触发后Q输出正好是一个时钟周期宽的脉冲。这个方案比较"数字",答辩时讲原理也清晰。
第三种是用NE555搭单稳态电路,按键触发后输出一个固定宽度(比如50毫秒)的低电平脉冲。这个方案对抖动完全不敏感,因为单稳态的暂稳时间远远大于抖动时间,按键抖动全被淹没在脉冲宽度里了。
我的建议:课程设计追求稳妥,直接上NE555单稳态。它在实物调试时最省心,而且老师问起来你可以把单稳态触发器原理讲一遍,属于标准的数电考点。
3.2 用D触发器锁存"飞行中"状态
投弹之后,炸弹需要从0飞到7,这个过程必须锁定,不能允许玩家再按键发射第二发,否则两个炸弹同时在屏幕上跑,逻辑就乱了。
这里用一片74LS74里的一个D触发器做状态锁存。我把这个状态信号命名为FLY,FLY=1表示炸弹正在飞行,FLY=0表示空闲可以投弹。
按键消抖后产生的投弹指令,作为触发器的置位信号,把FLY置为1。FLY=1就把炸弹计数器的计数使能打开;等命中或落空之后,产生一个清零信号,把FLY复位回0。
注意一个细节:玩家的投弹指令只有在FLY=0时才能生效。如果飞行途中按键又被按下,不能响应。这个互斥逻辑用一片74LS08与门就能实现——按键脉冲和FLY取反相与,只有空闲状态下的按键才有效。
3.3 使能端代替门控时钟:炸弹计数器的正确接法
炸弹计数器要实现在"飞行中才计数,空闲时停止"这个要求,初学者最容易想到的做法是用一个与门把时钟和FLY信号门控起来,让高频时钟在FLY=1时才送给计数器。这个方案我强烈不建议。
门控时钟的最大问题是毛刺。FLY信号翻转的瞬间,与门输出可能产生一个窄脉冲,计数器多计一个数,炸弹位置就跳了一格,后续所有逻辑全乱。TTL电平翻转时本来就存在竞争冒险,用门控时钟等于自己给自己埋雷。
正确做法是用74LS161的计数使能端。161的ENP和ENT两个使能端都为高时,每个时钟上升沿计数一次,任一个为低则保持。把FLY接到ENT上,ENP固定接高电平,CLK始终接主时钟。这样时钟一路走到计数器,只是计数器是否响应由使能端决定,干净利落,完全避开毛刺问题。
炸弹计数器还有一个异步清零端CLR,低电平有效。每次开始新一轮投弹前,需要先把炸弹位置清零,确保炸弹从0号位出发。这个清零信号和FLY置位信号在时序上的配合,我建议让按键消抖后的启动脉冲同时完成两件事:一边把炸弹计数器CLR拉低清零,一边把FLY置1,下一个时钟上升沿到来时,计数器就从0开始正常走了。
4. 命中判定逻辑:两个位置数相等的瞬间如何捕捉
4.1 位置相等的两种检测电路
目标计数器输出三位,炸弹计数器也输出三位,命中判定的本质就是判断两个三位二进制数是否相等。两种做法都可行。
第一种:用74LS85四位比较器。把目标的三根线接A组,炸弹的三根线接B组,级联输入中的I(A=B)接高电平。A=B输出端就是我们要的命中信号。这个方案芯片集成度高,电路简洁,而且74LS85比较器本身就是数电课里的标准器件,答辩时好解释。
第二种:用门电路搭同或比较。三个同或门分别比较QA、QB、QC,输出再接到三输入与门——注意同或门较少,也可以用异或门加反相器替代。如果三个位全部相等,与门输出高电平,命中信号产生。这个方案用到的门更多,但更能体现你对组合逻辑的基本功,如果学校要求"必须用基本门电路实现核心逻辑",选这个方案。
我个人推荐74LS85做主判定,是因为后续的扩展性更好。比如你想增加"炸弹距离目标一格以内算擦边"这种玩法,用比较器的A>B、A<B输出就很容易实现。
4.2 命中与落空信号的逻辑表达式
这里要把逻辑写清楚,不然实现时会乱。
FLY = 1 表示炸弹飞行中。命中信号HIT应该同时满足三个条件:
HIT = (A[2:0] == B[2:0]) 且 FLY = 1 且 炸弹还没飞出界
实际上只要前两个条件成立,炸弹和目标在同一格,必然算命中。落空信号MISS的条件是:
MISS = (B[2:0] == 7) 且 FLY = 1 且 HIT = 0
也就是说,炸弹飞到7号位那一格,如果目标恰好也在7号位,那应该按命中处理而不是落空。所以MISS必须用HIT取反来限制,这个优先级顺序要在电路里体现出来。
炸弹到达7号位的检测,直接利用炸弹那一片74LS138的Y7输出即可,不需要额外接门电路。Y7是低电平有效,所以MISS再用一个与非门和FLY相与。同时,炸弹飞行中如果HIT产生了,这个信号要立刻完成三件事:让计分计数器加1、把FLY清零停止炸弹、把炸弹计数器清零复位。三件事都可以由HIT信号同时驱动,这就是数字系统并行性的优势。
命中信号送往74LS192的加计数端时要注意极性和脉宽。74LS192在CP上升沿计数,HIT信号宽度等于一个炸弹时钟周期,对8Hz左右的时钟来说有100多毫秒,完全满足触发要求。实物调试中如果你用的是更高频的时钟,就要保证脉宽不低于192的最小要求,否则可能出现"打中了但不加分"的怪现象。
5. 计分、扣命与重新开局:可逆计数器实现游戏管理
5.1 分数计数与数码管译码驱动
计分部分我用了74LS192可逆计数器。把HIT信号接到192的加计数时钟端UP,DOWN端接高电平禁用减计数,于是每命中一次分数加1。QA到QD的输出接到74LS47译码器,74LS47再驱动一位共阳数码管,显示0到9的分数。
这个方案看起来简单,实际很容易在74LS47的引脚处理上翻车。74LS47有三个辅助控制引脚:LT、RBI、BI/RBO。很多同学这几个引脚悬空,结果数码管一直显示一个奇怪的字符,或者某段常亮不灭。正确接法是:LT接高电平,让芯片处于正常译码状态;RBI接高电平,不消隐无效零;BI/RBO也接高电平。三个控制脚全部接VCC,普通应用永远没错。
分数只到9有一个尴尬问题,就是命中第10次时计数器溢出回0,玩家会觉得是自己机器坏了。如果实验要求不严,你可以说这是"九局制";更稳妥的做法是用两片74LS192级联,显示0到99,但这会增加不少连线,建议先保证基础功能再考虑。
5.2 三条命的扣减、耗尽判定与重启逻辑
扣命用另一片74LS192,但工作在减计数模式。初始值预置为3,每来一个MISS信号,DOWN端减1。
难点在于初始值3怎么装进去。74LS192有一个异步预置功能,当LD端为低电平时,D0到D3的数据会被直接装入计数器。所以开机时要产生一个短暂的低电平LD脉冲,把D0D1D2D3设置成0011即3。这个脉冲可以用一个简单的上电复位电路实现:一个10微法电容串联一个10千欧电阻接VCC,中间节点经过施密特触发器整形后接LD端。上电瞬间电容充电,节点电压从低到高,正好形成一次LD低电平复位。
生命值减到0的检测用一片74LS30八输入与非门接所有输出位,当QA到QD全为0时输出高电平,这就是"游戏结束"信号。游戏结束时可以把目标时钟关断,让目标停下,同时点亮一颗红色指示灯。
重新开始逻辑我直接用一个复位按键。按下后同时做三件事:清空分数计数器、把生命计数器预置回3、把FLY状态复位、把目标计数器清零。这个操作是所有异步复位信号的"总闸",用一个按键驱动多个与非门实现。重新开局这个功能在实物验收时几乎是必测项目,一定要保证每次都能完整恢复到初始状态。
6. 仿真、焊接与答辩:实物调试中必须避开的坑
6.1 仿真阶段容易自我欺骗的地方
Multisim或者Proteus仿真能帮你验证逻辑正确性,但也容易让你对实物盲目乐观。仿真里面按键永远不抖,LED驱动能力永远是理想的,TTL输入端悬空电平也完全符合教科书。结果就是仿真一遍过,实物一接就废。
我的建议是仿真阶段就要有意识地给自己制造困难。故意在按键输出那里加一个高频干扰源,看看你的消抖电路扛不扛得住;把LED限流电阻调成1欧姆,看看74LS138会不会过热。这些极限测试才能暴露真实电路的隐患。
另外,仿真软件里74LS138的输入悬空会默认为高电平,如果你的方向控制或使能信号某根线忘了接,仿真可能还能跑,实物就会表现出一堆诡异现象。所以仿真通过以后,一定要逐根线检查是否每个输入引脚都有明确连接,不要依赖悬空电平。
6.2 实物焊接与电源布线经验
实物调试最大的敌人是电源噪声。NE555产生的时钟信号属于模拟电路范畴,和后面的数字逻辑共用一个电源时,容易通过电源线互相干扰。我见过一个组的目标灯每隔几秒自己跳一格,查了半天是NE555的地线和计数器地线在面包板上绕了一大圈,地回路阻抗太高。
解决办法是在电源入口处并接一个100微法电解电容和一个100纳法陶瓷电容做去耦,同时保证每片IC的VCC和GND之间都就近放一个100纳法电容。面包板走线时尽量让时钟信号线远离按键信号线,时钟线周围用地线包裹,可以有效减少串扰。
还有一个极其常见的问题:74LS161的CLK输入如果不加整形,从555出来的方波在长线传输后边沿会变缓,计数器可能一个沿计两次。如果发现炸弹位置偶尔跳两格,可以在时钟输出端串联一个100欧姆电阻再接计数器,或者加一个施密特触发器反相器整形。
6.3 答辩时的高频追问与扩展思路
老师看实物演示之后,通常会有几个固定问题。怎么让游戏变难或变简单?答:调整NE555的频率,提高炸弹与目标的时钟频率比;或者修改落空判定条件,比如炸弹飞到3号位还没碰到目标就算失败。怎么加声音反馈?答:用NE555输出音频方波,命中时接通蜂鸣器响一声,用HIT信号控制一个三极管开关即可。分数能不能掉电保存?这就是另一套存储逻辑了,课程设计做到这个深度已经可以当课题加分项。
我自己的经验是,答辩高分的核心不是你功能有多花哨,而是你对自己的每一个模块都能讲清楚"为什么选这个器件""为什么这样接"。比如能说出"不用门控时钟是因为毛刺、用使能端是因为同步"这种话,老师的印象分会明显不一样。
最后再说一条操作层面的建议:拿到题目先别急着连电路,花半天时间把所有信号的名字定好,在纸上画清楚信号流向图。这次做完你会发现,投弹游戏机真正锻炼的不是谁焊得快,而是谁能在混乱的连线里始终保持对每一个信号状态的清醒判断。这恰恰是数电课设最想教给你的东西。
本文还有配套的精品资源,点击获取