单片机课程设计贪吃蛇说明书.docx
- 文档编号:8907062
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:19
- 大小:93.38KB
单片机课程设计贪吃蛇说明书.docx
《单片机课程设计贪吃蛇说明书.docx》由会员分享,可在线阅读,更多相关《单片机课程设计贪吃蛇说明书.docx(19页珍藏版)》请在冰豆网上搜索。
单片机课程设计贪吃蛇说明书
单片机课程实训作品说明书
姓名:
李兆基
完成时间:
2016年7月3日
一、作品说明介绍
1.作品名称:
贪吃蛇简易游戏机
2.作品实现功能:
a)按上、下、左、右键控制蛇身改变方向;
b)蛇头与食物碰撞时“吃掉”食物,使蛇身变长;
c)复位键使游戏重新开始;
d)暂停/继续键可以暂停、继续游戏
3.选择目的:
巩固单片机课程所学知识,真正做到学有所用
二、作品操作介绍
1.作品外观图
⑮
⑭
⑪
⑩
⑫
⑬
⑨
⑧
⑦
⑥
④
⑤
②
③
①
1②点阵屏:
显示地图、蛇以及食物
③STC12C5A60S2单片机:
控制整个作品,可以烧录不同的程序
④微动开关1:
向上的按键,用于改变蛇的方向
⑤微动开关2:
向下的按键,用于改变蛇的方向
⑥微动开关3:
向左的按键,用于改变蛇的方向
⑦微动开关4:
向右的按键,用于改变蛇的方向
⑧微动开关5:
复位按键,按下后游戏复位,重新开始
⑨微动开关6:
暂停/继续按键,控制游戏暂停/继续
⑩自锁开关:
实现整体的电源总控制(断负)
⑪晶振、电容:
用于单片机起振,单片机的最小时钟电路
⑫排针:
用于连接电源正负极以及RXD和TXD
⑬电源指示灯:
通电时点亮
⑭8个1KΩ电阻:
限制电流大小
⑮10个0Ω电阻:
做跳线用
2.作品功能介绍及操作说明
a)给游戏机上电
1将电源正极接在排针处标有VCC的位置
2将电源负极接在排针处标有GND的位置
3按下自锁开关完成上电
b)让贪吃蛇改变方向
1按向上键:
蛇身向上
2按向下键:
蛇身向下
3按向左键:
蛇身向左
4按向右键:
蛇身向右
c)游戏暂停/继续、复位
1按暂停/继续键:
游戏暂停/继续
2按复位键:
游戏复位,重新开使
三、作品制作说明
1.电路原理图
2.作品原件清单
元件名称
型号
数量(个)
单片机
STC12C5A60S2
1
单片机底座
40引脚
1
点阵屏
8*8
2
微动开关
5*5
6
晶振
12MHz
1
电容
30pf
2
电阻
1KΩ
8
电阻
10KΩ
1
电阻
0Ω
10
自锁开关
3*3
1
排针
直针
4(根)
LED
红色
1
杜邦线
1组
4(根)
洞洞板
单面挂锡玻纤板10CM*14CM
1
电池盒
1
3.PCB图
a)正面图(见附录1)
b)F5图(见附录2)
c)F6图(见附录3)
四、产品控制顺序
/*******************************************
名称:
贪吃蛇简易游戏机
制作人:
李兆基
制作时间:
2016.6.28
修改时间:
2016.7.1(加入吃食物蛇身变长功能)
2016.7.3(处理程序兼容细节)
*******************************************/
#include
#include
unsignedcharmap[16];//定义一个MAP地图
unsignedcharline;//列
unsignedcharsnake[45][2];//定义蛇的大小
unsignedchargame_reset;//游戏复位
unsignedcharfoodx,foody;//食物的位置
sbitKey_left=P3^2;//左
sbitKey_up=P3^3;//上
sbitKey_down=P3^4;//下
sbitKey_right=P3^5;//右
sbitKey_start=P3^7;//开始/暂停
sbitKey_reset=P3^6;//复位
/****************
按键所对应的位置
***************/
voidCreateFood()
{
unsignedchari;
i=0;
RESET:
foodx=rand()%6+1;//rand()函数随即产生食物的横坐标(1~6)
foody=rand()%14+1;//rand()函数随即产生食物的纵坐标(1~14)
while(!
(snake[i][0]==snake[i][1]&&snake[i][0]==44))//找蛇尾(遍历蛇)
{
if(snake[i][0]==foodx&&snake[i][1]==foody)
gotoRESET;//如果产生的食物在蛇的节点上,则重新生成食物
i++;
}
}
/*********
构造食物
********/
voidClearMap()
{
unsignedchari;
for(i=0;i<16;i++)
map[i]=0x81;//清空地图
map[0]=map[15]=0xff;//构造墙
}
/**********
初始化地图
**********/
voidClearSnake()
{
unsignedchari;
for(i=0;i<45;i++)
snake[i][0]=snake[i][1]=0x00;//清空蛇节点
snake[0][0]=5;
snake[0][1]=10;//构造蛇头
snake[1][0]=5;
snake[1][1]=11;
snake[2][0]=5;
snake[2][1]=12;//构造蛇身
snake[3][0]=44;
snake[3][1]=44;//构造蛇尾
}
/************
初始化蛇节点
************/
voidSnakeToMap(void)
{
unsignedinti;
ClearMap();
i=0x80>>foodx;//获取食物的横坐标
map[foody]|=i;//将其横坐标和纵坐标对应的点显示在地图上
i=0;
while(!
(snake[i][0]==snake[i][1]&&snake[i][0]==44))
{
map[snake[i][1]]|=0x80>>snake[i][0];
i++;
}//将蛇节点全部显示在地图上
}
/**********************
将蛇以及食物显示在地图上
***********************/
voidMove(unsignedcharfx)//fx参数(0为上,1为下,2为左,3右)
{
unsignedchari,snakewx,snakewy;
snakewx=snakewy=i=0;
while(!
(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;
snakewx=snake[i-1][0];
snakewy=snake[i-1][1];//扫描蛇节点并且得到尾巴的位置(横纵坐标)
switch(fx)
{
case0:
while(!
(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;//扫描蛇节点得到节点数
for(i--;i>0;i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
}//后节点朝着前节点方向移动
snake[0][0]--;//移动蛇头
break;
case1:
while(!
(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;//扫描蛇节点得到节点数
for(i--;i>0;i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];//后节点朝着前节点方向移动
}
snake[0][0]++;//移动蛇头
break;
case2:
while(!
(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;
for(i--;i>0;i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
}
snake[0][1]--;
break;
case3:
while(!
(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;
for(i--;i>0;i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
}
snake[0][1]++;
break;
}
if(snake[0][0]==foodx&&snake[0][1]==foody)//蛇吃食物(蛇头的坐标与食物坐标重合)
{
while(!
(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;
snake[i][0]=snakewx;
snake[i][1]=snakewy;
snake[i+1][0]=snake[i+1][1]=44;//重新添加(定义)蛇尾
CreateFood();//创建食物
}
}
/************************
蛇的移动(按键的方向改变)
************************/
voiddelay(unsignedinti)
{
unsignedintj;
while(i--)
for(j=600;j>0;j--);
}
/*********************
延时函数(接近与1毫秒)
*********************/
voiddonghua(void)
{
unsignedinti;
for(i=0;i<16;i++)
{
if(i<8)
{
P2=0xff;
P1=~(0x80>>i);
}
else
{
P1=0xff;//第一块点阵屏亮
P2=~(0x80>>(i-8));
}
P0=0xff;
delay(20);
}
P1=P2=P0=0x00;
for(i=0;i<16;i++)
{
if(i<8)
{
P1=0xff;
P2=~(0x01<
}
else
{
P2=0xff;
P1=~(0x01<<(i-8));
}//第二块点阵屏亮
P0=0xff;
delay(20);
}
}
/********
开机动画
********/
bitIsOver()
{
unsignedchari;
game_reset=0;
i=0;
while(!
(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;
for(i--;i>0;i--)
{
if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1])
{
game_reset=1;
break;
}//遍历蛇节点是否蛇头和蛇身重合
}
if(snake[0][0]==0||snake[0][0]==7||snake[0][1]==0||snake[0][1]==15)//判断蛇头是否撞墙
game_reset=1;
returngame_reset;
}
/*********************
判断蛇的状态(死亡条件)
**********************/
voidinit(void)
{
P0M0=0xff;
P0M1=0x00;//PO为强推模式
TMOD=0X01;//设定时/计数器方式
EA=1;//开启中断
ET0=1;//开启定时计数器0
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//设置计数初值为1毫秒
TR0=1;//开启定时/计数软开关
ClearMap();//初始化地图
ClearSnake();//初始化蛇
}
/**********
初始化函数
**********/
voidmain(void)
{
unsignedcharfx,i,newfx;//定义方向,新方向,以及变量i
unsignedcharisStart;//开始/暂停变量
newfx=fx=2;//初始化方向
donghua();
delay(100);
i=0;
isStart=1;
init();
CreateFood();
while
(1)
{
for(i=0;i<20;i++)
{
delay(10);
if(fx!
=1&&!
Key_up&&isStart)//蛇向下移动则向上按键无效
{
newfx=0;
}
if(fx!
=0&&!
Key_down&&isStart)//蛇向上移动则向下按键无效
{
newfx=1;
}
if(fx!
=3&&!
Key_left&&isStart)//蛇向左移动则向右按键无效
{
newfx=2;
}
if(fx!
=2&&!
Key_right&&isStart)//蛇向右移动则向左按键无效
{
newfx=3;
}//按键改变newfx,默认向fx移动
if(!
Key_start)
{
delay(20);
if(!
Key_start)
if(isStart==1)isStart=0;
elseif(isStart==0)isStart=1;//暂停/继续改变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);
}
if(fx==0&&newfx==1||fx==2&&newfx==3)
newfx=fx;
else
fx=newfx;//方向冲突时按新方向移动,避免按的太快
Move(fx);//移动
while(IsOver())
{
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);
}//当蛇死亡只能激活复位按钮
SnakeToMap();//将蛇显示在地图
}
}
/******
主函数
******/
voiddisplay(void)interrupt1
{
TR0=0;//关闭软开关
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//计数赋值
if(line<8)
{
P2=0xff;
P1=~(0x80>>line);//选列
}
else
{
P1=0xff;
P2=~(0x80>>(line-8));//选列
}//两块点阵屏的对接
P0=map[line];//送行
line++;
if(line==16)line=0;
TR0=1;//开启软开关
}
/********
显示函数
********/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 贪吃 说明书