基于单片机的新贪吃蛇游戏设计与制作.docx
《基于单片机的新贪吃蛇游戏设计与制作.docx》由会员分享,可在线阅读,更多相关《基于单片机的新贪吃蛇游戏设计与制作.docx(25页珍藏版)》请在冰豆网上搜索。
基于单片机的新贪吃蛇游戏设计与制作
暑期任务实验报告总结
题目:
红外控制贪吃蛇游戏
2012年8月28日
1引言
如今,游戏机风行的程度,是第一台电子游戏机的研制者诺兰-布什纳尔先生始料不及的。
在全世界最大的城市,直至最小的村庄,从纽约最辉煌的游乐场,到高加索最小的乡镇儿童娱乐点,在千家万户,正在进行着千千万万这样的“战斗”,伴随着无数成功与失败,兴奋与懊丧。
游戏机带来了一个全球性的疯狂症,其他任何娱乐与之相比都望尘莫及。
然而,究竟是什么原因使游戏机如此风行呢?
在回顾了游戏机发展简史之后,我们不难悟出,技术进步在游戏机发展过程中起到了极大的促进作用。
第二次世界大战以后,电子计算机技术得到了突飞猛进的发展。
先是由晶体管代替了笨重的真空管,后来出现了集成电路和大规模集成电路,使电子计算机一代一代实现更新,同时软件技术也发展迅速。
在美国,集中了许多计算机软件的设计人才,他们工作之余,时常喜爱编一种能与人斗智的“游戏”,以此来锻炼编程的能力。
这种“游戏”花样繁多,但其特点都是利用计算机软件事先设计好的“分析”、“判断”能力反过来与人较量。
由于不断修改更新,使计算机的“智力”水平与人难分高低。
随着深蓝计算机与人的棋类对决,到现在的PSP游戏机或者是家庭用的X-BOX游戏机,游戏机的技术是日益的发展、进步。
但是,技术进步绝不是游戏机风行的唯一因素。
随着终端设备开发能力的加强,作为娱乐终端的游戏机也得到了很大程度的发展。
只有得到了游戏终端技术的支持,才能做出更新、更高难的游戏。
这也加速了游戏机在全球风行程度,所以对于游戏机的研究和设计具有很重要的意义,这也是本课题研究的来源
二.课题任务及设计思路
2.1主要任务
组建遥控器控制电路,要求通过遥控器的方向键控制贪吃蛇游戏。
(类似于贪吃蛇游戏)
2.2设计思路
1 此实验我们采用38k的红外对LCD控制,通过红外接收模块对遥控数据进行采集,MCU中心模块主要对采集数据进行判断,并相应的去控制LCD的显示模块。
2 软件设计流程:
2.2.1主控制器的选择
STC90C51是标准的40引脚双列直插式集成电路芯如图2-1所示,AT89C51是一种带64K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
STC90C51具有以下标准功能:
64K字节Flash,1280字节RAM,32位I/O口线,看门狗定时器,2个数据指针,2个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,STC90C51可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
图2-1AT89S52的引脚图
(1)管脚功能
①输入/输出口
P0.0~P0.7P0口8位双向口
P1.0~P1.7P1口8位双向口
P2.0~P2.7P2口8位双向口
P3.0~P3.7P3口8位双向口
②ALE地址锁存控制信号
在系统扩展时,ALE用于控制把P0口输出的低8位地址送入锁存器锁存起来,以实现低位地址和数据的分时传送。
此外由于ALE是以六分之一晶振频率的固定频率输出的正脉冲,因此可作为外部时钟或外部定时脉冲使用。
③PSEN外部程序存储器读选通信号
在读外部ROM时PSEN有效(低电平),以实现外部ROM单元的读操作。
④EA访问程序存储器控制信号
当EA信号为低电平时,对ROM的读操作限定在外部程序存储器;而当EA信号为高电平时,则对ROM的读操作是从内部程序存储器开始,并可延续至外部程序存储器。
⑤RST复位信号
当输入的复位信号延续2个机器周期以上高电平时即为有效,用以完成单片机的复位操作。
⑥XTAL1和XTAL2外接晶体引线端
当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。
⑦Vss地线
Vcc+5V电源
(2)常见的第二功能信号
①P3口线的第二功能
P3的8条口线都定义有第二功能如表2-1所示
表2-1端口第二功能
口线
第二功能
信号名称
P3.0
RXD
串行数据接收
P3.1
TXD
串行数据发送
P3.2
INT0
外部中断0申请
P3.3
INT1
外部中断1申请
P3.4
T0
定时器/计数器0记数输入
P3.5
T1
定时器/计数器1记数输入
P3.6
WR
外部RAM写选通
P3.7
RD
外部RAM读选通
(3)EPROM存储器程序固化所需要的信号
有内部EPROM的单片机芯片(例如80C51),为写入程序需提供专门的编程脉冲和编程电源,它们也是由信号引脚以第二功能的形式提供的,即:
编程脉冲:
30脚(ALE/PROG)
编程电压(25V):
31脚(EA/Vpp)
2.2.2液晶屏的选择
采用320*240LCD,根据CPU的指令进行输出。
320*240的分辨率对于小游戏来讲已经是非常高的分辨率了,足以满足小游戏的显示要求,使图像清晰,色彩丰富!
红外的选择
采用38K的红外遥控和接收,红外遥控的特点是不影响周边环境、不干扰其它电器设备。
由于其无法穿透墙壁,故不同房间的家用电器可使用通用的遥控而不会产生相互干扰;电路调试简单,只要按给定电路连接无误,一般不需任何调试即可投入工作;编解码容易,可进行多路遥控。
三具体设计
3.1软硬件基本分工
硬件:
主要实现红外的发射与接收,单片机最小系统使红外接受管工作及实现彩屏的输出;
软件:
实现红外的解码,实现按键映射到游戏屏幕的动作,实现游戏规则的判定等等。
3.2硬件设计部分
3.2.1电源部分
电源部分由手机充电器直接提供,大概是5V/500MA,刚好是单片机需要的电源。
3.2.2复位电路
上电复位采用电平方式开关复位。
如图3-4所示。
上电复位用RC电路,电容用10uF,电阻用10K。
如图3-4复位电路
3.2.3液晶显示芯片与单片机接口电路
液晶显示屏共有15个引脚,其中VDD接电源,GND接地,RS接单片机的P0.0脚,RW接单片机的P0.1脚,复位接P0.4脚,RD接P0.2脚,CS接P0.3脚,D0~D7数据段接口接P2.0~P2.7。
如图3-2.3所示
图3-2.3液晶显示与单片机相连电路图
3.2.4K38与单片机接口电路
图3-6K38与单片机接口电路
本游戏共有4个控键,分别是:
四个方向键,用于控制小点的移动方向;分别是上下左右四个方向
程序通过中断的方式检查是否有按键按下,调用移动函数。
每次有按键按下,小点会做出相应的反应。
3.3软件部分设计
3.3.1软件部分主要负责a红外解码,b将按键输入通过算法映射为小蛇在屏幕上的动作、c生成随机数(既小蛇的食物),d判定是否吃到食物/是否过关/是否结束游戏等等;
1.红外编码方式
本实验红外采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,(如下图所示)
本红外每次发送的数据格式为引导码+8位系统码+8位系统反码+8位数据码+8位数据反码,周期约为108ms。
其中引导码由9ms低电平和4.5ms的高电平组成。
(如下图所示)
如果键按下超过108ms仍未松开,接下来发射的代码(连发码)将仅由起始码(9ms)和结束码(2.25ms)组成。
(如下图所示)
2.软件解码
基于红外的编码方式我们的软件解码思路为,用红外的引导码的脉冲负边沿触发单片机的外部中断,进入中断,在中断中完成解码,并转换得到按键的具体的按键值。
具体实现步骤:
a.外部触发进入中断,延时约2ms,若仍是低电平则确认为信号出现,进入下一步,否则跳出中断,等待下一次触发;
b.等待9MS的低电平后再等待经过4.5MS的高电平(此时引导码已结束);
c.收集四组数据存入数组IRCOM[j]中(其中IRCOM[0]为系统码,IRCOM[1]为系统反码,IRCOM[2]数据码,IRCOM[3]为数据反码);
d.判定数据是0还是1。
我们采用的是在每位数据的高电平期间在适当的延时下让N自加(由红外编码方式知0与1的区别在于高电平的时长不一样,1的高电平比0的长),然后判定N的值可知数据为0或1,我们预设当N<8时数据为0,当8<=N<=30时数据为1,当N>30时为无效数据,跳出中断等待下一次触发;
e.小循环8次得到一组数据;
f.大循环4次得到4组数据;
g.数据码存在IRCOM[2]中,所以判定IRCOM[2]的值就知道按键按的是哪个了。
(上0X18,下0X5A,左0X08,右0X52)。
遥控器按键
上
下
左
右
按键码
0X18
0X5A
0X08
0X52
附加具体代码:
voidIR_IN(void)interrupt0//外部中断服务程序
{
unsignedcharj,k;
unsignedintN=0;
EX0=0;
delay_14(15);
if(IRIN==1)
{
EX0=1;
return;
}
//确认IR信号出现
while(!
IRIN)//等IR变为高电平,跳过9ms的前导低电平信号。
{
delay_14
(1);
}
for(j=0;j<4;j++)//收集四组数据
{
for(k=0;k<8;k++)//每组数据有8位
{
while(IRIN)//等IR变为低电平,跳过4.5ms的前导高电平信号。
{
delay_14
(1);
}
while(!
IRIN)//等IR变为高电平
{
delay_14
(1);
}
while(IRIN)//计算IR高电平时长,得到数据是0或1
{
delay_14
(1);
N++;
if(N>=30)
{
EX0=1;
return;
}//0.14ms计数过长自动离开。
}//高电平计数完毕
IRCOM[j]=IRCOM[j]>>1;//数据最高位补“0”
if(N>=8)
{IRCOM[j]=IRCOM[j]|0x80;}//数据最高位补“1”
N=0;
}//endfork
}//endforj
if(IRCOM[2]!
=~IRCOM[3])
{
EX0=1;
return;
}
switch(IRCOM[2])
{
case0x18:
Dx=0;Dy=-5;break;//按键2
case0x08:
Dx=-5;Dy=0;break;//按键4
case0x5A:
Dx=+5;Dy=0;break;//按键6
case0x52:
Dx=0;Dy=+5;break;//按键8
}
EX0=1;
}
3.3.2几个主要部分的具体算法
a.本实验采用中断解码,具体算法在3.3.1软件解码以说明;
b.小蛇食物由rand()函数产生随机数,通过Sx=rand()%213+13;
Sy=rand()%193+53;将其限定在游戏框图中;
c.小蛇是否吃到食物的判定:
通过小蛇当前坐标的值(X,Y)与随机数(SX,SY)比较,当X与SX的差的绝对值与Y与SY的差的绝对值同时满足小于等于3,则判定小蛇吃到食物;
d.小蛇出界判为游戏结束:
当小蛇当前坐标X<11或X>226或Y<50或Y>249就判为出界,游戏结束;
E.过关:
当吃到的食物数m>8,则进入下一关。
N
3.3.3软件实现的结果
实现结果与预期基本一致,红外遥控可以实时的控制小蛇的上下左右的运动,当吃到食物后小蛇加长,并且分数加一分,当吃到食物数大于8时进入下一关,随机数产生的小蛇的食物都能落在游戏限定的框图内部,当小蛇触碰游戏框图边缘时游戏结束并显示“GAMEOVER”.
四、整机调试和检测结果
4.1遇到问题及解决方法:
a.本次实验硬件部分较简单,所以未出现什么重大问题,就是在焊接时彩屏引脚的GND脚虚焊导致一开始时彩屏显示不正常,经万用表检测后很快排除了问题;
b.本次实验软件问题出现的较多,具体如下:
1.
由于未能正确理解红外的编码方式,在解码时将引导码部分9MS的低电平忽略,导致数据经常读错或是未能读出数据等,后来按照正确的顺序解码就得到了正确的数据;
2.由于小蛇的食物需要随机数产生,所以一开始设想使用读取定时器的TL0来作为随机数,但是实验时,中断一直无法开启,无法得到随机数,后来经查阅资料及询问老师得知外部中断输入脚不能与计数/定时器同时使用,后来改用RAND()函数产生随机数后解决了问题;
3.在实验过程中出现了总是有一个随机的方块出现(非随机数产生的),后来经认真检查程序后得知是坐标数组Zx[],Zy[]的最后一个值程序未给,于是系统每次都给其填充一个随机值或是上次该内存地址的值直接赋给了该数组的最后一位,再经程序在彩屏上输出就是一个乱点了。
后来,经过把小蛇吃到的食物的坐标SX,SY赋给Zx[],Zy[]后乱点小时,问题解决。
五.总结
通过本次的实验项目,我们加深了对红外遥控的了解,将小游戏的控制有传统的有线连接升级到无线控制,相信这项技术将给游戏的控制带来极大的方便,玩游戏时只要拿个红外遥控器就可以了,而不必再连笨重的屏幕与主机之类的都要提在手上了,这必将被喜欢轻便的年轻人所热衷,由此看其有相当大的发展空间。
这项技术在其它许多领域也有许多有许多可以改造运用的空间,例如,在家用电器的控制方面,以及多媒体教学方面也有极大的用途,在工业方面,尤其是在有些特殊的操作环境下,例如,高温处人无法直接到达的地方,使用红外控制,既可以高度的防止环境干扰,又可以达到实时精确的操作机械的目的。
参考文献
[1]全国大学生电子设计竞赛组委会.第五届全国大学生电子设计竞赛获奖作品选编.北京理工大学出版社,2005.10-17
[2]康华光,陈大钦.电子技术基础模拟部分第四版.第四版.北京:
高等教育出版社,1999.82-155
[3]康华光,邹寿彬.电子技术基础数字部分第四版.第四版.北京:
高等教育出版社,2000.83-155
[4]周坚.如何用C语言编写计数器程序.无线电合订本,2004年(下):
213-214
[5]黄智伟,王彦,陈文光.全国大学生电子设计竞赛训练教程.电子工业出版社,2005.304-314
[6]张万奎.《模拟电子技术》[M].湖南.湖南大学出版社,2005:
226-229.
[7]彭为,黄科,雷道仲.单片机典型系统设计实例精讲.电子工业出版社.2006.5
[8]李广弟,朱月秀,王秀山.单片机基础.第2版.北京航空航天大学出版社,2001.13-71
[9]梅丽风,王艳秋,张军等.单片机原理及接口技术.清华大学出版社,2004.296-323
[10]涂时亮等.单片机软件设计技术.科学技术文献出版社重庆分社:
1998
[11]席德勋.现代电子技术[D].北京.高等教育出版社,2002:
121-125.
[12]陆子明,徐长根.单片机设计与应用基础[M].北京:
国防工业出版社,2005
[13]刘胜利.新型显示器电路分析.北京:
电子工业出版社,1999.122-344
[14]胡伟.单片机C程序设计及应用实例.北京:
人民邮电出版社,2003.1-247
[15]实用电子元器件手册.上海:
上海科学技术出版社,1998.1-21
[16]李广弟等.单片机基础(修订本).北京:
北京航空航天大学出版社,2002.1-223
[17]胡汉才.单片机原理及接口技术.清华大学出版社,1996
[18]刘征宇,韦立华.最新74系列IC特性代换手册.福州:
福建科学技术出版社,2002.1-122
[19]李玉峰等MCS-51系列单片机原理与借口技术.北京:
人民邮电出版社2004.12-55
附录1总电路图
1原理图
2工作PCB
附录2部分程序
#include
#include
#include
#include
#include"delay.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineFOSC22118400
/****************************************************/
sbitIRIN=P3^2;//红外接收器数据线
/****************************************************/
ucharIRCOM[7];
ucharNUM[]="0123456789";
uintZx[35],Zy[35];
/****************************************************/
uinty=160,x=120,Dx=5,Dy=0,Sx,Sy,n=0,m=1;
unsignedchartime=200;
/******************************************************/
voidchushihua();//游戏界面初始化
voidxianshi(uintx);
voiddiyiguan();
voiddierguan();
/*****************************************************/
voidmain()//主函数
{
IRIN=1;
IE=0x81;//允许总中断中断,使能INT0外部中断
TCON=0x01;//触发方式为脉冲负边沿触发
Zx[0]=120;
Zy[0]=160;//I/O口初始化
chushihua();//游戏界面初始化
diyiguan();
while
(1)
{
n++;
x=x+Dx;
Zx[n]=x;
y=y+Dy;
Zy[n]=y;
if((x<11)||(x>226)||(y>249)||(y<50))
{
GUI_sprintf_string(80,120,"GAMEOVER",RED,0);//显示GAMEOVER
while
(1);
}
if((abs(Zx[n]-Sx)<=5)&(abs(Zy[n]-Sy)<=5))
{
m++;
xiaodian(Sx,Sy);
x=Sx;
y=Sy;
Zx[n+1]=x;
Zy[n+1]=y;
GUI_sprintf_char(180,10,NUM[m-2],0,0);//清上次分数
Sx=rand()%216+13;
Sy=rand()%196+53;
xiandian(Sx,Sy);
}
GUI_sprintf_char(180,10,NUM[m-1],RED,0);//显示分数
xianshi(m);
n=m-1;
if(m>=9)
{
y=160;x=120;Dx=5;Dy=0;
n=0;m=1;
Zx[n]=x;
Zy[n]=y;
dierguan();
}
}
}
/*****************************************************************/
voidchushihua()//游戏界面初始化
{
ILI9325_initial();/*TFT彩屏初始化*/
delayms(20);
GUI_clearscreen(0);//清屏
GUI_sprintf_HZ(20,20,YELLOW,0);//显示'贪吃蛇小游戏'
GUI_sprintf_string(60,60,"---CDD",RED,0);//显示---CDD
GUI_sprintf_HZ2(110,60,BLUE,0);//显示小组制作
GUI_sprintf_HZ3(40,130,RED,0);//显示开始游戏
GUI_DisPicture(53,180,133,100);//显示图片
while
(1)//扫描按键等待开始游戏
{
if(IRCOM[2]==0x18||IRCOM[2]==0x08||IRCOM[2]==0x5A||IRCOM[2]==0x52)
break;
GUI_sprintf_string(20,130,"<<",YELLOW,0);//显示开始游戏
GUI_sprintf_string(190,130,">>",YELLOW,0);
delay200ms();
GUI_sprintf_string(20,130,"<<",0,0);//显示开始游戏
GUI_sprintf_string(190,130,">>",0,0);
delay50ms();
}
}
/**********************************************************/
voidIR_IN(void)interrupt0//外部中断服务程序
{
unsignedcharj,k;
unsignedintN=0;
EX0=0;
delay_14(15);
if(IRIN==1)
{
EX0=1;
return;
}
//确认IR信号出现
while(!
IRIN)//等IR变为高电平,跳过9ms的前导低电平信号。
{
delay_14
(1);
}
for(j=0;j<4;j++)//收集四组数据
{
for(k=0;k<8;k++)//每组数据有8位