1、广东工业大学华立学院 课 程 设 计(论文)课程名称微机原理与单片机技术综合设计与实践 题目名称 贪吃蛇游戏机 学生系部 机电工程学部 专业班级 09电气3班 学号 12030903039 学生姓名 指导教师 王 赟 2012年06月5日1广东工业大学华立学院课程设计(论文)任务书题目名称贪吃蛇游戏机学系学部机电工程学部专业班级09电气3班姓 名12030903039学 号一、课程设计(论文)的内容设计一款贪吃蛇游戏机。主要功能有:(1) 进行经典的贪吃蛇游戏;(2) 显示玩家当前关卡;(3) 记录玩家分数;(4) 游戏暂停,重新开始;(5) 上下颠倒画面,以适应习惯左手或右手操作的玩家。二、
2、课程设计(论文)的要求与数据(1) 方案论证;(2) 系统原理图或各功能模块的硬件电路原理框图;(3) 主程序流程图;(4) 系统调试与分析;(5) 源程序清单。三、课程设计(论文)应完成的工作(1) 完成方案论证;(2) 完成器件选型;(3) 给出硬件电路原理图;(4) 给出程序流程图;(5) 完成源程序设计及调试;(6) 完成课程设计报告的撰写。四、课程设计(论文)进程安排序号设计(论文)各阶段内容地点起止日期1选择课题,明确设计要求,查阅资料校内5.262方案论证、系统总体设计校内6.073硬件电路原理图设计校内6.074程序流程图设计、源程序的编制及调试校内6.076.105系统调试及
3、分析校内6.106课程设计报告的撰写校内6.10五、应收集的资料及主要参考文献1 孙育才.MCS-51系列单片微型计算机及其应用M.东南大学出版社,2004.6 发出任务书日期: 2012年 05月19 日 指导教师签名:计划完成日期: 2012年 06 月5 日 教学单位责任人签章:目录1系统分析12系统设计22.1系统硬件设计22.1.1系统硬件接线图22.1.2单片机引脚接线表22.1.3TFT液晶屏引脚功能32.1.4微动开关功能42.2系统软件设计52.2.1系统MAIN程序设计52.2.2系统SNAKE程序设计62.2.3系统KEY程序设计72.3.4 MAIN源程序72.3.5
4、SNAKE源程序82.3.6 KEY源程序133元件清单14参考文献151系统分析本文设计一款贪吃蛇游戏机,以STC 12C5A60S2芯片为控制核心,24MHz晶振,并采用一块2.4英寸,以ILI9325为控制器,分辨率为320*240的TFT彩色显示屏,保证了显示效果细腻流畅。由于显示屏自带的背光,使得画面在黑暗中也能清晰地展现出来。作品基于一块7cm*9cm的玻璃纤维万能版制作,体积重量与一般智能手机相当,并集成了独立移动电源,便于携带。游戏机外观如图1.1所示。左边为显示屏,右边是总开关和游戏键盘,屏幕下方焊接有单片机,晶振以及两块3V的CR2032纽扣电池。作品主要功能有:(6) 进
5、行经典的贪吃蛇游戏(7) 显示玩家当前关卡(8) 记录玩家分数(9) 游戏暂停,重新开始(10) 上下颠倒画面,以适应习惯左手或右手操作的玩家图1.1 贪吃蛇游戏机外观图32系统设计2.1硬件设计本系统的硬件主要由12C5A60S2单片机、24MHz晶振、2.4英寸TFT显示屏、若干微动开关组成。单片机的作用是运行游戏程序,驱动显示屏,识别微动开关;显示屏的作用是显示游戏画面、微动开关的作用是控制蛇的运动方向等设置。2.1.1系统硬件接线图图2.1 系统硬件接线图2.1.2单片机引脚分配单片机引脚对应元件引脚P1.0微动开关REVERSEP1.7微动开关PAUSE/RESTARTP3.1微动开
6、关DOWNP3.5微动开关RIGHTP3.6微动开关UPP3.7微动开关LEFTXTAL224MHz晶振XTAL124MHz晶振VSSGNDVCC+5V DCP0.0TFT DB0P0.1TFT DB1P0.2TFT DB2P0.3TFT DB3P0.4TFT DB4P0.5TFT DB5P0.6TFT DB6P0.7TFT DB7P2.6TFT RDP2.5TFT WRP2.4TFT RSP2.2TFT CSP2.1TFT RESET2.1.3TFT液晶屏引脚功能符号功能说明CS-选通RESET-复位DB7高4位三态、双向数据总线4位DB6高4位三态、双向数据总线4位DB5高4位三态、双向数
7、据总线4位DB4高4位三态、双向数据总线4位DB3低4位三态、双向数据总线4位DB2低4位三态、双向数据总线4位DB1低4位三态、双向数据总线4位DB0低4位三态、双向数据总线4位RD通过读数据寄存器从GRAM读取18位数据WR-写RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器NC悬空VCC+5V DCGNDGND2.1.4微动开关功能本系统硬件选用了6个微动开关,分布在显示屏的同一侧,其作用分别为:微动开关名称功能说明UP令蛇向上走DOWN令蛇向下走LEFT令蛇向左走RIGHT令蛇向右走PAUSE/RESTART游戏暂停/重新开始REVERSE颠倒屏幕单片机识别微动开关
8、动作的原理是判断引脚置零与否。把所有微动开关常开引脚的一端接地,另一端接单片机相应的引脚,当微动开关触点闭合,则相当于把单片机相应的引脚接地,输入了“0”信号,于是单片机能识别到该微动开关闭合,在程序运行上作出预先设定好的改变。2.2软件设计本系统的软件系统主要可分为MAIN,KEY,SNAKE程序三大模块。2.2.1系统MAIN程序设计主程序的任务是对系统进行初始化,清屏,运行SNAKE和KEY程序。程序框图如图2.2示。图2.2 主程序流程图2.2.2系统SNAKE程序设计SNAKE程序是本系统的核心程序,此程序的正常运行与否直接影响到游戏的显示和操作效果。其作用为:(1) 绘制游戏界面(
9、2) 显示死亡界面(3) 显示过关界面(4) 控制蛇的运动(5) 判断蛇是否碰壁(6) 判断蛇是否咬到自己(7) 判断蛇是否吃到豆程序框图如图2.3所示。图2.3 SNAKE程序流程图2.2.3系统KEY程序设计KEY程序是本系统唯一的玩家操控程序,通过识别玩家对六个独立开关的操作,控制游戏里蛇的走向等。程序框图如图2.4示。图2.4 KEY程序流程图2.3.4 MAIN源程序#include STC12C5A60S2.h#include KEY_SWEEP.H #include SNAKE.h#include 9325tp.hmain() ILI9325_Initial();CLR_Scre
10、en(0XFFFF);Init_SNAKE();P3=0XFF;P1=0XFF;while(1)Run_SNAKE();Key();2.3.5 SNAKE源程序#include STC12C5A60S2.h #include #include9325tp.h#include SNAKE.h#define uchar unsigned charstruct uchar X;uchar Y; uchar Yes;Food;/食物结构体#define SNAKE_Max_Long 3 struct uchar XSNAKE_Max_Long;uchar YSNAKE_Max_Long;uchar L
11、ong; uchar Life; uchar Score;uchar Level; idata Snake;uchar idata Key_V_temp=0; extern unsigned char xdata Key_flag;void Delay_1mS(unsigned int n)unsigned int xdata i;unsigned char xdata j;for(i=0;in;i+)for(j=0;j120;j+);void Init_time0 (void)EA=1;/ET1=1;TMOD|=0x20;TH1=0X00;TL1=0X00;TR1=1;void Trun_O
12、n_Point (uchar x,uint y,uchar color)Bar(2*(x+2),(2*(y+2),(2*(x+4),(2*(y+4),color);void Trun_Off_Point (uchar x,uint y)Bar(2*(x+2),(2*(y+2),(2*(x+4),(2*(y+4),0xBE5F);void Init_SNAKE(void) uchar xdata i;Init_time0();CLR_Screen(0xBE5F);Rectangle(8,8-1,231,270,0x8a);/绘制一个矩形框, 0-127Rectangle(7,7-1,232,27
13、1,0x8a);/绘制一个矩形框, 0-127Rectangle(6,6-1,233,272,0x8a);/绘制一个矩形框, 0-127 LCD_PutString(50,275,SCORE,0x00ff,0xBE5F);LCDShow_uCharNumber(56,290,Snake.Score,0x00ff,0xBE5F); LCD_PutString(150,275,LEVEL,0x00ff,0xBE5F);LCDShow_uCharNumber(156,290,Snake.Level,0x00ff,0xBE5F);Snake.Long=16;Snake.Life=0;Snake.Sco
14、re=0;Snake.Level=0;Food.Yes=1;Key_Value=0; Key_V_temp=0;for(i=0;iSnake.Long;i+)Snake.Xi=i+6;Snake.Yi=6;for(i=0;iSnake.Long;i+)Trun_On_Point(Snake.Xi,Snake.Yi,0xa8);void Display_dead(void)LCD_PutString(80,80,GAME OVER,0x00ff,0xBE5F); while(Key_Value!=Key_Enter) Key(); Init_SNAKE();void Display_Pass(v
15、oid)Snake.Level+;LCD_PutString(68,80,You are,0xcc88,0xBE5F); LCD_PutString(74,100,WIN!,0xcc88,0xBE5F); while(Key_Value!=Key_Enter) Key(); Init_SNAKE();void Run_SNAKE(void)uchar xdata i=0;if(Key_Value=Key_Right&Key_V_temp!=Key_Left)|(Key_Value=Key_Left&Key_V_temp=Key_Right)Trun_Off_Point(Snake.X0,Sna
16、ke.Y0); for(i=0;iSnake.Long-1;i+)Snake.Xi=Snake.Xi+1;Snake.Yi=Snake.Yi+1; Snake.XSnake.Long-1=Snake.XSnake.Long-2+1;Snake.YSnake.Long-1=Snake.YSnake.Long-2+0;for(i=0;iSnake.Long;i+)Trun_On_Point(Snake.Xi,Snake.Yi,0xaa);Key_V_temp=Key_Right;if(Key_flag)if(Key_Value=Key_Left&Key_V_temp!=Key_Right)|(Ke
17、y_Value=Key_Right&Key_V_temp=Key_Left)Trun_Off_Point(Snake.X0,Snake.Y0);for(i=0;iSnake.Long-1;i+)Snake.Xi=Snake.Xi+1;Snake.Yi=Snake.Yi+1; Snake.XSnake.Long-1=Snake.XSnake.Long-2-1;Snake.YSnake.Long-1=Snake.YSnake.Long-2+0;for(i=0;iSnake.Long;i+)Trun_On_Point(Snake.Xi,Snake.Yi,0xaa);Key_V_temp=Key_Le
18、ft;if( Key_Value=Key_Up&Key_V_temp!=Key_Down)|( Key_Value=Key_Down&Key_V_temp=Key_Up)Trun_Off_Point(Snake.X0,Snake.Y0); for(i=0;iSnake.Long-1;i+)置Snake.Xi=Snake.Xi+1;Snake.Yi=Snake.Yi+1; Snake.XSnake.Long-1=Snake.XSnake.Long-2+0;Snake.YSnake.Long-1=Snake.YSnake.Long-2-1;for(i=0;iSnake.Long;i+)Trun_O
19、n_Point(Snake.Xi,Snake.Yi,0xaa);Key_V_temp=Key_Up;if( Key_Value=Key_Down&Key_V_temp!=Key_Up)|( Key_Value=Key_Up&Key_V_temp=Key_Down)Trun_Off_Point(Snake.X0,Snake.Y0);for(i=0;iSnake.Long-1;i+)Snake.Xi=Snake.Xi+1;Snake.Yi=Snake.Yi+1; Snake.XSnake.Long-1=Snake.XSnake.Long-2+0;Snake.YSnake.Long-1=Snake.
20、YSnake.Long-2+1;for(i=0;i=111|Snake.YSnake.Long-1=131 |Snake.XSnake.Long-1=2 |Snake.YSnake.Long-10;i-)if(Snake.Xi=Snake.XSnake.Long-1&Snake.Yi=Snake.YSnake.Long-1)Snake.Life=1;if(Snake.Life=1)Display_dead();Display_Pass();if(Snake.XSnake.Long-1-1=Food.X & Snake.YSnake.Long-1-1=Food.Y)/Trun_Off_Point
21、(Food.X,Food.Y);Snake.Long+;Snake.XSnake.Long-1=Food.X;Snake.YSnake.Long-1=Food.Y;Snake.Score+=5;LCDShow_uCharNumber(56,290,Snake.Score,0x00ff,0xBE5F);Food.Yes=1;if(Food.Yes=0)Trun_On_Point(Food.X,Food.Y,0xaa); if(Food.Yes=1)while(1)Food.X=(TL1+60)2);Food.Y=(TL1+85)2); for(i=0;iSnake.Long;i+)if(Food
22、.X=Snake.Xi)&(Food.X=Snake.Yi)break;if(i=Snake.Long)Food.Yes=0;break;Delay_1mS(300-Snake.Level*200);2.3.6 KEY源程序void Key (void) if(P3!=0XFF) | (P1!=0XFF) Delay(10); if(P3!=0XFF)if(K_UP=0)Key_Value=1;Key_flag =1;if(K_DOWM=0)Key_Value=2;Key_flag =1;if(K_LEFT=0)Key_Value=3;if(K_RIGHT=0)Key_Value=4;Key_
23、flag =1; if(P1!=0XFF)if(K_RETURN=0)Key_Value=5;if(K_ENTER=0)Key_Value=6;void Key (void) if(P1!=0XFC) Delay(10); if(P1!=0XFC)if(K_UP=0 & K_DOWM!=0)Key_Value=1;Key_flag =1;if(K_DOWM=0 & K_UP!=0)Key_Value=2;Key_flag =1;if(K_LEFT=0)Key_Value=3;if(K_DOWM=0 & K_UP=0)Key_Value=4;Key_flag =1;*/* if(Key_Port
24、!=0X0f)/Delay();if(Key_Port!=0X0f)KeyV_l=Key_Port&0x0f;Key_Port=0XF0;KeyV_h=Key_Port&0xf0;KeyV=KeyV_h+KeyV_l;for(i=0;i16;i+)if(Key_codei=KeyV)Key_Value=(i+1);Key_Port=0X0f;Key_flag =1;3元件清单元件型号数量单片机12C5A60S21IC插口40P1方口排母16P1圆口排母3P1纽扣电池CR20322微动开关6按钮开关1晶振24MHz1万用板7*9cm1参考文献1 张毅刚,彭喜源,谭晓昀.MCS51系列单片机实用设计M.哈尔滨工业大学出版社,2008.2 楼苗然,李光飞.单片机课程设计指导M.北京航空航天大学出版社,2007.心得体会教师评语 年 月 日成绩及签名年 月 日