单片机课程设计贪吃蛇说明书.docx

上传人:b****7 文档编号:8907062 上传时间:2023-02-02 格式:DOCX 页数:19 大小:93.38KB
下载 相关 举报
单片机课程设计贪吃蛇说明书.docx_第1页
第1页 / 共19页
单片机课程设计贪吃蛇说明书.docx_第2页
第2页 / 共19页
单片机课程设计贪吃蛇说明书.docx_第3页
第3页 / 共19页
单片机课程设计贪吃蛇说明书.docx_第4页
第4页 / 共19页
单片机课程设计贪吃蛇说明书.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

单片机课程设计贪吃蛇说明书.docx

《单片机课程设计贪吃蛇说明书.docx》由会员分享,可在线阅读,更多相关《单片机课程设计贪吃蛇说明书.docx(19页珍藏版)》请在冰豆网上搜索。

单片机课程设计贪吃蛇说明书.docx

单片机课程设计贪吃蛇说明书

 

单片机课程实训作品说明书

 

姓名:

李兆基

完成时间:

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

电阻

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;//开启软开关

}

/********

显示函数

********/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1