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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(南京邮电大学电子设计竞赛 选拔赛试题 A题俄罗斯方块.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

南京邮电大学电子设计竞赛 选拔赛试题 A题俄罗斯方块.docx

1、南京邮电大学电子设计竞赛 选拔赛试题 A题俄罗斯方块2012年南京邮电大学电子设计竞赛选拔赛试题(A题) 小组成员: B10011305 刘薇 B10011420 吕健 B10010235 梁燕青二一二年五月七日2012年南京邮电大学电子设计竞赛选拔赛试题无线遥控游戏机(A题)(通信类)摘 要俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人Alex Pajitnov发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。这次设计使用STC89C54RD单片机和LCD1

2、2864液晶显示,由红外收发模块以及红外遥控器控制组合,来实现比较简单的俄罗斯方块设计。此次设计初期是在keil和protues联合仿真中进行,编程语言为51C语言,后期是进行实物连接。论文描述了俄罗斯方块的主要功能函数的实现,算法分析和实物焊接过程中遇到的问题。【关键词】:俄罗斯方块 STC89C54RD 红外收发模块 LCD12864 一、 系统方案1.1系统方案描述按照系统的设计功能要求,本无线遥控游戏机系统的设计采用单片机软件系统实现,用单片机的自动控制功能配合按键控制,来控制俄罗斯方块游戏的正常进行。达到游戏图形的开始/结速、左移、右移、翻转、旋转、加速下降。并且达到旋转90度使用而

3、功能不改变。我们使用了红外收发模块达到用红外无线遥控器控制游戏进行。以上都满足了题目所有要求。此外,我们还进行了创新提高,将题目中的3种图形增加到了19种图形,增加了插空功能,使带字模本来只能水平显示的12864利用画图方法进行水平显示,美化了开始、游戏中和结束的界面,显示屏右上方显示下一个即将出现的图形,显示屏下方显示游戏玩家的成绩和等级,优化了人机关系,使玩家更轻松愉悦。1.2 系统方案比较1.2.1程序整体思路单片机上的程序设计一般是一个大循环结构,对于俄罗斯方块的程序设计,首先通过随机数发生器产生一个伪随机数,然后程序根据此数值所对应的图形模块装入ram的固定区域内,紧接着将此图像写入

4、LCD所对应的显示缓冲区中,显示程序将缓冲区内的内容显示在LCD上,如果没有控制键按下,图形将自动向下移动。如果有键按下,程序将根据按下的键来改变图形存储区的值,同时程序将判断图形是否已到达边界,先判断图形是否能向左、向右、旋转,再判断是否能继续下落一格,当图形最上层到达显示区顶部,则游戏结束,此时将清楚显示缓冲的内容,游戏重新开始。整个游戏期间屏幕右上方显示下一个即将出现的图形,屏幕下方显示玩家的级别和分数。消层增加分数1分,50分晋级,级别越高,图形自动下降的速度越快,10级为通关。显示结束界面。1.2.2显示方案选择 方案一:分数和级别可以使用数码管,但数码管只能显示简单的数字,其电路复

5、杂,占用资源较多,字母和文字显示几乎不能实现,显示信息少,不宜显示大量信息。固放弃次方案。 方案二:1602有明显的有点:微功耗,尺寸校,超薄轻巧,显示信息量大,而且容易控制。但对于次图形绘制移动游戏显示需求不能满足,固放弃次方案。 方案三:我们设计的俄罗斯方块游戏系统要显示的信息多,所以应选用显示功能更好的液晶显示,要求能显示更多的数据,增加显示信息的可读性,看起来方便。而12864液晶屏显示信息量更大,字迹美观,视觉舒适,而且容易控制。它可以显示8*4行16*16点阵的汉字,也可以完成图形显示,低电压功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬

6、件电路结构或显示程序都要简洁得多,切该模块的价格也略低于相同点阵的图形液晶模块。通过以上三种方案的比较,我们选择方案三。1.2.3遥控方案选择 方案一:有线遥控:采用有线遥控抗干扰能力强,由于它与控制对象直接相连,所以他的控制距离有限。由于他的这个局限性,这种技术一般只能用于短距离控制。 方案二:无线遥控:无线电遥控最主要的特点是,遥控距离远。一般不受遥控方向或角度的制约,无线电波接收器能接收数十米至数百米外由操作者操纵无线电波发射器送来的电波信号。通过以上两种方案的比较,我们选择方案二。二、 理论分析与计算2.1显示方案描述 12864液晶屏显示原理如图图表 1 12864液晶显示原理图 带

7、中文字库的128X64是一种具有4位/8位并行、2线或3线串口多种接口方式,内部含有国际一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128*64,内置8192个16*16点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。通过对LCD初始化,向LCD指定起始位置写入一个字符串,写入指令代码,从LCD中读出数据。设置有显示字符串子函数、起点坐标、字符串起始地址,向LCD指定位置画一条长度一定指定颜色的垂直线和水平线,坐标未变化向LCD指定坐标写入一个象素,象素颜色有两种,0代表白(无显示),1代表黑(有显示)

8、。首先测试LCD是否处于忙状态,清除Lcd全屏,如果清除模式Mode为0,则为全屏清除为颜色0则无任何显示,否则为全屏清除为颜色1,全屏填充显示,其中部分清屏函数对应的是垂直坐标,游戏中加速模块为加速逻辑运算而设置的掩码表,这是以牺牲空间而换取时间的办法。2.2控制算法表述消层算法 设置循环变量数,每一次循环过程中检测此行是否已满,也就是检测这一行所对应的存储单元是否全为一,如果全为一则将消去此行,即将此行对应的ram清零。同时将此行上面ram的内容按每列依次下移,下移完之后重新将R2=0,又从第一行开始检测。此行不全为零时只需将R2=R2+1。直到R2=9消层过程结束。旋转算法 首先要确定一

9、个旋转中心,假如旋转中心的编号是34,将34除以8,商是4存入R1余数是2存入R2,及时用商和余数建立坐标系。此时若以此为旋转中心的图形需要旋转,则将每一个小方块对应编号除以8,商减去R1,余数减去R2,而每一个方块一次将旋转90度,所以有公式x2= - y1,y2= x1其中x1,y1为旋转之前的坐标,x2,y2为旋转之后的坐标。旋转完之后将x2加上R1将y2加上R2,然后将x2乘以8再加上y2。执行四次此过程旋转结束。参数计算方法游戏界面:大的方面来说一共12列20行(x = 0_12; y = 0_20)第2行到第20行共19行。第1行,最下面。第2行,最上面。定义共21行,其中num0

10、为下墙壁行,num20为上墙壁行,每行12格,最左一格为左墙壁列,最右一格为右墙壁列。得到前一个状态的翻转后的形式 (i = type * 4 + change)无线方案设计红外遥控系统:通用红外遥控系统由发射和接收两大部分组成。应用编/解码专用集成电路芯片来进行控制操作,如图1所示。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。图表 2 红外线摇杆系统框图接收器对外只有3个引脚:Out、GND、VCC与单片机接口非常方便,如图7所示。三、 电路与程序设计电路设计 图表 3 12864液晶屏原理如图 图表 4 54单片机原理如图 图表 5 红外

11、收发模块原理如图程序设计程序流程图:图表 6 程序流程图1图表 7 程序流程图2图表 8 程序流程图3附录I 部分程序代码/初始化MPU 包括开启定时器0和定时器1 红外线用到的外部中断口P3.2void InitCpu(void) wela = 0; dula = 0; TMOD=0x02; /工作在方式0 定时器0和1都开启 TH0=0x00; /重载值 TL0=0x00; /初始化值 ET0=1; /开中断 TR0=1; TH1=0; /初值为0 定时213 = TL1=0; TR1=1; /外部中断 ET1=1; IT0 = 1; /指定外部中断0下降沿触发,INT0 (P3.2) E

12、X0 = 1; /使能外部中断 /EA = 1; /开总中断 EA=1;/定时中断服务子程序来获取键值void Timer1Int(void) interrupt 3 /定时器0中断(中断的形式读取键值) if(irok) /如果接收好了进行红外处理 Ircordpro(); /键值的获取 irok=0; if(irpro_ok) switch(IRcord2) /如果处理好后进行工作处理 case 0x0c: KeyBuffer=11; break; case 0x09: KeyBuffer=PAUSE; /键值用到只有8 13 17 21 25 break; case 0x18: KeyB

13、uffer=CHANGE; break; case 0x1c: KeyBuffer=DOWN; break; case 0x5a: KeyBuffer=RIGHT; break; case 0x08: KeyBuffer=LEFT; break; case 0x46: KeyBuffer=RESTAR; break; default: break; /红外线模块的处理函数(键值的获取)void Ircordpro(void) /红外码值处理函数 unsigned char i, j, k; unsigned char cord,value; k=1; for(i=0;i4;i+) /处理4个字

14、节 for(j=1;j7) /大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差 value|=0x80; if(j=1; k+; IRcordi=value; value=0; irpro_ok=1; /处理完毕标志位置1/根据积木图标左下坐标X,Y来画出积木图标 (通过控制DrawMode,可用于擦除)/其中横屏和竖屏用两个函数分别实现void DrawSign(struct Jimu Temp,unsigned char DrawMode) unsigned char m,n; for(m=0;m4;m+) /在一个4*4的空间中绘制积木 for(n=0;n4;n

15、+) if(Temp.dat&MaskTab4*m+n)!=0) Lcd_Rectangle(Temp.x+n*unit,Temp.y-3-unit*m,Temp.x+n*unit+3,Temp.y-unit*m,DrawMode); void DrawSign_original(struct Jimu Temp,unsigned char DrawMode) unsigned char m,n; for(m=0;m4;m+) /在一个4*4的空间中绘制积木 for(n=0;n4;n+) if(Temp.dat&MaskTab4*m+n)!=0) Lcd_Rectangle_original(

16、Temp.x+n*3,Temp.y-2-3*m,Temp.x+n*3+2,Temp.y-3*m,DrawMode); void DrawSign_tishi(struct Jimu Temp,unsigned char DrawMode) unsigned char m,n; for(m=0;m4;m+) /在一个4*4的空间中绘制积木 for(n=0;n4;n+) if(Temp.dat&MaskTab4*m+n)!=0) Lcd_Rectangle(Temp.x+n*(unit - 1),Temp.y-2-(unit - 1)*m,Temp.x+n*(unit - 1)+2,Temp.y-

17、(unit - 1)*m,DrawMode); /将方块固定函数实现void FixSign(void) /重点理解 unsigned char m,n; for(m=0;m4;m+) /行循环 for(n=0;n4;n+) /列循环 if(Sign0.dat&MaskTab4*m+n)!=0) /将不能下落的积木固定 num20-(Sign0.y-2)/unit+m|=MaskTab11-Sign0.x/unit-n; return;/判断是否可以再移动unsigned char CheckIf(void) unsigned char m,n; for(m=0;m4;m+)/行循环 for(

18、n=0;n3) /控制翻转数载0到2之间 Sign1.change=0; i=Sign1.type*4+Sign1.change; /得到前一个状态的翻转后的形式 (i = type * 4 + change) 总共有28种 Temp=(unsigned int)Blocki0=20) /防止越过了下边界 Temp=1; else Temp=20-Temp; for(n=Temp+3;n=Temp;n-) /积木图标的最顶行开始寻找满行比较有利于运算 if(numn=0xfff) Flag=1; /消行标志 for(m=n+1;m=19;m+) /把上一行的数赋值给下一行积木 /第19行始终不

