基于51单片机与点阵的贪食蛇游戏机开发Word下载.docx
- 文档编号:15996716
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:10
- 大小:111.59KB
基于51单片机与点阵的贪食蛇游戏机开发Word下载.docx
《基于51单片机与点阵的贪食蛇游戏机开发Word下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机与点阵的贪食蛇游戏机开发Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
其中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点阵初始化
对点阵初始化,先把点阵所有的信息清空,让其不显示任何信息,再在指定的位置显示蛇所处的最初位置和第一个果实的位置。
初始化程序如下:
voidInit()
{
for(i=3;
i<
SNAKE+1;
i++)//SNAKE是蛇的最大长度
x[i]=100;
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键即可进行仿真。
当出现ANALYSERERRORS时,表示电路有错误,列表中说明了具体的错误,必须要先排错才可以进行仿真。
本设计仿真效果如图4所示。
图4系统测试效果图
软件调试及Proteus仿真完成后就进行硬件的安装。
本设计按照原先设计好的电路图进行总体上的布置,采用人工搭电路的方法进行硬件的安装。
安装时要考虑受热、稳固等多方面的影响使用电烙铁时要控制好焊接的时间,电烙铁停留的时间太短,焊锡不易完全熔化,形成“虚焊”,而焊接时间太长又容易损坏元器件,每一两秒内要焊好一个焊点,若没完成,宁愿等一会儿再焊一次。
其次芯片的摆置要方便连线,焊接时要先把芯片拔出,等线接好了再插上去。
在焊接时要考虑电路的抗干扰能力同时要充分考虑电源对单片机的影响。
每焊接完一个模块,要用万能表根据电路图检查有没有接错、短路等现象,确认正确后再继续下一个模块[2]。
附录:
代码
#include<
reg51.h>
#defineucharunsignedchar
#defineSNAKE20//最大长度
#defineTIME50//显示延时时间
#defineSPEED71//速度控制
sbitkeyenable=P3^6;
//方向使能
sbitkeyy=P0^2;
//上下*/
sbitup=P3^3;
//down
sbitdown=P3^1;
sbitright=P3^2;
sbitleft=P3^4;
ucharx[SNAKE+1];
uchary[SNAKE+1];
uchartime,n,i,e;
//延时时间,当前蛇长,通用循环变量,当前速度
charaddx,addy;
//位移偏移量
/********************
延时程序
*********************/
voiddelay(charMS)
{
charus,usn;
while(MS!
=0)
usn=0;
while(usn!
us=0xff;
while(us!
=0){us--;
};
usn--;
}
MS--;
/*******************************************
判断碰撞
*******************************************/
bitknock()
{bitk;
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;
//撞自己
returnk;
/*****************
上下左右键位处理
*****************/
voidturnkey()//interrupt0using2
if(keyenable)
if(left){addy=0;
if(addx!
=1)addx=-1;
elseaddx=1;
if(right){addy=0;
=-1)addx=1;
elseaddx=-1;
if(up){addx=0;
if(addy!
=-1)addy=1;
elseaddy=-1;
if(down){addx=0;
=1)addy=-1;
elseaddy=1;
乘方程序
ucharmux(uchartemp)
if(temp==7)return128;
if(temp==6)return64;
if(temp==5)return32;
if(temp==4)return16;
if(temp==3)return8;
if(temp==2)return4;
if(temp==1)return2;
if(temp==0)return1;
return0;
显示时钟显示程序
voidtimer0(uchark)
{while(k--)
{for(i=0;
SNAKE+1;
i++)
{P2=mux(x[i]);
P1=255-mux(y[i]);
turnkey();
//上下左右键位处理
delay(TIME);
//显示延迟
P2=0x00;
P1=0xff;
}}
}
主程序
*****************/
voidmain(void)
{e=SPEED;
P0=0x00;
P1=0xff;
P2=0x00;
P3=0x00;
while
(1)
{//if(keyenable==1){P1=0x00;
P2=0xff;
}else{P1=0xff;
for(i=3;
i++)x[i]=100;
for(i=3;
i++)y[i]=100;
//初始化
x[0]=4;
y[0]=4;
//果子
n=3;
x[1]=1;
y[1]=0;
x[2]=0;
y[2]=0;
addx=0;
addy=0;
//k=1;
while
(1){if(keyenable)break;
timer0
(1);
while
(1)
{timer0(e);
if(kn
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 点阵 贪食 游戏机 开发
![提示](https://static.bdocx.com/images/bang_tan.gif)