• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

基于51单片机的推箱子设计(二)!!!

04/28 09:55
515
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

单片机仿真设计合集资料获取.pdf

共1个文件

资料清单:C程序+仿真+设计报告+使用说明+元件清单+操作视频

仿真版本:Proteus8.6及以上版本

程序编译:Keil5 C51

编程语言:C语言

设计编号:【Z02】

1.  简介

本文提出了一种基于51单片机的推箱子设计。本系统由AT89C51单片机为控制核心,按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,通过小人推动箱子,把箱子推到指定的目的地为过关,箱子只能推不能拉。

2.  主要功能

a.支持按键实现开始/选关、上下左右控制!

3.  源程序(Keil5)

本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。

void dischar(uc row,uc col,uc cha) //写ASCII码字符,row字符行(=8图形行),col字符列(=8图形列),chaASCII码
{  //显示ASCII码时,16行x30列
ui address;
uc dat1,dat2;
address=row*30+col+0x1000; //计算文本显示区地址
dat1=address;
dat2=address>>8;
lcdcmd2(dat1,dat2,0x24);//地址指针定位
lcdcmd1(cha,0xc4); //写字符,地址指针不变
}

//数字和汉字代码写入自定义字符存储区
void setcgram(uc count)  //count是要写的汉字个数
{//定义自定义字符在GCRAM中存储区地址,自定义字符首地址0x80(固定值),一个字符8x8=8字节,对应字节地址0x0400
ui i;
lcdcmd2(0x03,0x00,0x22); //定义自定义字符(在GCRAM中)存储区字节地址高5位为0x03,
lcdcmd2(0x00,0x1c,0x24); //0x03<<11+0x0400=0x1c00(字节地址)
for(i=0;i<16*8*12/8;i++)
lcdcmd1(shucode[i],0xc0);	//写数字(每个16*8)*12(0-9,:)到GCRAM
for(i=0;i<16*16*count/8;i++)
lcdcmd1(hancode[i],0xc0);	 //写汉字(每个16*16)*count到GCRAM
}
	 //写汉字代码,row行,col列,sit汉字在自定义字符中的位置,每个汉字相当于4个字符(2行2列)
void dishan(uc row,uc col,uc sit)//		sit位置用han[]描述
{
dischar(row,col,sit);//每个汉字按左上,左下,右上,右下存放
dischar(row+1,col,sit+1);
dischar(row,col+1,sit+2);
dischar(row+1,col+1,sit+3);
}
 //写数字代码,row行,col列,sit数字在自定义字符中的位置,每个数字相当于2个字符(2行1列)
void disshu(uc row,uc col,uc sit)//	sit位置用shu[]描述
{
dischar(row,col,sit);//每个汉字按左上,左下,右上,右下存放
dischar(row+1,col,sit+1);
}

void bushu()		//显示步数
{
	uc b1=0,b2=0,b3=0;
	if(bu>999)  {b1=9;b2=9;b3=9;}
	else {b1=bu/100;b2=bu/10;b3=bu%10;}
	disshu(10,23,shu[b1]);disshu(10,24,shu[b2]);disshu(10,25,shu[b3]);
	dishan(10,26,han[6]);
}

void huamap()	  //画关卡地图
{
uc i,j;
for(i=0;i<8;i++)
for(j=0;j<10;j++)
{
	dishan(2*i,2*j,han[map[guan-1][i][j]]);
	rammap[i][j]=map[guan-1][i][j];
	if(rammap[i][j]==0x07) rammap[i][j]=0x00;
}
dishan(4,22,han[4]);
disshu(4,24,shu[0]);
disshu(4,25,shu[guan]);
dishan(4,26,han[5]);
bushu();
dishan(2*renh,2*renl,han[1]);
}

void disxg()		   //显示选关提示
{
dishan(0,22,han[8]);
dishan(0,24,han[9]);
dishan(0,26,han[5]);
disshu(0,28,shu[10]);
}

void shengli()			 //过关判断
{
uc i,j,s1=0,s2=0;
for(i=0;i<8;i++)
for(j=0;j<10;j++)
{
	if(map[guan-1][i][j]==0x07)    //检视目标
	{
		s1++;					  //目标计数
		if(rammap[i][j]==0x02) s2++;	//目标上箱子计数
	}
}
if(s1==s2)		 //目标计数和目标上箱子计数相同,则过关
{
dishan(2,20,han[10]);	 //显示过关提示
dishan(2,22,han[11]);
dishan(2,24,han[12]);
dishan(2,26,han[5]);
disshu(2,28,shu[11]);
startf=0;				 //停止游戏
disxg();				 //显示选关提示
}
}

void delay()			//延时
{
	ui x;
	for(x=0;x<1000;x++);
}


uc key()		   //检测按键
{
	uc x,k=0;
	P3=0xff;
	x=P3;
	if(x==0xff)	   //没按键跳出
	goto over;
	else
	{
		delay();	   //有按键,延时
		P3=0xff;
		x=P3;
		if(x==0xff)		//再测
		goto over;
		else
		{
			switch(x)	   //获取键值
			{
				case 0xfe:k=1;break;
				case 0xfd:k=2;break;
				case 0xfb:k=3;break;
				case 0xf7:k=4;break;
 				case 0xef:k=5;break;
				case 0xdf:k=6;break;
				case 0xbf:k=7;break;
				case 0x7f:k=8;break;
				default:break;
			}
			wait:	   //等待按键释放
			P3=0xff;
			x=P3;
			if(x==0xff) goto over;
			else goto wait;
		}
	}
	over:
	return k;
}

4.  仿真proteus8.6

  本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。

仿真界面:

5.  设计报告

设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考

6.  资料清单

设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。

7.  资料获取链接

百度网盘下载链接:【Z02】百度网盘下载链接

更多单片机仿真设计合集:单片机仿真设计合集

  • 单片机仿真设计合集资料获取.pdf
    下载

相关推荐