基于单片机的贪食蛇设计.docx

上传人:b****7 文档编号:11301706 上传时间:2023-02-26 格式:DOCX 页数:51 大小:269.18KB
下载 相关 举报
基于单片机的贪食蛇设计.docx_第1页
第1页 / 共51页
基于单片机的贪食蛇设计.docx_第2页
第2页 / 共51页
基于单片机的贪食蛇设计.docx_第3页
第3页 / 共51页
基于单片机的贪食蛇设计.docx_第4页
第4页 / 共51页
基于单片机的贪食蛇设计.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

基于单片机的贪食蛇设计.docx

《基于单片机的贪食蛇设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的贪食蛇设计.docx(51页珍藏版)》请在冰豆网上搜索。

基于单片机的贪食蛇设计.docx

基于单片机的贪食蛇设计

基于单片机的贪食蛇设计

 

一题目要求:

使用8051单片机和点阵显示屏实现贪吃蛇的基本功能

二题目分析:

1,贪吃蛇的基本功能:

A,能够蛇形移动

B,能够任意改变方向

C,能够吃到食物并增长

D,撞到四边的墙蛇死

F,吃到自己蛇死

E,放置新的食物

2,拓展部分:

A,能够过关

B,在游戏开始和结束都显示一些相关花样

C,过关能显示关数

D,增加串口通信功能

F,增加红外遥控功能

3,贪吃蛇关键算法分析:

A,蛇身的形成:

使用20个RAM来存储蛇身X坐标,20个RAM来存储蛇身Y坐标

显示时只须将X坐标输出到行,Y坐标输出列即可

B,蛇的方向:

使用两个存储单元分别来存储代表方向的X坐标和Y坐标

向上:

X=0,Y=1

向下:

X=0,Y=-1

向左:

X=-1,Y=0

向右:

X=1,Y=0

C,蛇的移动:

只须将蛇头的X坐标和Y坐标分别与方向的X坐标和Y坐标相加

原来蛇身各节的前一节X从标和Y坐标分别与后一节的X坐标和Y

坐标交换即可

D,吃食物:

只要判断蛇头的X,Y坐标是否与食物的X,Y坐标相同,相同则判断

吃到食物,反之,没吃到食物

F,吃到食物蛇增长一节:

当判断为吃到食物后只须让蛇移动时多交换一次即可实现

G,判断蛇是否撞墙:

只要判断蛇头的X坐标或Y坐标是否等于点阵最外边时的X或Y

坐标

H,判断蛇是否吃到自己:

只须将蛇头X,Y坐标与每一节蛇身的X,Y坐标进行比较如果相等到

则视为吃到自己

I,放置新的食物:

根据游戏者控制蛇吃到食物的时间的不同而产生的坐标,是随机的食物

三功能描述:

开机即显示“SNAKE”,当按下KEY5则显示蛇的形状,再按下KEY5

进入游戏,即可开始游戏,此时即可通按下KEY1,KEY2,KEY3,KEY4来控

制上,下,左,右,此时按下KEY5可退出游戏,上述按键也可用红外遥控

来实现.此时吃到食物即可增长一节,撞到边框即蛇死,吃到自己蛇死,死亡则显示”GAMEOVER”,长到20节即过一关,并显示关数,10过完则重新开始.

 

四系统硬件设计:

系统主原理图:

 

五系统软件设计:

A流程序图设计

1,系统主流程图:

 

2,按键子程序流程图:

 

3,蛇移动子程序流程图:

 

4,判断蛇是否死亡子程序流程图:

 

5,蛇吃食物子程序流程图:

 

6,过关子程序流程图:

7,蛇显示子程序流程图:

 

六程序清单:

;=================================================================================================

;红外遥控--串口--贪吃蛇

;---------2008/9/1--------------------

;=================================================================================================

;硬件:

P0,P2显示码输出---行,P1.0-P1.3接74LS154为点阵列扫描信号

;P1.4-P1.7为4个独立键盘

;P3.2INT0为启停键

;P3.3INT1为红外接收

;P3.0P3.1为串口

;=================================================================================================

;字节定义区

;=================================================================================================

SNAKE_TAIL_XEQU27H;蛇尾X坐标暂存器