19、动0x801 numm-1=numm; numm=0x801; /改为绘制界面初始值 Score+; /每找到一个满行,则分数加1 if(Flag) /为加速而设置并判断的标志,有已固定的积木有满格消行变化则重画积木界面 for(m=Temp;m=19;m+) /为加速,不必要重第一行重画起,只需要从积木图标最下行开始往上的重画 for(n=1;n=10;n+) / if(numm&MaskTabn)=0) if(Lcd_ReadPixel(40-(n-1)*unit,76-(m-1)*unit)!=0) /为加速而做的读象素操作 Lcd_Rectangle(40-(n-1)*unit,76-

20、(m-1)*unit,40-(n-1)*unit+3,76-(m-1)*unit+3,0); /清除操作 else if(Lcd_ReadPixel(40-(n-1)*unit,76-(m-1)*unit)=0) /为加速而做的读象素操作 Lcd_Rectangle(40-(n-1)*unit,76-(m-1)*unit,40-(n-1)*unit+3,76-(m-1)*unit+3,1); /画图操作 /随机产生一个积木图标放到预产生区域并显示出来void CreatSign(void) unsigned char n; unsigned int Temp; DrawSign_tishi(S

21、ign2,0); /先清除 n=Random()*28; Temp=(unsigned int)Blockn08; Temp=Temp|Blockn1; Sign2.dat=Temp; Sign2.x=50; /首坐标为45 Sign2.y=4*unit+2; /14 Sign2.type=n/4; /形状是随机的,但是类型只能有一种 Sign2.change=n%4; /类型的变化 DrawSign_tishi(Sign2,1); /后画出/*游戏的具体过程,也是俄罗斯游戏的关键部分*/unsigned char GamePlay(void) unsigned char m,n; unsig

