基于单片机的贪食蛇设计_第1页
基于单片机的贪食蛇设计_第2页
基于单片机的贪食蛇设计_第3页
基于单片机的贪食蛇设计_第4页
基于单片机的贪食蛇设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于单片机的贪食蛇设计一 题目要求: 使用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坐标

2、 向上: 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坐标进行比较如果

3、相等到 则视为吃到自己 I,放置新的食物: 根据游戏者控制蛇吃到食物的时间的不同而产生的坐标,是随机的食物 三 功能描述: 开机即显示 “SNAKE”,当按下KEY5则显示蛇的形状,再按下KEY5 进入游戏,即可开始游戏,此时即可通按下KEY1,KEY2,KEY3,KEY4来控 制上,下,左,右,此时按下KEY5可退出游戏,上述按键也可用红外遥控来实现.此时吃到食物即可增长一节,撞到边框即蛇死,吃到自己蛇死,死亡则显示”GAMEOVER” ,长到20节即过一关,并显示关数,10过完则重新开始.四 系统硬件设计:系统主原理图:五 系统软件设计:A 流程序图设计1, 系统主流程图:2, 按键子程序

4、流程图:3, 蛇移动子程序流程图:4, 判断蛇是否死亡子程序流程图:5, 蛇吃食物子程序流程图:6, 过关子程序流程图:7, 蛇显示子程序流程图:六 程序清单:;=;红外遥控-串口-贪吃蛇;-2008/9/1-;=;硬件: P0,P2显示码输出-行, P1.0-P1.3接74LS154为点阵列扫描信号; P1.4-P1.7为4个独立键盘; P3.2 INT0为启停键; P3.3 INT1为红外接收; P3.0 P3.1为串口;=;字节定义区;= SNAKE_TAIL_X EQU 27H ;蛇尾X坐标暂存器SNAKE_TAIL_Y EQU 28H ;蛇尾Y坐标暂存器 FOOD_X EQU 29H

5、 ;食物X坐标 FOOD_Y EQU 2AH ;食物Y坐标SNAKE_CHANG EQU 2BH ;蛇的节数PUT_FOOD EQU 2CH ;放食物随机码产生器PASS_NUM EQU 2DH ;过关数目TIME EQU 2EH ;过关时间调节暂存器 TIME_400 EQU 32H ;400延时XX EQU 33H ;方向X坐标暂存YY EQU 34H ;方向Y坐标暂存X EQU 35H ;方向X坐标Y EQU 36H ;方向Y坐标 SNAKE_TOU_X EQU 40H ;蛇头 X坐标 存储单元 SNAKE_TOU_Y EQU 54H ;蛇头 Y坐标 存储单元SNAKE_SHEN1_X

6、EQU 41H ;蛇身第一节 X坐标 存储单元 SNAKE_SHEN1_Y EQU 55H ;蛇身第一节 Y坐标 存储单元SNAKE_SHEN2_X EQU 42H ;蛇身第二节 X坐标 存储单元SNAKE_SHEN2_Y EQU 56H ;蛇身第二节 Y坐标 存储单元H_Y_8 EQU 37H ;Y坐标大于8的寄存器L_Y_8 EQU 38H ;Y坐标小于8的寄存器IR_COM1 EQU 39H ;红外接收操作码寄存器IR_COM2 EQU 3AH ;红外接收操作反码寄存器;=;位定义区;= B_GAME_ON_OFF BIT 00H ;启停标志位BT0 BIT 01H ;定时器0中断标志B

7、_KEYTEST BIT 02H ;有键按下标志位B_SNAKE_DED BIT 03H ;蛇死亡标志位B_SNAKE_FOOD BIT 04H ;蛇吃到实物标志位 B_PASS BIT 05H ;过关标志位IRIN BIT P3.3;=;游戏开始;=ORG 00HJMP START_1ORG 03HJMP GAME_ON_OFF ;INT0启停中断ORG 0BHJMP T0_SET ;定时器T0中断ORG 13HJMP IR_IN ;INT1红外接收 ORG 23H JMP RI_SET ;串口通信ORG 30H;=;初始化 蛇总长20节;=START_1: MOV PASS_NUM,#0

