单片机课程设计(贪吃蛇)参考word
贪吃蛇设计文档.doc

贪吃蛇游戏的设计文档目录一、需求分析 ................................................. 错误 ! 未定义书签。
1.功能需求 . .............................................. 错误 ! 未定义书签。
2.非功能需求错误 ! 未定义书签。
. ............................................二、系统设计 ................................................. 错误 ! 未定义书签。
1. 实际思路 . ............................................... 错误 ! 未定义书签。
2,结构设计 . .............................................. 错误 ! 未定义书签。
(1), main(), 主函数; . ................................ 错误 ! 未定义书签。
(2), init() , 图形化驱动函数 . ......................... 错误 ! 未定义书签。
(3), help(), 帮助信息函数 . ............................ 错误 ! 未定义书签。
(4), drawfence(), 周围墙壁函数 . ....................... 错误 ! 未定义书签。
(5), printscore(), 得分显示函数 . ...................... 错误 ! 未定义书签。
(6), playgame(), 游戏控制函数 . ........................ 错误 ! 未定义书签。
(7), gameover(), 游戏结束函数 . ........................ 错误 ! 未定义书签。
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程序

#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;}}。
(完整word版)贪吃蛇实验报告

《计算机程序设计》课程设计报告课题名称贪吃蛇游戏班级学号姓名指导教师设计时间至设计地点常熟理工学院计算机科学与工程学院常熟理工学院计算机科学与工程学院目录1需求解析 (1)2系统解析和设计 (1)数据构造的设计和选择的原因 (1)系统模块区分和模块构造 (2)流程图 (2)数据种类、全局变量和函数说明 (3)3程序测试和运转结果 (4)4课程报告小结 (5)分数重叠显示 (5)速度太快 (5)食品可能出此刻蛇身上 (5)附录 A :程序源代码 (6)《 C 程序设计》课程设计1 需求解析【论述课程设计应当达成的功能】使用键盘的上下左右,来控制蛇的运动方向,ESC 键退出,并显示得分。
2系统解析和设计2.1 数据构造的设计和选择的原因本游戏中波及的主要数据构造是怎样表示运动的蛇、食品状态等问题。
2.1.1 从游戏参照画面中我们能够看到,贪吃蛇的身体是一节节的,由一个个大小同样的方块构成,那么我们能够用一个 (x,y) 坐标为左上角的、固定宽度的正方形来表示一节蛇身。
为表示连续的多节身体,那么我们能够采纳数组(或链表,或线性表)等数据构造来表示。
下边以数组方式为例:struct Point {int x, y;}struct Point nodes[MAX_LENGTH];// 蛇身数组, MAX_LENGTH为最大蛇长贪吃蛇是在不停的运动的,我们研究蛇的运动能够发现这样的特色:1. 蛇头由键盘控制,键盘不操作时,保持原有方向运动;(用 int direction; 表示 )2.运动时,蛇身后边一节挪动到前面一节的地点。
当我们用 nodes[0]表示蛇头的时候, nodes[1] 运动到 nodes[0]处; nodes[2] 运动到 nodes[1]处 ...。
3. 吃到一个食品此后,蛇身会增添一节。
即该数组中的有效数据个数加一。
(用 int length;表示 )依据上边的状况,我们能够设计蛇的数据构造以下:struct Snake {struct Point nodes[MAX_LENGTH];// 蛇身数组,保留每节蛇身的坐标。
贪吃蛇游戏单片机程序

贪吃蛇游戏单片机程序贪吃蛇游戏是一款经典的游戏,其简洁的规则和有趣的玩法使其成为了许多人喜爱的游戏之一。
在单片机中实现贪吃蛇游戏需要利用单片机的输入输出功能以及控制算法来完成游戏的控制和显示。
下面是一个简单的贪吃蛇游戏单片机程序的实现。
首先,我们需要定义一些常量和变量来表示游戏中的一些参数和状态。
比如,我们可以定义一个常量来表示屏幕的宽度和高度,以及一个变量来表示蛇的长度和当前的移动方向。
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点阵贪吃蛇综合课程设计报告-图文《电子线路综合》课程设计报告设计课题:贪吃蛇掌上游戏机毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
基于51单片机贪吃蛇游戏设计

基于51单片机贪吃蛇游戏设计贪吃蛇游戏是一种经典的游戏,也是很多人小时候玩过的游戏,其玩法简单,但却能够让人沉迷其中。
本文将介绍如何基于51单片机设计贪吃蛇游戏。
一、功能需求1. 界面设计贪吃蛇游戏的界面应简洁美观,可以利用点阵或LCD显示屏来呈现。
应包括游戏画面、分数、游戏难度等。
2. 操作方式游戏的操作主要包括上下左右移动贪吃蛇头部,进行输入、开始游戏、结束游戏等操作。
游戏可以使用按键、遥控器或者手柄等方式进行控制。
3. 游戏规则游戏正常进行时,贪吃蛇必须不断吃到食物,同时不能碰到墙壁或自己的身体。
每吃到一个食物,分数就会增加一点。
当贪吃蛇碰到墙壁或自己的身体时,游戏结束。
4. 难度等级游戏可以设置不同的难度等级,难度等级越高,贪吃蛇的速度就会越快,游戏难度也会相应提高。
二、设计思路本设计采用51单片机作为控制器,通过点阵或者LCD显示屏实现游戏界面的显示,通过按键、遥控器或手柄等方式进行游戏的操作。
具体设计思路如下:LCD显示屏:同样可以实现游戏画面的显示,但是可以显示更丰富的内容,如文字、动画等。
2. 游戏逻辑处理游戏逻辑处理主要包括游戏规则的实现和贪吃蛇的移动控制。
在实现游戏规则时,需要判断贪吃蛇是否碰到墙壁或自己的身体,同时需要计算分数;在实现贪吃蛇的移动控制时,需要通过按键、遥控器或者手柄等方式实现上下左右的移动。
可以通过按键或者遥控器等方式设置游戏难度等级,从而实现游戏难度的调整。
4. 硬件设计硬件设计包括主控芯片的选择、显示屏的选择、按键、遥控器或手柄等外设的选择。
主控芯片可以选择51单片机,同时可以选择点阵或LCD显示屏,按键、遥控器和手柄等外设可以根据需要进行选择。
三、实现步骤1. 硬件搭建搭建硬件时需要将主控芯片、显示屏、按键、遥控器或手柄等外设连接起来,并进行电路调试。
2. 程序设计程序设计包括游戏界面的设计、游戏逻辑的实现和难度等级的设置。
其中游戏界面的设计可以根据实际需要进行调整,游戏逻辑的实现需要考虑到游戏规则和贪吃蛇的移动控制,难度等级的设置可以通过按键或遥控器等方式实现。
单片机贪食蛇课程设计报告参考模板

单片机课程设计报告目录1设计任务及要求 (1)2总体设计思路及功能描述 (1)3 各部分软硬件设计原理及方案详细说明 (2)3.1 人机接口电路 (2)3.2单片机与PC机通信电路 (4)3.3 其他部分电路说明 (5)3.4 软件模块设计 (5)3.4.1 LCD初始化 (5)3.4.2 键盘扫描程序 (7)3.4.3 显示16*16点阵汉字 (7)3.4.4 食物的随机出现 (7)3.4.58X8点阵LED工作原理说明 (8)3.4.6锁存器(74HC573) (8)3.5软件编译 (10)4 调试的步骤及调试过程中出现的问题以及解决方法 (10)4.1 PROTEUS仿真 (10)4.2 硬件的安装 (10)4.3 调试注意事项 (11)4.3.1 硬件调试注意事项 (11)4.3.2 软件调试注意事项 (11)5 设计心得体会 (11)6 附录 (12)6.1总原理图 (12)6.2单片机程序代码 (13)7 参考文献 (22)正文:1设计任务及要求本设计以51系列单片机STC89C52为控制核心,以点阵液晶显示模块、键盘为人机接口,实现了一个贪食蛇游戏机。
通过本设计,令读者掌握利用单片机开发简单电子产品的基本技能,熟悉原理图绘制、仿真、软件设计、优化以及系统调试的基本方法,为进一步设计开发更为复杂的嵌入式模拟/数字混合系统打下一定的基础。
“贪食蛇”又称为“贪吃蛇”,是一种益智小游戏。
其游戏规则比较简单,就是一条小蛇,不停地在屏幕上游走去吃屏幕上出现的蛋,越吃越长,只要蛇头碰到屏幕四周或者碰到自己的身子,小蛇就立即毙命并结束游戏。
本作品有上下左右四个按键来控制蛇头的移动方向,另有一个复位按键控制程序的重启,游戏界面方案一:采用分辨率为128×64的液晶显示屏方案二:和8*8点阵显示。
2总体设计思路及功能描述如图ChpNum-3所示,贪食蛇软件主要分成三个部分:主程序、外部中断服务程序、定时中断服务程序。
基于单片机的贪食蛇设计

基于单片机的贪食蛇设计一、引言贪食蛇是一款经典的电子游戏,也是很多人童年的回忆。
在这个项目中,我们将使用单片机设计并实现一个基于单片机的贪食蛇游戏。
通过这个项目,我们可以学习并理解单片机的使用、游戏的逻辑设计和开发过程。
二、设计原理1.单片机选择和引脚配置我们选择使用ATmega16单片机作为主控芯片。
ATmega16是一款8位的RISC微控制器,具有很强的处理能力和丰富的外设资源。
我们将连接LCD显示屏、按键、LED等外设,以实现游戏的显示和交互功能。
2.游戏逻辑设计贪食蛇游戏的逻辑设计包括蛇的移动、食物的生成和判断是否吃到食物等功能。
(1)蛇的移动蛇的移动是游戏的核心逻辑之一、在每一个游戏周期内,蛇的位置将根据用户的输入进行更新。
当蛇吃到食物后,蛇将会增加身体长度,移动的方式则是在蛇头的位置插入新的节点,同时删除蛇尾的节点。
(2)食物的生成食物的生成是贪食蛇游戏的另一个重要功能。
食物的生成应该遵循一定的规则,例如不能生成在蛇身上。
当蛇吃到食物后,游戏分数将增加,并且在一个合适的位置生成新的食物,继续进行游戏。
(3)判断是否吃到食物判断蛇是否吃到食物是游戏进行的关键判断。
当蛇的头部位置与食物位置重合时,就表示蛇吃到了食物,游戏的分数将增加。
3.外设的接口设计我们将使用LCD显示屏、按键和LED等外设与单片机进行交互。
(1)LCD显示屏我们将使用LCD显示屏来显示游戏的界面和分数。
单片机通过并行或者串行接口与LCD进行通讯,将游戏界面和分数进行显示。
(2)按键按键用于控制蛇的移动方向,例如上、下、左、右。
通过检测按键的状态,单片机可以识别用户的输入,并根据输入来更新蛇的位置。
(3)LEDLED用于显示游戏的状态,例如游戏是否开始、是否结束等。
通过控制LED的亮灭,我们可以通过外设来反馈游戏的状态。
三、系统实现1.硬件连接将ATmega16单片机与LCD显示屏、按键和LED进行连接。
根据单片机和外设的引脚映射关系,正确地连接到单片机的对应引脚。
基于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])。
基于51单片机8x8点阵贪吃蛇综合课程设计报告

