基于51单片机设计的打地鼠游戏机
演示视频:
基于51单片机设计的打地鼠游戏机
功能描述:使用 51单片机为核心制作一个打地鼠游戏机。按下启动开关,8盏LED流水点亮并闪烁2次,随即开始播放游戏音乐,直到开始选择模式。选择的模式在数码管上显示,该游戏机共有两个模式,分别是闯关模式和无尽模式。闯关模式共3关,每通过一关,蜂鸣器就播放一小段音乐以示鼓励,完成闯关后继续播放游戏音乐;无尽模式,顾名思义没有尽头,但显示的最高分为999分。单片机随机生成一个0~6的随机整数到 LED,以表示地鼠冒头。在1秒内按下对应的按钮,即可得1分,蜂鸣器响一声提示;若超时或按错则扣2分,蜂鸣器响两声提示。初始分数为 10分,若分数低于0分则游戏结束。当前分数显示在数码管的后2位,第一位显示的是当前模式。
摘 要
本设计使用AT89S51单片机为核心,设计并实现了一款经典的打地鼠游戏机。系统主要由LED显示模块、蜂鸣器音效模块、按键输入模块、数码管显示模块等硬件组成,并通过单片机的程序控制,实现了游戏的启动、模式选择、随机地鼠生成、按键响应和分数显示等功能。通过此次设计,学生不仅掌握了单片机的基础知识,还深入理解了电子电路的设计与调试。系统通过仿真与实物测试,验证了设计的有效性与稳定性。
关键词: AT89S51,打地鼠游戏机,单片机,LED显示,数码管
目录
程序源码&原理图&proteus仿真图&PCB&设计文档&演示视频&元件清单等
第一章 绪论
1.1 课题背景
随着单片机技术的迅速发展,基于单片机的电子产品在日常生活中得到了广泛应用,特别是在智能家居、自动化控制以及娱乐设备中,单片机技术的应用越来越普及。本项目基于AT89S51单片机,设计并实现了一款打地鼠游戏机,旨在通过简易的硬件与软件设计,完成一款具备娱乐功能的电子产品。
打地鼠游戏机是一款经典的娱乐设备,玩家通过快速按下按键,模拟捕捉从随机位置冒出的地鼠。此类游戏不仅能够考验玩家的反应速度和手眼协调能力,还能够作为单片机开发的实践项目,帮助初学者掌握单片机的基本原理和应用技能。
1.2 研究现状
在现今的市场上,基于单片机的娱乐设备越来越多,其中打地鼠类游戏因其简单有趣的特点,在各类娱乐设备中占有一席之地。尽管市场上已有一些成熟的打地鼠产品,但它们大多采用复杂的集成电路或专用控制芯片,而本项目则通过较为简易的AT89S51单片机来实现该游戏的基本功能,以便于学习与实践。
1.3 设计目标
本次课程设计的主要目标是利用AT89S51单片机作为核心控制器,设计一个具备闯关模式和无尽模式的打地鼠游戏机。游戏机需具备以下功能:
- 启动与模式选择:按下启动开关,LED灯流水点亮并闪烁2次,播放游戏音乐并开始模式选择。
- 闯关模式:共有3关,每通过一关,蜂鸣器播放提示音。完成闯关后继续播放游戏音乐。
- 无尽模式:无限次游戏,最高分为999分。
- 随机生成地鼠:单片机随机生成0~6的整数,表示LED灯对应的地鼠冒头。玩家需在1秒内按下对应按钮。
- 分数计算:按对加分,按错或超时扣分,初始分数为10分,分数低于0分时游戏结束。
- 分数显示与模式指示:当前分数和游戏模式显示在数码管上。
1.4 论文结构
论文将按照以下结构进行详细讨论:
- 第一章 绪论:介绍课题背景、研究现状以及设计目标。
- 第二章 系统总体设计:概述系统的整体设计思路和功能模块划分。
- 第三章 硬件设计:详细介绍系统的硬件组成部分,包括各个模块的电路设计。
- 第四章 软件设计:描述系统的软件实现,包括主程序、子程序以及各功能模块的逻辑设计。
- 第五章 仿真与调试:进行系统的仿真测试与调试,验证设计的有效性。
- 第六章 总结与展望:总结设计的成果,并对未来的改进方向进行展望。
第二章 系统总体设计
2.1 设计思路
打地鼠游戏机系统的设计主要分为硬件和软件两大部分。硬件部分包括单片机主控电路、LED显示模块、蜂鸣器音效模块、按键输入模块及电源管理模块。软件部分则负责系统的整体逻辑控制,包括游戏的启动、模式选择、随机数生成、按键响应及分数管理。
本系统的设计以模块化为原则,硬件与软件各模块之间通过接口进行连接,方便日后扩展和维护。系统的核心控制器采用AT89S51单片机,通过编程实现对硬件的控制。
2.2 功能模块划分
整个系统按照功能划分为以下几个模块:
主控模块:由AT89S51单片机构成,负责控制整个游戏的流程,包括模式选择、分数计算、时间控制等功能。
显示模块:包括LED显示和数码管显示。LED用于显示地鼠的位置,数码管用于显示当前得分和游戏模式。
按键输入模块:提供玩家的输入接口,玩家通过按键捕捉地鼠,按键输入通过单片机的I/O端口进行检测。
蜂鸣器音效模块:用于在玩家按键成功或失败时提供音效提示,增强游戏的趣味性。
电源管理模块:为系统提供稳定的工作电压,确保各模块的正常运行。
第三章 硬件设计
原理图如下
PCB如下
3.1 系统硬件结构
本系统的硬件部分由以下几个主要模块组成:
- AT89S51单片机:作为系统的核心控制单元,负责控制整个游戏的流程。
- LED显示模块:由8个LED灯组成,显示地鼠的位置。
- 数码管显示模块:用于显示游戏分数和当前模式。
- 按键模块:包括7个按键,对应地鼠的7个位置,用于玩家输入。
- 蜂鸣器模块:用于播放音效,提示玩家当前操作的成功或失败。
- 电源模块:提供稳定的电源电压,保障系统正常运行。
3.2 关键元件选型
根据元件清单,本系统的关键元件选型如下:
- AT89S51单片机:选择AT89S51单片机作为主控芯片,因其成本低廉,性能稳定,适合于本项目的需求。
- LED灯:选用常规的5mm红色LED灯,用于地鼠位置的显示。
- 数码管:采用共阳极数码管,用于显示当前的游戏分数和模式。
- 按键:使用标准轻触开关,方便用户操作。
- 蜂鸣器:选择小型有源蜂鸣器,方便安装且音效清晰。
- 电源模块:选用7805稳压电源模块,提供5V稳定电压供给系统。
3.3 硬件电路设计
硬件电路设计包括主控电路、显示电路、按键电路和音效电路。各部分电路通过接口连接在一起,形成完整的系统硬件结构。
3.3.1 主控电路设计
主控电路以AT89S51单片机为核心,包括晶振电路、复位电路、I/O接口等。
+--------------------+
| AT89S51 |
| +---------------+ |
| | P1.0-P1.7 | |
| +---------------+ |
| | XTAL1, XTAL2 | |
| +---------------+ |
| | RST | |
+--------------------+
3.3.2 LED显示电路设计
LED显示电路由8个LED灯组成,每个LED灯通过一个限流电阻连接到单片机的I/O端口。
+--------+
| LED1 |
| |
+--------+
| R = 330Ω |
| |
+--------+
| P1.0 |
+--------+ -> AT89S51
| |
第四章 软件设计
4.1 软件功能描述
本系统的软件设计包括游戏启动、模式选择、随机地鼠生成、按键响应和分数计算等功能。软件部分的核心在于如何通过程序控制各个硬件模块
4.2 主程序流程设计
主程序的设计思路是通过一个主循环来不断监控按键输入、随机生成地鼠位置、控制LED显示、检测玩家的按键响应,并根据玩家的操作进行分数计算和游戏状态的切换。
主程序的基本流程如下:
- 初始化系统:包括单片机初始化、LED和数码管显示初始化、蜂鸣器初始化等。通过初始化使各个模块准备就绪。
- 游戏启动:按下启动按键后,LED流水点亮2次,并播放启动音乐,同时进入模式选择界面。
- 模式选择:通过按键选择闯关模式或无尽模式,数码管显示当前模式。
- 游戏循环:
- 随机生成地鼠位置并点亮相应的LED。
- 检测玩家的按键输入,判断是否按对地鼠位置。
- 计算得分或扣分,更新数码管显示。
- 在闯关模式下,根据分数判断是否通过当前关卡;在无尽模式下持续游戏。
- 游戏结束:当分数低于0时,游戏结束,蜂鸣器播放结束音效,数码管显示“End”。
4.2.1 主程序代码框架
#include <reg51.h>
void main() {
SystemInit(); // 系统初始化
while (1) {
GameStart(); // 游戏启动及模式选择
while (GameRunning()) { // 游戏主循环
GenerateRandomMole(); // 生成随机地鼠位置
CheckInput(); // 检测玩家按键
UpdateScore(); // 更新分数
}
GameOver(); // 游戏结束处理
}
}
4.3 各子程序模块设计
4.3.1 系统初始化
系统初始化函数负责配置单片机的工作状态,初始化LED、数码管、按键、蜂鸣器等模块,为游戏运行做好准备。
void SystemInit() {
P1 = 0x00; // LED初始化
P2 = 0xFF; // 按键初始化
InitBuzzer(); // 蜂鸣器初始化
InitTimer(); // 定时器初始化
}
4.3.2 随机数生成与地鼠位置控制
单片机通过定时器和随机数生成算法,生成一个0到6之间的随机数,表示地鼠的位置。根据随机数点亮对应的LED,提示玩家该地鼠的位置。
void GenerateRandomMole() {
unsigned char rand_num = GetRandomNumber() % 7;
LightUpLED(rand_num); // 点亮对应的LED
}
4.3.3 按键输入检测
在游戏过程中,玩家通过按键输入来捕捉地鼠。按键检测模块会定时扫描各个按键的状态,并与当前地鼠的位置进行对比,判断玩家是否按对。
void CheckInput() {
if (P2 == 0xFE) { // 假设按键0被按下
if (current_mole == 0) {
score++; // 按对加分
Beep(1); // 蜂鸣器提示
} else {
score -= 2; // 按错扣分
Beep(2); // 蜂鸣器提示两声
}
}
// 其他按键检测逻辑
}
4.3.4 分数计算与显示
分数由初始的10分开始,按对加1分,按错或超时扣2分。当分数低于0时,游戏结束。分数通过数码管实时显示。
void UpdateScore() {
DisplayScoreOn7Seg(score); // 数码管显示当前分数
}
4.4 游戏模式设计
本游戏设计有两种模式:闯关模式和无尽模式。玩家在启动游戏时可以通过按键选择模式,系统根据选择的模式切换相应的游戏逻辑。
4.4.1 闯关模式
闯关模式包含3个关卡,每关都有不同的时间限制或难度。玩家通过每一关时,蜂鸣器播放提示音,并进入下一关。通过所有关卡后,游戏结束并显示“胜利”。
void PlayStageMode() {
for (int stage = 1; stage <= 3; stage++) {
while (current_stage_score < target_score[stage]) {
GenerateRandomMole();
CheckInput();
UpdateScore();
}
Beep(1); // 通过关卡提示音
}
}
4.4.2 无尽模式
无尽模式没有关卡限制,玩家可以持续游戏,直到分数低于0。最高分为999分,当分数达到上限时,游戏会自动提示并停止计分。
void PlayEndlessMode() {
while (score >= 0 && score <= 999) {
GenerateRandomMole();
CheckInput();
UpdateScore();
}
}
4.5 按键消抖处理
为了避免按键抖动造成的误操作,程序加入了按键消抖处理,确保每次按键输入的稳定性。
void KeyDebounce() {
static unsigned char key_state = 0xFF;
static unsigned char key_last_state = 0xFF;
key_state = P2; // 读取按键状态
if (key_state != key_last_state) {
delay_ms(10); // 延时消抖
key_last_state = key_state;
}
}
第五章 仿真与调试
5.1 仿真环境搭建
本系统的仿真在Proteus仿真软件中完成。Proteus是一款强大的电路设计与仿真工具,通过Proteus可以对设计的电路进行虚拟测试,验证电路功能的正确性。
- 创建电路仿真模型:使用Proteus软件将设计好的电路图搭建在仿真平台上,包含AT89S51单片机、LED、数码管、蜂鸣器、按键等模块。
- 载入程序代码:将Keil编译后的程序代码(.hex文件)加载到Proteus中运行,通过仿真器观察系统的运行情况。
- 测试输入输出:通过Proteus的虚拟按键模拟玩家输入,观察LED和数码管的显示效果,并测试蜂鸣器音效。
5.2 功能模块仿真测试
在仿真测试过程中,首先对各个功能模块进行单独测试,确保每个模块都能够按照设计正常工作。
5.2.1 LED显示仿真测试
测试LED显示模块,生成随机数点亮对应的LED灯,并通过Proteus观察LED灯的亮灭情况。
5.2.2 数码管显示仿真测试
测试数码管的分数显示功能,观察玩家按下按键后分数的实时变化,确保数码管能够正确显示分数。
5.2.3 按键输入仿真测试
通过Proteus的虚拟按键模拟玩家输入,观察按键输入是否能够触发游戏操作,测试按键响应速度和准确性。
第六章 总结与展望
6.1 总结
本设计基于AT89S51单片机,成功实现了一款打地鼠游戏机。通过系统的硬件电路设计和软件逻辑控制,完成了游戏的启动、模式选择、随机生成地鼠、按键响应和分数显示等功能。系统在Proteus仿真平台上经过了严格的测试,结果表明设计具有较高的稳定性和可靠性。
6.2 展望
虽然本系统已具备了基本的游戏功能,但在后续的改进中,仍然有进一步的优化空间。可以考虑增加以下功能:
- 增加更多游戏模式:如计时模式或多人对战模式,丰富游戏玩法。
- 改进音效处理:使用更加复杂的音效提示,提高玩家的游戏体验。
- 优化硬件设计:使用更高效的LED驱动电路,提升显示效果,降低功耗。
未来可以将该设计应用于更多娱乐设备中,结合其他传感器和通信模块,扩展其功能范围。