基于51单片机与8*8点阵的贪吃蛇游戏机开发
物理与电子信息工程学院 07电信本一 蘧孝泼
摘 要:设计并实现了一种基于51单片机的贪吃蛇游戏,主要讨论了游戏机的硬件电路与软件编程的设计方案,并介绍了如何使用Proteus进行软件仿真。通过软件测试,可实现贪吃蛇游戏的基本功能。
关键词:单片机;贪吃蛇;LED点阵
Abstract:Designed and implemented a microcomputer-based Snake games, mainly discussed the console hardware design and software programming, and describes how to use the Proteus to software emulation. Software testing, can be realized Snake game's basic functions.
Key words: Single chip microcomputer;Snake;LED lattice
引言
贪吃蛇,是一种益智小游戏。其游戏背景:蛇引诱夏娃吃了苹果之后,就被贬为毒虫,阴险的象征,而蛇吃东西是整只动物吞进去的,大概在文艺复兴的时候就有人发明了这么一种游戏,是现在贪吃蛇的前身,后来慢慢地发展成了现有的贪吃蛇游戏。其游戏规则比较简单,就是一条小蛇,不停地在屏幕上游走去吃屏幕上出现的食物,越吃越长,到了一定的长度之后,就可以进入下一关,越到后面的关卡蛇移动的速度越快,只要蛇头碰到四周的墙壁或者碰到自己的身体,小蛇就立即毙命并结束游戏。本文根据贪吃蛇的游戏规则,以ATMEL AT89S52 单片机为控制核心,使用8*8点阵为显示模块,设计并实现贪吃蛇最基本的功能。
一、硬件设计
1、8*8LED点阵的原理说明
本设计采用的点阵显示模块是ARK-SZ411288K,其原理结构图如图1所示。ARK-SZ411288K显示模块是8*8点阵的显示模块,从图1中可以看出,8*8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的 图1 8*8LED点阵的原理图
二极管就亮。ARK-SZ411288K可与CPU直接连接,根据引脚说明,将其各个引脚与相应的I/O口连接。
2、LED阵列驱动电路
正向点亮一颗LED,至少也得10~20毫安,若电流不够大,则LED不够亮。而不管是8051的输入/输出口,还是TTL、CMOS的输出端,其高态输出电流都不是很高,不过1~2毫安而已,因此,很难直接高态驱动LED。这时候就需要额外的驱动电路,本设计采用的是74HC595,用74HC595芯片驱动LED有以下特点:速度较快,功耗较小,LED的数目多少随意,既可以控制共阴极的LED显示器,也可以控制共阳极的LED显示器,可以软件控制LED
的亮度,还可以在必要的时候关断显示 (数据保留),以减小功耗,并可随时唤醒显示。用它设计的电路,不仅软硬件设计简单,而且功耗低,驱动能力强,占用的I/O口线较少,是一种造价低廉,应用灵活的设计方案。
图2 74HC595管脚图
74HC595内含8位串入、串/并出移位寄存器和8位三态输出锁存器。寄存器和锁存器分别有各自的时钟输入(SCLK和SLCK),都是上升沿有效。当SCLK从低到高电平跳变时,串行输入数据(SDA)移入寄存器;当SLCK从低到高电平跳变时,寄存器的数据置入锁存器。清除
端(CLR) 的低电平只对寄存器复位(QS为低电平),而对锁存器无影响。当输出允许控制(EN)为高电平时, 并行输出(Q0~Q7)为高阻态,而串行输出(QS)不受影响。74HC595最多需要5根控制线,即SDA、SCLK、SLCK、CLR和EN。其中CLR可以直接接到高电平,用软件来实现寄存器清零;如果不需要软件改变亮度,EN可以直接接到低电平,而用硬件来改变亮度。把其余三根线和单片机的I/O口相接,即可实现对LED的控制。
数据SDA口送入74HC595,在每个SCLK的上升沿,SDA口上的数据移入寄存器,在 SCLK的第9个上升沿,数据开始从QS移出。如果把第一个74HC595的贪吃蛇编程教学QS和第二个74HC595的SDA 相接,数据即移入第二个74HC595中,照此一个一个接下去,可接任意多个。数据全部送完后,给SLCK一个上升沿,寄存器中的数据即置入锁存器。此时如果EN为低电平,数据即从并口Q0~Q7输出,把Q0~Q7与LED的8段相接,LED就可以实现显示了。要想软件改变LED的亮度,只需改变EN的占空比就行了[1]。
二、软件设计
1、主程序工作流程
主程序工作流程如图3所示,系统上电后首先对LED进行初始化,接着对定时器初始化,并启动定时器,接着执行程序主体逻辑,程序主体逻辑执行一遍后检查是否有中断发生。中断源有两个,一个是驱动贪吃蛇自动前行的定时中断,另一个是用户控制贪吃蛇移动方向的键盘中断,任意中断的到来都将改变贪吃蛇的当前状态。若当前没有中断发生,主程序继续判断蛇头是否碰壁或头尾相撞,若是,结束游戏,否则继续执行程序主体循环。
图3 主程序工作流程
2、LED点阵初始化
对点阵初始化,先把点阵所有的信息清空,让其不显示任何信息,再在指定的位置显示蛇所处的最初位置和第一个果实的位置。初始化程序如下:
void Init()
{
for (i = 3; i < SNAKE + 1; i++) //SNAKE是蛇的最大长度
x[i] = 100;
for (i = 3; i < SNAKE + 1; i++)
y[i] = 100; //初始化
x[0] = 4; y[0] = 4; //果子
n = 3; //蛇长 n=-1
x[1] = 1; y[1] = 0; //蛇头
x[2] = 0; y[2] = 0; //蛇尾1
addx = 0; addy = 0; //位移偏移
}
3、贪吃蛇的移动
当蛇没有吃到任何食物时,每次步进蛇头的将要到的下一个LED灯点亮,而蛇尾那个LED灯会灭掉,程序设计时只要将蛇尾那点位置的值传给蛇头下一个位置的值,再改变蛇尾的值即可。而蛇头下一个位置根据蛇头和偏移量来确定,每次上下左右按键决定了蛇步进的偏移量,只要将蛇头的位置加上偏移量的值即得到新的蛇头位置。当蛇头碰到四周的墙壁或者碰到自己的身体,小蛇就立即毙命并结束游戏。
4、食物的随机出现
食物的出现是一种随机行为,所以必须做一个随机数,而且食物出现的位置不能与蛇的位
置相同,也不能超出墙外,否则就要重置食物。这里使用程序中的定时计数器的低八位 TL0的数值,由于TL0不断变化,不同的时间点数值不同,我这里使用的是C++语言里的stdlib.h文件库,使用里面的随机函数srand(),先利用srand(TL0)获得TL0的数值,再利用两次rand()%8分别得到食物出现的横纵坐标的位置。
三、调试及仿真
程序软件编译器使用uVision3。在用uVision3编写单片机程序时,因uVision3往往只能修改语法上的错误,对于算法上的问题不好检查,而直接下到单片机里又受电路板的限制而不方便调试,因此这里使用Proteus进行电路仿真。该软件具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能,同时有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
先在Proteus上绘制硬件电路(并未画出驱动电路),电路设计完成后就可以进行仿真。先双击单片机,把用uVision3编译生成的HEX文件指定为下载文件,点击PLAY键即可进行仿真。当出现ANALYSER ERRORS时,表示电路有错误,列表中说明了具体的错误,必须要先排错才可以进行仿真。本设计仿真效果如图4所示。
图4 系统测试效果图
软件调试及Proteus仿真完成后就进行硬件的安装。本设计按照原先设计好的电路图进行总体上的布置,采用人工搭电路的方法进行硬件的安装。安装时要考虑受热、稳固等多方面的影响使用电烙铁时要控制好焊接的时间,电烙铁停留的时间太短,焊锡不易完全熔化,形成“虚焊”,而焊接时间太长又容易损坏元器件,每一两秒内要焊好一个焊点,若没完成,宁愿等一会儿再焊一次。其次芯片的摆置要方便连线,焊接时要先把芯片拔出,等线接好了再
插上去。在焊接时要考虑电路的抗干扰能力同时要充分考虑电源对单片机的影响。每焊接完一个模块,要用万能表根据电路图检查有没有接错、短路等现象,确认正确后再继续下一个模块[2]。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论