基于51单片机贪吃蛇游戏设计( proteus仿真+程序+设计报告+讲解视频)
仿真图proteus8.17(有低版本)
程序编译器:keil 4/keil 5
编程语言:C语言
设计编号:P24
1主要功能:
基于51单片机的贪吃蛇游戏设计
1、采用8*8点阵作为贪吃蛇游戏的显示装置;
2、贪吃蛇在吃到食物后会变长;
3、贪吃蛇在撞到墙或者撞到身体后将会重新开始游戏;
4、使用独立按键控制贪吃蛇的运动方向。
5、需要在Proteus软件和普中51开发板实现功能验证。
主要硬件 51单片机 8*8点阵 独立按键
(目前仅完全适配普中51-实验板234,其他普中开发板型号需要接线)
需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。
以下为本设计资料展示图:
2.实物图:

3.仿真设计
打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。开始仿真后贪吃蛇静止不动,需要任意按键按下启动。

独立按键控制贪吃蛇的运动方向,贪吃蛇在吃到食物后会变长。

贪吃蛇在撞到墙或者撞到身体后将会重新开始游戏。
4.程序代码
使用keil4或者keil5编译,代码有注释,可以结合视频理解代码含义。

c
#include <reg51.h> // 51单片机头文件
#include <intrins.h> // 包含空操作指令_nop_()
#define uchar unsigned char // 定义无符号字符类型
#define uint unsigned int // 定义无符号整数类型
#define SNAKE 10 // 蛇的最大长度
#define TIME 20 // 显示延时时间
#define SPEED 71 // 游戏速度控制值
// 方向按键定义
sbit up = P3^0; // 上键
sbit down = P3^1; // 下键
sbit right = P3^2; // 右键
sbit left = P3^3; // 左键
// 74HC595移位寄存器控制引脚
sbit SRCLK = P3^6; // 移位寄存器时钟
sbit RCLK = P3^5; // 存储寄存器时钟
sbit SER = P3^4; // 串行数据输入
// 游戏数据结构
uchar x[SNAKE+1]; // 蛇身和食物的x坐标数组(0:食物, 1:蛇头, 2~SNAKE:蛇身)
uchar y[SNAKE+1]; // 蛇身和食物的y坐标数组
uchar time, n, i, e, state; // time:延时计数, n:当前蛇长, i:循环变量, e:速度控制, state:游戏状态(0=初始/结束,1=运行)
char addx, addy; // 蛇头移动方向偏移量(x,y方向)
/********************
延时函数
功能:产生指定毫秒的延时
参数:MS - 延时毫秒数
*********************/
void delay(char MS) {
char us, usn;
while(MS != 0) {
usn = 0;
while(usn != 0) {
us = 0xff;
while (us != 0) { us--; }; // 内层循环延时
usn--;
}
MS--;
}
}
/*******************************************************************************
* 函数名 : Hc595SendByte
* 功能 : 向74HC595发送一个字节的数据
* 参数 : dat - 要发送的数据
* 说明 : 通过串行方式将数据发送到74HC595移位寄存器
*******************************************************************************/
void Hc595SendByte(char dat) {
char a;
SRCLK = 0; // 移位时钟置低
RCLK = 0; // 存储时钟置低
// 循环8次发送一个字节
for(a = 0; a < 8; a++) {
SER = dat >> 7; // 取最高位发送
dat <<= 1; // 左移准备下一位
// 产生移位时钟上升沿
SRCLK = 1;
_nop_(); // 空操作延时
_nop_();
SRCLK = 0;
}
// 产生存储时钟上升沿(将移位寄存器内容输出到存储寄存器)
RCLK = 1;
_nop_();
_nop_();
RCLK = 0;
}
/*****************
主函数
功能:游戏主循环,控制游戏流程
*****************/
完整代码见文章下载链接
void main(void) {
// 初始化游戏参数
e = SPEED; // 初始速度
state = 0; // 初始状态(游戏未开始)
// 主游戏循环
while(1) {
// 检测按键(更新方向)
turnkey();
// 游戏初始/结束状态
if(state == 0) {
// 初始化多余的蛇身位置为无效值(100,不显示)
for(i = 3; i < SNAKE + 1; i++) {
x[i] = 100;
y[i] = 100;
}
// 设置食物初始位置
x[0] = 4; // 食物x坐标
y[0] = 4; // 食物y坐标
// 初始化蛇身
n = 3; // 初始蛇长(头+2节身体)
x[1] = 1; // 蛇头x坐标
y[1] = 0; // 蛇头y坐标
x[2] = 0; // 第一节身体x坐标
y[2] = 0; // 第一节身体y坐标
// 初始化移动方向
addx = 0; // x方向无偏移
addy = 0; // y方向无偏移
// 显示初始游戏画面
timer0(e);
}
// 游戏运行状态
else if(state == 1) {
// 显示当前游戏画面
timer0(e);
// 碰撞检测
if(knock()) {
// 游戏结束,重置参数
e = SPEED; // 恢复初始速度
state = 0; // 返回初始状态
}
// 检查是否吃到食物(蛇头位置与食物位置重合)
if((x[0] == x[1] + addx) & (y[0] == y[1] + addy)) {
// 增加蛇身长度
n++;
// 当蛇达到最大长度时重置
if(n == SNAKE + 1) {
n = 3; // 重置蛇长为初始长度
e = e - 10; // 增加游戏速度(减少延时)
// 隐藏多余的蛇身(设置为无效坐标)
for(i = 3; i < SNAKE + 1; i++) {
x[i] = 100;
y[i] = 100;
}
}
// 设置新的食物位置(暂时放在蛇尾位置)
x[0] = x[n - 2];
y[0] = y[n - 2];
}
// 移动蛇身(从尾部向前更新位置)
for(i = n - 1; i > 1; i--) {
x[i] = x[i - 1]; // 当前位置等于前一个位置
y[i] = y[i - 1];
}
// 更新蛇头位置(根据移动方向)
x[1] = x[2] + addx;
y[1] = y[2] + addy;
}
}
}
5.设计报告
8261字设计报告,内容包括硬件设计、软件设计、软硬件框图、调试、结论等

6.设计资料内容清单&&下载链接
资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。

0、常见使用问题及解决方法--必读!!!!
1、程序
2、proteus仿真
3、功能要求
4、软硬件流程图
5、开题报告
6、设计报告
7、烧录工具
8、讲解视频
9、实物图
Altium Designer 安装破解
KEIL+proteus 单片机仿真设计教程
KEIL安装破解
Proteus元器件查找
Proteus安装
Proteus简易使用教程
单片机学习资料
相关数据手册
答辩技巧
设计报告常用描述
鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url
资料下载链接(可点击):
P24 8X8点阵贪吃蛇游戏
链接: https://pan.baidu.com/s/1rahcHhqpAv2tD13qKJziSw?pwd=megb
提取码: megb