资料清单:C程序+仿真+设计报告+使用说明+元件清单+操作视频
仿真版本:Proteus8.6及以上版本
程序编译:Keil5 C51
编程语言:C语言
设计编号:【Z06】
1. 简介
本文提出了一种基于51单片机的12864贪吃蛇设计。本系统由AT89C51单片机为控制核心,制作一个贪吃蛇游戏机,通过LCD12864显示屏为载体显示数据,并用四个输入端表示四个上下左右控制键和三个确认、返回、暂停功能键,实现地图设置、难度设置。
2. 主要功能
a.支持按键实现地图设置、难度设置。
b. 支持按键实现确认、返回、暂停。
3. 源程序(Keil5)
本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。
while(1)
{
if(flag_exit_game==1)//如果游戏过程中按下返回键 则立即结束游戏 返回菜单
break;
if(flag_game_over==1)
break;
ET1=1; //允许扫描按键 贪吃蛇游戏难度决定蛇2次移动之间的间隔时间 也就是检测按键的时间
tcs_key_flag=0; //允许捕获按键 在检测按键时间内 只允许生产一个拐点 即捕获到一个有效的
//按键以后 就置一这个变量 不允许再增加拐点
while(tcs_stop==0);
switch(tcs_nd)
{
case 0: {delay_ms(10); break;}
case 1: {delay_ms(50); break;}
case 2: {delay_ms(100); break;}
}
ET1=0;
switch(tou.direction)//这个switch用来根据蛇头的x y value值以及当前蛇头移动的方向
//取出蛇头要到达的下一个点 存入check中 来判断是否撞墙 吃到食物 什么的···
{
case 0: {
check.x=tou.x;
if(tou.y==63)
check.y=0;
else
check.y=tou.y+1;
check.value=tou.value;
break ;
}//->向右y+1 其他不变
case 1: { //↓ 向下y不变
check.y=tou.y;
if(tou.value==0x80)// value==0x80 则 x+1 value=0x01
{
if(tou.x==7)
check.x=0;
else
check.x=tou.x+1;
check.value=0x01;
}
else
{
check.x=tou.x;
check.value=tou.value<<1;
}
break ;
}
case 2: {
check.x=tou.x;
if(tou.y==0)
check.y=63;
else
check.y=tou.y-1;
check.value=tou.value;
break ;
}//<-向左y-1 其他不变
case 3: { //↑ 向上y不变
check.y=tou.y;
if(tou.value==0x01)// value==0x01 则 x-1 value=0x80
{
if(tou.x==0)
check.x=7;
else
check.x=tou.x-1;
check.value=0x80;
}
else
{
check.x=tou.x;
check.value=tou.value>>1;
}
break ;
}
}
he=test_point_exist(check.x,check.y,check.value); // 检测蛇头移动的下一个点是否几经有点存在
if(he==check.value) //如果前面的点已经存在 则可以是食物 或者是墙和蛇身
{
if( (check.x==food.x) && (check.y==food.y) && (check.value==food.value) )//吃到食物
{
tcs_df++;
cs1=1; cs2=0;
write_lcd_shuzi(2,32,tcs_shuzi[tcs_df/100] ); //显示分数的百位
write_lcd_shuzi(2,40,tcs_shuzi[ (tcs_df%100)/10] ); // 十
write_lcd_shuzi(2,48,tcs_shuzi[tcs_df%10] ); // 个
cs1=0; cs2=1;
food.direction=tou.direction;//食物本没有方向 但是为了下面的语句
tou=food; //食物就成了蛇头···蛇头的方向依然不变
hui=wei.direction; //先记录下尾巴本来的移动方向
wei.direction=611;//这次行动尾巴不动 这样蛇身就自然加一了···611代表下面的尾巴不动
do
{
food_produce();
he=test_point_exist(food.x,food.y,food.value);
}
while(he==food.value);
draw_lcd_point(food.x,food.y,food.value);//上面有说过 这个是产生并显示食物
}
else//撞到身体或者墙
{
flag_game_over=1; // 游戏结束
}
}
else //什么都么有遇到 继续前进
{
check.direction=tou.direction;//这么做的理由同上 为了保持蛇头当前的移动方向
tou=check;
draw_lcd_point(tou.x,tou.y,tou.value);//画出此时的蛇头
}
//下面是对尾巴的操作
if ( (wei.x == queue.dat[queue.front].x) && ( wei.y==queue.dat[queue.front].y ) && ( wei.value== queue.dat[queue.front].value) ) //如果尾巴到达拐点
{
check=queue_out(&queue);
wei.direction=check.direction; //尾巴按照拐点指示的方向走
}
else //如果没有到达拐点 尾巴移动的方向不变
{
}
switch( wei.direction ) //这个是尾巴的移动 以及尾巴节点数据的修改
{
case 0: { wei_you(); break; }
case 1: { wei_xia(); break; }
case 2: { wei_zuo(); break; }
case 3: { wei_shang(); break; }
case 611: { wei.direction=hui; break;} //这次移动 吃到实物 还原尾巴本来的移动方向
}
}
TR0=0;
TR1=0;
ET1=0; //退出游戏时 关闭游戏过程中用到的定时器0和1 然后定时器中断也要关闭
}
4. 仿真proteus8.6
本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。
仿真界面:
5. 设计报告
设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考。
6. 资料清单
设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。
7. 资料获取链接
百度网盘下载链接:【Z06】百度网盘下载链接
更多单片机仿真设计合集:单片机仿真设计合集
阅读全文