SNAKE_TAIL_YEQU28H;蛇尾Y坐标暂存器

FOOD_XEQU29H;食物X坐标

FOOD_YEQU2AH;食物Y坐标

SNAKE_CHANGEQU2BH;蛇的节数

PUT_FOODEQU2CH;放食物随机码产生器

PASS_NUMEQU2DH;过关数目

TIMEEQU2EH;过关时间调节暂存器

TIME_400EQU32H;400延时

XXEQU33H;方向X坐标暂存

YYEQU34H;方向Y坐标暂存

XEQU35H;方向X坐标

YEQU36H;方向Y坐标

SNAKE_TOU_XEQU40H;蛇头X坐标存储单元

SNAKE_TOU_YEQU54H;蛇头Y坐标存储单元

SNAKE_SHEN1_XEQU41H;蛇身第一节X坐标存储单元

SNAKE_SHEN1_YEQU55H;蛇身第一节Y坐标存储单元

SNAKE_SHEN2_XEQU42H;蛇身第二节X坐标存储单元

SNAKE_SHEN2_YEQU56H;蛇身第二节Y坐标存储单元

H_Y_8EQU37H;Y坐标大于8的寄存器

L_Y_8EQU38H;Y坐标小于8的寄存器

IR_COM1EQU39H;红外接收操作码寄存器

IR_COM2EQU3AH;红外接收操作反码寄存器

 

;=================================================================================================

;位定义区

;================================================================================================

B_GAME_ON_OFFBIT00H;启停标志位

BT0BIT01H;定时器0中断标志

B_KEYTESTBIT02H;有键按下标志位

B_SNAKE_DEDBIT03H;蛇死亡标志位

B_SNAKE_FOODBIT04H;蛇吃到实物标志位

B_PASSBIT05H;过关标志位

IRINBITP3.3

;===============================================================================================

;游戏开始

;===============================================================================================

ORG00H

JMPSTART_1

ORG03H

JMPGAME_ON_OFF;INT0启停中断

ORG0BH

JMPT0_SET;定时器T0中断

ORG13H

JMPIR_IN;INT1红外接收

ORG23H

JMPRI_SET;串口通信

ORG30H

 

;===============================================================================================

;初始化蛇总长20节

;===============================================================================================

 

START_1:

MOVPASS_NUM,#0

MOVTIME,#20;20*20MS=400MS移动一次

CLRB_PASS

START:

MOVTIME_400,TIME

MOVSNAKE_TOU_X,#8;刚进入游戏模式时蛇为三节,初始X,Y坐标

MOVSNAKE_TOU_Y,#8

MOVSNAKE_SHEN1_X,#7

MOVSNAKE_SHEN1_Y,#8

MOVSNAKE_SHEN2_X,#6

MOVSNAKE_SHEN2_Y,#8

MOVR0,#SNAKE_SHEN2_X;第三节之后的蛇身X,Y坐标清0

CLE_SNAKE_SHEN_X_17:

INCR0

MOV@R0,#0

CJNER0,#53H,CLE_SNAKE_SHEN_X_17

MOVR0,#SNAKE_SHEN2_Y

CLE_SNAKE_SHEN_Y_17:

INCR0

MOV@R0,#0

CJNER0,#67H,CLE_SNAKE_SHEN_Y_17

MOVIR_COM1,#00H;红外接收寄存器

MOVIR_COM2,#00H

MOVPUT_FOOD,#0;初始化随机码产生器归0

MOVX,#1;初始化方向向右

MOVY,#0

MOVFOOD_X,#4;第一颗食物X,Y坐标

MOVFOOD_Y,#13

MOVSNAKE_CHANG,#3;初始化蛇长为3节

CLRBT0;T0中断标志位初始化

CLRB_KEYTEST;键盘测试标志位初始化

CLRB_SNAKE_DED;蛇死亡标志位初始化

CLRB_SNAKE_FOOD;蛇吃到食物标志位初始化

CLRB_GAME_ON_OFF;启停位清零

SETBEA;开中断

SETBEX0;开INT0中断

SETBEX1;开外部中断INT1

SETBIT0;INT0负边缘触发

CLRIT1;INT1边缘触发方式

MOVTMOD,#01H;定时器0工作方式

