基于单片机游戏设计.docx
- 文档编号:8296283
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:31
- 大小:516.01KB
基于单片机游戏设计.docx
《基于单片机游戏设计.docx》由会员分享,可在线阅读,更多相关《基于单片机游戏设计.docx(31页珍藏版)》请在冰豆网上搜索。
基于单片机游戏设计
基于单片机游戏设计
摘要
本论文主要介绍了基于单片机推箱子游戏设计的游戏规则、硬件结构、软件代码的编写及工作原理、LCD12864液晶模块的介绍,在开发板上模拟出推箱子游戏。
本系统是以单片机为其控制核心,以有源晶振构成的电路作为时钟信号,通过方向键的选择向单片机控制系统发出人物移动控制命令,控制系统接收命令后做出一系列必要的判断后,控制人物及箱子的移动。
本设计已通过实物验证,基本没有规则方面的错误。
论文分为两大块:
一块为游戏的硬件电路组成部分,一块为软件程序设计部分。
在硬件电路里主要包括有源晶振部分、方向控制部分及液晶显示部分等与单片机的接线设计;软件编程方面主要是子程序和主程序的编写,包括:
初始化代码、液晶驱动代码、方向键代码、过关判断代码、等等。
关键词:
单片机,推箱子,LCD12864液晶,模块
THEDESIGNOFLCDDISPLAYSYSTEM
BASEDONMCU
ABSTRACT
Thesystemisbasedonitssingle-chipcontrolofthecore,consistingofactivecrystalclockcircuitclocksignalsentthroughthearrowkeystoselectthesingle-chipcontrolsystemtocontrolmobilecommandcharacters,thecontrolsystemafterreceivinganordertomakeaSeriestodeterminethenecessary,tocontrolthemovementofpeopleandboxes.Thisdesignhasbeenadoptedbythesimulationexperiments,stable,rulesvirtuallynomistakes.
Themainthesisisdividedintotwoblocks:
oneforthegame’shardwarecomponentsofthecircuit,asapartofthesoftwareprogramming.Inthehardwarecircuitry,includingthemainactivepartofthecrystal,thedirectionandcontrolofsomeoftheliquidcrystaldisplayandotherpartsofthesingle-chipwiringdesign;softwareprogrammingsideofthemainsubroutineisthemainprogramandthepreparation,including:
initializationcode,LCDDrivercode,thedirectionofkeycode,recordtimecode,voicebuttoncode,customscodeandselectanumberofformsofdatacodeandsoon.
KEYWORDS:
SingleChipMicrocomputer,Sokoban,LCD12864
前言
如今,游戏机风行的程度,是第一台电子游戏机的研制者诺兰布什纳尔先生始料不及的。
在全世界最大的城市,直至最小的村庄,从纽约最辉煌的游乐场,到高加索最小的乡镇儿童娱乐点,在千家万户,正在进行着千千万万的“战斗”,伴随着无数成功与失败,兴奋与懊丧。
游戏机带来了一个全球性的疯狂症,与其他任何娱乐与之相比都望尘莫及。
然而,究竟是什么原因使游戏机如此风行呢?
在回顾了游戏机发展简史之后,我们不难悟出,技术进步在游戏机发展过程中起到了极大的促进作用。
但是技术进步绝不是游戏风行的唯一因素。
随着终端设备开发能力的加强,作为娱乐终端的游戏机也得到了很大程度的发展。
用单片机来设计一个游戏,不同于现在的大型网络游戏和手机游戏,也不同与其他的小型的单片机控制程序,它对游戏编写者对单片机架构、指令系统、工作模式、数据在内存分配以及传递的把握都提出了更高的要求,特别是在游戏运行当中对外部按键的处理,各子程序的调用流程,先后顺序等代码的复杂程度也是单片机的一般程序不能比的。
可以这样说,能完整的编出游戏,并可以稳定运行,会让我们对游戏有一个更深刻的认识;对游戏编写的难度有一个更切身的理解;对自己的编程能力及逻辑思维能力有一个很大的提高;再一次看到了C语言的适用性、易移植性、高效性,相信对C语言的学习也不无帮助。
目前国内游戏公司已达到了200多家,市场上运营的游戏亦达250多款,但与欧美、韩国等国家的游戏发展程度还有一定差距。
我国有广阔的游戏市场,宽阔的发展空间,无限的继续挑战和剧增的玩家队伍。
随着网络的兴起,巨大的市场需求量使中国在短短几年,已经从无到有,从陌生到熟知,从掌握到运用。
游戏必将成为网络竞争中的主角,他的商业利益和商业价值无法估量。
中国,人口众多的国家,随着人们生活水平的提高,温饱已经不是最终目的,我们寻求的是更加多姿多彩的生活,那么我们怎么能错过游戏这一最佳休闲娱乐项目呢?
所以我国游戏发展前景一片大好!
编程完成推箱子游戏的设计实现。
以单片机为核心,设计人机接口电路。
第1章系统总图设计
§1.1系统总图
图1-1系统总图
§1.2系统功能
实现游戏推箱子的运行,用户用键盘通过单片机来控制游戏的运行,并且在液晶显示器上显示出来;其中键盘由5个键组成,四个控制方向,一个开始/暂停。
§1.3单片机的选择
单片机的种类有很多:
通用型单片机按位数分有4位机,8位机,16位机和32位机等等。
按厂家分种类就更多,我国目前最常用的单片机有如下几家:
Intel公司的(MCS51系列);Atmel公司的(AT89系列,MCS51内核);Microchip公司的(87,80系列,MCS51内核);Siemens公司的(SAB80系列,MCS51内核);NEC公司的(78系列),每种单片机都有不同,包括:
I/O口个数,定时/计数器个数、数据/程序存取区大小、中断源个数、有无看门狗中断、有无A/D转化等等。
基于本游戏只用了不到20个I/O口;一个定时器。
所以选择Atmel公司的AT89C51系列单片机。
其参数如下:
1、基于8051的全静态CMOS工艺控制器
2、3级流水线指令执行架构;
3、32个I/O口;
4、2个定时/计数器;
5、6个中断源;
6、4k的闪存程序存储器;
7、128字节的片内数据存取器;
有以上参数可知AT89C51单片机完全满足游戏设计要求。
§1.4液晶屏的选择
液晶屏的种类也有很多,我们经常用到的液晶屏包括:
AMPIRE12864;LGM12641BS1R;LM016;LM020L;LM017等等。
液晶显示器TFTLCD,全称为薄膜晶体管液晶显示器(ThinFilmTransistorLiquidCrystalDisplayer),一般简称LCD(LiquidCrystalDisplay)。
液晶显示器LCD具有超薄体形、低功耗、低辐射、无闪烁、完全物理平面、低反光、清晰的字符显示等优点。
显示游戏信息和游戏运行画面的LCDl602和LCDl2864使用广泛,技术相对成熟,故LCD底层驱动采用前人成果,并在此基础上设计了游戏的运行界面。
第2章推箱子游戏硬件设计
§2.1硬件原理图
图2-1硬件原理图
§2.2LCD12864液晶介绍
§2.2.1液晶显示模块概述
YM12864R汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
主要技术参数和显示特性:
电源:
VDD3.3V~+5V(内置升压电路,无需负压);
显示内容:
128列×64行
显示颜色:
黄绿
显示角度:
6:
00钟直视
LCD类型:
STN
与MCU接口:
8位或4位并行/3位串行
配置LED背光
多种软件功能:
光标显示、画面移位、自定义字符、睡眠模式等
§2.2.2硬件连接
图2-2LCD12864硬件连接
§2.2.3模块引脚说明
128X64HZ引脚说明
引脚号引脚名称方向功能说明
1VSS-模块的电源地
2VDD-模块的电源正端
3V0-LCD驱动电压输入端
4RS(CS)H/L并行的指令/数据选择信号;串行的片选信号
5R/W(SID)H/L并行的读写选择信号;串行的数据口
6E(CLK)H/L并行的使能信号;串行的同步时钟
7DB0H/L数据0
8DB1H/L数据1
9DB2H/L数据2
10DB3H/L数据3
11DB4H/L数据4
12DB5H/L数据5
13DB6H/L数据6
14DB7H/L数据7
15PSBH/L并/串行接口选择:
H-并行;L-串行
16NC空脚
17/RETH/L复位低电平有效
18NC空脚
19LED_A-背光源正极(LED+5V)
20LED_K-背光源负极(LED-OV)
逻辑工作电压(VDD):
4.5~5.5V
电源地(GND):
0V
工作温度(Ta):
0~60℃(常温)/-20~75℃(宽温)
§2.3晶振、复位电路
图2-3晶振电路
晶振包括有源晶振和无源晶振。
晶振在单片机系统中为单片机运行提供时钟源,任何指令的执行都必须依靠时钟源的存在,所以被称为工作三要素之一。
由于本开发板使用可拔插晶振,所以长期使用难免会出现接触不良的现象,需要定期检测晶振的可靠性。
正常工作的开发板,晶振产生的时钟频率与标称的频率是一致的,可以用示波器观察波形和频率,在没有示波器的情况下,可以使用万用表测量两个引脚的对地电压估计晶振的工作状态,一把情况如下:
5V系统中,2个引脚的对地电压是都2V左右,且压差不大,如果出现引脚电压为0V或者5V表明晶振没有起振,需要检查连接可靠性或者更换晶振。
图2-4复位电路
单片机复位电路可以正常引导单片机到正确的程序执行位置,复位电路不正常会导致程序运行错乱甚至不能运行。
所以称为单片机工作的三要素之一。
上图包括2种复位方式,低电平复位与高电平复位,51单片机都采用高电平复位,即正常工作时复位引脚为低电平,按下复位按键时,复位脚为高电平。
阻容复位的特点是成本低连接方便。
第3章推箱子游戏软件部分设计
§3.1游戏流程图
§3.1.1方向函数所调用的函数流程图
图3-1方向函数调用程序图
§3.1.2主程序流程图
图3-2主程序流程图
§3.2液晶屏驱动代码
§3.2.1清屏函数
输入参数:
bColor清屏所使用的背景色
voidCLR_Screen(unsignedintbColor)
{unsignedinti,j;
LCD_SetPos(0,240,0,320);//320x240
for(i=0;i<320;i++)
{for(j=0;j<240;j++)
Write_Data_U16(bColor);
}
}
§3.2.2显示字符串
可以中英文同时显示
输入参数:
x横坐标y纵坐标*s需要显示的字符串fColor字符颜色bColor字符背景颜色
voidLCD_PutString(unsignedshortx,unsignedshorty,unsignedchar*s,unsignedintfColor,unsignedintbColor)
{unsignedcharl=0;
while(*s)
{if(*s<0x80)
{LCD_PutChar(x+l*8,y,*s,fColor,bColor);
s++;l++;
}
else
{PutGB1616(x+l*8,y,(unsignedchar*)s,fColor,bColor);
s+=2;l+=2;
}
}
}
§3.3游戏初始化代码
voidInit_0()
{CLR_Screen(0x7FFF);//调用清屏函数
Rectangle(0,0,128,160,0xaa);
Rectangle(16,16,112,144,0xaa);//绘制矩形框
LCD_PutString(32,128,"推箱子",0x00ff,0xBE5F);
LCD_PutString(16,144,"机电092李召",0xf800,0xBE5F);
LCD_PutString(48,64,"开机",0xf800,0xBE5F);
}
§3.4地图显示代码
voidDTXS(void)
{unsignedchari,j;
for(i=0;i<8;i++)
//扫描8行
for(j=0;j<8;j++)
//扫描8列
{map_ram[i][j]=map[game][i][j];
//将关卡数组中的数据传给跟踪数组
a=map_ram[i][j];
//将跟踪数组中的数据赋给动态内存
switch(a)
//根据动态内存中的数据做出判断
{case0:
LCD_PutString(16*i,16*j,"李",0x00ff,0xFFFF);break;
//如果是0,则将白色汉字‘李’显示在屏幕对应位置
case1:
LCD_PutString(16*i,16*j,"",0x00ff,0xF800);renwu_x=i,renwu_y=j;break;
//如果是1,则将红色汉字‘李’显示在屏幕对应位置
case2:
LCD_PutString(16*i,16*j,"李",0x00ff,0x0000);break;
//如果是2,则将黑色汉字‘李’显示在屏幕对应位置
case3:
LCD_PutString(16*i,16*j,"李",0x00ff,0x07E0);break;
//如果是3,则将绿色汉字‘李’显示在屏幕对应位置
case4:
LCD_PutString(16*i,16*j,"李",0x00ff,0xFFE0);break;
//如果是4,则将黄色汉字‘李’显示在屏幕对应位置
case5:
LCD_PutString(16*i,16*j,"召",0x00ff,0xFFE0);break;
//如果是5,则将汉字‘召’显示在屏幕对应位置
}
}
§3.5原来位置代码
void_DTXS()
{if(a==0||a==3||a==1)
//如果原来人物位置是空白或者箱子,则显示空白
{LCD_PutString(16*renwu_x,16*renwu_y,"李",0x00ff,0xFFFF);
//显示出来空白
map_ram[renwu_x][renwu_y]=0;
//更新跟踪数组
}
if(a==4||a==5)
//如果人物位置是目标或者目标与箱子重合的位置,则显示目标
{LCD_PutString(16*renwu_x,16*renwu_y,"李",0x00ff,0xFFE0);
//将目标显示出来
map_ram[renwu_x][renwu_y]=4;
//更新跟踪数组
}
}
§3.6关卡更新代码
voidguangeng()
{game++;
//关卡加1
if(game>8)game=1;
//如果关卡大于8,则置一
DTXS();
//显示地图
}
§3.7通关代码
voidpass()
{unsignedchari,j,a=1;
//内存空间分配
for(i=0;i<8;i++)
//扫描8行
{for(j=0;j<8;j++)
//扫描8列
{if(map[game][i][j]==5||map[game][i][j]==4)
//如果关卡数组中此位置是目标或者目标与箱子重合后的图
{if(map_ram[i][j]==5)a=1;
//如果动作更新数组中此位置是目标与箱子重合后的图,则将a置一
}
else{a=0;break;}
//如果不是的话,则将a置0,并退出
}
}
if(a)
{game++;
//如果a=1,则将关卡加一
if(game==9)game=1;
//如果关卡等与9,则返回第一关
DTXS();
//更新地图
}
}
§3.8方向控制代码
游戏共有四个方向键,原理相同,所以只列出上推函数
voidUP()//向上推子函数
{charb;
a=map[game][renwu_x][renwu_y];
//原来人物这个位置是什么
b=map_ram[renwu_x-1][renwu_y];
//现在人物位置上面是什么
if(b==0||b==4)
//如果现在人物位置上面是空白或者目标图形则显示一个人物
{
LCD_PutString(16*(renwu_x-1),16*renwu_y,"李",0x00ff,0xF800);
//上面显示代表人物的汉字
_DTXS();
//调用原来位置显示子程序,还原人物本身位置图形
renwu_x--;
//更新人物坐标
}
if(b==3||b==5)
//如果现在人物上面是箱子或者箱子与目标重合的图形则还得判断人物上边是什么图形,如果人物上面的上面不是箱子、墙和箱子与目标重合后的图形则可以移动
{if(map_ram[renwu_x-2][renwu_y]!
=2&&map_ram[renwu_x-2][renwu_y]!
=3&&map_ram[renwu_x-2][renwu_y]!
=5)
{if(map_ram[renwu_x-2][renwu_y]==0)
//如果人物上边是空白
{LCD_PutString(16*(renwu_x-2),16*renwu_y,"李",0x00ff,0x07E0);
//则在上边的上边显示个箱子
map_ram[renwu_x-2][renwu_y]=3;
//更新箱子的位置
}
elseif(map_ram[renwu_x-2][renwu_y]==4)
//如果现在人物位置的上边是目标
{LCD_PutString(16*(renwu_x-2),16*renwu_y,"召",0x00ff,0xFFE0);
//则在上边的上边显示目标与箱子重合的图形
map_ram[renwu_x-2][renwu_y]=5;
//更新箱子和目标重合的位置
}
LCD_PutString(16*(renwu_x-1),16*renwu_y,"李",0x00ff,0xF800);
//在上边显示一个人物的图形
if(b==3)map_ram[renwu_x-1][renwu_y]=0;
//如果现在人物的上边是箱子则更新为空白
if(b==5)map_ram[renwu_x-1][renwu_y]=4;
//如果现在人物上边是箱子与目标重合的图则更新为目标的图形
_DTXS();
//调用原来位置显示子函数
renwu_x--;
//更新人物坐标
pass();
//调用过关子函数,判断是否过关
}
}
}
第4章推箱子游戏联机调试
§4.1KeiluVision4编译环境介绍
KeiluVision4集成开发环境是KeilSoftware,Inc/KeilElektronikGmbH开发的基于80C51内核的微处理器软件开发平台,内嵌多种符合当前工业标准的开发工具,可以从工程建立到管理、编译、链接、目标代码的生成、软件仿真、硬件仿真等完整的开发流程尤其是C编译工具在产生代码的准确性和效率方面达到了较高的水平,而且可以附加灵活的控制选项,在开发大型项目时非常理想。
KeilC51集成开发环境的主要功能有以下几点:
1:
uVision4forWindows:
是一个集成开发环境,它将项目管理、源代码编辑和程序调试等组合在一个功能强大的环境中;
2:
C51国际标准化C交叉编译器:
从C源代码产生可重定位的目标模块;
3:
A51宏汇编器:
从80C51汇编源代码产生可重定位的目标模块;
4:
BL51链接器/定位器:
组合由C51和A51产生的可重定位的目标模块,生成绝对目标模块;
5:
LIB51库管理器:
从目标模块生成连接器可以使用库文件;
6:
OH51目标文件至HEX格式的转换器,从绝对目标模块生成IntelHex文件;
7:
RTX_51实时操作系统:
简化了复杂的实时应用软件项目的设计。
uVision4支持所有的Keil80C51的工具软件,包括C51编译器、宏汇编器、链接程序等操作。
1:
C51编译器和A51汇编器
由uVision4IDE创建源文件,可以被C51编译器或A51汇编器处理,生成可重定位的object文件。
KkeilC51编译器遵照ANSIC语言标准,支持C应用的所有标准特性。
另外,还增加了几个可以直接支持80C51结构的特性。
KeilA51宏汇编器支持80C51及派生系列的所有指令集。
2:
LIB51库管理器
LIB51库管理器可以从由汇编器和编译器创建的目标文件建立目标库。
这些库是按规定格式排列的目标模块,可在以后被链接器所使用。
当链接器处理一个库时,仅仅使用了库中程序使用了的目标模块而不是全部加以引用。
3:
BL51连接器/定位器
BL51连接器使用从库中提取出来的目标模块和有编译器、汇编生成的目标模块,创建一个绝对地址目标模块。
绝对地址目标文件或模块包括不可重定位的代码和数据。
所以的代码和数据都被固定在具体的存储单元中。
4:
uVision4软件调试器
uVision4软件调试器能十分理想地进行快速、可靠的程序调试。
调试器包括一个高速模拟器,可以使用它模拟整个80C51系统,包括片上外围器件和外部硬件。
当从器件数据库选择器件时,这个器件的属性会被自动配置。
5:
uVision4硬件调试器
uVision4调试器提供了几种在实际目标硬件上测试程序的方法。
安装MON51目标监控器的目标系统,并通过Monitor_51接口下载程序;
6:
RTX51实时操作系统
RTX
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 游戏 设计