ImageVerifierCode 换一换
格式:DOCX , 页数:51 ,大小:269.18KB ,
资源ID:11301706      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11301706.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于单片机的贪食蛇设计.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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,蛇的方向: 使用两个存储单元分别来存储代

2、表方向的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坐标与每一节蛇身的

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

4、程图:2, 按键子程序流程图: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坐标暂存器 FO

5、OD_X EQU 29H ;食物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坐

6、标 存储单元 SNAKE_SHEN1_X 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 ;

7、启停标志位 BT0 BIT 01H ;定时器0中断标志 B_KEYTEST BIT 02H ;有键按下标志位 B_SNAKE_DED BIT 03H ;蛇死亡标志位 B_SNAKE_FOOD BIT 04H ;蛇吃到实物标志位 B_PASS BIT 05H ;过关标志位 IRIN BIT P3.3;=;游戏开始;= ORG 00H JMP START_1 ORG 03H JMP GAME_ON_OFF ;INT0启停中断 ORG 0BH JMP T0_SET ;定时器T0中断 ORG 13H JMP IR_IN ;INT1红外接收 ORG 23H JMP RI_SET ;串口通信 ORG 30

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

9、NAKE_SHEN_X_17: INC R0 MOV R0,#0 CJNE R0,#53H,CLE_SNAKE_SHEN_X_17 MOV R0,#SNAKE_SHEN2_YCLE_SNAKE_SHEN_Y_17: INC R0 MOV R0,#0 CJNE 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,#0 MOV FOOD_X,#4 ;第一颗食物X,Y坐标 MOV FOOD_Y,#13 MO

10、V SNAKE_CHANG,#3 ;初始化蛇长为3节 CLR BT0 ;T0中断标志位初始化 CLR B_KEYTEST ;键盘测试标志位初始化 CLR B_SNAKE_DED ;蛇死亡标志位初始化 CLR B_SNAKE_FOOD ;蛇吃到食物标志位初始化 CLR B_GAME_ON_OFF ;启停位清零 SETB EA ;开中断 SETB EX0 ;开INT0中断 SETB EX1 ;开外部中断INT1 SETB IT0 ;INT0负边缘触发 CLR IT1 ;INT1边缘触发方式 MOV TMOD,#01H ;定时器0工作方式 SETB ET0 ;开定时器0 SETB ES ;开串口中断

11、 MOV TMOD,#20H ;定时器1用作串口通信波特率产生器 ANL PCON,#3FH ;SMOD=0 波特率不倍增 MOV TH1,#0FDH ;波特率为9600 MOV TL1,#0FDH SETB TR1 ;开始定时 MOV SCON,#50H ;串口设为工作模式1 接收 MOV SP,#70H ;堆栈初始化 JB B_PASS,GOTO_GAME ;过关则直接跳入游戏;=;等待游戏开始 并显示SNAKE 启停键按下则显示PLAYGAME 并进入游戏模式;=SNAKE: CALL DISP_SNAKE ;等待开始时显示SNAKE JNB B_GAME_ON_OFF,SNAKE ;启

12、停标志位为0表示启停键没按下继续等待 CLR B_GAME_ON_OFF ;清除启停标志位SHEXIN: CALL DISP_SHEXIN ;启停键按下显示PLAYGAME进入游戏 JNB B_GAME_ON_OFF,SHEXIN CLR B_GAME_ON_OFF ;清除启停标志位GOTO_GAME: CLR B_PASS MOV DPTR,#65536-20000 ;定时器0定时初值 MOV TH0,DPH MOV TL0,DPL SETB TR0 ;开定时器;=;游戏主程序 判断键盘, 移动, 是否死亡, 吃食, 显示;=MAIN_GAME: JNB BT0,MAIN_GAME ;等待T

13、0中断 CLR BT0 ;清除T0中断标志 CALL KEYTEST ;调用键盘测试程序 JNB B_KEYTEST,NOKEY ;判断是否有键按下 CALL READKEY_X_Y ;有键按下调用键盘操作子程序 CJNE A,#0F0H,XX_X_YY_Y ;再次判断是否有键按下 JMP NOKEYXX_X_YY_Y: ;有键按下将取得的方向值送入 X,Y MOV X,XX MOV Y,YYNOKEY: DJNZ TIME_400,MAINDISP ;等待400MS到 MOV TIME_400,TIME ;重送初值 CLR P3.7 INC PUT_FOOD ;对移动次数进行计数从而产生随机

