51单片机课程设计俄罗斯方块.docx

上传人:b****6 文档编号:14139605 上传时间:2023-06-20 格式:DOCX 页数:38 大小:83.46KB
下载 相关 举报
51单片机课程设计俄罗斯方块.docx_第1页
第1页 / 共38页
51单片机课程设计俄罗斯方块.docx_第2页
第2页 / 共38页
51单片机课程设计俄罗斯方块.docx_第3页
第3页 / 共38页
51单片机课程设计俄罗斯方块.docx_第4页
第4页 / 共38页
51单片机课程设计俄罗斯方块.docx_第5页
第5页 / 共38页
51单片机课程设计俄罗斯方块.docx_第6页
第6页 / 共38页
51单片机课程设计俄罗斯方块.docx_第7页
第7页 / 共38页
51单片机课程设计俄罗斯方块.docx_第8页
第8页 / 共38页
51单片机课程设计俄罗斯方块.docx_第9页
第9页 / 共38页
51单片机课程设计俄罗斯方块.docx_第10页
第10页 / 共38页
51单片机课程设计俄罗斯方块.docx_第11页
第11页 / 共38页
51单片机课程设计俄罗斯方块.docx_第12页
第12页 / 共38页
51单片机课程设计俄罗斯方块.docx_第13页
第13页 / 共38页
51单片机课程设计俄罗斯方块.docx_第14页
第14页 / 共38页
51单片机课程设计俄罗斯方块.docx_第15页
第15页 / 共38页
51单片机课程设计俄罗斯方块.docx_第16页
第16页 / 共38页
51单片机课程设计俄罗斯方块.docx_第17页
第17页 / 共38页
51单片机课程设计俄罗斯方块.docx_第18页
第18页 / 共38页
51单片机课程设计俄罗斯方块.docx_第19页
第19页 / 共38页
51单片机课程设计俄罗斯方块.docx_第20页
第20页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

51单片机课程设计俄罗斯方块.docx

《51单片机课程设计俄罗斯方块.docx》由会员分享,可在线阅读,更多相关《51单片机课程设计俄罗斯方块.docx(38页珍藏版)》请在冰点文库上搜索。

51单片机课程设计俄罗斯方块.docx

51单片机课程设计俄罗斯方块

单片机课程设计

俄罗斯方块

 

学院:

工程技术学院

专业:

08级电子科学与技术

小组成员:

何冠羲,马志祥,李洋,张世刚,叶彪,郑先安,洪之

 

摘要

引言

1.程序整体思路

2.8X8LED模块显示原理

3.硬件电路仿真图

4.图形显示

5.消层算法

6.旋转算法

7.实物焊接

8.心得体会

附录程序代码

 

摘要

记得在很小的时候,有一种掌上游戏机,里面有一款游戏叫做俄罗斯方块,那时的我们只是简单的按照游戏规则进行“堆积木”,而其中的原理却很少有人去思考,毕竟当时的我们都还很年幼。

基于单片机课程设计的机会,我们这个小组将使用51单片机和8x8led的组合,来实现比较简单的俄罗斯方块设计。

此次设计初期是在keil和proteus联合仿真中进行,编程语言为51汇编,后期是进行实物焊接。

论文描述了俄罗斯方块的主要功能函数的实现,算法分析和实物焊接过程中遇到的问题。

关键词:

俄罗斯方块;算法;8X8led;

 

引言

游戏是人们活动中一项非常重要的内容,有人认为如果哪一天人类对所有的游戏都失去兴趣,恐怕世界的末日就要到了。

电脑对游戏的贡献有目共睹,现在摸过电脑的人很少有没玩过电脑游戏的,喜欢游戏的人也很少有不玩电脑的。

俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。

这款游戏最初是由苏联的游戏制作人AlexPajitnov制作的,它看似简单但却变化无穷,令人上瘾。

相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。

究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。

现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。

对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在"联众俄罗斯方块"中,更有一些联众网络游戏所独有的魅力――有单机作战与两人在线对战两种模式,用户可任选一种进行游戏。

网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。

俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种类似游戏,深受广大玩家喜爱。

这个游戏有的简单,有的复杂,但其根本原理是一样的都是对运动的方块进行组合,来训练玩家的反应能力。

本文利用单片机进行俄罗斯方块设计,采用51汇编语言进行编程,基于汇编语言的原因是在编写程序的过程中,对于程序的执行会有一个比较直观的表现。

 

 

1.程序整体思路