基于51单片机8x8点阵贪吃蛇综合课程设计报告此文档为WORD版可编辑修改《电子线路综合》课程设计报告设计课题:贪吃蛇掌上游戏机专业班级:电子信息班学生姓名:指导教师:设计时间:2016 .12 .23目录一、设计任务与要求二、方案设计与论证三、原理图及元器件清单四、性能测试与分析五、性能测试与分析六、结论与心得七、参考文献八、附录贪吃蛇掌上游戏机一、设计任务与要求基本功能:制作一个8*8点阵的贪吃蛇游戏,系统以单片机的c语言的软件设计,系统通过LED点阵屏为载体显示数据,并用四个输入端表示四个控制键(上下左右)。
系统硬件部分由STC89C52RC单片机,8*8点阵屏, 4个按键,软件部分在keil环境下用c51语言编写,包括游戏初始蛇的段数,以及障碍墙壁,游戏结束时自动复位。
具体要求:1、用四个按钮控制蛇的方向,蛇的原始段数为2点,并设置墙壁。
2、蛇的移动速度随着蛇的段数增加而增加,当蛇碰到墙壁和自己的身体时死亡3、用proteus设计,仿真基于STC89C52RC单片机的8*8点阵贪吃蛇的硬件电路。
4、蛇死亡,游戏结束,系统自动复位。
二、方案设计与论证图1、系统框图1、贪吃蛇的移动当蛇没有吃到任何食物时,每次步进蛇头的将要到的下一个LED灯点亮,而蛇尾那个LED灯会灭掉,程序设计时只要将蛇尾那点位置的值传给蛇头下一个位置的值,再改变蛇尾的值即可。
而蛇头下一个位置根据蛇头和偏移量来确定,每次上下左右按键决定了蛇步进的偏移量,只要将蛇头的位置加上偏移量的值即得到新的蛇头位置。
当蛇头碰到四周的墙壁或者碰到自己的身体,小蛇就立即毙命并结束游戏。
2、食物的随机出现食物的出现是一种随机行为,所以必须做一个随机数,而且食物出现的位置不能与蛇的位置相同,也不能超出墙外,否则就要重置食物。
这里使用程序中的定时计数器的低八位 TL0的数值,由于TL0不断变化,不同的时间点数值不同,我这里使用的是C语言里的stdlib.h文件库,使用里面的随机函数srand(),先利用srand(TL0)获得TL0的数值,再利用两次rand()%8分别得到食物出现的横纵坐标的位置。
(完整word版)贪吃蛇游戏程序设计一课程设

