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

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

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

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

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

⑦微动开关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Ω

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;

//开启软开关

显示函数

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

当前位置:首页 > 考试认证 > 其它考试

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

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