51单片机课程设计汇本俄罗斯方块_第1页
51单片机课程设计汇本俄罗斯方块_第2页
51单片机课程设计汇本俄罗斯方块_第3页
51单片机课程设计汇本俄罗斯方块_第4页
51单片机课程设计汇本俄罗斯方块_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

...wd......wd......wd...单片机课程设计俄罗斯方块学院:工程技术学院专业:08级电子科学与技术小组成员:何冠羲,马志祥,李洋,张世刚,叶彪,郑先安,洪之目录摘要引言1.程序整体思路2.8X8LED模块显示原理3.硬件电路仿真图4.图形显示5.消层算法6.旋转算法7.实物焊接8.心得体会附录程序代码摘要记得在很小的时候,有一种掌上游戏机,里面有一款游戏叫做俄罗斯方块,那时的我们只是简单的按照游戏规则进展“堆积木〞,而其中的原理却很少有人去思考,毕竟当时的我们都还很年幼。基于单片机课程设计的时机,我们这个小组将使用51单片机和8x8led的组合,来实现比拟简单的俄罗斯方块设计。此次设计初期是在keil和proteus联合仿真中进展,编程语言为51汇编,后期是进展实物焊接。论文描述了俄罗斯方块的主要功能函数的实现,算法分析和实物焊接过程中遇到的问题。关键词:俄罗斯方块;算法;8X8led;引言游戏是人们活动中一项非常重要的内容,有人认为如果哪一天人类对所有的游戏都失去兴趣,恐怕世界的末日就要到了。电脑对游戏的奉献有目共睹,现在摸过电脑的人很少有没玩过电脑游戏的,喜欢游戏的人也很少有不玩电脑的。俄罗斯方块是一款风行全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人AlexPajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在"联众俄罗斯方块"中,更有一些联众网络游戏所独有的魅力――有单机作战与两人在线对战两种模式,用户可任选一种进展游戏。网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。俄罗斯方块游戏可以说是随计算机的开展而开展,并不断推陈出新演变出各种类似游戏,深受广阔玩家喜爱。这个游戏有的简单,有的复杂,但其根本原理是一样的都是对运动的方块进展组合,来训练玩家的反响能力。本文利用单片机进展俄罗斯方块设计,采用51汇编语言进展编程,基于汇编语言的原因是在编写程序的过程中,对于程序的执行会有一个比拟直观的表现。程序整体思路单片机上的程序设计一般是一个大循环构造,对于俄罗斯方块的程序设计,首先产生一个伪随机数,其范围是0-6,然后程序根据此数值所对应的图形模块装入ram的固定区域内,紧接着将此图像写入led所对应的显示缓冲区中,显示程序将缓冲区内的内容显示在led上,如果没有控制键按下,图形将自动向下移动。如果有键按下,程序将根据按下的键来改变图形存储区的值,同时程序将判断图形是否已到达边界,当图形最上层到达显示区顶部,则游戏完毕,此时将清楚显示缓冲的内容,游戏重新开场。2.8x8led显示原理8x8led显示屏的原理图如下由于人眼的视觉暂留现象,通过逐行扫描显示的方式来显示要显示的内容,当每一行扫描的时间很小时人眼观察的将是一幅完整的图像。3.硬件电路仿真图.4.图形显示8x8led一共有64个led,可以从下至上一次对其编号,对于显示类的根本操作是任意点亮一个点,熄灭一个点,任意点亮n〔0<n<=64〕个点,灭掉n个点,如此一来游戏的第一个关键点就完成了。我们将ram中从21h单元到28h单元作为led的显示缓冲区,这里面的每一位对应led的一个点,led将实时显示缓冲区的内容,也就是当此缓冲区内容一改变,led上看到的也会做出相应的改变。同时在俄罗斯方块中那些方块被存放在一个类似于一维的数组之中,每一个方块对应四个小方块,根据伪随机数将这四个小方块对应的值装入ram固定的区域内。如果要显示方块只需将这些方块所对应的点写入缓冲区。5.消层算法设置循环变量数R2=8,即总共至少要扫描8次,每一次循环过程中检测此行是否已满,也就是检测这一行所对应的存储单元是否全为一,如果全为一则将消去此行,即将此行对应的ram清零。同时将此行上面ram的内容按每列依次下移,下移完之后重新将R2=0,又从第一行开场检测。此行不全为零时只需将R2=R2+1。直到R2=9消层过程完毕。6.旋转算法首先要确定一个旋转中心,假设旋转中心的编号是34,将34除以8,商是4存入R1余数是2存入R2,及时用商和余数建设坐标系。此时假设以此为旋转中心的图形需要旋转,则将每一个小方块对应编号除以8,商减去R1,余数减去R2,而每一个方块一次将旋转90度,所以有公式x1,y1,x2,y2x2=-y1,y2=x1其中x1,y1为旋转之前的坐标,x2,y2为旋转之后的坐标。旋转完之后将x2加上R1将y2加上R2,然后将x2乘以8再加上y2。执行四次此过程旋转完毕。7.实物焊接器件:stc51单片机一块,8x8led显示模块一块,电阻10k10个,开关5个,与门,12m晶振一个,电容3个。首先按照目的进展进展元器件布局,然后按照电路图里的导线的连接次序将元器件焊在电路板上,焊好之后进展调试。8.心得体会写程序的过程中,首先应该把程序思路理清,然后再写代码,否则写到一半感觉行不通时是很令人心烦的。还有就是焊接是一个技术活,因为在电子工艺实习之后大家便没有碰过电烙铁,所以焊的过程还是很辛苦的。附录:程序代码 ORG0000HAJMPSTARTORG0003HAJMPINTERRUPTAAEQU10000000BBBEQU11111111BHANGEQU32HLIEEQU33HCOUNTEQU34HREMOVEROWEQU35HSTEPSEQU36HXUNHUANEQU37HBIANLIANGEQU38HGRAPHRAM1EQU39HGRAPHRAM2EQU40HGRAPHRAM3EQU41HGRAPHRAM4EQU42HXXXEQU43HYYYEQU44HKEYEQU45HLEDHEADEQU21HTESTBIT100BITSBIT99RIGHTBIT98LEFTBIT97DOWNBIT96HARDBIT95TURNBIT94KEYDOWNBIT93TESTINGBIT92BOTTOMBIT91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;程序由此处开场执行;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START:MOVTCON,#00000001B;;;;;;;;;;;;;设置外部中断0响应方式为下降沿触发SETBEX0SETBEAMOVSP,#60H;;;;;;;;;;;;;;;;;;;;;将堆栈指针SP设置在RAM的高地址处MOVR7,#6;;;;;;;;;;;;;;;;;;;;;;R7作为存放0-6这7个随机数的变量MOVP0,#11111111B;;;;;;;;;;;;;;;;;;;;;;将P0口最为输入口LCALLWRITEGRAPHTORAMCLRTESTINGGAMELOOP:;CLREALCALLSHOWGRAPHMOVR6,#30TIMING:LCALLSHOWLEDRAMLCALLDELAYDJNZR6,TIMINGLCALLDOWNTESTJNBDOWN,NEXT1ABCD:MOVA,28HCJNEA,#0,GAMEOVERLCALLREMOVEBLOCKLCALLWRITEGRAPHTORAMJMPGAMELOOPNEXT1:;JBKEYDOWN,KEY1JMPKEY4KEY1:CLRTESTINGCLRKEYDOWNMOVA,KEYCJNEA,#1,KEY2;1-LEFTLCALLLEFTTESTJBLEFT,KEY4LCALLCLEANGRAPHLCALLMOVELEFTLCALLGAMELOOPKEY2:CJNEA,#2,KEY3;2-RIGHTLCALLRIGHTTESTJBRIGHT,KEY4LCALLCLEANGRAPHLCALLMOVERIGHTLCALLGAMELOOPKEY3:CJNEA,#4,KEY4;4-ROTATE;LCALLROTATIONTEST;JNBTURN,KEY4LCALLCLEANGRAPHLCALLROTATIONJMPGAMELOOPKEY4:CJNEA,#8,KEY5SWEAT:LCALLDOWNTESTJBDOWN,GAMELOOPLCALLCLEANGRAPHLCALLMOVEDOWNJMPSWEATKEY5:LCALLCLEANGRAPHLCALLMOVEDOWNINCR7CJNER7,#7,NEXT5MOVR7,#0NEXT5:JMPGAMELOOPGAMEOVER:MOVR0,#8MOVR1,#LEDHEADCLEAR:LCALLCLEANGRAPHMOV@R1,#0INCR1DJNZR0,CLEARMOVR0,#4MOVR1,#GRAPHRAM1ASDF:MOVA,@R1ADDA,#16MOV@R1,AINCR1DJNZR0,ASDFJMPGAMELOOP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试图形是否能向下移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DOWNTEST:PUSH0PUSH1PUSH2PUSH3PUSHBPUSHACCMOVR2,#4MOVR0,#GRAPHRAM1DOWN0:MOVA,@R0SUBBA,#8MOVB,AMOVR3,#4CLRCMOVR1,#GRAPHRAM1DOWN2:CLRCSUBBA,@R1JZDOWN1INCR1MOVA,BDJNZR3,DOWN2LCALLTESTBITJBBITS,DOWN3DOWN1:INCR0DJNZR2,DOWN0CLRDOWNJMPHOPEDOWN3:SETBDOWN;DOWNWEIYIBIAOSHIBUNENGWANGXIAYIDONGCPLP3.4JMPDOWN4HOPE:MOVR2,#4MOVR0,#GRAPHRAM1YOUQIANG2:MOVR3,#1CCC2:MOVA,R3MOVB,ACLRCSUBBA,@R0JNZCCC1SETBDOWNSETBBOTTOMJMPDOWN4CCC1:MOVA,BINCR3CJNER3,#9,CCC2INCR0DJNZR2,YOUQIANG2DOWN4:POPACCPOPBPOP3POP2POP1POP0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;外部中断0中断处理程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;INTERRUPT:PUSH0PUSH1PUSHACCINCR7CJNER7,#7,INTTMOVR7,#0INTT:SETBTESTINGSETBKEYDOWNMOVA,P0CPLAMOVKEY,APOPACCPOP1POP0RETI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试能否旋转;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;向下移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MOVEDOWN:PUSH0PUSH1PUSHACCMOVR0,#GRAPHRAM1MOVR1,#4MOVE1:MOVA,@R0CLRCSUBBA,#8MOV@R0,AINCR0DJNZR1,MOVE1POPACCPOP1POP0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;向左移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MOVELEFT:PUSH0PUSH1PUSHACCMOVR0,#GRAPHRAM1MOVR1,#4MOVE2:MOVA,@R0CLRCSUBBA,#1MOV@R0,AINCR0DJNZR1,MOVE2POPACCPOP1POP0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;向右移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MOVERIGHT:PUSH0PUSH1PUSHACCMOVR0,#GRAPHRAM1MOVR1,#4MOVE3:MOVA,@R0CLRCINCAMOV@R0,AINCR0DJNZR1,MOVE3POPACCPOP1POP0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;将图形写入RAM缓存中;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WRITEGRAPHTORAM:PUSHACCPUSHBPUSH0PUSH1PUSH2PUSH7MOVR1,#4MOVA,R7MOVB,#4MULABMOVR2,AMOVR0,#GRAPHRAM1MOVDPTR,#GRAPHWRITEGRAPH:MOVA,R2MOVCA,@A+DPTR;SUBBA,#16MOV@R0,AINCR2INCR0DJNZR1,WRITEGRAPHPOP7POP2POP1POP0POPBPOPACCRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试某一个二进制位是否为1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;TESTBIT:PUSH0PUSH1PUSHBPUSHACCMOVB,#8DIVABMOVR0,AMOVA,BCJNEA,#0,TEST3MOVA,R0DECAJMPTEST4TEST3:MOVA,R0TEST4:MOVDPTR,#TAB1MOVR1,#LEDHEADADDA,R1MOVR1,AMOVA,BMOVCA,@A+DPTRANLA,@R1CJNEA,#0,TEST1CLRBITSJMPTEST2TEST1:SETBBITSTEST2:POPACCPOPBPOP1POP0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试图形是否能向左移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LEFTTEST:PUSH0PUSH1PUSH2PUSH3PUSHBPUSHACCMOVR2,#4MOVR0,#GRAPHRAM1LEFT0:MOVA,@R0CLRCSUBBA,#1MOVB,AMOVR3,#4;CLRCMOVR1,#GRAPHRAM1LEFT2:CLRCSUBBA,@R1JZLEFT1INCR1MOVA,BDJNZR3,LEFT2LCALLTESTBITJBBITS,LEFT3LEFT1:INCR0DJNZR2,LEFT0CLRLEFTJMPLEFT4LEFT3:SETBLEFT;DOWNWEIYIBIAOSHIBUNENGWANGXIAYIDONGCPLP3.4JMPLEFT5LEFT4:MOVR2,#4MOVR0,#GRAPHRAM1YOUQIANG:MOVR3,#9MOVA,#1HHH2:MOVB,ACLRCSUBBA,@R0JNZHHH1SETBLEFTJMPLEFT5HHH1:MOVA,BADDA,#8DJNZR3,HHH2INCR0DJNZR2,YOUQIANGLEFT5:POPACCPOPBPOP3POP2POP1POP0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试图形是否能向右移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RIGHTTEST:PUSH0PUSH1PUSH2PUSH3PUSHBPUSHACCMOVR2,#4MOVR0,#GRAPHRAM1RIGHT0:MOVA,@R0ADDA,#1MOVB,AMOVR3,#4;CLRCMOVR1,#GRAPHRAM1RIGHT2:SUBBA,@R1JZRIGHT1INCR1MOVA,BDJNZR3,RIGHT2LCALLTESTBITJBBITS,RIGHT3RIGHT1:INCR0DJNZR2,RIGHT0CLRRIGHTJMPRIGHT4RIGHT3:SETBRIGHT;DOWNWEIYIBIAOSHIBUNENGWANGXIAYIDONGCPLP3.4JMPRIGHT5RIGHT4:MOVR2,#4MOVR0,#GRAPHRAM1YOUQIANG1:MOVR3,#8MOVA,#8III2:MOVB,ACLRCSUBBA,@R0JNZIII1SETBRIGHTJMPRIGHT5III1:MOVA,BADDA,#8DJNZR3,III2INCR0DJNZR2,YOUQIANG1RIGHT5:POPACCPOPBPOP3POP2POP1POP0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;图形旋转;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ROTATION:PUSH0PUSH1PUSH2PUSH3PUSHBPUSHACCMOVA,GRAPHRAM1;A=50MOVB,#8DIVAB;A=6B=2MOVHANG,A;HANG=6MOVLIE,B;LIE=2MOVR3,#4MOVR0,#GRAPHRAM1ROTATESTART:MOVA,@R0MOVB,#8DIVABCLRCSUBBA,HANGMOVR1,AMOVA,BCLRCSUBBA,LIEMOVR2,A;;;;;;;;;;;;;;;;;;X2=-Y1Y2=X1MOVA,#0CLRCSUBBA,R2;-Y1MOVB,R1;X1MOVR1,A;X2=-Y1MOVR2,B;Y2=X1MOVA,R1ADDA,HANGMOVR1,AMOVA,R2ADDA,LIEMOVR2,AMOVA,R1MOVB,#8MULABADDA,R2MOV@R0,A INCR0DJNZR3,ROTATESTARTPOPACCPOPBPOP3POP2POP1POP0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示LEDRAM中的内容;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SHOWLEDRAM:PUSH0PUSH1PUSHBPUSHACCMOVR0,#LEDHEADMOVR1,#8MOVA,#AASHOW1:MOVP1,AMOVP2,@R0LCALLDELAYINCR0RLADJNZR1,SHOW1POPACCPOPBPOP1POP0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;软件延时;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DELAY:PUSH1PUSH2MOVR1,#5FQFQ:MOVR2,#200FWFW:DJNZR2,FWFWDJNZR1,FQFQPOP2POP1RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;清楚图形在LEDRAM中的内容;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CLEANGRAPH:PUSHACCPUSH1MOVA,#GRAPHRAM1MOVXUNHUAN,#4MOVR1,ADADA1:MOVA,@R1;SUBBA,#16LCALLWRITEPOINT0INCR1DJNZXUNHUAN,DADA1POP1POPACCRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示图形在LEDRAM中的内容;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SHOWGRAPH:PUSHACCPUSH1MOVA,#GRAPHRAM1MOVXUNHUAN,#4MOVR1,ADADA2:MOVA,@R1;SUBBA,#16LCALLWRITEPOINT1INCR1DJNZXUNHUAN,DADA2POP1POPACCRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;消除已经填满的行;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;REMOVEBLOCK:PUSH0PUSH1PUSHBPUSHACCREMOVESTART:MOVR0,#1MOVR1,#LEDHEADREMOVE2:MOVA,@R1CJNEA,#11111111B,REMOVE1MOV@R1,#00000000BMOVREMOVEROW,R0LCALLDOWNBLOCKJMPREMOVESTARTREMOVE1:INCR0INCR1MOVA,R0CJNEA,#9,REMOVE2POPACCPOPBPOP1POP0RETDOWNBLOCK:PUSH0PUSH1PUSHBPUSHACCMOVR0,#1DOWN11:MOVA,REMOVEROWMOVB,#8MULABADDA,R0LCALLDOWNSTEPLCALLJUSTMOVEINCR0MOVA,R0CJNEA,#9,DOWN11POPACCPOPBPOP1POP0RETDOWNSTEP:PUSH0PUSH1PUSHBPUSHACCMOVR0,#0MOVR1,REMOVEROWSTEP2:CLRCSUBBA,#8LCALLTESTBITJBBITS,STEP1INCR0DJNZR1,STEP2STEP1:MOVSTEPS,R0POPACCPOPBPOP1POP0RETJUSTMOVE:PUSH0PUSH1PUSH2PUSHBPUSHACCMOVR0,AMOVA,STEPSMOVB,#8MULABMOVB,AMOVA,R0CLRCSUBBA,BMOVR1,AMOVR2,REMOVEROWMOVA,#8CLRCSUBBA,R2MOVR2,AJUST3:MOVA,R0LCALLTESTBITJBBITS,JUST1MOVA,R1LCALLWRITEPOINT0JMPJUST2JUST1:MOVA,R1LCALLWRITEPOINT1JUST2:MOVA,R0ADDA,#8MOVR0,AMOVA,R1ADDA,#8MOVR1,ADJNZR2,JUST3MOVR2,REMOVEROWDDD:MOVA,R1LCALLWRITEPOINT0MOVA,R1ADDA,#8MOVR1,ADJNZR2,DDDJUSTEND:POPACCPOPBPOP2POP1POP0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;将某个二进制位写

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论