基于51单片机的推箱子游戏设计方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于51单片机的推箱子游
戏设计方案
1、课程设计目的
《MCS-51单片机》课程设计是与《MCS-51单片机》课程相配套的实践教学环节。《MCS-51单片机》是一门实践性很强的专业基础课,通过课程设计,达到进一步理解单片机的硬件、软件和综合应用方面的知识,培养实践能力和综合应用能力,开拓学习积极性、主动性,学会灵活运用已经学过的知识,并能不断接受新的知识。培养大胆发明创造的设计理念,为今后就业打下良好的基础。
通过课程设计,掌握以下知识和技能:
1.单片机应用系统的总体方案的设计;
2.单片机应用系统的硬件设计;
3.单片机应用系统的软件程序设计;
4.单片机开发系统的应用和调试能力
2、课程设计题目和实现目标
2.1 课程设计题目:基于51单片机的推箱子游戏设计
2.2实现目标
设计一款在以51单片机为核心的硬件系统中运行的推箱子游戏。游戏一共9关,功能包括:
(1)显示游戏开机界面和游戏界面;
(2)按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,通过小人推动箱子,把箱子推到指定的目的地为过关,箱子只能推不能拉;(3)用于可以任意选关,并能随时退出、进入游戏;
(4)每一关都有时间计时,显示当前玩家的游戏耗时。
3、设计方案
根据设计目标,整个系统框图如下:
图1 系统框图
3.1 控制模块
选用ATMEL公司生产的AT89C52为主控芯片,它是是一个低电压,高性能CMOS 8位单片机,主要功能特性如下:
1、兼容MCS51指令系统;
2、8k可反复擦写(大于1000次)Flash
7、2个串行中断,可编程UART串行通道;
8、2个外部中断源,共8个中断源;
9、2个读写中断口线,3级加密位;
10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;
本次课设选用PDIP封装的 AT89C52芯片,其引脚功能如图2所示,图3为最小系统:
图2 引脚功能
图3 最小系统
U1:AT89C52,DIPf封装;C1,C2:22pf瓷片电容
C3:10uf电解电容;X1:12M晶振
R1:10K金属膜电阻
3.2 显示模块
选用置T6963C控制控制器的12864图形点阵液晶(以下简称Lcd12864)做为显示模块。
T6963C控制器的最大特点具是有硬件初始值设置功能,显示驱动所需的参数,例如:占空比系数、每行驱动传输的字节数、字符的字体选择等均由引脚电平设置。所以,液晶显示模块在上电时T6963C控制器就进行初始化设置,软件操作的主要精力就可以全部用于显示界面的设计上。
市场上出售此控制器的液晶很多,本次课设选用市晶日达科技生产
KXM12864F.
LCD12864和单片机以模拟方式连接,即通过模拟操作时序的方法控制液晶显
示。具体的接线图如图4所示
图4 显示模块
RP1:1k排阻,用于做P0口的上拉电阻;LCD1:KXM12864F
3.3按键模块
16个轻触按键连接成4*4矩阵键盘,做为按键模块,如图5所示
图5 4*4矩阵键盘
最终系统的硬件系统如下:
图6 硬件系统
4、Proteus仿真原理图
在proteus搭建的仿真原理图如下:
图7 硬件系统
图8 开机画面
图9 游戏画面
图10 游戏画面
5.程序设计
5.1 Lcd12864显示驱动程序
图11 读写指令/数据时序图
准备向Lcd12864进行操作时,首先要读取lcd12864的当前的状态,只有lcd12864不忙的时候才能读写操作和数据。相关程序如下:
/**************************************************
函数名:status_bit_01()
功能:状态位sta1(读/写指令),sta0(读/写数据)判断
入口参数:
返回值:状态值i
***************************************************/
unsigned char status_bit_01()
{
unsigned char i;
P0=0xff;
cd=1;
rd=0;
for(i=10;i>0;i--)
{
if((P1&0x03)==0x03)
break;
}
rd=1;
return i;
}
/*********************************************
函数名:write_data(unsigned char dat)
功能:写数据
入口参数:8位数据dat
返回值:
*********************************************/
void write_data(unsigned char dat)
{
while(status_bit_01()==0);
rd=1;cd=0;wr=0;
P0=dat;
wr=1;cd=1;
}
/*********************************************
函数名:write_cmd1(unsigned char cmd)
功能:写命令,无参数
入口参数:8位命令cmd
返回值:
*********************************************/
void write_cmd1(unsigned char cmd)
{
while(status_bit_01()==0);
rd=1;cd=1;wr=0;
P0=cmd;
wr=1;cd=0;
}
/*********************************************
函数名:write_cmd2(unsigned char cmd)
功能:写单参数命令
入口参数:8位数据dat,8位命令cmd
返回值:
*********************************************/
void write_cmd2(unsigned char dat,unsigned char cmd)
{
write_data(dat);
write_cmd1(cmd);
}
/************************************************
函数名:write_cmd2(unsigned char cmd)
功能:写双参数命令
入口参数:8位数据data1,8位数据data2,8位命令cmd
返回值:
*************************************************/
void write_cmd3(unsigned char data1,unsigned char data2,unsigned char cmd) {
write_data(data1);
write_data(data2);
write_cmd1(cmd);