贪吃蛇游戏程序设计__一、课程设.txt同志们:别炒股,风险太大了,还是做豆腐最安全!做硬了是豆腐干,做稀了是豆腐脑,做薄了是豆腐皮,做没了是豆浆,放臭了是臭豆腐!稳赚不亏呀!贪吃蛇游戏程序设计一、课程设计任务贪吃蛇小游戏程序设计二、设计要求通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。
(1).收集资料,分析课题,分解问题,形成总体设计思路;(2).对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍;(3).上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行;(4).完成课程设计报告,并进行答辩三、需求分析3.1、程序功能贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
3.2、设计思想程序关键在于表示蛇的图形及蛇的移动。
用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。
移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。
食物的出现与消失也是画矩形块和覆盖矩形块。
为了便于理解,定义两个结构体:食物与蛇。
3.3、流程图开始初始化界面和蛇身放置食物蛇开始运动蛇吃到食?蛇长大蛇死亡?继续?退出界面NYNY游戏者按键选择Y四、设计的具体实现(1)函数定义函数定义是对各个基础函数的定义,并且设置需要运用的信息,便于调用#define N 200#define M 200#include"graphics.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#include<iostream.h>#include<dos.h>#include<conio.h>#include <windows.h>#define LEFT 97//A#define RIGHT 100//D#define DOWN 115//S#define UP 119//W#define Esc 0x011bint i,key;int score=0;int gamespeed=250;//游戏速度可根据实际情况自行调整struct Food{int x;//食物的横坐标int y;//食物的纵坐标int yes;//判断是否要出现食物的变量}food;//食物的结构体struct Snake{int x[M];int y[M];int node;//蛇的节数int direction;//蛇的移动方向int life;//蛇的生命,0表示活着,1表示死亡}snake;void Init();//图形驱动void Close();//图形结束void DrawK();//开始画面void GamePlay();//玩游戏的具体过程void GameOver();//游戏结束void PrScore();//输出成绩(2)主函数main( ) 主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统,调用函数DrawK()画出开始画面,调用函数GamePlay(),即玩游戏的具体过程,游戏结束后调用Close()关闭图形系统,结束程序void main()//主函数{Init();//图形驱动DrawK();//开始画面GamePlay();//玩游戏的具体过程Close();//图形结束}void Init()//图形驱动{int gd=DETECT,gm;initgraph(&gd,&gm," ");/*此处为turboc的路径,读者可以根据自己的电脑而改*/cleardevice();}(3)画界面函数DrawK( )主界面是一个封闭的围墙,用两个循环语句分别在水平和垂直方向输出连续的宽度和高度均的矩形方块,表示围墙,为了醒目,设置为白色。
基于某单片机地贪吃蛇游戏设计