14、码 CALL SNAKE_MOVE ;调用蛇身移动子程序=1 CALL SNAKE_DED ;判断蛇是否死亡子程序=2 JB B_SNAKE_DED,GAMEOVER ;死亡则显示GAMEOVER CALL SNAKE_FOOD ;判断是否吃到食物子程序=3 JNB B_SNAKE_FOOD,MAINDISP CALL SNAKE_ZHANGCHANG ;吃到食物则增长一节并重放食物=4 JNB B_PASS,MAINDISP CLR TR0 CALL SNAKE_PASS MOV A,PASS_NUM CJNE A,#10,GOTO_START JMP START_1MAINDISP: CA

15、LL GAME_DISP ;显示蛇=5 JB B_GAME_ON_OFF,GAMEOVER JMP MAIN_GAME ;继续循环GAMEOVER: CLR TR0 CLR B_GAME_ON_OFF CALL DISP_GAMEOVER ;启停键在游戏中按下则结束显示GAMEOVER JNB B_GAME_ON_OFF,GAMEOVER ;再次按下启停键则进入SNAKE进行等待 CLR B_GAME_ON_OFF ;清除启停标志位GOTO_START: JMP START ;=;T0中断服务子程序 重送初值 置标志位;=T0_SET: MOV DPTR,#65536-20000 MOV TH

16、0,DPH MOV TL0,DPL SETB BT0 RETI;=;INTO中断服务子程序 启 , 停;=GAME_ON_OFF: ;INTO中断服务子程序 CLR EX0 JB P3.2,OUT CALL DEL_10MS JB P3.2,OUT SETB B_GAME_ON_OFF ;置启停标志位为1表示按下 OUT: SETB EX0 RETI;=;键盘测试子程序 有键按下则 B_KEYTEST=1;=KEYTEST: SETB B_KEYTEST MOV A,P1 ANL A,#0F0H CJNE A,#0F0H,KEYTEST_OUT CLR B_KEYTESTKEYTEST_OUT

17、: RET;=;读键值并得出方向 ,即 X, Y的值;=READKEY_X_Y: JNB P1.4,PD_UP_DOWN1 ;判断是否为向上键按下 JMP KEY_DOWNPD_UP_DOWN1: MOV A,Y CJNE A,#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,

18、#0 JMP READKEY_OUTKEY_LEFT: JNB P1.5,PD_LEFT_RIGHT1 ;判断是否为向左键按下 JMP KEY_RIGHTPD_LEFT_RIGHT1: MOV A,X CJNE A,#0,KEY_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 ;向右键按下则置方向标志

19、 MOV YY,#0READKEY_OUT: MOV A,P1 ;去抖 ANL A,#0F0H RET;=;蛇移动子程序;=SNAKE_MOVE: MOV R1,SNAKE_CHANG MOV A,SNAKE_TOU_X ADD A,X ;蛇头X坐标加上 方向X坐标 MOV R0,#SNAKE_TOU_XMOVE_CHANGE_X: ;依次将前一个蛇身X坐标转向下一蛇身X坐标 XCH A,R0 INC R0 DJNZ R1,MOVE_CHANGE_X ;MOV SNAKE_TAIL_X,A MOV R1,SNAKE_CHANG MOV A,SNAKE_TOU_Y ADD A,Y ;蛇头Y坐标加

20、上 方向Y坐标 MOV R0,#SNAKE_TOU_YMOVE_CHANGE_Y: ;依次将前一个蛇身Y坐标转向下一蛇身Y坐标 XCH A,R0 INC R0 DJNZ R1,MOVE_CHANGE_Y ;MOV SNAKE_TAIL_Y,A RET;=;蛇显示子程序;=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 M

21、OV 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 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,#00H CJNE R2,#0,COUNT_

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

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