基于单片机的俄罗斯方块游戏机课程设计
基于单片机的俄罗斯方块游戏系统的设计

摘要俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。
俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
由于上手简单、老少皆宜,从而家喻户晓,风靡世界。
这次设计将使用52单片机和HD61202液晶显示控制驱动器和JM12864J液晶显示器组合,来实现比较简单的俄罗斯方块设计。
此次设计初期是在keil和proteus联合仿真中进行,编程语言为51汇编,后期是进行实物焊接。
论文描述了俄罗斯方块的主要功能函数的实现。
关键词:俄罗斯方块,算法,仿真AbstractTetris is a popular television game machine and game machine game, which Alexei Pajitnov invented by Russians, it was this name. Tetris are the basic rules of movement, rotation and display the game automatically output of the box, which are arranged into a complete one or more rows and eliminate scores. Due to use simple, ages, thus make known to every family, swept the world.Based on single chip computer of the curriculum design of opportunity, I will use the 51 single-chip microcomputer and HD61202 LCD control driver and JM12864J liquid crystal display combination, to carry out a more simple Russian square design.This design is in early keil and proteus joint simulation, programming language for 51 assembly, later is welding material.The paper describes the main functions of the Russian box function of the realization of.Keywords:Russian square, Algorithm, Simulation目录摘要 (1)Abstract (2)目录 (1)引言 (3)1整体设计方案 (4)1.1系统的核心部分单片机 (4)1.2液晶显示模块 (8)2系统程序的设计 (16)2.1俄罗斯方块驱动流程图 (16)2.2俄罗斯方块所有绘图工作流程图 (17)2.3俄罗斯方块中按下键的流程图 (18)2.4俄罗斯方块所有绘图工作流程图 (19)3系统仿真 (20)3.1 Proteus软件介绍 (20)3.2 Keil软件介绍 (20)3.3俄罗斯方块系统PROTUES仿真 (21)结论 (24)参考文献 (25)附录A 电路原理图 (26)附录B 主要程序 (28)附录C 英文资料和中文翻译 (45)结束语 (1)引言游戏是人们活动中一项非常重要的内容,有人认为如果哪一天人类对所有的游戏都失去兴趣,恐怕世界的末日就要到了。
基于单片机实现的俄罗斯方块游戏任务书

[10]谭浩强. C程序设计.[M] 北京:清华大学出版社,2003
毕业设计(论文)工作进度计划:
周 次
工作内容
(08—09第一学期)
(08—09第二学期)
第1周
第2-4周
第5-8周
第9-10周
为使操作者操作方便,在PC机上用Proteus、Keil、Protel DXP安装程序,该软件的安装平台是XP系统。
下位机的核心控制芯片采用AT89S52。
二、毕业设计的主要技术指标:
1.电源电压+5V
2.串口线要求1.5M
3.电脑系统为XP系统,最低256M内存
三、工艺制作任务
a)设计并焊接电路
b)调试电路
拟订题目,完成开题,了制作毕业设计、实物调试硬件
软件、测试毕业设计作品
完成毕业论文
教研室(学科组)主任签字:
[3]杨元强。酷比杯获奖作品选登《LEGO 俄罗斯》[J]。“酷比杯”游戏策划大赛,2007.
[4] 周润景著.Proteus在MCS-51&ARM7系统中的应用百例[M].北京:电子工业出版社,2006.
[5] 游安弼, 李玉岐. 基于JavaBean组件模型的俄罗斯方块[R]. 北京:全国第四届Java
毕业设计(论文)任务书
2009年12月18日
题目
(包括副标题)
基于单片机实现的俄罗斯方块游戏
教师姓名
系别
职称
学生姓名
班级
学号
课题成果形式
论文■设计说明书□实物■软件□其它□
1.毕业设计(论文)课题任务的内容和要求(如原始数据、技术要求、工作要求等):
俄罗斯方块单片机课程设计作品说明书

