普中开发板基于51单片机贪吃蛇游戏设计

基于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

相关推荐
羽获飞24 分钟前
从零开始学嵌入式之STM32——9.STM32的时钟系统
stm32·单片机·嵌入式硬件
ujainu1 小时前
Flutter + OpenHarmony 实现经典打砖块游戏开发实战—— 物理反弹、碰撞检测与关卡系统
flutter·游戏·openharmony·arkanoid·breakout
来自晴朗的明天2 小时前
13、NMOS 电源防反接电路
单片机·嵌入式硬件·硬件工程
芯岭技术3 小时前
PY32MD310单片机:高性能、低功耗的32位电机控制微控制器
单片机·嵌入式硬件
呆呆敲代码的小Y4 小时前
【Unity 实用工具篇】 | Book Page Curl 快速实现翻书效果
游戏·unity·游戏引擎·u3d·免费游戏·翻书插件
串流游戏联盟4 小时前
星铁4.0前瞻开启!手机玩家体验或将进一步下降
游戏·远程工作
小龙报4 小时前
【51单片机】深度解析 51 串口 UART:原理、配置、收发实现与工程化应用全总结
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·51单片机
renke33644 小时前
Flutter for OpenHarmony:构建一个 Flutter 数字迷宫游戏,从随机路径生成到认知训练系统的完整工程实践与跨学科深度解析
flutter·游戏
子春一4 小时前
Flutter for OpenHarmony:构建一个 Flutter 数字消消乐游戏,深入解析网格状态管理、合并算法与重力系统
算法·flutter·游戏
Lester_110111 小时前
STM32 高级定时器PWM互补输出模式--如果没有死区,突然关闭PWM有产生瞬间导通的可能吗
stm32·单片机·嵌入式硬件·嵌入式软件