基于单片机的贪吃蛇游戏设计学生姓名:学生学号:院(系):电气信息工程学院年级专业:指导教师:二〇一五年五月摘要在21世纪的今天,人们的生活开始变得更加丰富多彩。
在繁忙的工作之余,娱乐成为人们生活不可或缺的一份子,而游戏作为近年来逐渐兴起的一种娱乐方式,已经越来越受到人们的青睐。
在工作学习之余,通过玩游戏来放松、调节紧张的学习工作压力是不错的选择;然而大型的网络游戏玩起来比较耗费时间,且不能随时随地的玩。
那么如果这时候拥有一款简单易携带,并且能够缓解压力的小游戏将是个不错的选择,所以,我就设计了这样一款简单易携带的经典小游戏——贪吃蛇。
具体实现上,硬件系统平台采用STC89C52R单片机,搭载LCD12864显示屏,构成一个轻巧简单的游戏机系统。
软件系统采用C语言编程,Protues软件设计电路并仿真,KEIL软件进行程序的调试。
最终实现贪吃蛇游戏系统。
本次设计的贪吃蛇游戏,实现了传统意义上的贪吃蛇游戏的特点:蛇吃掉豆子后,得分增加并且蛇身变长;分数到达一定数目进行升级以后,蛇运动速度加快。
而玩家只需利用方向按钮“上↑、下↓、左←、右→”来改变蛇的运行方向,就能达到娱乐的目的,操作非常简单。
关键词:贪吃蛇游戏,STC89C52R单片机,LCD12864,C语言ABSTRACTIn the 21st century today, people's life become more colorful, In the outside of busy work, entertainment become an integral part of people's life, And the game as emerging in recent years, a kind of entertainment, already more and more get the popular of people, In the outside of work and study, through the play games to relax, adjust the pressure of learning is a good choice; However large network game play more time-consuming, And can't play anywhere, anytime. So if this time has a simple is easy to carry, and can ease the pressure of small game will be a good choice. So, I would design such a simple and easy to carry small classic game –t h e s n a k e g a m e.On the concrete implementation, with STC89C52RCSingle chip microcomputer system platform, with a LCD display, constitute a lightweight simple game system. Software use C language programming, use Protues software Circuit design and simulation, KEIL Software program debugging, Finally realizes the snake gamesystem.The design of the snake game, Achieved in the traditional sense of the snake game features: after the snake to eat beans, scores and snake-body variable length; Score to reach a certain number after the upgrade, the snake's movement speed. Players need to use the direction key "↑,up, down, left, right , to change the running direction of snake, and can achieve the purpose of entertainment ,the operation is very simple.Key words:Greedy Snake Game, STC89C52RCSingle chip microcomputer, LCD12864,C language目录摘要 (I)ABSTRACT (2)1绪论 (2)1.1本课题研究的背景及意义 (2)1.2 国内外研究现状、水平 (2)1.3 本课题的发展趋势 (3)1.4本课题的研究内容和达到的要求 (3)2 方案分析与选择 (2)2.1 系统方案设计 (2)2.2显示器模块设计方案 (2)2.3 按键输入模块设计方案 (3)2.4 本课题的技术指标 (3)2.5 本课题的创新 (3)3 系统硬件设计 (4)3.1单片机的选择与其性能分析 (4)3.1.1 单片机概述 (4)3.1.2 单片机STC89C52RC的介绍 (4)3.1.3 单片机最小系统的介绍 (5)3.2 LCD12864简介 (6)3.2.1 LCD12864概述 (6)3.2.2 LCD128*64的基本特性 (7)3.2.3 模块接口说明 (7)3.2.4 指令说明 (9)3.3 键盘电路的设计 (11)3.4 蜂鸣器电路的设计 (11)3.4.1蜂鸣器简介 (11)3.4.2 蜂鸣器的设计 (12)4 软件系统设计 (13)4.1 游戏设计思想 (13)4.2 主要模块介绍及其功能 (14)4.3 编程语言介绍 (15)4.3.1 C语言简介 (15)4.3.2 C源程序结构特点 (16)4.4 程序设计流程图 (16)5 仿真设计与结果分析 (17)5.1 仿真软件的简介 (17)5.1.1 仿真软件Proteus的简介 (17)5.1.2 keiluVision4编程开发工具的简介 (17)5.2本系统的Proteus仿真设计 (2)5.2.1仿真设计的预期目标 (2)6 PCB设计 (2)6.1 PCB设计软件 (2)6.1.1 PCB原理图设计 (2)6.1.2 PCB板制作方法 (2)6.2 PCB的EMC设计 (2)6.2.1 元器件布局的基本原则 (2)6.2.2 布线设计原则 (2)6.3 印制电路板 (2)6.3.1 印制电路板的结构 (2)6.3.2 印制电路板的种类 (2)6.3.3 印制电路板制作流程 (2)7 系统调试 (2)7.1 硬件调试 (2)7.2 软件调试 (2)7.3 硬件软件联合调试 (2)7.4 调试结果 (2)结论 (3)参考文献 (4)附录一:系统PCB原理图 (5)附录二:系统仿真图 (2)附录三: PCB图 (2)附录四:程序主函数 (1)附录五:原器件清单 (2)致谢............................................ 错误!未定义书签。
单片机贪吃蛇课程设计报告模板

