单片机课程设计贪吃蛇说明书

合集下载

STM32课程设计贪吃蛇

STM32课程设计贪吃蛇

STM32课程设计贪吃蛇STM32大作业报告学生姓名:学号:所在院系:光电信息与计算机工程学院专业班级:授课教师:完成时间: 2016年前言随着科学技术的不断进步,嵌入式近些年来逐渐兴起,其领域比较新,发展非常迅速,由于它属于新兴领域,接触的人并不是很多,但是嵌入式在各种电子设备上的应用越来越越广泛,并且各种电子设备也在朝着嵌入式微系统,智能化的方向前进。

STM32系列是基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核。

作为21世纪的人才,为了与社会实际需要相衔接,提高我们的学习兴趣,利用STM32系列单片机进行了一次嵌入式系统设计。

摘要在本次作业中采用STM32系列中的STM32F103RCT6微控制器芯片,采用ALIENTEK战舰STM32开发板,使用MiniSTM32开发板上的 LCD 接口,来点亮TFTLCD,实现触摸屏功能。

一、课程设计任务要求本次的课程设计目的是实现一个经典的贪吃蛇游戏,整个游戏实现功能分别为:1、初始化程序。

2、随机红点、左转、右转、判断边框。

二、系统硬件设计硬件设计原理图根据此硬件设计图再结合软件设计就能做出此游戏。

三、系统软件实现此次的课程设计在于开发个贪吃蛇游戏,其流程图如下图所示。

程序流程图为方便介绍,此软件实现只给出主要程序部分:1、本例程提供了硬件平台的初始化GPIO是常规输入/输出端口,STM32F103RCT6有PA、PB、PC、PD、PE 共5个16位的GPIO。

STM32的GPIO都可编程,具有很多复用功能。

GPIO 可以配置为很多总模式,这些模式有:输入浮空、输入上拉、输入下拉、模拟输入、开漏输入、推挽输出、推挽复用、开漏复用。

通过对GPIO寄存器编程,可以设置每个端口的工作模式。

24C02 EEPROM是开发板板载的2Kbit(256 个字节)EEPROM ,型号为:24C02,用于掉电数据保存。

因为STM32 内部没有EEPROM,所开发板外扩了24C02,用于存储重要数据,用来做IIC 实验,该芯片直接挂在STM32 的IO 口上。

8X8点阵贪吃蛇游戏(单片机)_c程序

8X8点阵贪吃蛇游戏(单片机)_c程序

