ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:167.80KB ,
资源ID:7414061      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7414061.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于51单片机的贪吃蛇游戏设计Proteus仿真含完整程序.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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

2、单片机和一些基础组件设计出一个贪吃蛇游戏。游戏的实现需要一个16x16的屏幕(由4个8x8的点阵屏组成)和5个按键,其中4个按键控制贪吃蛇的前进方向,另外一个按键可以使游戏重新开始。另外还需要一个显示BCD码的数字型LED灯组用于记录得分。贪吃蛇游戏需要实现的功能是:游戏开始时会出现一个长度为init_length的贪吃蛇,和一个随机出现的苹果(必须是贪吃蛇蛇身以外的一个点)。玩家可以通过按键控制贪吃蛇的前进方向,但是只能转向,而不能向前或者向后,例如:当贪吃蛇向上行走时,只能通过左键和右键来让它左转或者右转,另外两个按键将失灵。当贪吃蛇吃到苹果后,贪吃蛇尾部将会增加一个点,而屏幕上又会随机出

3、现一个不与贪吃蛇重合的点。此时积分器加一。当贪吃蛇马上就要“撞向”屏幕边缘时,会从相反的一边钻出来。所以“撞墙”并不会导致游戏结束。而当贪吃蛇吃到自身时则会使游戏结束,并且会自动回到游戏初始化时的状态。任何时候按下“重新开始”按键都将使游戏回到初始状态。二、工具51单片机开发板,Keil uVision3,ISIS 7 Professional。三、概要设计根据我们要实现的功能,我们决定把这次课程设计分成三个部分。第一个部分为硬件设计和连接部分。负责该部分的组员需要根据课程设计的要求选取适当的组件,并且自主设计连接方式。当这部分完成后,要求其他组员能直接通过程序控制点阵屏幕上面显示的图形,同时

4、也能让按键、数字型LED等组件能正常工作。负责这部分的组员需要与负责图形显示部分的同学沟通,统一好各个引脚对应的功能和使用方式。第二个部分为图形显示和外部、内部中断部分。要让点阵屏幕持续显示图形就要通过软件重复扫描需要显示的点,这时候需要同时兼顾外部中断和内部中断,因为经过一个时间单位或者有按钮输入信息都会使得显示的图形发生变化。因此我们把图形显示部分和外部中断、内部中断分到一个部分。负责这部分的组员要求能将任何想要其显示的图形显示到点阵屏幕上,并且通过程序控制其变化。第三个部分为游戏逻辑设计部分。第二个部分已能将想要输出的图形显示出来,所以这部分要实现的功能就是显示哪些图形。根据贪吃蛇的游戏

5、规则,如果没有方向键按下图形会怎么变化、按下哪些键贪吃蛇会有哪些变化、吃到苹果或者碰到墙会怎么变化等都是这个部分需要解决的问题。负责这部分组员也要与负责第二个部分的组员沟通好,因为游戏中使用的坐标信息是要求能直接在屏幕上显示的,这与第二个部分的任务有很大关系。四、详细设计(硬件设计和连接部分)1.组件介绍1)AT89C55单片机和89C51相比,该单片机具有更大存储量的片内ROM,在编程时能减少很多麻烦。而且89C55和89C51的引脚完全相同,程序也都兼容,根据以前所学知识可以直接使用。2)Matrix-8X8点阵屏幕我们采用4个8X8的点阵屏幕来组成一个16X16的LED点阵屏幕。而需要注

6、意的是,单个8X8LED点阵屏的上面8个引脚和下面8个引脚要严格区分,上面8个引脚用于选择行,低电平有效;下面8个引脚用于选择列,高电平有效。当组成一个大的点阵屏时同行的上面8个引脚要接在一起,而同列的下面8个引脚要接在一起。4块屏幕一共64个引脚显然不能都直接接到单片机上,所以要用到下面的译码器。3)74LS154译码器以前通常使用74LS138译码器,但是现在该译码器并不能满足需求。如果我们将用于选择列的引脚都连接到单片机上,而用于选择行的引脚连接译码器的话,需要2个74138译码器,而74LS154译码器的话仅需要连接一个即可,编写程序也较为方便。当G1和G2接地时,该译码器工作。输入端

