基于单片机的88俄罗斯方块游戏.docx
- 文档编号:24624704
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:26
- 大小:443.21KB
基于单片机的88俄罗斯方块游戏.docx
《基于单片机的88俄罗斯方块游戏.docx》由会员分享,可在线阅读,更多相关《基于单片机的88俄罗斯方块游戏.docx(26页珍藏版)》请在冰豆网上搜索。
基于单片机的88俄罗斯方块游戏
基于单片机的8*8俄罗斯方块游戏
摘要:
本文集中论述了如何使用AT89C52单片机来实现8*8俄罗斯方块游戏,该系统能具体根据8*8俄罗斯方块游戏的基本规则进行游戏,并通过单片机控制点阵屏显示其8*8俄罗斯方块游戏界面。
系统具有实用实时性强、操作简单、娱乐性能好,扩展性能较好价格便宜等特点。
关键词:
单片机;AT89C52;点阵屏显示管;俄罗斯方块游戏
一前言
汇编语言易学易用的特点,特别适合于初学者学习单片机系统编程。
随着21世纪信息社会的到来,计算机在人们的工作和生活中的深入,要求我们越来越多地与计算机打交道,为了使用户在繁忙的日程工作中得到放松,于是出现了各种各样的休闲软件,如聊天工具,游戏等等。
于是我们着手设计开始一个这样的游戏软件。
通过汇编语言的学习,我初步掌握了汇编语言的最基本的知识,于是在王筝老师的指导下动手用汇编语言编写俄罗斯方块游戏。
无可争议,《俄罗斯方块》是有史以来最伟大的游戏之一。
它是永恒的娱乐经典,但它实际上又和那些传统的经典娱乐方式不同,因为它的本质是电子化的,所以它的确属于现代产物。
《俄罗斯方块》举世闻名的游戏性,在该游戏新鲜出炉时就显得非常直观。
某些与坠落的玩具碎片和它们的形状有关的东西,使得哪怕新手也会很自然地企图把它们排列起来,并加以适当组合,就好似《俄罗斯方块》触动了我们某些内在的感官,使得哪怕是我们当中最杂乱无章的人也要把事情整理妥当。
在曾经发布过的所有游戏中,《俄罗斯方块》还被认为是仅有的一个能够真正吸引广泛人群的作品。
为了怀念经典,也为了能够给大多的计算机用户在工作之余找到一个休闲、娱乐的一个方式,我们小组开始着手用汇编语言开发一个经典的俄罗斯方块游戏,本文就是介绍一种采用52系列单片AT89C52为中心器件来实现8*8俄罗斯方块游戏,下面就设计过程及关键技术作一些具体介绍。
该文将主要为硬件和软件两部分来介绍如何用AT89C52实现8*8俄罗斯方块游戏。
二设计思路,方案比较、设计与论证
1、单片机的总体设计思路:
2、电源提供方案:
为使模块稳定工作,须有可靠电源。
我们考虑了两种电源方案。
方案一:
采用独立的稳压电源。
此方案的优点是稳定可靠,且有各种成熟电路可选用;缺点是各模块都采用独立电源,会使系统复杂,且可能影响电路电平。
方案二:
采用单片机控制模块提供电源。
改方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。
综上所述,我们选择第二种方案。
3、显示界面方案:
该系统要求完成游戏界面方块的移动,旋转等功能。
基于上述原因,我们考虑了三种方案:
方案一:
完全采用数码管显示。
这种方案只显示有限的符号和数码字苻,无法胜任题目要求。
方案二:
完全采用点阵式LED显示。
这种方案实现可行,这种方案既满足系统功能要求,又减少了系统实现的复杂度。
我们决定采用方案二以实现系统的显示功能。
4、输入方案:
题目要求系统能手动复位游戏、左右下键处理,旋转键处理。
我们讨论了两种方案:
方案一:
采用矩阵按键。
该方案的优点是:
充分利用I/O口。
若用该方案,可提供较多I/O口,但按键少,体现不了矩阵按键的优势,而且操作起来稍显复杂。
方案二:
采用独立按键,直接在I/O口线上接上按键开关。
因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用四个按键,分别是旋转键,下键,左键,右键。
由于该系统对于8*8俄罗思方块游戏控制,只用单片机本身的I/O口就可实现,且本身的计数器及RAM已经够用,故选择方案二。
三8*8俄罗思方块游戏硬件系统设计
(一)、单片机最小系统:
1、电源(5v的稳压电源,通过整流,滤波,稳压得到)
2、复位电路
(1)自动上电复位(RC延时电路)当刚接上电源的瞬间,电容C两端相当于短路,即相当于给RESET9号引脚一个高电平,等充电结束时(这个时间很短暂),电容相当于断开,这时已经完成了复位动作。
(2)手动复位电路
3、晶振电路(提供时钟脉冲)
18,19号管脚,如下图分别接30pf的电容。
(二)、点阵显示屏及其驱动电路:
三极管采用PNP型,发光二极管采用共阳型。
单片机的P1口作为数据端,P2口作为片选端。
点阵显示屏及其驱动电路图
点阵显示屏及其驱动电路仿真图
(三)、独立按键电路:
按键K1定义为右键,按键K2定义为左键,按键K3定义为下键,按键K4定义为旋转键。
按键电路图按键电路仿真图
(四)、8*8俄罗斯方块游戏系统硬件:
(1)选用设备:
AT89C51芯片一片,USB数据线一根,共阳极的点阵屏一个,驱动三极管八个,开关按键五个,导线,限流电阻若干。
系统总框图如图所示。
硬件系统总框图
(2)8*8俄罗斯方块游戏控制线路图
(3)系统工作原理
1)编程设置好俄罗斯方块游戏规则,通过编程器写入89C51单片机系统。
2)由89C51单片机通过P1口输送数据,P2口片选。
3)通过89C51单片机的RESET位来控制系统是工作或设置初值,为0就对系统进行初始化,为1系统就开始工作;通过AT89C51单片机的P3.2,P3.3,P3.4位来控制游戏方块的右移,左移,下移,P3.5位来控制俄罗斯方块的旋转。
四8*8俄罗斯方块游戏的软件设计
系统软件的设置主要包含延迟时间设计、方块显示程序设计、判断按键程序、方块旋转程序、判断在下移,左移,右移,旋转时是否冲突程序、俄罗斯方块消行程序以及游戏结束界面显示程序设计。
我们将对每一步的具体如何实现展示给大家。
下面为俄罗斯方块游戏主程序流程图:
;/////////主程序/////
MAIN:
JNBSS,$;判断中断是否到来
CLRSS;中断标志清0
ACALLHECHENG;调用移动与背景合成程序
ACALLDISPLAY;调用动态显示子程序
ACALLJIANPAN;调用键盘扫描程序
INCR3;等待1秒
CJNER3,#50,MAIN
MOVR3,#0
ACALLMOVINGDOWN;1秒到了,下移
ACALLJIESHU;调用结束
jnbliyongzhi,llll
liyongzhi555:
movr4,#50
oooo:
calljieshuhou
djnzr4,oooo
movr4,#50
oooo1:
calljieshuhou1
djnzr4,oooo1
movr4,#50
oooo2:
calljieshuhou2
djnzr4,oooo2
ljmpliyongzhi555
llll:
JBCHONGTU,LEE_A;判断是否冲突
JNBCHONGHE,MAIN;判断是否需要合成
LEE_A:
ACALLBACKHECHENG;移动合成到背景
ACALLXIAOHANG;调用消行子程序
ACALLQINGCHU;清除移动区数据
ACALLCHUSUIJI;出随机数
ACALLSUIJI;通过随机数取出积木
ACALLTIHUAN3;新积木送旋转区
ACALLTIHUAN;再送移动区
MOVSHUCHU,#00H;关屏幕
AJMPMAIN1
1.延时时间程序设计
其中延迟时间设计方法有两种:
一种是采用软延时的方法;另一种是利用MCS-51内部定时器产生溢出中断来延迟时间。
具体方案设计如下:
(1)定时器初值计算
定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL上的。
它是以加法记数的,并能从全1到全0时自动产生溢出中断请求。
因此可以把计数器记满为零所需的计数值设定为C和计数初值设定为Tc可得到如下计算公式:
Tc=M-C式中,M为计数器总值,且在方式1时M为216,(在方式0时M的值为213,在方式2和3为28)
由此可知:
当工作于方式1时,定时时间最长,所以将定时器工作于方式1,即M=216=65536;同时设定单片机的主脉冲频率fosc=12MHz。
(2)软件计时1秒的方法
在主程序中设定一个初值为0的软件计数器和使T0定时1秒。
CPU先使软件计数器加1,然后判断它是否为50,若为50表示1秒已到。
(3)定时器计时参考程序代码
;/////////////////中断初始化//////////////
;输入:
无
;输出:
T0JISUQI0,T0JISUQI1,TH0,TL0
;功能:
中断初始化
ZDCUSIHUA:
MOVTMOD,#01H;T0方式1
MOVDPTR,#65536-20000;赋初值
MOVTH0,DPH
MOVTL0,DPL
MOVT0JISUQI0,DPH;保护定时器初值
MOVT0JISUQI1,DPL
SETBTR0;开启中断
SETBET0
SETBEA
RET
;//////////////中断子程序//////////////
;输入:
36H,35H
;输出:
36H,35H,SS
;功能:
置中断标志位为1
ZDUAN:
MOVTH0,T0JISUQI0;定时器重新赋初值
MOVTL0,T0JISUQI1
SETBSS;秒标志位置1
RETI
;//////////////延时子程序//////////////
;功能:
延时一段时间,稳定点阵屏的显示
DELAY:
MOVR7,#30
DL:
MOVR6,#40
DJNZR6,$
DJNZR7,DL
RET
;//////////////等待1秒//////////////
INCR3;等待1秒
CJNER3,#50,MAIN
MOVR3,#0
ACALLMOVINGDOWN;1秒到了,程序往下执行
2.方块显示的设计
当点阵屏按照给定的变化规律进行运行时,采用动态显示原理。
单片机的P1口作为数据端,P2口作为片选端。
达到显示俄罗斯方块的目的。
动态显示原理:
同一时刻,最多只有一位数码管工作,并且所有数码管以一定的频率交替循环工作。
当频率较低时,看到的显示效果是闪烁的、不稳定的。
当频率较高时,由于人眼的视觉暂留现象,就会看到稳定显示的数字了。
俄罗斯方块显示仿真图
方块显示参考程序如下:
;/////////////显示子程序///////////////
;输入:
XIANSHOW0--7
;输出:
SHUCHU
;功能:
显示
DISPLAY:
MOVR0,#XIANSHOW0
MOVR2,#7fH
NEXT_II:
MOVPIANXUAN,R2
MOVA,@R0
CPLA
MOVSHUCHU,A
ACALLDELAY
MOVSHUCHU,#0FFH
INCR0
MOVA,R2
RrA
MOVR2,A;片选
CJNER0,#40H,NEXT_II
RET
3.判断按键程序
由于按键只需要四个,采用独立按键就足以满足要求。
当按键按下,则相应的I/O口置0。
判断按键是否按下,需通过编程来完成:
;////////////////键盘子程序///////////////
;输入:
RETURN/LEFT/LIGHT/DOWNKEY
;输出:
无
;功能:
判断按键
JIANPAN:
JBRETURNKEY,TAIQI;旋转按键
JBRETURNKEYBZ,TAIQI
SETBRETURNKEYBZ
ACALLRETURNMOVING
TAIQI:
JNBRETURNKEY,PANZUO
CLRRETURNKEYBZ
PANZUO:
JBLEFTKEY,TAIQI2;左移按键
JBLEFTKEYBZ,TAIQI2
SETBLEFTKEYBZ
ACALLLEFTMOVING
TAIQI2:
JNBLEFTKEY,PANYOU
CLRLEFTKEYBZ
PANYOU:
JBRIGHTKEY,TAIQI3;右移按键
JBRIGHTKEYBZ,TAIQI3
SETBRIGHTKEYBZ
ACALLRIGHTMOVING
TAIQI3:
JNBRIGHTKEY,PANXIA
CLRRIGHTKEYBZ
PANXIA:
JBDOWNKEY,TAIQI4;下移按键
ACALLMOVINGDOWN
TAIQI4:
RET
4.方块旋转程序
游戏过程中方块可以自由旋转,俄罗斯方块的旋转主要将方块的位置加以变换得到的,当然首先要判断是否满足旋转的要求。
然后在旋转区将方块图形进行旋转,再送往移动区。
程序如下:
;///////////////旋转判断子程序///////////////////
;输入:
MOVESHOW0-MOVESHOW7
;输出:
MOVESHOW0-MOVESHOW7
;功能:
没有冲突和处边情况,积木旋转90度
RETURNMOVING:
;/////////////////判断左边是否处边/////////////////
CLRC;进位标志清0
MOVR0,#MOVESHOW0;判断能不能左移
NEXT_CX:
MOVA,@R0
RLCA;如果CY为1表示模型
JCNEXT_11;已经碰到边界
INCR0;因为8行,所以要判断8次
CJNER0,#48H,NEXT_CX
AJMPPANYOUBIAN
NEXT_11:
MOVA,X_X;判断是否是中心处边
CJNEA,#7,PANYOUBIAN
AJMPOUT_CD
;/////////////////判断右边是否处边//////////////////////
PANYOUBIAN:
MOVR0,#MOVESHOW0;判断能不能右移
NEXT_MX:
MOVA,@R0
RRCA;如果CY为1表示模型
JCNEXT_12;已经碰到边界
INCR0;因为8行,所以要判断8次
CJNER0,#48H,NEXT_MX
AJMPPANXIABIAN
NEXT_12:
MOVA,X_X;判断是否是中心处边
JZOUT_CD
;///////////////判下边是否处底//////////////////////
PANXIABIAN:
MOVR7,MOVESHOW7
CJNER7,#0,OUT_CD;为1表示碰到边框
;///////////////开旋转子程序//////////////////////
;输入:
SUIJISHU
;输出:
无
;功能:
开始旋转
KAIXUANZHUAN:
;MOVA,SUIJISHU
;CJNEA,#0,NEXT_BF;方块不旋转
;AJMPOUT_CD
NEXT_BF:
ACALLCUNSHU;移动区数据送显示区暂存
ACALLCUNSHU3;旋转区数据送显示区暂存
ACALLZHUANDONG;调用转动子程序
ACALLQINGCHU;调用清除子程序
ACALLTIHUAN;调用替换子程序
ACALLYIDIYIDONG;调用异地移动子程序
ACALLCHONGTUPANDUAN;旋转是否冲突
JNBCHONGTU,OUT_CD
ACALLFANGSHU;恢复移动区数据
ACALLFANGSHU3;恢复旋转区数据
OUT_CD:
RET
;/////////////////异地移动子程序/////////////////////
;输入:
X_X,Y_Y
;输出:
无
;功能:
旋转数据送到积木原始位置
YIDIYIDONG:
MOVR4,X_X
TANG15:
DJNZR4,YIDIZHUAN;X坐标减1为0表示水平位置没有移动
MOVR5,Y_Y
TING15:
DJNZR5,YIDIZHUAN3;Y坐标减1为0表示水平位置没有移动
AJMPOUT_BACK
YIDIZHUAN:
ACALLZUOYI
AJMPTANG15
YIDIZHUAN3:
ACALLXIAYI
AJMPTING15
OUT_BACK:
RET
;////////////////////转动子程序//////////////////////
;输入:
SAVE1_1--SAVE1_3
;输出:
SAVE1_1--SAVE1_3
;功能:
旋转区数据旋转90度
;////////////////////外旋////////////////////
ZHUANDONG:
MOVC,23H.0;数据暂时存储
MOV26H.0,C
MOVC,25H.0;9-3
MOV23H.0,C
MOVC,25H.2;7-9
MOV25H.0,C
MOVC,23H.2;1-7
MOV25H.2,C
MOVC,26H.0;3-1
MOV23H.2,C
;////////////////////内旋////////////////////
MOVC,23H.1;数据暂时存储
MOV26H.0,C
MOVC,24H.0;6-2
MOV23H.1,C
MOVC,25H.1;8-6
MOV24H.0,C
MOVC,24H.2;4-8
MOV25H.1,C
MOVC,26H.0;2-4
MOV24H.2,C
RET
5.冲突判断程序
俄罗斯方块游戏区图形框看成移动区、旋转区、背景区几部分构成,判断是否遇到边界,是否移动区的数据与背景区的数据重和。
;/////////////////////冲突判断子程序/////////////////
;输入:
MOVESHOW0--7ANDBACKSHOW0--7
;输出:
无
;功能:
判断在下移,左移,右移,旋转时是否冲突
CHONGTUPANDUAN:
MOVR0,#BACKSHOW0
MOVR1,#MOVESHOW0
GOTO_A:
MOVA,@R0
ANLA,@R1
CJNEA,#00H,TANG_A1
INCR0
INCR1
CJNER0,#38H,GOTO_A
CLRCHONGTU
RET
TANG_A1:
SETBCHONGTU;冲突标志置1
RET
6.消行程序
我们的这个俄罗斯方块游戏,其实在游戏区图形框可以看成是由许多的小方块组成,方块运动的过程就是造型里方块显示或者隐藏,就像现在的霓虹灯效果一样,上一层的消失,下一层的显示,这样,从视觉效果可以看到方块的下落运动效果。
方块在下落的过程中会自动判断每一行方块是否满行,如果满行时,就会将这一行小方块的隐藏,在将上面的小方块向下移动。
当有多行同时出现这样情况时使用递归调用,实现连续消行。
具体程序如下:
;////////////////消行子程序////////////////////
;输入:
BACKSHOW0--7
;输出:
BACKSHOW0--7
;功能:
消掉全亮的行
XIAOHANG:
XH:
MOVR7,#0;R7赋予初值,一共判8行
MOVR0,#BACKSHOW7;从最底行开始判断,但当消了一行后,37H内的数据即为
XH_1:
;上一行的数据,即继续判断上行需要消行否
MOVA,@R0;首先判断每一行是否为0FF
CPLA;数据取反
JZXIAOCHU;如果为0(原来就为0FF),则可以去消行。
DECR0;判断下一行需要消行否
INCR7
CJNER0,#3FH,XH_1
RET
XIAOCHU:
MOV@R0,#0;把需要消行的那一行数据清0
X_H:
MOVA,R0;消行当前行赋予ACC,暂存
MOVR1,A
DECR1;上一行往下移
MOVA,@R1;上一行数据移下来,移到消行所在行
MOV@R0,A
DECR0;整体往下移动一格
CJNER0,#2FH,x_H;30H为最上行,判断移完没有
CJNER7,#08,XH;判断到顶行为止
RET
7.游戏结束界面显示程序
当背景区最上面的一行有方块,说明游戏结束,则进入游戏结束界面,游戏中结束后设计产生有意思的画面,给你带来乐趣。
具体程序如下:
;////////////////结束子程序////////////////////
JIESHU:
MOVR0,#BACKSHOW0
MOVA,@R0
clrliyongzhi
cjnea,#00h,lyz
RET
LYZ:
setbliyongzhi
Ret
jieshuhou:
;游戏结束后界面一
MOVXIANSHOW0,#40H
MOVXIANSHOW1,#40H
MOVXIANSHOW2,#40H
MOVXIANSHOW3,#40H
MOVXIANSHOW4,#40H
MOVXIANSHOW5,#40H
MOVXIANSHOW6,#40H
MOVXIANSHOW7,#7fh
ACALLDISPLAY
ret
jieshuhou1:
;游戏结束后界面二
MOVXIANSHOW0,#00H
MOVXIANSHOW1,#36H
MOVXIANSHOW2,#49H
MOVXIANSHOW3,#22H
MOVXIANSHOW4,#14H
MOVXIANSHOW5,#08H
MOVXIANSHOW6,#00H
MOVXIANSHOW7,#00H
ACALLDISPLAY
Ret
jieshuhou2:
;游戏结束后界面三
MOVXIANSHOW0,#00H
MOVXIANSHOW1,#22H
MOVXIANSHOW2,#22H
MOVXIANSHOW3,#22H
MOVXIANSHOW4,#22H
MOVXIANSHOW5,#22H
MOVXIANSHOW6,#1CH
MOVXIANSHOW7,#00H
ACALLDISPLAY
Ret
五测试、数据及结果分析
1、按键测试
当电路连接完毕后,将写好的测试程序刷写到芯片内,K1、K2、K3、K4以及复位按键分别给端口送高电平和低电平,通电观察即可检测。
2、点阵显示屏的测试
将串口的和电路板上的接口连接,将写好的测试程序刷写到芯片内,开电源即可测试。
3、整体电路测试
系统上电,刷写好程序即可开始测试,观测一次游戏从开始到结束的周期的显示状态是否正常,同时观察是否达到预期的显示功能。
实物图一实物图二实物图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 88 俄罗斯方块 游戏