#include <reg52.h>#include <string.h>#include <intrins.h>#include <stdlib.h>sbit keystar = P3^0;sbit keyup = P3^1;sbit keylift = P3^5;sbit keydown = P3^6;sbit keyright = P3^7;int n;int dir = 1; // lift->1 up->2 right->3 down->4int timer1count = 0;int state_point = 1;int time = 50000;char green_point_row = 0x01;char green_point_list = 0xfe;char row[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};char redlist[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};char greenlist[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};int temp_point_row[8] = {1,2,4,8,16,32,64,128};int temp_point_list[8] = {254, 253, 251, 247, 239, 223, 191, 127};idata char snakerow[64] = {0x08,0x08,0x08};idata char snakelist[64] = {0xfe,0xfd,0xfb};void delay_ms (int time) // Every time 1 millisecond{int i, k;for (i = 0; i < time; i++){for (k = 0; k < 901; k++);}}void init () // Initialize timer // Every time 50 milliseconds {TMOD = 0x01; // Open the two timersEA = 1;ET0 = 1;TH0 = (65536 - time) / 256;TL0 = (65536 - time) % 256;keyup = 1;}void keyscan (void){if (0 == keylift){delay_ms(3);if (0 == keylift){dir = 1;}return;}if (0 == keyup){delay_ms(3);if (0 == keyup){dir = 2;}return;}if (0 == keydown){delay_ms(3);if (0 == keydown){dir = 4;}return;}if (0 == keyright){delay_ms(3);if (0 == keyright){dir = 3;}return;}}void arr_con (int i) // An array of conversion{int num;switch(dir){case 1: //lift{if (snakelist[strlen(snakerow) - 1] == 0x7f){while(1){P0 = 0xff;P1 = 0x00;P2 = 0xff;}}snakerow[i] = snakerow[i - 1];snakerow[i + 1] = '\0';for (num = 0; num < 8; num++){if (snakelist[i - 1] == redlist[num]){break;}}snakelist[i] = redlist[num - 1];snakelist[i + 1] = '\0';for (i = 0; i < strlen(snakerow); i++){snakerow[i] = snakerow[i + 1];snakelist[i] = snakelist[i + 1];}}; break;case 2: //up{if (snakerow[strlen(snakerow) - 1] == 0x01){while(1){P0 = 0xff;P1 = 0x00;P2 = 0xff;}}snakelist[i] = snakelist[i - 1];snakelist[i + 1] = '\0';for (num = 0; num < 8; num++){if (snakerow[i - 1] == row[num]){break;}}snakerow[i] = row[num - 1];snakerow[i + 1] = '\0';for (i = 0; i < strlen(snakerow); i++){snakerow[i] = snakerow[i + 1];snakelist[i] = snakelist[i + 1];}};break;case 3: // rignt{if (snakelist[strlen(snakelist) - 1] == 0xfe){while(1){P0 = 0xff;P1 = 0x00;P2 = 0xff;}}snakerow[i] = snakerow[i - 1];snakerow[i + 1] = '\0';for (num = 0; num < 8; num++){if (snakelist[i - 1] == redlist[num]){break;}}snakelist[i] = redlist[num + 1];snakelist[i + 1] = '\0';for (i = 0; i < strlen(snakerow); i++){snakerow[i] = snakerow[i + 1];snakelist[i] = snakelist[i + 1];}}; break;case 4: //down{if (snakerow[strlen(snakerow) - 1] == 0x80){while(1){P0 = 0xff;P1 = 0x00;P2 = 0xff;}}snakelist[i] = snakelist[i - 1];snakelist[i + 1] = '\0';for (num = 0; num < 8; num++){if (snakerow[i - 1] == row[num]){break;}}snakerow[i] = row[num + 1];snakerow[i + 1] = '\0';for (i = 0; i < strlen(snakerow); i++){snakerow[i] = snakerow[i + 1];snakelist[i] = snakelist[i + 1];}};break;}}void longer (void){int length;length = strlen(snakerow);snakerow[length] = snakerow[length - 1];snakerow[length + 1] = '\0';snakelist[length] = snakelist[length - 1];snakelist[length + 1] = '\0';}void main (void){int i;int length_point;int temp;init();while(1){if (0 == keystar) // If press keystar,go on.{delay_ms(2);if (0 == keystar) // The key to eliminate jitter{P0 = 0x01;TR0 = 1;while (1){for (i = 0; i < strlen(snakerow); i++) // The original image{P1 = 0xff;P2 = 0xff;P0 = snakerow[i];P2 = snakelist[i];_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();P2 = 0xff;P0 = green_point_row;P1 = green_point_list;}for (i = 0; i < 8; i++){if (green_point_list == greenlist[i]){break;}}length_point = strlen(snakerow);if ((snakerow[length_point - 1] == green_point_row)&&(snakelist[length_point - 1] == redlist[i])){time = time + 1000;if (state_point){do{green_point_row = temp_point_row[rand() % 8]; // 1 2 4 8 16 32 64 128green_point_list = temp_point_list[rand() % 8]; // 254 253 251 247 239 223 191 127for (temp = 0; temp < strlen(snakerow); temp++) //To test whether red dot green dot overlap{if((green_point_row == snakerow[temp])&&(green_point_list == snakelist[temp])){break;}}}while(temp < strlen(snakerow));longer();state_point = 0;}}for (temp = 0; temp < (strlen(snakerow) - 3); temp++){if ((snakerow[strlen(snakerow) - 1] == snakerow[temp])&&(snakelist[strlen(snakerow) - 1] == snakelist[temp])){while(1){P0 = 0xff;P1 = 0x00;P2 = 0xff;}}}keyscan();}}}}}void timer0 (void) interrupt 1{int i;TH0 = (65536 - time) / 256;TL0 = (65536 - time) % 256;n++;if (n >= 20){i = strlen(snakerow);arr_con(i);state_point = 1;n = 0;}}。

贪吃蛇设计说明书

贪吃蛇设计说明书

贪吃蛇设计说明书贪吃蛇设计说明书开发小组成员:目录1.需求陈述 (3)2.软件结构 (3)2.1用例图 (3)2.2类图 (4)2.3状态图---------------------------------------------------------------4 3.程序描述 (4)3.1功能 (5)3.2性能 (5)3.3输入项目 (5)3.4输出项目 (6)3.5算法 (6)3.6程序逻辑 (6)4.测试要点-----------------------------------------75.对象设计-------------------------------------------------------------------71.需求陈述1.用户需要开发一款命名为贪吃蛇的休闲小游戏2.开始游戏时,存在一条向右运动的小蛇和蛇需要吃掉的豆3.用户通过键盘的“上下左右”键控制小蛇分别向“上下左右”运动来吃掉豆,同时增加自身的长度4.小蛇吃掉游戏规定数量的豆后,游戏结束5.游戏分为初级、中级、高级6.小蛇不能碰到边界7.小蛇自身不能碰撞8.游戏可以暂停和重新开始9.游戏完成后计算所得分数10.游戏在任何时候都可以退出2.软件结构1.用例图2.类图3.状态图3.程序描述3.1功能小蛇可以通过方向键进行方向的变化。