电气与信息工程学院单片机课程设计报告一、设计任务及要求基本功能:制作一个8*8点阵的贪吃蛇游戏,系统以单片机的C语言的软件设计,系统通过LED点阵屏为载体显示数据,并用五个输入端表示五个控制键(上下左右及加速)。
系统硬件部分由STC89C52RC单片机,8*8点阵屏,5个按键,软件部分在keil环境下用C51语言编写,包括游戏初始化蛇的节数,以及障碍墙壁,游戏结束时自动复位。
具体要求:1、用四个按钮控制贪吃蛇的行径,一个按钮控制贪吃蛇的加速,蛇的初始长度为2点,设置墙壁。
2、蛇吃到长度为1点的食物时,自身长度增加1点。
2、速度按钮带有一次加速,按两下速度按钮蛇的行进速度回到初始值。
3、当蛇碰到墙壁或自己的身体时游戏结束。
4、用proteus设计,仿真基于STC89C52RC单片机的8x8点阵贪吃蛇的硬件电路。
5、游戏结束,系统自动复位。
二、硬件电路设计本系统以STC89C52RC为核心,设置12MHz的晶振,使得单片机有合理的运行速度。
LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示程序的运行情况,是模块化的显示组件,本设计采用8*8共阳红色点阵显示屏,用来显示贪吃蛇的游戏画面。
五个独立按键控制蛇的游走方向(上下左右)和加速减速的功能。
贪吃蛇是一款经典的小游戏,玩家通过按键操控贪吃蛇不断地吃食物,蛇身逐渐伸长,当蛇碰到蛇身和墙壁时游戏结束。
需要注意的是实际元件中,点阵的封装不尽相同,因此需要测试出每个引脚的功能,以便正确连线。
注意,每个像素点的额定电压在3v左右,电压过大将会彻底损坏。
三、系统软件设计软件方面采用了C51编写代码,代码编写模块如下图:核心代码主要为游戏处理、信息处理和按键处理。
编写游戏的功能代码,先定义游戏的数据结构和常量。
其中食物的数据结构采用结构体定义,两个unsigned char变量分别定义为食物的横纵坐标;蛇的身体定义为长度最大值为20的数组,游戏中贪吃蛇长度达到39,游戏通关结束。
电子报告