SETBET0;开定时器0

SETBES;开串口中断

MOVTMOD,#20H;定时器1用作串口通信波特率产生器

ANLPCON,#3FH;SMOD=0波特率不倍增

MOVTH1,#0FDH;波特率为9600

MOVTL1,#0FDH

SETBTR1;开始定时

MOVSCON,#50H;串口设为工作模式1接收

MOVSP,#70H;堆栈初始化

JBB_PASS,GOTO_GAME;过关则直接跳入游戏

;==============================================================================================

;等待游戏开始并显示SNAKE启停键按下则显示PLAYGAME并进入游戏模式

;==============================================================================================

SNAKE:

CALLDISP_SNAKE;等待开始时显示SNAKE

JNBB_GAME_ON_OFF,SNAKE;启停标志位为0表示启停键没按下继续等待

CLRB_GAME_ON_OFF;清除启停标志位

SHEXIN:

CALLDISP_SHEXIN;启停键按下显示PLAYGAME进入游戏

JNBB_GAME_ON_OFF,SHEXIN

CLRB_GAME_ON_OFF;清除启停标志位

GOTO_GAME:

CLRB_PASS

MOVDPTR,#65536-20000;定时器0定时初值

MOVTH0,DPH

MOVTL0,DPL

SETBTR0;开定时器

;==============================================================================================

;游戏主程序判断键盘,移动,是否死亡,吃食,显示

;==============================================================================================

MAIN_GAME:

JNBBT0,MAIN_GAME;等待T0中断

CLRBT0;清除T0中断标志

CALLKEYTEST;调用键盘测试程序

JNBB_KEYTEST,NOKEY;判断是否有键按下

CALLREADKEY_X_Y;有键按下调用键盘操作子程序

CJNEA,#0F0H,XX_X_YY_Y;再次判断是否有键按下

JMPNOKEY

XX_X_YY_Y:

;有键按下将取得的方向值送入X,Y

MOVX,XX

MOVY,YY

NOKEY:

DJNZTIME_400,MAINDISP;等待400MS到

MOVTIME_400,TIME;重送初值

CLRP3.7

INCPUT_FOOD;对移动次数进行计数从而产生随机码

CALLSNAKE_MOVE;调用蛇身移动子程序==================1

CALLSNAKE_DED;判断蛇是否死亡子程序================2

JBB_SNAKE_DED,GAMEOVER;死亡则显示GAMEOVER

CALLSNAKE_FOOD;判断是否吃到食物子程序==============3

JNBB_SNAKE_FOOD,MAINDISP

CALLSNAKE_ZHANGCHANG;吃到食物则增长一节并重放食物========4

JNBB_PASS,MAINDISP

CLRTR0

CALLSNAKE_PASS

MOVA,PASS_NUM

CJNEA,#10,GOTO_START

JMPSTART_1

MAINDISP:

CALLGAME_DISP;显示蛇==============================5

JBB_GAME_ON_OFF,GAMEOVER

JMPMAIN_GAME;继续循环

GAMEOVER:

CLRTR0

CLRB_GAME_ON_OFF

CALLDISP_GAMEOVER;启停键在游戏中按下则结束显示GAMEOVER

JNBB_GAME_ON_OFF,GAMEOVER;再次按下启停键则进入SNAKE进行等待

CLRB_GAME_ON_OFF;清除启停标志位

GOTO_START:

JMPSTART

;===============================================================================================

;T0中断服务子程序重送初值置标志位

;===============================================================================================

T0_SET:

MOVDPTR,#65536-20000

MOVTH0,DPH

MOVTL0,DPL

SETBBT0

RETI

;================================================================================================

;INTO中断服务子程序启,停

;================================================================================================

GAME_ON_OFF:

;INTO中断服务子程序

CLREX0

JBP3.2,OUT

CALLDEL_10MS

JBP3.2,OUT

SETBB_GAME_ON_OFF;置启停标志位为1表示按下

OUT:

SETBEX0

RETI

;===============================================================================================

;键盘测试子程序有键按下则B_KEYTEST=1

;==============================================================================================

KEYTEST:

SETBB_KEYTEST

MOVA,P1

ANLA,#0F0H