单片机上的程序设计一般是一个大循环结构,对于俄罗斯方块的程序设计,首先产生一个伪随机数,其范围是0-6,然后程序根据此数值所对应的图形模块装入ram的固定区域内,紧接着将此图像写入led所对应的显示缓冲区中,显示程序将缓冲区内的内容显示在led上,如果没有控制键按下,图形将自动向下移动。

如果有键按下,程序将根据按下的键来改变图形存储区的值,同时程序将判断图形是否已到达边界,当图形最上层到达显示区顶部,则游戏结束,此时将清楚显示缓冲的内容,游戏重新开始。

2.8x8led显示原理

8x8led显示屏的原理图如下

由于人眼的视觉暂留现象,通过逐行扫描显示的方式来显示要显示的内容,当每一行扫描的时间很小时人眼观察的将是一幅完整的图像。

 

3.硬件电路仿真图

.

4.图形显示

8x8led一共有64个led,可以从下至上一次对其编号,对于显示类的基本操作是任意点亮一个点,熄灭一个点,任意点亮n(0

我们将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.心得体会

写程序的过程中,首先应该把程序思路理清,然后再写代码,否则写到一半感觉行不通时是很令人心烦的。

还有就是焊接是一个技术活,因为在电子工艺实习之后大家便没有碰过电烙铁,所以焊的过程还是很辛苦的。

 

附录:

程序代码

ORG0000H

AJMPSTART

ORG0003H

AJMPINTERRUPT

AAEQU10000000B

BBEQU11111111B

HANGEQU32H

LIEEQU33H

COUNTEQU34H

REMOVEROWEQU35H

STEPSEQU36H

XUNHUANEQU37H

BIANLIANGEQU38H

GRAPHRAM1EQU39H

GRAPHRAM2EQU40H

GRAPHRAM3EQU41H

GRAPHRAM4EQU42H

XXXEQU43H

YYYEQU44H

KEYEQU45H

LEDHEADEQU21H

TESTBIT100

BITSBIT99

RIGHTBIT98

LEFTBIT97

DOWNBIT96

HARDBIT95

TURNBIT94

KEYDOWNBIT93

TESTINGBIT92

BOTTOMBIT91

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;程序由此处开始执行

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

START:

MOVTCON,#00000001B;;;;;;;;;;;;;设置外部中断0响应方式为下降沿触发

SETBEX0

SETBEA

MOVSP,#60H;;;;;;;;;;;;;;;;;;;;;将堆栈指针SP设置在RAM的高地址处

MOVR7,#6;;;;;;;;;;;;;;;;;;;;;;R7作为存放0-6这7个随机数的变量

MOVP0,#11111111B;;;;;;;;;;;;;;;;;;;;;;将P0口最为输入口

LCALLWRITEGRAPHTORAM

CLRTESTING

GAMELOOP:

;CLREA

LCALLSHOWGRAPH

MOVR6,#30

TIMING:

LCALLSHOWLEDRAM

LCALLDELAY

DJNZR6,TIMING

LCALLDOWNTEST

JNBDOWN,NEXT1

ABCD:

MOVA,28H

CJNEA,#0,GAMEOVER

LCALLREMOVEBLOCK

LCALLWRITEGRAPHTORAM

JMPGAMELOOP

NEXT1:

;JBKEYDOWN,KEY1

JMPKEY4

KEY1:

CLRTESTING

CLRKEYDOWN

MOVA,KEY

CJNEA,#1,KEY2;1-LEFT

LCALLLEFTTEST

JBLEFT,KEY4

LCALLCLEANGRAPH

LCALLMOVELEFT

LCALLGAMELOOP

KEY2:

CJNEA,#2,KEY3;2-RIGHT

LCALLRIGHTTEST

JBRIGHT,KEY4

LCALLCLEANGRAPH

LCALLMOVERIGHT

LCALLGAMELOOP

KEY3:

CJNEA,#4,KEY4;4-ROTATE

;LCALLROTATIONTEST

;JNBTURN,KEY4

LCALLCLEANGRAPH

LCALLROTATION

JMPGAMELOOP

KEY4:

CJNEA,#8,KEY5

SWEAT:

LCALLDOWNTEST

JBDOWN,GAMELOOP

LCALLCLEANGRAPH

LCALLMOVEDOWN

JMPSWEAT

KEY5:

LCALLCLEANGRAPH

LCALLMOVEDOWN

INCR7

CJNER7,#7,NEXT5

MOVR7,#0

NEXT5:

JMPGAMELOOP

GAMEOVER:

MOVR0,#8

MOVR1,#LEDHEAD

CLEAR:

LCALLCLEANGRAPH

MOV@R1,#0

INCR1

DJNZR0,CLEAR

MOVR0,#4

MOVR1,#GRAPHRAM1

ASDF:

MOVA,@R1

ADDA,#16

MOV@R1,A

INCR1

DJNZR0,ASDF

JMPGAMELOOP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;测试图形是否能向下移动

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DOWNTEST:

PUSH0

PUSH1

PUSH2

PUSH3

PUSHB

PUSHACC

MOVR2,#4

MOVR0,#GRAPHRAM1

DOWN0:

MOVA,@R0

SUBBA,#8

MOVB,A

MOVR3,#4

CLRC

MOVR1,#GRAPHRAM1

DOWN2:

CLRC

SUBBA,@R1

JZDOWN1

INCR1

MOVA,B

DJNZR3,DOWN2

LCALLTESTBIT

JBBITS,DOWN3

DOWN1:

INCR0

DJNZR2,DOWN0

CLRDOWN

JMPHOPE

DOWN3:

SETBDOWN;DOWNWEIYIBIAOSHIBUNENGWANGXIAYIDONG

CPLP3.4

JMPDOWN4

HOPE:

MOVR2,#4

MOVR0,#GRAPHRAM1

YOUQIANG2:

MOVR3,#1

CCC2:

MOVA,R3

MOVB,A

CLRC

SUBBA,@R0

JNZCCC1

SETBDOWN

SETBBOTTOM

JMPDOWN4

CCC1:

MOVA,B

INCR3

CJNER3,#9,CCC2

INCR0

DJNZR2,YOUQIANG2

DOWN4:

POPACC

POPB

POP3

POP2

POP1

POP0

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;外部中断0中断处理程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

INTERRUPT:

PUSH0

PUSH1

PUSHACC

INCR7

CJNER7,#7,INTT

MOVR7,#0

INTT:

SETBTESTING

SETBKEYDOWN

MOVA,P0

CPLA

MOVKEY,A

POPACC

POP1

POP0

RETI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;测试能否旋转

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;向下移动

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

MOVEDOWN:

PUSH0

PUSH1

PUSHACC

MOVR0,#GRAPHRAM1

MOVR1,#4

MOVE1:

MOVA,@R0

CLRC

SUBBA,#8

MOV@R0,A

INCR0

DJNZR1,MOVE1

POPACC

POP1

POP0

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;向左移动

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

MOVELEFT:

PUSH0

PUSH1

PUSHACC

MOVR0,#GRAPHRAM1

MOVR1,#4

MOVE2:

MOVA,@R0

CLRC

SUBBA,#1

MOV@R0,A

INCR0

DJNZR1,MOVE2

POPACC

POP1

POP0

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;向右移动

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

MOVERIGHT:

PUSH0

PUSH1

PUSHACC

MOVR0,#GRAPHRAM1

MOVR1,#4

MOVE3:

MOVA,@R0

CLRC

INCA

MOV@R0,A

INCR0

DJNZR1,MOVE3

POPACC

POP1

POP0

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;将图形写入RAM缓存中

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

WRITEGRAPHTORAM:

PUSHACC

PUSHB

PUSH0

PUSH1

PUSH2

PUSH7

MOVR1,#4

MOVA,R7

MOVB,#4

MULAB

MOVR2,A

MOVR0,#GRAPHRAM1

MOVDPTR,#GRAPH

WRITEGRAPH:

MOVA,R2

MOVCA,@A+DPTR

;SUBBA,#16

MOV@R0,A

INCR2

INCR0

DJNZR1,WRITEGRAPH

POP7

POP2

POP1

POP0

POPB

POPACC

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;测试某一个二进制位是否为1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

TESTBIT:

PUSH0

PUSH1

PUSHB

PUSHACC

MOVB,#8

DIVAB

MOVR0,A

MOVA,B

CJNEA,#0,TEST3

MOVA,R0

DECA

JMPTEST4

TEST3:

MOVA,R0

TEST4:

MOVDPTR,#TAB1

MOVR1,#LEDHEAD

ADDA,R1

MOVR1,A

MOVA,B

MOVCA,@A+DPTR

ANLA,@R1

CJNEA,#0,TEST1

CLRBITS

JMPTEST2

TEST1:

SETBBITS

TEST2:

POPACC

POPB

POP1

POP0

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;测试图形是否能向左移动

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LEFTTEST:

PUSH0

PUSH1

PUSH2

PUSH3

PUSHB

PUSHACC

MOVR2,#4

MOVR0,#GRAPHRAM1

LEFT0:

MOVA,@R0

CLRC

SUBBA,#1

MOVB,A

MOVR3,#4

;CLRC

MOVR1,#GRAPHRAM1

LEFT2:

CLRC

SUBBA,@R1

JZLEFT1

INCR1

MOVA,B

DJNZR3,LEFT2

LCALLTESTBIT

JBBITS,LEFT3

LEFT1:

INCR0

DJNZR2,LEFT0

CLRLEFT

JMPLEFT4

LEFT3:

SETBLEFT;DOWNWEIYIBIAOSHIBUNENGWANGXIAYIDONG

CPLP3.4

JMPLEFT5

LEFT4:

MOVR2,#4

MOVR0,#GRAPHRAM1

YOUQIANG:

MOVR3,#9

MOVA,#1

HHH2:

MOVB,A

CLRC

SUBBA,@R0

JNZHHH1

SETBLEFT

JMPLEFT5

HHH1:

MOVA,B

ADDA,#8

DJNZR3,HHH2

INCR0

DJNZR2,YOUQIANG

LEFT5:

POPACC

POPB

POP3

POP2

POP1

POP0

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;测试图形是否能向右移动

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

RIGHTTEST:

PUSH0

PUSH1

PUSH2

PUSH3

PUSHB

PUSHACC

MOVR2,#4

MOVR0,#GRAPHRAM1

RIGHT0:

MOVA,@R0

ADDA,#1

MOVB,A

MOVR3,#4

;CLRC

MOVR1,#GRAPHRAM1

RIGHT2:

SUBBA,@R1

JZRIGHT1

INCR1

MOVA,B

DJNZR3,RIGHT2

 

LCALLTESTBIT

JBBITS,RIGHT3

RIGHT1:

INCR0

DJNZR2,RIGHT0

CLRRIGHT

JMPRIGHT4

RIGHT3:

SETBRIGHT;DOWNWEIYIBIAOSHIBUNENGWANGXIAYIDONG

CPLP3.4

JMPRIGHT5

RIGHT4:

MOVR2,#4

MOVR0,#GRAPHRAM1

YOUQIANG1:

MOVR3,#8

MOVA,#8

III2:

MOVB,A

CLRC

SUBBA,@R0

JNZIII1

SETBRIGHT

JMPRIGHT5

III1:

MOVA,B

ADDA,#8

DJNZR3,III2

INCR0

DJNZR2,YOUQIANG1

RIGHT5:

POPACC

POPB

POP3

POP2

POP1

POP0

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;图形旋转

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ROTATION:

PUSH0

PUSH1

PUSH2

PUSH3

PUSHB

PUSHACC

MOVA,GRAPHRAM1;A=50

MOVB,#8

DIVAB;A=6B=2

MOVHANG,A;HANG=6

MOVLIE,B;LIE=2

MOVR3,#4

MOVR0,#GRAPHRAM1

ROTATESTART:

MOVA,@R0

MOVB,#8

DIVAB

CLRC

SUBBA,HANG

MOVR1,A

MOVA,B

CLRC

SUBBA,LIE

MOVR2,A

;;;;;;;;;;;;;;;;;;X2=-Y1Y2=X1

MOVA,#0

CLRC

SUBBA,R2;-Y1

MOVB,R1;X1

MOVR1,A;X2=-Y1

MOVR2,B;Y2=X1

MOVA,R1

ADDA,HANG

MOVR1,A

MOVA,R2

ADDA,LIE

MOVR2,A

MOVA,R1

MOVB,#8

MULAB

ADDA,R2

MOV@R0,A

INCR0

DJNZR3,ROTATESTART

POPACC

POPB

POP3

POP2

POP1

POP0

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;显示LEDRAM中的内容

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SHOWLEDRAM:

PUSH0

PUSH1

PUSHB

PUSHACC

MOVR0,#LEDHEAD

MOVR1,#8

MOVA,#AA

SHOW1:

MOVP1,A

MOVP2,@R0

LCALLDELAY

INCR0

RLA

DJNZR1,SHOW1

POPACC

POPB

POP1

POP0

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;软件延时

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DELAY:

PUSH1

PUSH2

MOVR1,#5

FQFQ:

MOVR2,#200

FWFW:

DJNZR2,FWFW

DJNZR1,FQFQ

POP2

POP1

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;清楚图形在LEDRAM中的内容

;;;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2