7、输入4个二进制数,输出端将对应的一个引脚以低电平方式译出。该译码器结构如下图所示:74LS154译码器的工作方式如下列表所示:4)CMOS反相器在有的时候可以快速地在硬件电路上实现按位求反,而不需要改程序。5)按键按键的功能是对游戏进行控制,四个方向按键可以控制贪吃蛇左转或者右转,而另外一个按键可以让游戏重新开始。按键可以直接接到单片机的P0-P3口,在程序内部实现扫描、响应,或者也可以接到外部中断INT0和INT1上。我们选择的是将重新开始按钮接到INT0上,而将方向按键接到P3口的其他引脚上,使用程序内部扫描查询到这组引脚的状态。6)7-SEG BCD这是一组排成数字形状的LED灯,可以直

8、接对输入的10进制数译出显示出来。该组件一共有4个引脚,可以显示0到F共16个数。该组件需要实现的功能是显示出玩家当前分数。2.硬件设计主要是点阵LED屏幕与单片机的连接。同行的8X8点阵屏的上面8个引脚连接在一起,通过反相器后连接到单片机上。使用反相器的原因是74154输出端是选择一个低电平译出,而选择列的引脚是高电平有效,故需要将各个引脚取反然后连接到LED灯组上。上面两个连到P1口,上面两个连到P0口。同列的8X8点阵屏的下面8个引脚连接在一起,然后连到74154译码器的输出端。译码器输入端4个引脚连到P2口的低4位上。需要注意的是P0口需要接上拉电阻,这里直接接上阻排,然后电阻另一端接

9、电源即可。具体连接方式如下图所示:在这个部分以外,需要连接一个7-SEG BCD数字型LED。因为空出来的引脚中P2口的高4位空闲,而连续的引脚更容易实现直接输出数字图形,所以将该组件连接到P2口的高4位。P3口有5根引脚连接5个按键,用于控制游戏重新开始和控制贪吃蛇转向。完整的硬件设计图如下:五、心得体会此次试验遇到的最大的问题是存储空间不足的问题,为了解决这个问题我试过很多不同的办法,包括使用XDATA存储区和PDATA存储区,和使用不同型号的MCS-51单片机。最后是通过压缩定义的变量类型(即尽量使用char 和unsigned char)使得情况有所缓解。不过,存储容量不足的问题仍然在

10、运行效果上体现出来了。考虑到DATA区容量的限制,我们没有用全局变量数组来存储列信息,如果这样做的话程序会根据列来扫描及显示,即会显示较为流畅,但会占用较大空间;而如果不这样做,按每一个点来扫描的话,游戏会越到后面刷新越慢,但是会占用较小空间。我们选择的是后者,所以无可避免的面临了“越玩越卡”的困境。下一次如果我们在开始是就考虑到并且尽力规避这个问题的话,应该就可以避免出现这一类问题了。此次大型试验带给我的最大收获就是对计算机有了更深入的了解。我们是计算机专业的学生,在学习计算机知识的时候硬件部分和软件部分一样是必修内容,而因为计算机硬件发展至今已成为一个非常庞大复杂的体系,直接学习这类知识会

11、导致理论和实际的脱节,因为我们很难依据自己学到知识自行设计一台功能完善的微型计算机。但是单片机就直接解决了这个问题。因为单片机就是一个很简单的计算机系统,通过连接硬件和设计程序我们一步一步的掌握了单片机里面的I/0功能,中断功能等,对计算机各部分组成和基本工作方式也掌握得更熟练了,这对以后工作的帮助是非常可观的。并且自行设计实现简单的单片机功能也可以让我以后再接触此类工作时游刃有余,这是最直接的帮助。附录I(程序)#include#include#includepoint points25;unsigned char direction=0;/0-上,1-下,2-左,3-右unsigned c