8、MOV TIME,#20 ;20*20MS=400MS 移动一次CLR B_PASSSTART: MOV TIME_400,TIME MOV SNAKE_TOU_X,#8 ;刚进入游戏模式时蛇为三节,初始 X,Y 坐标MOV SNAKE_TOU_Y,#8MOV SNAKE_SHEN1_X,#7MOV SNAKE_SHEN1_Y,#8MOV SNAKE_SHEN2_X,#6MOV SNAKE_SHEN2_Y,#8MOV R0,#SNAKE_SHEN2_X ;第三节之后的蛇身 X,Y 坐标清0CLE_SNAKE_SHEN_X_17: INC R0MOV R0,#0CJNE R0,#53H,CLE_

9、SNAKE_SHEN_X_17MOV R0,#SNAKE_SHEN2_YCLE_SNAKE_SHEN_Y_17:INC R0MOV R0,#0CJNE R0,#67H,CLE_SNAKE_SHEN_Y_17 MOV IR_COM1,#00H ;红外接收寄存器 MOV IR_COM2,#00H MOV PUT_FOOD,#0 ;初始化随机码产生器归0 MOV X,#1 ;初始化方向向右MOV Y,#0MOV FOOD_X,#4 ;第一颗食物X,Y坐标MOV FOOD_Y,#13MOV SNAKE_CHANG,#3 ;初始化蛇长为3节 CLR BT0 ;T0中断标志位初始化CLR B_KEYTES

10、T ;键盘测试标志位初始化 CLR B_SNAKE_DED ;蛇死亡标志位初始化CLR B_SNAKE_FOOD ;蛇吃到食物标志位初始化CLR B_GAME_ON_OFF ;启停位清零SETB EA ;开中断SETB EX0 ;开INT0中断SETB EX1 ;开外部中断INT1SETB IT0 ;INT0负边缘触发CLR IT1 ;INT1边缘触发方式MOV TMOD,#01H ;定时器0工作方式SETB ET0 ;开定时器0SETB ES ;开串口中断 MOV TMOD,#20H ;定时器1用作串口通信波特率产生器ANL PCON,#3FH ;SMOD=0 波特率不倍增 MOV TH1,

11、#0FDH ;波特率为9600MOV TL1,#0FDHSETB TR1 ;开始定时MOV SCON,#50H ;串口设为工作模式1 接收 MOV SP,#70H ;堆栈初始化JB B_PASS,GOTO_GAME ;过关则直接跳入游戏;=;等待游戏开始 并显示SNAKE 启停键按下则显示PLAYGAME 并进入游戏模式;=SNAKE: CALL DISP_SNAKE ;等待开始时显示SNAKEJNB B_GAME_ON_OFF,SNAKE ;启停标志位为0表示启停键没按下继续等待 CLR B_GAME_ON_OFF ;清除启停标志位SHEXIN:CALL DISP_SHEXIN ;启停键按下

12、显示PLAYGAME进入游戏JNB B_GAME_ON_OFF,SHEXIN CLR B_GAME_ON_OFF ;清除启停标志位GOTO_GAME: CLR B_PASS MOV DPTR,#65536-20000 ;定时器0定时初值MOV TH0,DPHMOV TL0,DPL SETB TR0 ;开定时器;=;游戏主程序 判断键盘, 移动, 是否死亡, 吃食, 显示;=MAIN_GAME: JNB BT0,MAIN_GAME ;等待T0中断CLR BT0 ;清除T0中断标志CALL KEYTEST ;调用键盘测试程序JNB B_KEYTEST,NOKEY ;判断是否有键按下CALL REA

13、DKEY_X_Y ;有键按下调用键盘操作子程序CJNE A,#0F0H,XX_X_YY_Y ;再次判断是否有键按下JMP NOKEYXX_X_YY_Y: ;有键按下将取得的方向值送入 X,Y MOV X,XXMOV Y,YYNOKEY: DJNZ TIME_400,MAINDISP ;等待400MS到 MOV TIME_400,TIME ;重送初值CLR P3.7INC PUT_FOOD ;对移动次数进行计数从而产生随机码CALL SNAKE_MOVE ;调用蛇身移动子程序=1CALL SNAKE_DED ;判断蛇是否死亡子程序=2JB B_SNAKE_DED,GAMEOVER ;死亡则显示G

