【基于单片机贪吃蛇游戏设计(论文)10000字】_第1页
【基于单片机贪吃蛇游戏设计(论文)10000字】_第2页
【基于单片机贪吃蛇游戏设计(论文)10000字】_第3页
【基于单片机贪吃蛇游戏设计(论文)10000字】_第4页
【基于单片机贪吃蛇游戏设计(论文)10000字】_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

[5].。本次程序代码都是用C语言编写的,值得注意的是在编写LCD12864显示软件代码之前必须要先掌握汉字取模的方法。要得到需要的文字或图形,可以借助取模软件来完成。软件编译主要步骤:(1)第一步,下载keiluVision4后打开,在Project里面找到创建新工程,选中创建来创建一个新的工程文件,将其命名,最后点击Save按钮以保存。新项目保存后,选择使用的单片机型号。(2)建立一个新项目之后,接下来就是新程序和各种文件,在保存了程序文件之后,需要在项目中添加这些文件。(3)此时可进行源程序编写,此次编程采用c语言进行编写,程序代码依照需要的各个功能和顺序编写完成后就可以进行程序编译和模拟。接着可以翻译所有的源文件并通过单击工具栏图标BuildTarget生成应用程序。KeiluVision4在Build应用出现语法错误时,OutputWindow-Build界面上就会提示存在Error或者Warning,当显示“0Error0Warning”时,代表所编写的程序没有语法和逻辑上的错误,可以进行编译并生成hex文件了。如果存在有错误的语法和代码,系统也会准确给予提式,找到有错误或者预警的程序代码,双击错误的部分,软件就可以自动定位到出错的位置,就可以检查并且改正对应的语法错误或者拼写错误。KeiluVision4将在编辑器窗口中,点击该行,打开源文件,系统会自动定位到对应的地方。在软件成功生成程序后,调试的工作就可以正式进行了。(4)当调试完成没有问题后,系统就会生成对应的以HEX为后缀的文件,将文件下载到EPROM编程器。HEX文件可以直接烧录进单片机。最后将程序使用专门的烧录软件stc-isp和烧录器烧录进单片机。图4-3KeiluVision4界面图4-3KeiluVision4界面第5章调试的步骤及调试过程中出现的问题以及解决方法5.1PROTEUS仿真程序软件编译器使用的是keiluVision4。单片机程序编写完之后,没有问题就可以使用Proteus进行仿真。之前已经先使用keiluVision4编写好了程序代码并且生成了单片机可以识别的hex文件。接下来就可以使用Proteus进行画图了,首先选择左的主菜单栏中的第一项File,在下拉菜单中选择NewDesign,建立后就可以绘制电路了。在搜索栏中搜索需要用到的元器件,首先是找到单片机,之后就开始找到各种元器件,并且按照电路图布局和连线。最后先在Proteus上画完硬件电路后就开始仿真。硬件电路图画完之后点击单片机,在弹出的窗口里选择之前用keiluVision4编译生成带hex后缀的文件加载进去,就可开始仿真,接下来就是等待仿真结束,当提示ANALYSERERRORS时,说明出错了,要认真检查电路图排除一切出错的地方,仿真才能成功。本系统的设计为贪吃蛇游戏控制系统,模块分别有按键模块、单片机、时钟控制模块、LCD12864显示模块、蛇运动控制模块、游戏控制模块。主要功能都是通过LCD12864屏幕来显示。本设计仿真测试图如图5-1所示。图5-1仿真测试图图5-1仿真测试图5.2硬件安装首先是需要的元器件,本次实物制作需要的原件清单如下表:序号名称数量19*15板子12STC89C52单片机1312864显示屏1420P排针1520P排母16103排阻1740脚IC座1810UF电容1930PF电容21010K电阻111103电位器(卧式)112小按键113自锁开关114DC插口1154P排针116喇叭11712.000晶振118大按键619USB电源线或电池盒120锡丝若干21导线若干软件调试及Proteus仿真都正常,接下来就是硬件的制作。此次硬件的制作选择了用万用板进行焊接,之所以没有使用覆铜板,主要原因是这次制作因为各种外部条件的不允许,没有支持刻板腐蚀等步骤的机器,所以最终确定使用万用板制作。首先就是线路的布局,如何在一块万用板上在不影响美观的条件下将各个元器件按电路图连接起来。一开始我先用画好布局的图纸,尽量把每根需要连接的线路做到最简化。在做完这些步骤后就可以开始用电烙铁进行焊接。焊接时要先确认好晶振、扬声器等元器件的正负极,在电池和USB中我选择了更方便的usb接口,作用是提供5V电压,用来给单片机供电。下面就是运用我们实训课上学到的焊接的知识进行焊接了,焊接前先选择焊锡丝的粗细,在使用电烙铁安装时应考虑受热、稳固等因素。例如在用电烙铁时不能太随意,时间焊短了,锡丝没有全部熔掉,就会造成“虚焊”的情况,但是焊接时间又不能过长,不然可能会烧坏电路或者元件。焊的时候基本1秒钟焊一个,就算没焊好,也要等一会儿再焊。元器件中多出来的铁丝也要整齐剪掉,芯片的摆放提前布置好,不要影响到后续的连线工作。连线时要注意导线的长短,还有要严格按照事先准备好的电路图接线,注意单片机的每一个引脚,电焊时要注意不要烧到单片机和电路。焊接时单片机芯片先不要插入,等接好线后再插入,否则可能烧坏芯片引脚。每焊好一个模块,就要用万能表检查线路,确定没有接错、短路等现象,确认无误后才能接着焊接。焊锡时只要控制好时间,就不会出现烧糊烧坏的情况。最后焊接完成后,测试后可实现功能。结论本设计是通过LCD12864进行显示的基于单片机的贪吃蛇游戏机。本文介绍了硬件电路,软件设计及调试以及仿真设计,软件上在使用keil软件的基础上用C语言进行了编程,又对软件算法进行了优化,使整个程序简单、精炼,并对该搭建好的电路进行了Proteus仿真,实物制作成功,功能可以实现。硬件上通过使用STC89C52单片机和LCD12864显示系统搭建硬件电路,对一款贪吃蛇游戏的设计进行了介绍,硬件电路不算复杂,使用单片机最小系统加显示屏和按键就可实现基本游戏功能,为了添加趣味性还使用扬声器加入了音效。我在程序编写和调试程序过程中也出现了不少的问题,在经过对程序的修改和调试后,最终得以成功完成设计内容。由于外部条件和个人能力有限,还有许多功能可以在此基础上扩充。但通过这个设计,我切实的接触并实验了单片机和编程语言的使用,在个人知识面上也有更大的拓宽,希望接下来能够更继续深入学习。通过此次设计,使我在单片机语言的基础上更熟练地使用它并加深了对单片机语言模块化程序设计的理解。设计的过程也是学习的过程,此次设计让我对语言程序和单片机有了深入的学习了解。对编程和仿真也学习到了更多并且更加熟练,也让我对大学学习的知识有了更深入的研究。在本次设计结束的同时,衷心感谢老师的精心指导和帮助。附录附录1原理图附录2主要源程序代码#include"reg52.h"#include"Lcd12864.h"#include"Key.h"#defineucharunsignedchar#defineuintunsignedintstaticunsignedlongSeed=1;#defineA48271L#defineM2147483647L#defineQ(M/A)#defineR(M%A)ucharflag_1=0;sbitkkk=P3^6;//sbitkk=P3^6;/************************************伪随机数发生器*************************************/doubleRandom(void){ longTmpSeed; TmpSeed=A*(Seed%Q)-R*(Seed/Q); if(TmpSeed>=0) Seed=TmpSeed; else Seed=TmpSeed+M; return(double)Seed/M;}/**************************************为伪随机数发生器播种***************************************/voidInitRandom(unsignedlongInitVal){ Seed=InitVal;}//延时子程序voiddelay(unsignedintt){ unsignedinti,j; for(i=0;i<t;i++) for(j=0;j<10;j++);}/*********************************初始化MPU**********************************/voidInitCpu(void){ TMOD=0x0; TH0=0; TL0=0; TR0=1; ET0=1; EA=1;}#defineN25structFood{ unsignedcharx; unsignedchary; unsignedcharyes;}food;//食物结构体structSnake{ unsignedcharx[N]; unsignedchary[N]; unsignedcharnode; unsignedchardirection; unsignedcharlife;}snake;//蛇结构体unsignedcharFlag=0;unsignedcharScore=0;unsignedcharSpeed=5;unsignedcharKeyBuffer=0;#defineFUNC1#defineUP2#defineDOWN3#defineLEFT4#defineRIGHT5#definePASSSCORE20//预定义过关成绩voidTimer0Int(void)interrupt1{ switch(OSReadKey()) { case9: KeyBuffer=FUNC; /*if(++Speed>=10) Speed=1; Flag|=1<<1;//速度变化标志置1*/ break; case13: KeyBuffer=DOWN; /*if(snake.direction!=2) snake.direction=1;*/ break; case17: KeyBuffer=UP; /*if(snake.direction!=1) snake.direction=2;*/ break; case21: KeyBuffer=RIGHT; /*if(snake.direction!=4) snake.direction=3;*/ break; case25: KeyBuffer=LEFT; /*if(snake.direction!=3) snake.direction=4;*/ break; default: break; } if(kkk==0) { delay(5); if(kkk==0) { flag_1=1; } }}/******************************画墙壁,初始化界面*******************************/voidDrawBoard(void){ unsignedcharn; for(n=0;n<31;n++) { Lcd_Rectangle(3*n,0,3*n+2,2,1); Lcd_Rectangle(3*n,60,3*n+2,62,1); } for(n=0;n<21;n++) { Lcd_Rectangle(0,3*n,2,3*n+2,1); Lcd_Rectangle(90,3*n,92,3*n+2,1); } Lcd_HoriLine(93,31,35,1); Lcd_HoriLine(93,63,35,1);}/***************************打印成绩****************************/voidPrintScore(void){ unsignedcharStr[3]; Lcd_WriteStr(6,0,"成绩"); Str[0]=(Score/10)|0x30;//十位 Str[1]=(Score%10)|0x30;//个位 Str[2]=0; Lcd_WriteStr(7,1,Str);}/********************************打印速度级别*********************************/voidPrintSpeed(void){ unsignedcharStr[2]; Lcd_WriteStr(6,2,"级别"); Str[0]=Speed|0x30; Str[1]=0; Lcd_WriteStr(7,3,Str);}/***********************************游戏结束处理************************************/voidGameOver(void){ unsignedcharn; Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,0);//消隐出食物 for(n=1;n<snake.node;n++) { Lcd_Rectangle(snake.x[n],snake.y[n],snake.x[n]+2,snake.y[n]+2,0);//消隐食物,蛇头已到墙壁内,故不用消去 } if(snake.life==0)//如果蛇还活着 Lcd_WriteStr(2,1,"胜利"); else//如果蛇死了 Lcd_WriteStr(2,1,"输了"); Lcd_WriteStr(1,2,"游戏输了");}/********************************游戏的具体过程,也是贪吃蛇算法的关键部分*********************************/voidGamePlay(void){ unsignedcharn; InitRandom(TL0); food.yes=1;//1表示需要出现新事物,0表示已经存在食物尚未吃掉 snake.life=0;//表示蛇还活着 snake.direction=DOWN; snake.x[0]=6;snake.y[0]=6; snake.x[1]=3;snake.y[1]=6; snake.node=3; PrintScore(); PrintSpeed(); while(1) { if(food.yes==1) { while(1) { food.x=Random()*85+3; food.y=Random()*55+3;//获得随机数 while(food.x%3!=0) food.x++; while(food.y%3!=0) food.y++; for(n=0;n<snake.node;n++)//判断产生的食物坐标是否和蛇身重合 { if((food.x==snake.x[n])&&(food.y==snake.y[n])) break; } if(n==snake.node) { food.yes=0; break;//产生有效的食物坐标 } } } if(food.yes==0) { Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,1); } for(n=snake.node-1;n>0;n--) { snake.x[n]=snake.x[n-1]; snake.y[n]=snake.y[n-1]; } switch(snake.direction) { caseDOWN:snake.x[0]+=3;break; caseUP:snake.x[0]-=3;break; caseRIGHT:snake.y[0]-=3;break; caseLEFT:snake.y[0]+=3;break; default:break; } for(n=3;n<snake.node;n++)//从第三节开始判断蛇头是否咬到自己 { if(snake.x[n]==snake.x[0]&&snake.y[n]==snake.y[0]) { GameOver(); snake.life=1; break; } } if(snake.x[0]<3||snake.x[0]>=90||snake.y[0]<3||snake.y[0]>=60)//判蛇头是否撞到墙壁 { GameOver(); snake.life=1; } if(snake.life==1) break;//蛇死,则跳出while(1)循环 if(snake.x[0]==food.x&&snake.y[0]==food.y)//判蛇是否吃到食物 { Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,0);//消隐食物 snake.x[snake.node]=200; snake.y[snake.node]=200;//产生蛇新的节坐标先放在看不见的位置 snake.node++;//蛇节数加1 food.yes=1;//食物标志置1 if(++Score>=PASSSCORE) { PrintScore(); GameOver(); break; } PrintScore(); } for(n=0;n<snake.node;n++) { Lcd_Rectangle(snake.x[n],snake.y[n],snake.x[n]+2,snake.y[n]+2,1); }//根据蛇的节数画出蛇 delay(Speed*1000); Lcd_Rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+2,snake.y[snake.node-1]+2,0); switch(KeyBuffer) { caseFUNC: KeyBuffer=0; if(++Speed>=10) Speed=1; PrintSpeed(); break; caseDOWN: KeyBuffer=0; if(snake.direction!=UP) snake.direction=DOWN; break; caseUP: KeyBuffer=0; if(snake.direction!=DOWN) snake.direction=UP; break; caseRIGHT: KeyBuffer=0; if(snake.direction!=LEFT) snake.direction=RIGHT; break; caseLEFT: KeyBuffer=0; if(snake.direction!=RIGHT) snake.direction=LEFT; break; default: break; } }//结束while(1)}voidmain(){ InitCpu();//初始化CPU Lcd_Reset();//初始化LCD屏 Lcd_Clear(0);//清屏 while(1) { if(flag_1==0) { Lcd_WriteStr(1,1,"贪吃蛇"); Lcd_WriteStr(1,2,"Hello,NCU"); DrawBoard();//画界面 PrintScore(); PrintSpeed(); } if(flag_1==1) { Lcd_WriteStr(1,1,""); Lcd_WriteStr(1,2,""); GamePlay();//玩游戏 GameOver();//游戏结束 while(1);//重启 }参考文献易丽华.“看门狗”技术的实现[J].仪表技术,2011(07):55-57.张仙妮

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论