22、ned int Temp; SysFlag|=1NEWSIGNFLAG; /刚开始初始化为需要产生新的积木图标 InitRandom(TL0); /用定时器作为种子 Print_state(1); /PrintScore(); LCD_ShowString(84,63,SC:00,1); /PrintLevel(); LCD_ShowString(100,63,LV:01,1); CreatSign(); /界面的绘制 while(1) if(SysFlag&(1NEWSIGNFLAG)=1) /判是否需要产生新的积木图标 SysFlag&=(1NEWSIGNFLAG); /需要产生方块的系统

23、标志位 Sign0=Sign2; /把sign0 = 接收 CreatSign(); Sign0.x=16; /初始坐标设定 Sign0.y=19; for(m=0;m4;m+)/行循环 for(n=0;n4;n+)/列循环 if(Sign0.dat&MaskTab15-m*4-n)=0) /主要用于检测最上面一行 为了是从最后一行开始查询 break; if(n=4) Sign0.y-=unit; /将积木图标出现置顶 for(m=0;m4;m+)/行循环 for(n=0;n4;n+)/列循环 if(Sign0.dat&MaskTab4*m+n)!=0) if(num20-(Sign0.y-2)/unit+m&MaskTab11-Sign0.x/unit-n)!=0) SysFlag|=1DEADFLAG; if(SysFlag&(1DEADFLAG)!=0) return DEADFLAG; /如果产生新的积木图标中的方块与已固定好的方块重合,则死亡。游戏结束 DrawSign(Sign0,1); switch(KeyBuffer) case LEFT: KeyBuffer=0; /清除键盘缓存区 if(SysFlag&(1=10) /分数与时 Level=1; PrintLevel();

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

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