屏幕上随机的出现豆,贪吃蛇在运动的过程中蛇头可以吃掉出现的的豆。

吃掉豆后,蛇的身体会增长一节。

当蛇的身体碰到四周的墙壁或者是自己的身体时,游戏会结束。

并且,在屏幕的上方有一个分数牌显示,游戏开始时分数为0,每当蛇吃掉一个豆,分数会增加10分。

而在游戏的过程中,玩家可以按菜单上的退出键或点击界面的关闭按钮退出游戏。

3.2性能本款游戏在界面设计上清晰明了、美观大方;在操作上简单、易懂。

有效率高,不易出错的优点。

本游戏着重于娱乐大众,并且有锻炼反应速度的特点。

3.3输入项目1)用户在界面菜单的操作有点击“开始”、“暂停”、“结束”、“重新开始”、“初级”、“中级”、“高级”。

贪吃蛇游戏单片机程序

贪吃蛇游戏单片机程序

贪吃蛇游戏单片机程序贪吃蛇游戏是一款经典的游戏,其简洁的规则和有趣的玩法使其成为了许多人喜爱的游戏之一。

在单片机中实现贪吃蛇游戏需要利用单片机的输入输出功能以及控制算法来完成游戏的控制和显示。

下面是一个简单的贪吃蛇游戏单片机程序的实现。

首先,我们需要定义一些常量和变量来表示游戏中的一些参数和状态。

比如,我们可以定义一个常量来表示屏幕的宽度和高度,以及一个变量来表示蛇的长度和当前的移动方向。

c#define SCREEN_WIDTH 16#define SCREEN_HEIGHT 8#define SNAKE_MAX_LENGTH 64int snake_length;int snake_direction;接着,我们需要定义一个数据结构来表示蛇的身体,可以使用一个数组来表示蛇的每一节身体的位置。

同时,我们还需要定义一个数据结构来表示食物的位置。

cstruct point {int x;int y;};struct point snake[SNAKE_MAX_LENGTH];struct point food;然后,我们可以编写一个函数来初始化游戏的状态。

在这个函数中,我们需要初始化蛇的位置和长度,以及随机生成食物的位置。