12、har count=100;unsigned char snakeLength=1;unsigned char score=0;unsigned char score_1;unsigned char score_10;unsigned char key_start=0;unsigned char row;unsigned char speed=60;sbit key_w=P30;sbit key_a=P31;sbit key_s=P36;sbit key_d=P37;sbit a5=P35;sbit a4=P34;sbit a3=P33;char isOverlaping(point p);v

13、oid init();void gameOver();void start();void keyScan();void setP3(unsigned char num) /设置数码显示管的十位 switch(num) case 0:a5=0;a4=0;a3=0;break; case 1:a5=0;a4=0;a3=1;break; case 2:a5=0;a4=1;a3=0;break; case 3:a5=0;a4=1;a3=1;break; case 4:a5=1;a4=0;a3=0;break; case 5:a5=1;a4=0;a3=1;break; case 6:a5=1;a4=1;

14、a3=0;break; case 7:a5=1;a4=1;a3=1;break; void display(char group,int value) /根据区块位置和值显示单个点 row=group/2; score_1=score%10; score_10=score/10; setP3(score_10); P2=row+score_1*16; if(group%2=0) P1=value; P0=0xff; else P0=value; P1=0xff; /delay1ms();void showPoints() /根据坐标数组显示到LED unsigned char i; char

15、score_1; char score_10; while(key_start=0) for(i=0;isnakeLength+1;i+) char group=pointsi.y*2+pointsi.x/8;/ unsigned char val=(int)pow(2,7-pointsi.x%8); display(group,val); /score_1=5;/score%10; /score_10=score/10; /P3=P3+score_10*8; if(key_start=1) start(); void createApple() /随机生成一个苹果 point applePo

16、int; unsigned char x=rand()%16; unsigned char y=rand()%16; applePoint.x=x; applePoint.y=y; while(isOverlaping(applePoint) applePoint.x+; applePoint.y+; points0=applePoint;char isOverlaping(point p) /判断生成的苹果是否与蛇身重合 unsigned char i; unsigned char flag=0; for(i=1;isnakeLength+1;i+) if (pointsi.x=p.x&po

17、intsi.y=p.y) flag=1; break; return flag;/判断蛇头是否咬到身子,即蛇头是否蛇身其他点重合char isSelfOverlaping(point p) unsigned char i; unsigned char flag=0; for(i=2;i10) speed-=10;/初始化界面,显示一条初始长度的贪吃蛇和一个随机生成的点。void init() speed=60; direction=0; key_start=0; snakeLength=init_length; score=0; createApple(); points1.x=13;poin

18、ts1.y=1; points2.x=14;points2.y=1; points3.x=15;points3.y=1; EA=1; TR1=0; IT0=1; EX0=1;void keyScan() /扫描键盘获取方向操控信息 if(direction2) if (key_a=0) direction=2; if(key_d=0) direction=3; else if(key_w=0) direction=0; if(key_s=0) direction=1; void nextPlot() /0-北,1-南,2-西,3-东 unsigned char i; point p; poin

19、t q; p=points1; if(direction=0) if(points1.x=0) points1.x=15; else points1.x-; else if(direction=1) if(points1.x=15) points1.x=0; else points1.x+; else if(direction=2) if(points1.y=0) points1.y=15; else points1.y-; else if(direction=3) if(points1.y=15) points1.y=0; else points1.y+; for(i=2;ispeed) count=0; nextPlot(); keyScan();void int0() interrupt 0 /外部中断INT0 key_start=1;void start() init(); initT1(); showPoints();void main() start(); #ifndef UTIL_H #define UTIL_H #include #define init_length 3 #define randomfact 7 typedef struct Point char x; char y;point;#endif附录II(运行截图)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1