CJNEA,#0F0H,KEYTEST_OUT

CLRB_KEYTEST

KEYTEST_OUT:

RET

;===============================================================================================

;读键值并得出方向,即X,Y的值

;===============================================================================================

READKEY_X_Y:

JNBP1.4,PD_UP_DOWN1;判断是否为向上键按下

JMPKEY_DOWN

PD_UP_DOWN1:

MOVA,Y

CJNEA,#0,KEY_DOWN

MOVYY,#1;向上键按下则置方向标志

MOVXX,#0

JMPREADKEY_OUT

KEY_DOWN:

JNBP1.7,PD_UP_DOWN2;判断是否为向下键按下

JMPKEY_LEFT

PD_UP_DOWN2:

MOVA,Y

CJNEA,#0,KEY_LEFT

MOVYY,#-1;向下键按下则置方向标志

MOVXX,#0

JMPREADKEY_OUT

KEY_LEFT:

JNBP1.5,PD_LEFT_RIGHT1;判断是否为向左键按下

JMPKEY_RIGHT

PD_LEFT_RIGHT1:

MOVA,X

CJNEA,#0,KEY_RIGHT

MOVXX,#-1;向左键按下则置方向标志

MOVYY,#0

JMPREADKEY_OUT

KEY_RIGHT:

JNBP1.6,PD_LEFT_RIGHT2;判断是否为向右键按下

JMPREADKEY_OUT

PD_LEFT_RIGHT2:

MOVA,X

CJNEA,#0,READKEY_OUT

MOVXX,#1;向右键按下则置方向标志

MOVYY,#0

READKEY_OUT:

MOVA,P1;去抖

ANLA,#0F0H

RET

;===============================================================================================

;蛇移动子程序

;===============================================================================================

SNAKE_MOVE:

MOVR1,SNAKE_CHANG

MOVA,SNAKE_TOU_X

ADDA,X;蛇头X坐标加上方向X坐标

MOVR0,#SNAKE_TOU_X

MOVE_CHANGE_X:

;依次将前一个蛇身X坐标转向下一蛇身X坐标

XCHA,@R0

INCR0

DJNZR1,MOVE_CHANGE_X

;MOVSNAKE_TAIL_X,A

MOVR1,SNAKE_CHANG

MOVA,SNAKE_TOU_Y

ADDA,Y;蛇头Y坐标加上方向Y坐标

MOVR0,#SNAKE_TOU_Y

MOVE_CHANGE_Y:

;依次将前一个蛇身Y坐标转向下一蛇身Y坐标

XCHA,@R0

INCR0

DJNZR1,MOVE_CHANGE_Y

;MOVSNAKE_TAIL_Y,A

RET

;===============================================================================================

;蛇显示子程序

;===============================================================================================

GAME_DISP:

MOVR0,#SNAKE_TOU_X;从蛇头开始显示

MOVR1,#SNAKE_TOU_Y

GAME_DISP_20:

MOVA,@R0;取X坐标

ORLA,#0F0H;高位为键盘因此屏蔽掉

MOVP1,A;X坐标输出

INCR0;下一节蛇身的X坐标

MOVA,@R1;Y坐标到R2

MOVR2,A

CALLCOUNT_Y;计算出Y坐标的高8位和低8位

MOVP0,H_Y_8;输出Y坐标的高8位

MOVP2,L_Y_8;输出Y坐标的低8位

INCR1;取下一节的Y坐标

CALLDEL;延时

MOVP0,#00H

MOVP2,#00H

CJNER0,#53H,GAME_DISP_20;20节蛇身是否全部显示完

MOVA,FOOD_X;显示食物

ORLA,#0F0H

MOVP1,A

MOVR2,FOOD_Y

CALLCOUNT_Y

MOVP0,H_Y_8

MOVP2,L_Y_8

CALLDEL

MOVP0,#00H

MOVP2,#00H

RET

;==============================================================================================

;Y坐标计算子程序Y坐标大于8的存在H_Y_8中,小于8的存在L_Y_8中

;================================================================================================

COUNT_Y:

MOVH_Y_8,#00H;初始化Y坐标的高8位和低8位

MOVL_Y_8,#00H

CJNER2,#0,COUNT_

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

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

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

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