单片机课程实训作品说明书姓名:武跃忠完成时间:2016年7月4日一、作品说明介绍1.作品名称:掌上游戏机(俄罗斯方块)2.作品实现功能:a)按下、左、右键控制图形改变位置;b)图形在落到底部和障碍物上时,把图形变为障碍物;c)复位键使游戏重新开始;d)暂停/继续键可以暂停、继续游戏3.选择目的:实践单片机课程所学到的知识。
二、作品操作介绍1.作品外观图⑮⑭①点阵屏:显示障碍物以及图形②零欧电阻,用作飞线③ 16个1K欧电阻,用来限制电流大小④ STC12C5A60S2单片机,用来烧录烧录主控程序,是整个作品的控制器⑤ 74LS154N芯片(4-16)译码器,用来产生列选信号⑥电源指示灯:通电时点亮⑦微动开关1:向上的按键,用于改变图形⑧排针:用于连接电源正负极以及RXD和TXD⑨ 10K欧电阻,用来限制通过电源指示灯的电流⑩微动开关2:功能按键,用于游戏的复位操作⑪自锁开关:实现整体的电源总控制(断负)⑫微动开关3:功能按键,用于游戏的暂停/继续⑬微动开关4:向右的按键,用于图形右移⑭微动开关5:向下的按键,用于图形下移⑮微动开关6:向左的按键,用于图形左移2.作品功能介绍及操作说明a)给游戏机上电①将电源正极接在排针处标有VCC的位置②将电源负极接在排针处标有GND的位置③按下自锁开关完成上电b)让图形移动或改变图形朝向①按向上键:改变图形的朝向②按向下键:让图形瞬间落到可以下落的最下方③按向左键:图形向左移动一位④按向右键:图形向右移动一位c)游戏暂停/继续、复位①按暂停/继续键:游戏暂停/继续②按复位键:游戏复位,重新开始三、作品制作说明1.电路原理图2.3.PCBa)主板正面图(见附录1)b)主板F5图(见附录2)c)主板F6图(见附录3)d)屏幕正面图(见附录4)e)屏幕F5图(见附录5)f)屏幕F6图(见附录6)四、产品控制程序/*************************************************************** *作品名称:掌上游戏机(俄罗斯方块)制作时间:2016年6月21日程序修改时间:2016年6月23日程序基本框架完善2016年6月25日完成图形生成,简单移动2016年6月29日完善图形移动函数,添加图形生成数量2016年7月1日排除致命BUG2016年7月2日重新整理图形生成逻辑,重写图形生成函数2016年7月3日写出图形变形函数,游戏载入动画2016年7月4日排除已知BUG,完善游戏整体运行逻辑*************************************************************** **/#include<stc12c5a60s2.h>#include<stdlib.h>sbit key_left=P3^4; //方向按键左sbit key_right=P3^7; //方向按键右sbit key_up=P3^5; //方向按键上sbit key_down=P3^6; //方向按键下sbit key_start=P3^3; //功能按键暂停,开始sbit key_reset=P3^2; //功能按键复位unsigned char shape[16][2]; //图形落地之前unsigned char map[16][2]; //障碍物图形落地之后//line用来在显示时候标记列数,shapeIndex用来记录当前形状,shapex、shapey用来记录图形所在位置unsigned char line,shapeIndex,shapex,shapey; unsigned char code fk[2][2]={{1,1}, //方块{1,1}};unsigned char code sx1[4][4]={{0,1,0,0}, //竖线{0,1,0,0},{0,1,0,0},{0,1,0,0}};unsigned char code sx2[4][4]={{0,0,0,0},{0,0,0,0},{1,1,1,1},{0,0,0,0}};unsigned char code zl1[3][3]={{1,0,0}, //正L形{1,0,0},{1,1,0}};unsigned char code zl2[3][3]={{0,0,1},{1,1,1},{0,0,0}};unsigned char code zl3[3][3]={{0,1,1},{0,0,1},{0,0,1}};unsigned char code zl4[3][3]={{1,1,1},{1,0,0},{0,0,0}};unsigned char code fl1[3][3]={{0,1,0}, //反L形{0,1,0},{1,1,0}};unsigned char code fl2[3][3]={{1,1,1},{0,0,1},{0,0,0}};unsigned char code fl3[3][3]={{0,1,1},{0,1,0},{0,1,0}};unsigned char code fl4[3][3]={{1,0,0},{1,1,1},{0,0,0}};unsigned char code zz1[3][3]={{1,0,0}, //正Z形{1,1,0},{0,1,0}};unsigned char code zz2[3][3]={{0,1,1},{1,1,0},{0,0,0}};unsigned char code fz1[3][3]={{0,1,0}, //反Z形{1,1,0},{1,0,0}};unsigned char code fz2[3][3]={{1,1,0},{0,1,1},{0,0,0}};unsigned char code txz1[3][3]={{0,1,0}, //T形{1,1,1},{0,0,0}};unsigned char code txz2[3][3]={{0,0,1},{0,1,1},{0,0,1}};unsigned char code txz3[3][3]={{1,1,1},{0,1,0},{0,0,0}};unsigned char code txz4[3][3]={{1,0,0},{1,1,0},{1,0,0}};bit game_reset; //用来标记游戏是否被重置void shapeLeft(bit flag); //声明图形左移的函数void delay(unsigned int i) //软件延时函数{unsigned int j;while(i--)for(j=600;j>0;j--);}void mapClear(void) //清除背景数组函数{unsigned int i,j;for(i=0;i<16;i++)for(j=0;j<2;j++)map[i][j]=0;}void shapeClear(void) //清除图形数组函数{unsigned int i,j;for(i=0;i<16;i++)for(j=0;j<2;j++)shape[i][j]=0;}void shapeToMap(void) //把图形变为背景的函数{unsigned int i,j;for(i=0;i<16;i++)for(j=0;j<2;j++)map[i][j]|=shape[i][j];}void txToShape() //把图形载入到shape数组{//i,j为循环变量,t,k为临时变量,其他为指向各种大小的二位数组的指针unsigned char i,j,t,k,(*tx2)[2],(*tx3)[3],(*tx4)[4];shapeClear();switch(shapeIndex) //根据需要的图形的标号,找到对应的图形数组{case 0:tx2=fk;k=2;break;case 1:tx4=sx1;k=4;break;case 2:tx4=sx2;k=4;break;case 3:tx3=zl1;k=3;break;case 4:tx3=zl2;k=3;break;case 5:tx3=zl3;k=3;break;case 6:tx3=zl4;k=3;break;case 7:tx3=fl1;break; case 8:tx3=fl2;k=3;break; case 9:tx3=fl3;k=3;break; case 10:tx3=fl4;k=3;break; case 11:tx3=zz1;k=3;break; case 12:tx3=zz2;k=3;break; case 13:tx3=fz1;k=3;break; case 14:tx3=fz2;k=3;break; case 15:tx3=txz1;k=3;break; case 16:tx3=txz2;k=3;break; case 17:tx3=txz3;k=3;break; case 18:tx3=txz4;break;}switch(k) //把找到的图形数组放入shape数组中{case 2:for(i=0;i<k;i++){for(j=0;j<k;j++){if(tx2[i][j]==1){if(i+shapex>7){t=(0x01<<(i+shapex-8));shape[15-shapey-j+1][1]|=t;}else{t=(0x01<<(i+shapex));shape[15-shapey-j+1][0]|=t;}}}}break;case 3:for(i=0;i<k;i++){for(j=0;j<k;j++){if(tx3[i][j]==1){if(i+shapex>7){t=(0x01<<(i+shapex-8));shape[15-shapey-j+1][1]|=t;}else{t=(0x01<<(i+shapex));shape[15-shapey-j+1][0]|=t;}}}break;case 4:for(i=0;i<k;i++){for(j=0;j<k;j++){if(tx4[i][j]==1){if(i+shapex>7){t=(0x01<<(i+shapex-8));shape[15-shapey-j+1][1]|=t;}else{t=(0x01<<(i+shapex));shape[15-shapey-j+1][0]|=t;}}}}break;}}void shapeCreat(void) //创建一个新图形的函数{shapex=0;shapey=7;shapeIndex=rand()%19;txToShape();}bit shapeAndMap() //检测是否与障碍物重叠{unsigned char i,j,t;for(i=0;i<16;i++)for(j=0;j<2;j++){t=map[i][j]&shape[i][j];if(t>0)return 0;return 1;}bit shapeDown(void) //图形下移函数{unsigned char i,t;bit flag;flag=1;for(i=0;i<16;i++) //检测是否到底部{if(shape[i][1]>=0x80){shapeToMap();flag=0;break;}}if(flag){for(i=0;i<16;i++) //图形下移{t=(shape[i][0]>=0x80)?1:0;shape[i][0]<<=1;shape[i][1]<<=1;shape[i][1]|=t;}shapex++;flag=shapeAndMap();if(!flag) //重叠则撤销下移操作{for(i=0;i<16;i++){t=(shape[i][1]%2==1)?0x80:0;shape[i][0]>>=1;shape[i][1]>>=1;shape[i][0]|=t;}shapeToMap(); //将图形转换为障碍物}}return flag;}/****************************************图形左右移函数,参数flag表示移动模式为0时无条件移动,为1时会检测是否可移动****************************************/void shapeRight(bit flag) //图形右移函数{unsigned char i,t;if(shape[0][0]==0&&shape[0][1]==0) //没移动到墙体则右移{for(i=0;i<15;i++){shape[i][0]=shape[i+1][0];shape[i][1]=shape[i+1][1];}shape[15][0]=0;shape[15][1]=0;shapey++;}else{flag=0;}if(flag){for(i=0;i<16;i++) //检测移动是否合法,非法则撤销{t=shape[i][0]&map[i][0];if(t!=0x00){shapeLeft(0);break;}t=shape[i][1]&map[i][1];if(t!=0x00){shapeLeft(0);break;}}}}void shapeLeft(bit flag){unsigned char i,t;if(shape[15][0]==0&&shape[15][1]==0) //没移动到墙体则左移{for(i=15;i>0;i--){shape[i][0]=shape[i-1][0];shape[i][1]=shape[i-1][1];}shape[0][0]=0;shape[0][1]=0;shapey--;}elseflag=0;if(flag){for(i=0;i<16;i++) //检测移动是否合法,非法则撤销{t=shape[i][0]&map[i][0];if(t!=0x00){shapeRight(0);break;}t=shape[i][1]&map[i][1];if(t!=0x00){shapeRight(0);break;}}}}void shapeChange(unsigned char oldShape){bit flag; //标记图形是否在合理范围//i,j为循环变量,k为临时变量,存储需要数组的大小,其他为指向各种大小的数组的指针unsigned char i,j,k,(*tx2)[2],(*tx3)[3],(*tx4)[4];switch(shapeIndex) //根据图形当前状态得出图形下一个状态{case 0:return;break;case 1:shapeIndex=2;tx4=sx2;k=4;break;case 2:shapeIndex=1;tx4=sx1;k=4;break;case 3:shapeIndex=4;tx3=zl2;k=3;break;case 4:shapeIndex=5;tx3=zl3;k=3;break;case 5:shapeIndex=6;tx3=zl4;k=3;break;case 6:shapeIndex=3;tx3=zl1;k=3;break;case 7:shapeIndex=8;tx3=fl2;k=3;break;case 8:shapeIndex=9;tx3=fl3;k=3;break;case 9:shapeIndex=10;tx3=fl4;k=3;break;case 10:shapeIndex=7;tx3=fl1;k=3;break;case 11:shapeIndex=12;tx3=zz2;k=3;break;case 12:shapeIndex=11;tx3=zz1;k=3;break;case 13:shapeIndex=14;tx3=fz2;k=3;break;case 14:shapeIndex=13;tx3=fz1;k=3;break;case 15:shapeIndex=16;tx3=txz2;k=3;break;case 16:shapeIndex=17;tx3=txz3;k=3;break;case 17:shapeIndex=18;tx3=txz4;k=3;break;case 18:shapeIndex=15;tx3=txz1;k=3;break;}flag=1;for(i=0;i<k&&flag;i++) //判断变形后图形有没有移动出规定范围{for(j=0;j<k&&flag;j++){switch(k){case 2:if((shapey==0||shapey+j>16)&&tx2[i][j]==1)flag=0;break;case 3:if((shapey==0||shapey+j>16)&&tx3[i][j]==1)flag=0;break;case 4:if((shapey==0||shapey+j>16)&&tx4[i][j]==1)flag=0;break;}}}if(flag)txToShape(); //如果没有移动出范围则变形if(!shapeAndMap()) //如果变形后与障碍重叠则撤销操作{shapeIndex=oldShape;txToShape();}}void deleteLine(void) //删除某行函数{unsigned char t,i,j,k,t1;for(j=0;j<2;j++){for(k=0;k<8;k++){for(i=0;i<16;i++) //判断某行是否全为1{t=0x80>>k;t&=map[i][j];if(t!=0x80>>k)break;}if(i==16) //全为1则消除{for(i=0;i<16;i++) //地图下移{if(j){t1=~(0xff>>k); //保存不需要消除的行t1&=map[i][1];t=(map[i][0]>=0x80)?1:0;map[i][0]<<=1; //障碍全体下移map[i][1]<<=1;map[i][1]|=t;t=0xff>>k; //把不需要消除的行放回原处map[i][1]&=t;map[i][1]|=t1;}else{t1=~(0xff>>k); //保存不需要消除的行t1&=map[i][0];t=(map[i][0]>=0x80)?1:0;//上部障碍下移map[i][0]<<=1;t=0xff>>k; //把不需要消除的行放回原处map[i][0]&=t;map[i][0]|=t1;}}}}}}void shapeMoveDown(void) //图形直接移动到底部{while(shapeDown());}void shapeMove(void) //图形移动的主控函数{unsigned char i;bit isStart; //用来标记游戏是否在运行1为在运行0为暂停isStart=1;do{for(i=0;i<70;i++) //延时且检测按键状态{if(!key_right&&isStart) //方向右键{delay(20);if(!key_right)shapeRight(1);while(!key_right);delay(20);}if(!key_left&&isStart) //方向左键{delay(20);if(!key_left)shapeLeft(1);while(!key_left);delay(20);}if(!key_down&&isStart) //方向下键{delay(20);if(!key_down)shapeMoveDown();while(!key_down);delay(20);}if(!key_up&&isStart) //方向上键{delay(20);if(!key_up)shapeChange(shapeIndex);while(!key_up);delay(20);}if(!key_start) //功能键暂停继续{delay(20);if(!key_start)isStart=~isStart;while(!key_start);delay(20);}if(!key_reset) //功能键复位{delay(20);if(!key_reset)game_reset=1;while(!key_reset);delay(20);if(game_reset)return;}if(!isStart)i--;delay(10);}}while(shapeDown());deleteLine();deleteLine();deleteLine();deleteLine();}bit gameOver(void) //判断游戏是否结束{unsigned int i;bit game_over;game_over=0;for(i=0;i<16;i++){if(map[i][0]%2==1) //如果顶端有障碍则游戏结束{game_over=1;break;}}return game_over;}void init(void) //初始化函数{P0M1=0x00; //设置IO口为强推模式P0M0=0xff;P2M1=0x00;P2M0=0xff;TMOD=0X01; //开启定时计数器EA=1;ET0=1;TH0=(65536-1000)/256;TL0=(65536-1000)%256;TR0=1;mapClear(); //初始化地图数组shapeClear(); //初始化图形数组game_reset=0; //初始化游戏结束标志}void loadGame() //游戏载入动画{unsigned char i;for(i=0;i<16;i++){if(i<8){map[i][0]=map[i][1]=0xff;map[15-i][0]=map[15-i][1]=0xff;delay(50);}else{map[i-8][0]=map[i-8][1]=0x00;map[15-(i-8)][0]=map[15-(i-8)][1]=0x00;delay(50);}}mapClear();delay(500);}void main(void){ready: init();loadGame();while(1){if(!gameOver()){shapeCreat();shapeMove();}if(!key_reset){delay(20);if(!key_reset)game_reset=1;while(!key_reset);delay(20);}if(game_reset)goto ready;}}void display(void) interrupt 1 //图形显示函数{TR0=0;TH0=(65536-1000)/256;TL0=(65536-1000)%256;P1=line;P2=shape[line][0]|map[line][0];P0=shape[line][1]|map[line][1];line++;if(line==16)line=0;TR0=1;}附录1附录3附录4附录6。
单片机俄罗斯方块设计 单片机俄罗斯方块设计