void init_game{// 初始化蛇的位置和长度snake[0].x = SCREEN_WIDTH / 2;snake[0].y = SCREEN_HEIGHT / 2;snake_length = 1;// 随机生成食物的位置food.x = rand% SCREEN_WIDTH;food.y = rand% SCREEN_HEIGHT;}接下来,我们需要编写一个函数来处理用户输入,并更新蛇的移动方向。

这个函数可以通过读取按键的状态来实现,比如可以通过一个变量来记录当前的按键状态。

cvoid handle_input{// 读取按键状态int key = read_key// 根据按键状态更新蛇的移动方向if (key == 'W' && snake_direction != 'S') {snake_direction = 'W';} else if (key == 'S' && snake_direction != 'W') {snake_direction = 'S';} else if (key == 'A' && snake_direction != 'D') {snake_direction = 'A';} else if (key == 'D' && snake_direction != 'A') {snake_direction = 'D';}然后,我们可以编写一个函数来更新蛇的位置。

基于51单片机8x8点阵贪吃蛇综合课程设计报告-图文

基于51单片机8x8点阵贪吃蛇综合课程设计报告-图文

基于51单片机8x8点阵贪吃蛇综合课程设计报告-图文基于51单片机8x8点阵贪吃蛇综合课程设计报告-图文《电子线路综合》课程设计报告设计课题:贪吃蛇掌上游戏机毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。

对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。

除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。

对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

本人完全意识到本声明的法律后果由本人承担。

作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。

本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

涉密论文按学校规定处理。

作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。

基于51单片机贪吃蛇游戏设计

基于51单片机贪吃蛇游戏设计

基于51单片机贪吃蛇游戏设计贪吃蛇游戏是一种经典的游戏,也是很多人小时候玩过的游戏,其玩法简单,但却能够让人沉迷其中。

本文将介绍如何基于51单片机设计贪吃蛇游戏。

一、功能需求1. 界面设计贪吃蛇游戏的界面应简洁美观,可以利用点阵或LCD显示屏来呈现。

应包括游戏画面、分数、游戏难度等。

2. 操作方式游戏的操作主要包括上下左右移动贪吃蛇头部,进行输入、开始游戏、结束游戏等操作。

游戏可以使用按键、遥控器或者手柄等方式进行控制。

3. 游戏规则游戏正常进行时,贪吃蛇必须不断吃到食物,同时不能碰到墙壁或自己的身体。

每吃到一个食物,分数就会增加一点。

当贪吃蛇碰到墙壁或自己的身体时,游戏结束。

4. 难度等级游戏可以设置不同的难度等级,难度等级越高,贪吃蛇的速度就会越快,游戏难度也会相应提高。

二、设计思路本设计采用51单片机作为控制器,通过点阵或者LCD显示屏实现游戏界面的显示,通过按键、遥控器或手柄等方式进行游戏的操作。

具体设计思路如下:LCD显示屏:同样可以实现游戏画面的显示,但是可以显示更丰富的内容,如文字、动画等。

2. 游戏逻辑处理游戏逻辑处理主要包括游戏规则的实现和贪吃蛇的移动控制。

在实现游戏规则时,需要判断贪吃蛇是否碰到墙壁或自己的身体,同时需要计算分数;在实现贪吃蛇的移动控制时,需要通过按键、遥控器或者手柄等方式实现上下左右的移动。

可以通过按键或者遥控器等方式设置游戏难度等级,从而实现游戏难度的调整。

4. 硬件设计硬件设计包括主控芯片的选择、显示屏的选择、按键、遥控器或手柄等外设的选择。

主控芯片可以选择51单片机,同时可以选择点阵或LCD显示屏,按键、遥控器和手柄等外设可以根据需要进行选择。

三、实现步骤1. 硬件搭建搭建硬件时需要将主控芯片、显示屏、按键、遥控器或手柄等外设连接起来,并进行电路调试。

2. 程序设计程序设计包括游戏界面的设计、游戏逻辑的实现和难度等级的设置。

其中游戏界面的设计可以根据实际需要进行调整,游戏逻辑的实现需要考虑到游戏规则和贪吃蛇的移动控制,难度等级的设置可以通过按键或遥控器等方式实现。

单片机贪食蛇课程设计报告

单片机课程设计报告目录1设计任务及要求 (1)2总体设计思路及功能描述 (1)3 各部分软硬件设计原理及方案详细说明 (3)3.1 人机接口电路 (3)3.2单片机与PC机通信电路 (5)3.3 其他部分电路说明 (5)3.4 软件模块设计 (6)3.4.1 LCD初始化 (6)3.4.2 键盘扫描程序 (7)3.4.3 显示16*16点阵汉字 (8)3.4.4 食物的随机出现 (8)3.4.58X8点阵LED工作原理说明 (9)3.4.6锁存器(74HC573) (9)3.5软件编译 (11)4 调试的步骤及调试过程中出现的问题以及解决方法 (11)4.1 PROTEUS仿真 (11)4.2 硬件的安装 (12)4.3 调试注意事项 (12)4.3.1 硬件调试注意事项 (12)4.3.2 软件调试注意事项 (12)5 设计心得体会 (13)6 附录 (14)6.1总原理图 (14)6.2单片机程序代码 (14)7 参考文献 (23)正文:1设计任务及要求本设计以51系列单片机STC89C52为控制核心,以点阵液晶显示模块、键盘为人机接口,实现了一个贪食蛇游戏机。

通过本设计,令读者掌握利用单片机开发简单电子产品的基本技能,熟悉原理图绘制、仿真、软件设计、优化以及系统调试的基本方法,为进一步设计开发更为复杂的嵌入式模拟/数字混合系统打下一定的基础。

“贪食蛇”又称为“贪吃蛇”,是一种益智小游戏。

其游戏规则比较简单,就是一条小蛇,不停地在屏幕上游走去吃屏幕上出现的蛋,越吃越长,只要蛇头碰到屏幕四周或者碰到自己的身子,小蛇就立即毙命并结束游戏。

本作品有上下左右四个按键来控制蛇头的移动方向,另有一个复位按键控制程序的重启,游戏界面方案一:采用分辨率为128×64的液晶显示屏方案二:和8*8点阵显示。

2总体设计思路及功能描述如图ChpNum-3所示,贪食蛇软件主要分成三个部分:主程序、外部中断服务程序、定时中断服务程序。

基于51单片机的贪吃蛇游戏设计

基于51单⽚机的贪吃蛇游戏设计本科时候做的⼀个课程作业,⾃⼰搭⼀个很简易的电路,⽐较有意思且易上⼿,故将之记录下来。

(全套的仿真及代码,演⽰视频,课程报告以及PPT展⽰上传在。

)⼀. 实验⽬的(1)通过对C51语⾔的理解,编写程序实现对贪吃蛇的有效控制;(2)通过对51单⽚机硬件的学习,学会运⽤⾯包板,独⽴按键、点阵屏等,完成对完整电路的搭建过程;(3)通过对Proteus仿真软件的学习,实现基于STC89C52单⽚机的8*8点阵贪吃蛇的硬件电路仿真。

⼆. 实验介绍贪吃蛇是⼀款经典⼩游戏,其游戏的规则是:玩家通过四个⽅向键来控制蛇的移动,控制其在地图上吃⾖⼦。

吃掉⾖⼦后蛇⾝相应加长,蛇⾝速度加快。

蛇运动过程中撞到墙壁或蛇⾝,则⽴即结束本轮游戏。

三. 实现功能(1)制作⼀个8*8点阵的贪吃蛇游戏;(2)通过LED点阵屏为载体显⽰数据;(3)外接4个独⽴按键作为输⼊端,分别控制蛇的移动⽅向(上、下、左、右);(4)蛇头与墙壁或蛇⾝相撞,随即结束游戏并复位。

四. ⽅案设计在该系统中,硬件部分包括STC89C52单⽚机,8*8点阵屏,4个按键;软件部分是在keil环境下⽤C51语⾔编写,设置蛇的初始段数为2点,并设置有障碍墙壁,游戏结束后⾃动复位。

(1)贪吃蛇的移动在贪吃蛇的移动过程中,每次需要将蛇头要到的下⼀个LED灯点亮,对应蛇尾的LED灯熄灭。

在程序中即是先把蛇尾位置的值传给蛇头的下⼀个位置,然后改变蛇尾的值即可。

蛇头下⼀个位置的确定由蛇头和偏移量来确定,每次通过操作四个独⽴按键来控制蛇步进的偏移量。

因⽽只要将蛇头的位置加上其偏移量的值,即可得到新的蛇头位置。

(2)⾷物的出现在市场上所流⾏的贪吃蛇游戏中,⾷物的出现是⼀种随机⾏为,这在程序中需要做⼀个随机数来⽀撑该过程。

我们组在实验过程中也尝试了该过程,最终选择让⾷物出现在蛇尾的后⼀步,来执⾏整个程序。

与此同时,⾷物出现的位置不能与蛇的位置重合,也不能超出墙外,否则需要重置⾷物。

基于51单片机的贪吃蛇游戏设计(Proteus仿真含完整程序)

中北大学硬件大型实验说明书学生姓名:学号:学院: 计算机与控制工程学院专业: 计算机科学与技术题目: “贪吃蛇”游戏设计指导教师:职称:2016 年 9 月 14 日目录一、需求分析 (1)二、工具 (1)三、概要设计 (1)四、详细设计(硬件设计和连接部分) (2)1.组件介绍 (2)1)AT89C55单片机 (2)2)Matrix-8X8点阵屏幕 (3)3)74LS154译码器 (3)4)CMOS反相器 (4)5)按键 (4)6)7-SEG BCD (5)2.硬件设计 (5)五、心得体会 (7)附录I(程序) (9)附录II(运行截图) (16)一、需求分析我们的课程设计题目是基于51单片机和一些基础组件设计出一个贪吃蛇游戏。