14、AMEOVERCALL SNAKE_FOOD ;判断是否吃到食物子程序=3JNB B_SNAKE_FOOD,MAINDISP CALL SNAKE_ZHANGCHANG ;吃到食物则增长一节并重放食物=4JNB B_PASS,MAINDISPCLR TR0CALL SNAKE_PASSMOV A,PASS_NUMCJNE A,#10,GOTO_STARTJMP START_1MAINDISP: CALL GAME_DISP ;显示蛇=5JB B_GAME_ON_OFF,GAMEOVERJMP MAIN_GAME ;继续循环GAMEOVER: CLR TR0CLR B_GAME_ON_OFFCA

15、LL DISP_GAMEOVER ;启停键在游戏中按下则结束显示GAMEOVERJNB B_GAME_ON_OFF,GAMEOVER ;再次按下启停键则进入SNAKE进行等待CLR B_GAME_ON_OFF ;清除启停标志位GOTO_START:JMP START ;=;T0中断服务子程序 重送初值 置标志位;=T0_SET: MOV DPTR,#65536-20000MOV TH0,DPHMOV TL0,DPLSETB BT0RETI;=;INTO中断服务子程序 启 , 停;=GAME_ON_OFF: ;INTO中断服务子程序 CLR EX0JB P3.2,OUT CALL DEL_10M

16、SJB P3.2,OUT SETB B_GAME_ON_OFF ;置启停标志位为1表示按下 OUT: SETB EX0RETI;=;键盘测试子程序 有键按下则 B_KEYTEST=1;=KEYTEST: SETB B_KEYTEST MOV A,P1ANL A,#0F0H CJNE A,#0F0H,KEYTEST_OUTCLR B_KEYTESTKEYTEST_OUT: RET;=;读键值并得出方向 ,即 X, Y的值;=READKEY_X_Y: JNB P1.4,PD_UP_DOWN1 ;判断是否为向上键按下 JMP KEY_DOWNPD_UP_DOWN1: MOV A,Y CJNE A,#

17、0,KEY_DOWN MOV YY,#1 ;向上键按下则置方向标志 MOV XX,#0 JMP READKEY_OUTKEY_DOWN: JNB P1.7,PD_UP_DOWN2 ;判断是否为向下键按下 JMP KEY_LEFTPD_UP_DOWN2: MOV A,Y CJNE A,#0,KEY_LEFT MOV YY,#-1 ;向下键按下则置方向标志 MOV XX,#0 JMP READKEY_OUTKEY_LEFT: JNB P1.5,PD_LEFT_RIGHT1 ;判断是否为向左键按下 JMP KEY_RIGHTPD_LEFT_RIGHT1: MOV A,X CJNE A,#0,KEY_

18、RIGHT MOV XX,#-1 ;向左键按下则置方向标志 MOV YY,#0 JMP READKEY_OUTKEY_RIGHT: JNB P1.6,PD_LEFT_RIGHT2 ;判断是否为向右键按下 JMP READKEY_OUTPD_LEFT_RIGHT2: MOV A,X CJNE A,#0,READKEY_OUT MOV XX,#1 ;向右键按下则置方向标志 MOV YY,#0READKEY_OUT: MOV A,P1 ;去抖 ANL A,#0F0H RET;=;蛇移动子程序;=SNAKE_MOVE: MOV R1,SNAKE_CHANG MOV A,SNAKE_TOU_XADD A

19、,X ;蛇头X坐标加上 方向X坐标MOV R0,#SNAKE_TOU_XMOVE_CHANGE_X: ;依次将前一个蛇身X坐标转向下一蛇身X坐标 XCH A,R0INC R0DJNZ R1,MOVE_CHANGE_X;MOV SNAKE_TAIL_X,A MOV R1,SNAKE_CHANGMOV A,SNAKE_TOU_YADD A,Y ;蛇头Y坐标加上 方向Y坐标MOV R0,#SNAKE_TOU_YMOVE_CHANGE_Y: ;依次将前一个蛇身Y坐标转向下一蛇身Y坐标 XCH A,R0INC R0DJNZ R1,MOVE_CHANGE_Y;MOV SNAKE_TAIL_Y,ARET;=