题目:[单片机俄罗斯方块设计]摘要随着社会的不断的发展和进步,人们对娱乐产品的关注在不断的增加,特别是电子游戏产品在我们的生活中占据了很重要的地位。
俄罗斯方块游戏是一款风靡全球的经典游戏。
这款游戏之所以叫做俄罗斯方块,是因为发明这款游戏的人是俄罗斯人。
本次为了回顾经典设计了一款基于单片机的俄罗斯方块游戏机。
本次设计了一款基于单片机的俄罗斯方块游戏机,该游戏机可以丰富我们的业余生活。
在硬件设计上该游戏机以STC89C52单片机为基础、使用LCD12864图形液晶可以显示游戏的界面、通过按键实现游戏机的按钮的功能、并具有蜂鸣器可以实现声音提示的功能。
在软件设计上,使用C语言进行了俄罗斯方块游戏的控制程序的编写,并在keil软件上进行了调试。
最后在Proteus仿真软件上对俄罗斯方块游戏的功能进行了仿真,并焊接了实物电路板。
关键词:STC89C52单片机;俄罗斯方块;游戏机;LCD12864液晶AbstractWith the continuous development and progress of society, people pay more and more attention to entertainment products, especially video game products play a very important role in our life. The Tetris game is a classic game that is popular all over the world. The game is called the Tetris, because the people who invented the game were Russian. This time in order to review the classic design of a single chip based Tetris block game machine.The design of a single chip computer based Tetris game machine, which can enrich our amateur life. On the hardware design, the game machine is based on STC89C52 microcontroller, and it can display the interface of the game by using LCD12864 graphic LCD, realize the button function of the game machine by button, and has the function of voice prompt by buzzer. In the software design, the control program of Tetris game is written in C language and debugged on the keil software. Finally, the function of the Tetris game is simulated on the Proteus simulation software, and the physical circuit board is welded.Keywords:STC89C52 singlechip;Tetris block;game machine;LCD12864 liquid crystal目录摘要 (I)Abstract........................................................... I I 第1章绪论.. (1)1.1课题研究背景和意义 (1)1.2俄罗斯方块的发展状况及趋势 (1)1.3课题研究的主要内容 (1)1.4课题研究的主要内容 (2)第2章系统整体方案设计 (4)2.1系统的功能要求 (4)2.2系统总体方案框图设计 (4)2.3单片机模块的选择 (5)2.4液晶显示模块的选择 (6)2.5按键电路的选择 (7)第3章系统整体硬件设计 (9)3.1单片机电路设计 (9)3.1.1STC89C52单片机介绍 (9)3.1.2晶振电路设计 (10)3.1.3复位电路设计 (10)3.1.4单片机最小系统电路设计 (11)3.2 LCD12864液晶显示电路 (11)3.2.1点阵LCD的显示原理 (11)3.2.2LCD12864液晶的硬件连接 (12)3.3按键控制电路 (12)3.4声音提示电路设计 (13)3.5电源电路 (13)第4章系统软件设计 (15)4.1程语言的选择 (15)4.2软件介绍和工程建立 (15)4.3俄罗斯方块流程图设计 (16)4.3.1主程序流程图 (16)4.3.2游戏外观显示流程图 (18)4.3.3俄罗斯方块向左/右移动工作流程图 (19)4.3.4俄罗斯方块中按下键的流程图 (20)第5章系统的调试与制作 (21)5.1 KEIL软件介绍 (21)5.2程序调试 (21)5.3 proteus仿真步骤 (22)5.4实物综合调试 (23)结论 (26)参考文献 (27)附录 (28)致谢.............................................. 错误!未定义书签。
基于51单片机俄罗斯方块程序设计