游戏的实现需要一个16x16的屏幕(由4个8x8的点阵屏组成)和5个按键,其中4个按键控制贪吃蛇的前进方向,另外一个按键可以使游戏重新开始。

另外还需要一个显示BCD码的数字型LED灯组用于记录得分。

贪吃蛇游戏需要实现的功能是:游戏开始时会出现一个长度为init_length的贪吃蛇,和一个随机出现的苹果(必须是贪吃蛇蛇身以外的一个点)。

玩家可以通过按键控制贪吃蛇的前进方向,但是只能转向,而不能向前或者向后,例如:当贪吃蛇向上行走时,只能通过左键和右键来让它左转或者右转,另外两个按键将失灵。

当贪吃蛇吃到苹果后,贪吃蛇尾部将会增加一个点,而屏幕上又会随机出现一个不与贪吃蛇重合的点。

此时积分器加一。

当贪吃蛇马上就要“撞向”屏幕边缘时,会从相反的一边钻出来。

所以“撞墙”并不会导致游戏结束。

而当贪吃蛇吃到自身时则会使游戏结束,并且会自动回到游戏初始化时的状态。

任何时候按下“重新开始”按键都将使游戏回到初始状态。

二、工具51单片机开发板,Keil uVision3,ISIS 7 Professional。