20、;蛇显示子程序;=GAME_DISP: MOV R0,#SNAKE_TOU_X ;从蛇头开始显示 MOV R1,#SNAKE_TOU_YGAME_DISP_20: MOV A,R0 ;取X坐标 ORL A,#0F0H ;高位为键盘因此屏蔽掉 MOV P1,A ;X坐标输出 INC R0 ;下一节蛇身的X坐标 MOV A,R1 ;Y坐标到R2 MOV R2,A CALL COUNT_Y ;计算出Y坐标的高8位和低8位 MOV P0,H_Y_8 ;输出Y坐标的高8位 MOV P2,L_Y_8 ;输出Y坐标的低8位 INC R1 ;取下一节的Y坐标 CALL DEL ;延时 MOV P0,#00H

21、MOV P2,#00H CJNE R0,#53H,GAME_DISP_20 ;20节蛇身是否全部显示完 MOV A,FOOD_X ;显示食物 ORL A,#0F0H MOV P1,A MOV R2,FOOD_Y CALL COUNT_Y MOV P0,H_Y_8 MOV P2,L_Y_8 CALL DEL MOV P0,#00H MOV P2,#00H RET;=; Y坐标计算子程序 Y坐标大于8的存在H_Y_8中 , 小于8的存在L_Y_8中;=COUNT_Y: MOV H_Y_8,#00H ;初始化Y坐标的高8位和低8位MOV L_Y_8,#00HCJNE R2,#0,COUNT_Y_H

22、;Y坐标为0则不要调整JMP COUNT_Y_OUTCOUNT_Y_H: CLR CMOV A,#8SUBB A,R2 JNC COUNT_Y_L ;判断Y坐标是否大于8CLR C ;大于8则调整MOV A,R2SUBB A,#8 MOV R2,A ;调整后的Y坐标存回R2SETB CMOV A,#00HCOUNT_Y_H_1: ;将Y坐标高8位转化为可输出的字节存入H_Y_8RLC ADJNZ R2,COUNT_Y_H_1MOV H_Y_8,AJMP COUNT_Y_OUTCOUNT_Y_L: ;Y坐标小于8则执行下面的操作 SETB CMOV A,#00HCOUNT_Y_L_1: ;将Y坐

23、标低8位转化为可输出的字节存入L_Y_8RLC ADJNZ R2,COUNT_Y_L_1MOV L_Y_8,ACOUNT_Y_OUT: RET;=;判断蛇是否死亡子程序 死亡则置位B_SNAKE_DED=1;=SNAKE_DED: SETB B_SNAKE_DED MOV A,#-1 ;判断蛇头是否撞到左边的墙CJNE A,SNAKE_TOU_X,X_16JMP SNAKE_DED_OUTX_16: MOV A,#16 ;判断蛇头是否撞到右边的墙CJNE A,SNAKE_TOU_X,Y_0JMP SNAKE_DED_OUTY_0: MOV A,#0 ;判断蛇头是否撞到下边的墙CJNE A,SN

24、AKE_TOU_Y,Y_17JMP SNAKE_DED_OUTY_17: MOV A,#17 ;判断蛇头是否撞到上边的墙CJNE A,SNAKE_TOU_Y,SNAKE_DED_ZISHENJMP SNAKE_DED_OUTSNAKE_DED_ZISHEN: ;没撞到墙则判断是否撞到自已 MOV R0,#SNAKE_TOU_XMOV R1,#SNAKE_TOU_YSNAKE_DED_1: INC R1INC R0MOV A,R0CJNE A,SNAKE_TOU_X,SNAKE_DED_19MOV A,R1CJNE A,SNAKE_TOU_Y,SNAKE_DED_19JMP SNAKE_DED_OUTSNAKE_DED_19: CJNE R0,#53H,SNAKE_DED_1SNAKE_NDED_OUT: CLR B_SNAKE_DEDSNA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论