基于51单片机俄罗斯方块游戏设计作者:左厚臣前言闲得无事,想用单片机和LCD12864写一个俄罗斯方块游戏,培养培养兴趣,丰富一下业余生活,同时也熟练熟练单片机应用。
然后整理一下过程,本文没有什么专业的流程图,系统框图,随手画的。
希望各位大神勿喷,本菜鸟就献丑了。
关键字:51单片机LCD12864 俄罗斯方块游戏设计一、实物写真1、先展示一下实物效果呗,看能不能吸引到各位大神的眼球!!!!2、单片机选型IO口占用:7个程序存储器占用:6459Byte内部RAM:117.0Byte内部扩展RAM:1016ByteFosc = 24Mhz(也可选择12Mhz)中断使用状况:16位定时器溢出中断1个手头有一块STC12C5A60S2 51系列单片机,本实验也采用的此款单片机,或许有大神能用很节省资源的方法写出这款游戏,本菜鸟甘拜下风。
二、游戏算法整个游戏的算法也就是这样子的吧!下面就对每个步骤进说明吧!三、算法说明算法就捡重点的说吧,省得各位大神都闲啰嗦。
1、当前随机方块获取和下一回合游戏方块生成并显示此步骤拆解成如下流程图所示:(1)随机数生成51单片机需要调用库函数来产生随机数,如下:#include <stdlib.h>//调用库函数的头文件函数rand ()会生成一个int型的随机数,int型变量范围为-32768~32767占用2 字节。
我们使用时其实是可以把它当做一个unsigned int型变量的,取值范围0-65535 这个应该是很好理解的。
但是如果我们需要一个0-7的随机数怎么处理呢,没关系有办法,程序如下:u8 Random(u8 max){u16 temp;u8 a;max = max +1;temp=rand();//获取随机种子a = temp%max;return a;}其实也就是把得到随机数与想要得到数范围的最大数求余运算就可以了,即:a = temp%max;我们的游戏方块可以描述成2个要素:A、形状比如说形状有:■■■■■■■■■等,可用0-n来表示B、姿态比如说形状■■■姿态有4种如下:■■■■■■■■■■■■它们从左往右看可以看出规律分别旋转了0°,90°,180°,270°,也分别相对旋转了90°,可以用0-3来表示。
《基于8052单片机和8X16点阵屏俄罗斯方块游戏板》开发介绍

Step 3.C程序模块简要说明
/*************************************全局变量声明***************************************/ char y;//方块位置属性:底部下落的高度,y=0时:刚刚出现,y=15时:下落到屏幕最底部 char shapenum;//方块形状属性:从0到18 int left; //方块位置属性:方块偏离居中位置的格数,不同的方块left值的上限不同 int mark; //玩家分数变量 int speed; //方块下落速度变量 int initialspeed;//方块下落的初始速度 int systemspeed;//系统下落速度,此值会随着玩家分数的增加而减小,相应的下落速度会增大 int fastspeed;//当用户按下down键时,方块下落速度为此值 int k;//一个全局循环变量,“帧数”变量 int startcontrol=1;//开始画面状态指示变量,为1时说明程序进入开机欢迎界面 int suspendcontrol=0;//游戏暂停与游戏继续画面状态指示变量,为1说明处在暂停界面。 int randnum;//随机数变量,用于产生随机方块 /****************************************************************************************/
信号源:由译码器提供16行扫描信号,由锁存器提供8位 显示信号和驱动电流。 功能:提供8×16个像素点的显示屏,为游戏提供必要的 图形显示模块。
Step 1.硬件构成及功能简介 3.4-to-16 Line Decoder
MM74HC154 关键参数
真值表 引脚图
基于单片机的俄罗斯方块游戏

【关键词】12C5A60SR;LCD液晶;C语言
Tetris game based on single chip microcomputer
Abstract
Tetris is one of the most classic electronic game, it had caused a sensation is really can not be underestimated. This design is the use of C programming language based on 12C5A60SR microcontroller, design the physical circuit diagrams to model the Tetris game. The game needs to use the keys to control block movement, game player can be 90 degrees rotate, by a lattice units moving boxes around, when the region in a row are filled by the box, the guild to disappear and score, the number of columns, and eliminate scores more; when the box at the top of pile to areas not to eliminate, the end of the game.
The actual operation shows that, the design can achieve the basic game functions, achieve the goal of the game.
基于单片机俄罗斯方块游戏设计报告

基于单片机俄罗斯方块游戏设计报告一、研究意义俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,作为最经典的游戏之一,它曾造成的轰动与经济价值可以说是游戏史上的一件大事。
这款游戏最初是由苏联的游戏制作人 Alex Pajitnov 制作的,它看似简单但却变化无穷,令人上瘾。
相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。
虽然用单片机来设计一个简单的俄罗斯方块游戏程序似乎有点大材小用了,但这仅仅是一个单片机在嵌入式游戏方面的简单应用,正因为他的前景无可预计,所以才有这个设计,此次设计仅仅是为了举一个单片机在游戏上应用的一个简单例子,他可以很好的说明单片机功能的强大,更高的可控性和高集成度的好处,因此它可以在电子游戏方面成为一个不可计量的明日之星。
二、研究内容本设计要实现的基本功能是:应用按键来控制方块的变换与移动;消除一行并计分;消除多行额外奖励记分,方块堆满时结束游戏等俄罗斯方块的基本功能。
单片机在手持娱乐设备上的应用具有非常大的潜力,它能将其带入到一个新的阶段。
为了解决外部电路图,必须充分了解所用液晶的显示方法和单片机的外部接口功能,和所需要处理的逻辑关系;还要理解LCD液晶的控制原理,来通过数据端口和控制端口来实现画面在液晶上面的显示。
仿真图如下:三、系统程序设计1)俄罗斯方块驱动流程图:2)俄罗斯方块所有绘图工作流程图:3)俄罗斯方块中按下键的流程图:结束4)俄罗斯方块所有绘图工作流程图:四、分析及结论本文对单片机制作的俄罗斯方块游戏的运行原理进行了分析,全面、详细地阐述了俄罗斯方块游戏的设计过程。
本游戏机已经达到了掌上娱乐的要求,但在设计上还留有进一步改善的余地,如可以美化游戏界面、加入背景和动作音乐、力回馈系统等。
毕业设计的整个开发过程是曲折的,首先在硬件设计上,由于开始对LCD液晶屏不熟悉,加之其程序量较多,所以,在设计的过程中,不免有些困难,通过我多方面的查找资料,并不断的向老师和同学请教,结合网络资源,最终找出比较完善的方案,在理论上能够实现功能要求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.
8XX51系列单片机的时钟信号通常用两种电路形式得到:内部振荡方式和外部振荡方式。在引脚XTAL1和XTAL2外接晶振,就构成了内部振荡方式。由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器,并产生振荡时钟脉冲。晶振通常选用6MHz、12MHz或24MHz。
1.3 分工
在本次设计中,张荣俊同学主要负责软件的设计与分析,汤青红同学负责硬件电路的设计。
2.设计方案
本次设计采用STC89C52单片机控制模块,USB电源模块来提供电源,复位模块,12864LCD显示屏进行屏显,晶振与电容实现时钟电路,按键直接接入I/O口,这样可以简化电路。另外我们还采用了6个按键,分别是左移,右移,下移、方块变化键、确定按键与暂停按键。
《单斯方块游戏机
专 业:电子信息工程技术
班 级:电子B1512班
学 号:
姓 名:
指导老师:
2017-12-01
1.设计题目、要求及分工
1.1 设计题目
本课程设计题目是基于51单片机的俄罗斯方块游戏机。
1.2 设计要求
本课程设计主要器件是STC89C52单片机和液晶12864,通过单片机发生信号控制液晶屏的显示,使用按键实现游戏的开始、暂停、移动、翻转等。
本次设计中我们选用了12MHz的晶振,晶振与锁相环电路配合使用,以提供系统所需的时钟频率。设计中STC89C52使用12MHz晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF到50pF之间,我们选用电容容量为33pF的电容,如图所示即为本设计的振荡电路。
XTAL1
振荡器反相放大器及内部时钟发生器的输入端。
XTAL2
振荡器反相放大器的输出端。
3.4
单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位。
手动按钮复位需要人为在复位输入端RST上加入高电平(图1)。一般采用的办法是在RST端和正电源Vcc之间接一个按钮。当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端。手动按钮复位的电路如所示。由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。复位电路连接如图所示:
RST
复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8 位字节。一般情况下,ALE 仍以时钟振荡频率的1/6 输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE 脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH 单元的D0 位置位,可禁止ALE 操作。该位置位后,只有一条MOVX 和MOVC指令才能将ALE 激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE 禁止位无效。
PSEN
程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52 由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN 有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP
外部访问允许。欲使CPU 仅访问外部程序存储器(地址为0000H-FFFFH),EA 端必须保持低电平(接地)。需注意的是:如果加密位LB1 被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU 则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V 的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
图3.5时钟电路
3.6液晶屏显示模块
液晶显示屏是整个系统硬件的重要组成部分,担当着人机交互的重要角色。本设计采用铭正同公司生产的MzL02D-12864液晶点阵屏作为显示器件。它是一块128*64点阵的LCD显示模组,模组上的LCM采用COG技术将控制(包括显存)、驱动器集成在LCM的玻璃上,接口简单,操作方便。其特点为单电源供电,对比度编程可调,可采用并行接口为6800/8080时序或者串行SPI的MPU接口方式,整块液晶屏由3.3V的白色LED背光,美观大方。其外接部分分为电源端口、数据端口和命令端口三部分组成。本设计中LCD的数据端口连接到STC89C51单片机的P0端口,LCD命令端口连接到单片机的P2端口。具体实物如图所示:
3.
3.1
图3.1硬件设计框图
3.
本设计的电源系统比较简单,由USB电源输出5V电源进行供电,具体电路如下图所示:
图3.2电源电路
3.
图3.3STC89C52引脚图
P1口
P1 是一个带内部上拉电阻的8 位双向I/O 口, P1的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对端口写"1",通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。与AT89C51 不同之处是,P1.0 和P1.1还可分别作为定时/计数器2 的外部计数输入(P1.0/T2)和(P1.1/T2EX)。
P2口
P2 是一个带有内部上拉电阻的8 位双向I/O 口,P2 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对端口P2 写"1",通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16 位地数据存储器(例如执行MOVX @DPTR 指令)时,P2 口送出高8 位地址数据。在访问8 位地址的外部数据存储器(如执行MOVX@RI 指令)时,P2 口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3 口
P3 口是一组带有内部上拉电阻的8 位双向I/O 口。P3 口输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对P3 口写入"1"时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3 口将用上拉电阻输出电流(IIL)。P3 口除了作为一般的I/O 口线外,更重要的用途是它的第二功能P3 口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。