基于单片机的贪食蛇设计.docx
- 文档编号:24374014
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:51
- 大小:287.82KB
基于单片机的贪食蛇设计.docx
《基于单片机的贪食蛇设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的贪食蛇设计.docx(51页珍藏版)》请在冰豆网上搜索。
基于单片机的贪食蛇设计
基于单片机的贪食蛇设计
一题目要求:
使用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,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 贪食 设计