数字电子课程设计设计题目:8*8贪吃蛇游戏实现学院:信息学院专业:计算机姓名:张帅学号:20133872指导教师:杨楠设计时间:2015年7月目录摘要 (3)第1章概述 (4)第2章课程设计任务及要求 (5)2.1 设计任务 (5)2.2 设计要求 (5)第3章系统设计 (6)3.1 方案论证 (6)3.2 系统设计: (6)3.2.1 结构框图及说明 (6)3.2.2 系统原理图及工作原理 (8)3.3 单元电路设计 (8)3.3.1单元电路工作原理 (8)第4 章软件仿真 (12)4.1仿真电路图 (12)4.3 仿真结果 (13)第5章安装调试 (16)5.1安装调试过程 (16)第6章使用仪器设备清单 (19)收获、总结 (20)参考文献 (21)摘要单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注。
单片微型计算机简称单片机,是典型的的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示。
其主要由运算器,控制器,存储器,输入输出设备构成,相当于一个微型的计算机。
由于单片机具有体积小、易于产品化、面向控制、集成度高、功能强、可靠性高、价格低等特点,其在工业控制、机电一体化、自动检测、智能仪表、家用电器、电力电子、通信等诸多领域中得到了广泛的应用。
LED点阵是由多个发光二极管组成,利用发光二极管的亮灭来显示字符。
随着电子技术的不断发展,作为一种新兴的显示模块,LED点阵的应用越来越广泛,各种场合的文字信息提示、动画等都是利用LED点阵模块制作而成。
本设计是基于单片机AT89S52的8*8点阵贪吃蛇游戏。
游戏的控制由上、下、左、右四个方向键控制,采用8*8LED点阵作为显示。
关键词:单片机;LED点阵;贪吃蛇游戏第1章概述单片微型计算机简称单片机,是典型的的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计报告(贪吃蛇)院校:专业:班级:姓名:学号:指导老师:设计日期:一、选题的背景与意义单片微型机简称单片机,它是在一片芯片上集成了中央处理部件,存储器、定时器/计数器和各种输入输出设备等接口部件。
单片机是微机发展的一个重要的分支,自问世以来,性能不断地改善和提高,加之单片机具有集成度高、功能强、速度快、体积小、功耗小、使用方便、性能可靠、价格便宜等优点,故在工业控制、数据采集和处理、通信系统、家用电器等领域的应用日益广泛。
国内虽然起步较晚,但单片机的潜力越来越被人们所重视,尤其在工业控制、自动化仪器仪表、计算机系统接口、智能化外设等应用领域发展很快。
它的应用对于产品升级换代、机电一体化都具有重要的意义,在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数,被用于各种不同产品的生产。
在通信行业更为广泛利用,手机从只能基本通话,到现在一台手机拥有各种不同的功能,单片机得到了广泛的应用。
手机可以听音乐,听收音机,玩游戏,照相片等等,比较流行的手机游戏贪吃蛇就能用单片机实现。
二、研究的基本内容与拟解决的主要问题贪吃蛇游戏设计主要硬件由单片机最小系统,8*8点阵,4个方向按键,7805稳压电路,整个的游戏设计外围电路比较少,主要核心在于游戏的程序设计,本设计的游戏规则也参照现在手机流行的贪吃蛇游戏的规则去设计,当蛇吃到食物时,蛇身就会自动增加一格,食物随机出现在屏幕上,当蛇碰到墙壁时,游戏结束。
本设计需要考虑的问题有以下几个:1.8*8点阵的选择2.保证游戏的流畅性和及时响应性3.游戏的设计应该接近人性化贪吃蛇初始化子程序流程图贪吃蛇运行子程序是整个程序设计的核心,首先由系统检测是否有按键按下,确定有按键按下后,外部中断程序自动执行,开始扫描矩阵键盘,得到键值,根据键值判断贪吃蛇要走的方向。
在游戏运行的期间,系统不断检测蛇是否死亡,蛇是否已经最长,蛇是否吃到了食物。
若蛇已经死亡,则蛇的死亡标记位被置位,跳转到死亡界面,检测是否有按键按下,有就跳转到游戏开始界面,重新开始游戏,无则等到有任意键按下。
游戏的速度控制由延时程序决定,若延时程序延时短,则蛇移动得快,若延时比较长,则蛇移动得慢。
若蛇已经吃到食物,则在放食物的原来的坐标会消除显示,重新读取计数器的值,通过计算得到要放置食物的坐标,在该坐标上显示食物。
1.准备工作➢认真详细的阅读任务书,深刻了解主要的内容和要求。
➢查阅与贪吃蛇相关的书籍,了解贪吃蛇的工作原理。
➢了解历年全国大学生电子竞赛有关贪吃蛇的资料。
➢根据控制要求初步确定所使用的元器件。
2. 实施步骤➢明确控制要求,绘制电路连接图。
➢参考文献,检查电路图的正确性。
➢根据电路连接图焊接电路板,制作贪吃蛇模型。
➢分析操作流程,绘制程序流程图。
➢编写程序代码。
➢运用电脑软件初步对程序进行调试。
➢配合贪吃蛇硬件部分,并完善功能,达到设计要求。
3.设计方案(1)8*8点阵方案8X8点阵LED比LCD128X64结构更简单,不需要任何的指令集,即对I/O 口直接输出可以使用。
若选用8X8点阵LED显示屏,8X8的led 点阵能使用的范围很少,对增强游戏的功能方面加以限制,显然有点大,不美观,但取材容易。
(2)电源单元方案采用usb供电,通过usb能使51单片机更加稳定在正常的工作范围内使得51更好的工作。
(3)方向单元方案利用方向按键来引导蛇的移动方向到达用户所指定的地点。
三:设计流程(重要)1:原理图(摘自互联网)2:单片机使用(如图)这次试验用到了P0.P2.P3口。
P0,P2口作为点阵的输入口P3.4 P3.5 P3.6 P3.7作为上下左右下图为源程序控制定义3:原件清单4:关于焊接方面的问题和图解电源开关3源程序#include <reg51.h>#define uchar unsigned char#define SNAKE 20 //最大长度#define TIME 50 //显示延时时间#define SPEED 40 //速度控制//#define keyenable 1sbit keyenable=P3^6; //方向使能/*sbit keyx=P0^1; //左右sbit keyy=P0^2; //上下*///sbit up=P0^0;sbit up=P3^4; //downsbit down=P3^5;sbit right=P3^6;sbit left=P3^7;uchar x[SNAKE+1];uchar y[SNAKE+1];uchar time,n,i,e; //延时时间,当前蛇长,通用循环变量,当前速度char addx,addy; //位移偏移量/********************延时程序*********************/void delay(char MS){char us,usn;while(MS!=0){usn = 0;while(usn!=0){us=0xff;while (us!=0){us--;};usn--;}MS--;}}/*******************************************判断碰撞*******************************************/bit knock(){bit k;k=0;if(x[1]>7||y[1]>7)k=1; //撞墙for(i=2;i<n;i++)if((x[1]==x[i])&(y[1]==y[i]))k=1; //撞自己return k;}/*****************上下左右键位处理*****************/void turnkey()// interrupt 0 using 2{//up=1;if(keyenable){if(left){addy=0;if(addx!=1)addx=-1; else addx=1;}if(right){addy=0;if(addx!=-1)addx=1; else addx=-1;}if(up){addx=0;if(addy!=-1)addy=1; else addy=-1;}if(down){addx=0;if(addy!=1)addy=-1; else addy=1;}}}/*****************乘方程序*****************/uchar mux(uchar temp){if(temp==5)return 32;if(temp==4)return 16;if(temp==3)return 8;if(temp==2)return 4;if(temp==1)return 2;if(temp==0)return 1;return 0;}/*****************显示时钟显示程序*****************/void timer0(uchar k){while(k--){for(i=0;i<SNAKE+1;i++){P0=mux(x[i]);P2=255-mux(y[i]);turnkey(); //上下左右键位处理}}}/*****************主程序*****************/void main(void){e=SPEED;P1=0x00;P2=0xff;P0=0x00;P3=0x00;while(1){for(i=3;i<SNAKE+1;i++)x[i]=100;for(i=3;i<SNAKE+1;i++)y[i]=100;//初始化n=3; //蛇长 n=-1 addx=0;addy=0; //位移偏移 //k=1;while(1){if(keyenable)break;timer0(1);}while(1){timer0(e);if(knock()){e=SPEED;break;} //判断碰撞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;for(i=3;i<SNAKE+1;i++)y[i]=100;}x[0]=x[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; //移动}}}四:总结实话说来程序和想法是从网上看的,原件是从网上购买,不过这次设计还是让我受益匪浅,第一学习了点阵的扫描方法。
第二也学习了键盘的动态扫描方法(不过这次设计没有涉及)。
加深了对微型系统的理解也感觉到单片机的不足中断较少(也从未涉及过中断里面嵌套中断的程序和设计),希望以后学习能够涉及到的方面是中断嵌套中断的方法,和液晶显示屏的驱动方法。
(注:可编辑下载,若有不当之处,请指正,谢谢!)推荐精选。