三、概要设计根据我们要实现的功能,我们决定把这次课程设计分成三个部分。

第一个部分为硬件设计和连接部分。

(完整版)基于STC89C52单片机贪吃蛇做法

(完整版)基于STC89C52单片机贪吃蛇做法#ifndef _glb_h_#define _glb_h_#define uchar unsigned char#define uint unsigned int#define LOW 0#define HIGH 1//初始化指令#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H #define AC_INIT 0x02 //将AC设置为00H。

且游标移到原点位置#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)#define FUN_MODE 0x30 //工作模式:8位基本指令集#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白#define DISPLAY_OFF 0x08 //显示关#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH#define SET_DD_AC 0x80#define FUN_MODEK 0x36 //扩展指令集,8位指令#define X1address 0x80 //上半屏X轴起始地址#define X2address 0x88 //下半屏X轴起始地址#define Yaddress 0x80 //Y轴起始地址/*---------------------------------------------------------------------------------------------------液晶屏----------------------------------------------------------------------------------------------------*/#define DataPort P0sbit RS = P3^5;sbit RW = P3^6;sbit E = P3^4;sbit PSB = P3^7;sbit WELA = P2^7;sbit DULA = P2^6;sbit speed=P2^0;sbit beep=P2^3;/*#define DataPort P1sbit RS = P2^0;sbit RW = P2^1;sbit E = P2^3;sbit PSB = P2^4;//sbit WELA = P2^7;//sbit DULA = P2^6;*//*---------------------------------------------------------------------------------------------------贪吃蛇----------------------------------------------------------------------------------------------------*/ //定义复位不自动清零全局变量//#pragma DATA_SEG NOINIT_RAMsbit LEFT=P2^4;//左sbit RIGHT=P2^1;//右sbit UP=P2^5;//上sbit DOWN=P2^2;//下//sbit Led1=P1^7;//sbit Led2=P1^6;/*sbit LEFT=P0^2;//左sbit RIGHT=P0^3;//右sbit UP=P0^0;//上sbit DOWN=P0^1;//下*/sbit Led7=P1^0;sbit Led6=P1^1;sbit Led5=P1^3;sbit Led4=P1^4;//sbit Led3=P3^3;//sbit Led2=P3^2;//sbit Led1=P3^1;//sbit Led0=P3^0;#endif#ifndef _Init_h_#define _Init_h_/*------------------------------------------------------------------------------------------------------------Init_12864-------------------------------------------------------------------------------------------------------------*/void Delayus(unsigned char i);void Delayms(unsigned int i);void Check_Busy();void Write_Cmd(unsigned char Cmd);void Write_Data(unsigned char Data);//uchar Read_Status();uchar Read_Data();void Init_IO();void Init_12864();//void disp();void CGRAM();void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s);void ClrScreen();void Clr_GDRAM(void);void LCD_PutGraphic(unsigned char code *img);void SetGraphicMode();void Keyscan();void statuschange();void Draw_Point(uchar X,uchar Y,uchar clour);void Draw_zhi(uchar X1,uchar X2,uchar Y);void Draw_shu(uchar X,uchar Y1,uchar Y2);void Draw_line(uchar x0,uchar y0,uchar x1,uchar y1);void Draw_all_lines();void Stat_Point();void Last_Point();void Add_Point();void Bump_Wall();void Self_Bump();/*------------------------------------------------------------------------------------------------------------Init_Time-------------------------------------------------------------------------------------------------------------*/ //void Init_Time();//void exter0() interrupt 1#endif#include#include "glb.h"uint timestatus=0;void Init_Time(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void Timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;timestatus++;if(speed==0){if(timestatus>2)timestatus=0;}if(timestatus>10)timestatus=0;}#ifndef _Interrupt_h_ #define _Interrupt_h_void Init_Time();#endif#include#include "glb.h"/*游戏的初始化值*/uchar gamestatus=0;uchar flag=1; //折点个数标志uchar a[]={20,0,0,0,0,0,0,0}; //其中(a[0],b[0])为初始蛇头坐标,(a[1],b[1])为初始蛇尾坐标,之后蛇尾坐标为(a[flag],b[flag])。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程实训作品说明书姓名:李兆基完成时间:2016年7月3日一、 作品说明介绍1. 作品名称:贪吃蛇简易游戏机2. 作品实现功能:a) 按上、下、左、右键控制蛇身改变方向;b) 蛇头与食物碰撞时“吃掉”食物,使蛇身变长; c) 复位键使游戏重新开始;d) 暂停/继续键可以暂停、继续游戏3. 选择目的:巩固单片机课程所学知识,真正做到学有所用二、 作品操作介绍1. 作品外观图① ②点阵屏:显示地图、蛇以及食物③STC12C5A60S2单片机:控制整个作品,可以烧录不同的程序 ④微动开关1:向上的按键,用于改变蛇的方向 ⑤微动开关2:向下的按键,用于改变蛇的方向 ⑥微动开关3:向左的按键,用于改变蛇的方向①②③④⑤⑥⑦ ⑧ ⑨⑩ ⑪⑫⑬⑭⑮⑦微动开关4:向右的按键,用于改变蛇的方向⑧微动开关5:复位按键,按下后游戏复位,重新开始⑨微动开关6:暂停/继续按键,控制游戏暂停/继续⑩自锁开关:实现整体的电源总控制(断负)⑪晶振、电容:用于单片机起振,单片机的最小时钟电路⑫排针:用于连接电源正负极以及RXD和TXD⑬电源指示灯:通电时点亮⑭8个1KΩ电阻:限制电流大小⑮10个0Ω电阻:做跳线用2.作品功能介绍及操作说明a)给游戏机上电①将电源正极接在排针处标有VCC的位置②将电源负极接在排针处标有GND的位置③按下自锁开关完成上电b)让贪吃蛇改变方向①按向上键:蛇身向上②按向下键:蛇身向下③按向左键:蛇身向左④按向右键:蛇身向右c)游戏暂停/继续、复位①按暂停/继续键:游戏暂停/继续②按复位键:游戏复位,重新开使三、作品制作说明1.电路原理图2.3.PCBa)正面图(见附录1)b)F5图(见附录2)c)F6图(见附录3)四、产品控制顺序/*******************************************名称:贪吃蛇简易游戏机制作人:李兆基制作时间:2016.6.28修改时间:2016.7.1 (加入吃食物蛇身变长功能)2016.7.3 (处理程序兼容细节)*******************************************/#include<stc12c5a60s2.h>#include<stdlib.h>unsigned char map[16]; //定义一个MAP地图unsigned char line; //列unsigned char snake[45][2]; //定义蛇的大小unsigned char game_reset; //游戏复位unsigned char foodx,foody; //食物的位置sbit Key_left=P3^2; //左sbit Key_up=P3^3; //上sbit Key_down=P3^4; //下sbit Key_right=P3^5; //右sbit Key_start=P3^7; //开始/暂停sbit Key_reset=P3^6; //复位/****************按键所对应的位置***************/void CreateFood(){unsigned char i;i=0;RESET:foodx=rand()%6+1;//rand()函数随即产生食物的横坐标(1~6)foody=rand()%14+1;//rand()函数随即产生食物的纵坐标(1~14)while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44)) //找蛇尾(遍历蛇){if(snake[i][0]==foodx&&snake[i][1]==foody)goto RESET;//如果产生的食物在蛇的节点上,则重新生成食物i++;}}/*********构造食物********/void ClearMap(){unsigned char i;for(i=0;i<16;i++)map[i]=0x81; //清空地图map[0]=map[15]=0xff; //构造墙}/**********初始化地图**********/void ClearSnake(){unsigned char i;for(i=0;i<45;i++)snake[i][0]=snake[i][1]=0x00; //清空蛇节点snake[0][0]=5;snake[0][1]=10; //构造蛇头snake[1][0]=5;snake[1][1]=11;snake[2][0]=5;snake[2][1]=12; //构造蛇身snake[3][0]=44;snake[3][1]=44; //构造蛇尾}/************初始化蛇节点************/void SnakeToMap(void){unsigned int i;ClearMap();i=0x80>>foodx; //获取食物的横坐标map[foody]|=i; //将其横坐标和纵坐标对应的点显示在地图上i=0;while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44)){map[snake[i][1]]|=0x80>>snake[i][0];i++;} //将蛇节点全部显示在地图上}/**********************将蛇以及食物显示在地图上***********************/void Move(unsigned char fx)//fx参数(0为上,1为下,2为左,3右){unsigned char i,snakewx,snakewy;snakewx=snakewy=i=0;while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;snakewx=snake[i-1][0];snakewy=snake[i-1][1]; //扫描蛇节点并且得到尾巴的位置(横纵坐标)switch(fx){case 0:while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++; //扫描蛇节点得到节点数for(i--;i>0;i--){snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1];} //后节点朝着前节点方向移动snake[0][0]--; //移动蛇头break;case 1:while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++; //扫描蛇节点得到节点数for(i--;i>0;i--){snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1]; //后节点朝着前节点方向移动}snake[0][0]++; //移动蛇头break;case 2:while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;for(i--;i>0;i--){snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1];}snake[0][1]--;break;case 3:while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;for(i--;i>0;i--){snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1];}snake[0][1]++;break;}if(snake[0][0]==foodx&&snake[0][1]==foody) //蛇吃食物(蛇头的坐标与食物坐标重合){while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;snake[i][0]=snakewx;snake[i][1]=snakewy;snake[i+1][0]=snake[i+1][1]=44; //重新添加(定义)蛇尾CreateFood(); //创建食物}}/************************蛇的移动(按键的方向改变)************************/void delay(unsigned int i){unsigned int j;while(i--)for(j=600;j>0;j--);}/*********************延时函数(接近与1毫秒)*********************/void donghua(void){unsigned int i;for(i=0;i<16;i++){if(i<8){P2=0xff;P1=~(0x80>>i);}else{P1=0xff; //第一块点阵屏亮P2=~(0x80>>(i-8));}P0=0xff;delay(20);}P1=P2=P0=0x00;for(i=0;i<16;i++){if(i<8){P1=0xff;P2=~(0x01<<i);}else{P2=0xff;P1=~(0x01<<(i-8));} //第二块点阵屏亮P0=0xff;delay(20);}}/********开机动画********/bit IsOver(){unsigned char i;game_reset=0;i=0;while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;for(i--;i>0;i--){if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1]){game_reset=1;break;} //遍历蛇节点是否蛇头和蛇身重合}if(snake[0][0]==0||snake[0][0]==7||snake[0][1]==0||snake[0][1]==15) //判断蛇头是否撞墙game_reset=1;return game_reset;}/*********************判断蛇的状态(死亡条件)**********************/void init(void){P0M0=0xff;P0M1=0x00;//PO为强推模式TMOD=0X01;//设定时/计数器方式EA=1; //开启中断ET0=1; //开启定时计数器0TH0=(65536-1000)/256;TL0=(65536-1000)%256; //设置计数初值为1毫秒TR0=1; //开启定时/计数软开关ClearMap(); //初始化地图ClearSnake(); //初始化蛇}/**********初始化函数**********/void main(void){unsigned char fx,i,newfx; //定义方向,新方向,以及变量iunsigned char isStart; //开始/暂停变量newfx=fx=2; //初始化方向donghua();delay(100);i=0;isStart=1;init();CreateFood();while(1){for(i=0;i<20;i++){delay(10);if(fx!=1&&!Key_up&&isStart)//蛇向下移动则向上按键无效{newfx=0;}if(fx!=0&&!Key_down&&isStart) //蛇向上移动则向下按键无效{newfx=1;}if(fx!=3&&!Key_left&&isStart) //蛇向左移动则向右按键无效{newfx=2;}if(fx!=2&&!Key_right&&isStart) //蛇向右移动则向左按键无效{newfx=3;} //按键改变newfx,默认向fx移动if(!Key_start){delay(20);if(!Key_start)if(isStart==1)isStart=0;else if(isStart==0)isStart=1; //暂停/继续改变isStart状态while(!Key_start);delay(20);}if(!Key_reset){delay(20);if(!Key_reset)game_reset=1;while(!Key_reset);delay(20);if(game_reset)return; //复位}if(!isStart)i--; //暂停状态时所执行的死循环delay(10);}if(fx==0&&newfx==1||fx==2&&newfx==3)newfx=fx;elsefx=newfx; //方向冲突时按新方向移动,避免按的太快Move(fx); //移动while(IsOver()){if(!Key_reset){delay(20);if(!Key_reset)game_reset=1;while(!Key_reset);delay(20);if(game_reset)return;}if(!isStart)i--;delay(10);} //当蛇死亡只能激活复位按钮SnakeToMap(); //将蛇显示在地图}}/******主函数******/void display(void) interrupt 1{TR0=0; //关闭软开关TH0=(65536-1000)/256;TL0=(65536-1000)%256; //计数赋值if(line<8){P2=0xff;P1=~(0x80>>line); //选列}else{P1=0xff;P2=~(0x80>>(line-8)); //选列} //两块点阵屏的对接P0=map[line]; //送行line++;if(line==16)line=0;TR0=1; //开启软开关}/********显示函数********/。

相关文档
最新文档