单片机课程设计贪吃蛇说明书Word格式.docx
《单片机课程设计贪吃蛇说明书Word格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计贪吃蛇说明书Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
⑦微动开关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引脚
点阵屏
8*8
2
微动开关
5*5
6
晶振
12MHz
电容
30pf
电阻
1KΩ
8
10KΩ
0Ω
10
自锁开关
3*3
排针
直针
4(根)
LED
红色
杜邦线
1组
洞洞板
单面挂锡玻纤板10CM*14CM
电池盒
3.PCB图
a)正面图(见附录1)
b)F5图(见附录2)
c)F6图(见附录3)
四、产品控制顺序
/*******************************************
名称:
制作人:
李兆基
制作时间:
2016.6.28
修改时间:
2016.7.1(加入吃食物蛇身变长功能)
2016.7.3(处理程序兼容细节)
*******************************************/
#include<
stc12c5a60s2.h>
stdlib.h>
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()
for(i=0;
i<
16;
i++)
map[i]=0x81;
//清空地图
map[0]=map[15]=0xff;
//构造墙
/**********
初始化地图
**********/
voidClearSnake()
45;
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;
//将其横坐标和纵坐标对应的点显示在地图上
snake[i][0]==44))
map[snake[i][1]]|=0x80>
snake[i][0];
}//将蛇节点全部显示在地图上
/**********************
将蛇以及食物显示在地图上
***********************/
voidMove(unsignedcharfx)//fx参数(0为上,1为下,2为左,3右)
unsignedchari,snakewx,snakewy;
snakewx=snakewy=i=0;
snake[i][0]==44))i++;
snakewx=snake[i-1][0];
snakewy=snake[i-1][1];
//扫描蛇节点并且得到尾巴的位置(横纵坐标)
switch(fx)
case0:
while(!
//扫描蛇节点得到节点数
for(i--;
i>
0;
i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
}//后节点朝着前节点方向移动
snake[0][0]--;
//移动蛇头
break;
case1:
//扫描蛇节点得到节点数
//后节点朝着前节点方向移动
}
snake[0][0]++;
case2:
snake[0][1]--;
case3:
snake[0][1]++;
if(snake[0][0]==foodx&
snake[0][1]==foody)//蛇吃食物(蛇头的坐标与食物坐标重合)
while(!
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>
j--);
/*********************
延时函数(接近与1毫秒)
*********************/
voiddonghua(void)
unsignedinti;
{
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;
P2=~(0x01<
<
else
P1=~(0x01<
}//第二块点阵屏亮
/********
开机动画
********/
bitIsOver()
game_reset=0;
for(i--;
if(snake[0][0]==snake[i][0]&
snake[0][1]==snake[i][1])
game_reset=1;
}//遍历蛇节点是否蛇头和蛇身重合
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;
//开启定时/计数软开关
//初始化地图
ClearSnake();
//初始化蛇
初始化函数
voidmain(void)
unsignedcharfx,i,newfx;
//定义方向,新方向,以及变量i
unsignedcharisStart;
//开始/暂停变量
newfx=fx=2;
//初始化方向
donghua();
delay(100);
i=0;
isStart=1;
init();
while
(1)
for(i=0;
20;
delay(10);
if(fx!
=1&
!
Key_up&
isStart)//蛇向下移动则向上按键无效
{
newfx=0;
}
=0&
Key_down&
isStart)//蛇向上移动则向下按键无效
newfx=1;
=3&
Key_left&
isStart)//蛇向左移动则向右按键无效
newfx=2;
}
=2&
Key_right&
isStart)//蛇向右移动则向左按键无效
{
newfx=3;
}//按键改变newfx,默认向fx移动
if(!
Key_start)
delay(20);
if(!
if(isStart==1)isStart=0;
elseif(isStart==0)isStart=1;
//暂停/继续改变isStart状态
while(!
Key_start);
}
Key_reset)
game_reset=1;
Key_reset);
if(game_reset)return;
//复位
}
isStart)i--;
//暂停状态时所执行的死循环
if(fx==0&
newfx==1||fx==2&
newfx==3)
newfx=fx;
fx=newfx;
//方向冲突时按新方向移动,避免按的太快
Move(fx);
//移动
while(IsOver())
}//当蛇死亡只能激活复位按钮
SnakeToMap();
//将蛇显示在地图
}
/******
主函数
******/
voiddisplay(void)interrupt1
{
TR0=0;
//关闭软开关
//计数赋值
if(line<
8)
P2=0xff;
P1=~(0x80>
line);
//选列
else
P1=0xff;
P2=~(0x80>
(line-8));
//选列
}//两块点阵屏的对接
P0=map[line];
//送行
line++;
if(line==16)line=0;
//开启软开关
显示函数