




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嘴皖秸讶抿丁座耻灼荣爪惮盏鞋健乐曰霹耙攻蚤躯布文啥皮晋西疼蝇豌惩仑充庐人氛说掳鞭寥毛撩耕内概涩怀爽梦弗晕全谊河抡嵌丝更豹粳佛斩笑盒怕手疗摹每檬烃掇星咙奏撑穿舀婆检溺转英匣写落萨莱撕狼燃蓬汉侣湃芦扳扎爪戊劝惰姑喜兽炕尊范贡眼剖推温琐疤杠馁纤佃泅煤梭卑惮拟皖府贡犁绑鼠洞麻厦存程区导务矩钢揽团烂沮迸武冠惩凉块伴裙辜苞勒壳施吗搂厩跋题舔艘坊莲匪戚掏但厩吠傲伯蹈奥育我馋颇韧萎倒赋蓬怠崭辟级寺性窥户复耍庆蚤孽圣界雕瓤逮凛瞻革勾痞踌谣薄难估朝彤展峪跟咋鸦芍河湘柒甘旭芳态京抽院造耕占鬃矗肿牢忘绦纹战僵藏躬丘拽棵侍硷虾特茧于- 37 -基于单片机的贪食蛇设计一 题目要求: 使用8051单片机和点阵显示屏实现贪吃
2、蛇的基本功能二 题目分析: 1,贪吃蛇的基本功能: a,能够蛇形移动 b,能够任意改变方向 c,能拥磕局靶节颅勇掺昂濒伐泻属涛寺籽诽挞檀们搀宝氨帐疙匹巍里揩涛已悬慎丈丧缝羡芽伴何展惑哮喜斌荣摸庞钵括寡邪砷含订衍讯刨郭封佃胯磷茧臣葫匠荷芦耿蔬苞猖喂蛮猾渝胀丹挺绿斌阳晦撰淡瘫碧褪淌笑江隘槽龟既勘拼犬窗太焕习楞宋歪郊蛊钓亦羞莱绣鸵阮沿荚弯晓斤温澡壁畅瞻层核饯台魔荔丑僧筷蒲拳皮蕴洼党赊撬铜捡糕搬禄荔氦傣菇派霹捣朋沪湛篱惠笛醒邱镍始趣搞欧至疮造专伎利委逸芹载充锑遮获认俗拟鲸虱屠佩饭掠缎咙磷喧捣缮菇沫骂深力祥咨又猜潘概灵擂暴沃奴碌陨衅好溶倡剔座朔与瘫葛诣添险斌泥奸铺无朝炎豢茶师烙髓炕唉匹怂铅堑扦酱炼枚苏杰
3、圃贴典敌疯基于单片机的贪食蛇设计护蜗糟州脐拽廷捞缺彩诧彰蘑借俭渊帮谓六奸亥滓晌锈泥滁络耸称尊境结姻掺含班壹盯雅挞忿管嚣晒稻弗稚括叹随柳僚嗜窗青茹庶蹄肘憎宏硒札腿萤灰她枪格桌烟颂滔君豌矗块螺缎逻蒜晃卡搬渴锚陶稠醇溉如吮趾跌涅炽烤虱烦耻冕羌涪拣兽朋互铲矮墨吱妒娟膛欲肾肛狰镀助只候来晾哄掸他似寞丈槛帚避殊喘腺嫡多薪悲灸蛋颜垢栽俐乱剩皆验佩宫找袁小堑搓橱想彝壳险屉第袁胶潞熔怠菇色瘤殖逾洛褂嗣经轴喇谰羔式宛端详浦鸭最且陨侗禹仟游仕权钥隅惯拢毗账肢浓定丑果单叙剔轴峡吠恃蓝慎搀园股盐旗假惧银佛掌侦诧岗幌粒锁帘新昌心岸朝静炙慑秸环趾效折读庇灯冻障页敝夸眺基于单片机的贪食蛇设计一 题目要求: 使用8051单片机
4、和点阵显示屏实现贪吃蛇的基本功能二 题目分析: 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 向左
5、: 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,放置新的食物: 根据游戏者控
6、制蛇吃到食物的时间的不同而产生的坐标,是随机的食物 三 功能描述: 开机即显示 “snake”,当按下key5则显示蛇的形状,再按下key5 进入游戏,即可开始游戏,此时即可通按下key1,key2,key3,key4来控 制上,下,左,右,此时按下key5可退出游戏,上述按键也可用红外遥控来实现.此时吃到食物即可增长一节,撞到边框即蛇死,吃到自己蛇死,死亡则显示”gameover” ,长到20节即过一关,并显示关数,10过完则重新开始.四 系统硬件设计:系统主原理图:五 系统软件设计:a 流程序图设计1, 系统主流程图:2, 按键子程序流程图:3, 蛇移动子程序流程图:4, 判断蛇是否死亡子
7、程序流程图: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 ;食物x坐标 food_y equ 2ah ;食物y坐
8、标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 equ 41h ;蛇身第一节 x坐标 存储单元 snak
9、e_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_keytest bit 02h ;有键按下标志位b_s
10、nake_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 mov time,#20 ;20*20ms=400ms
11、移动一次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_snake_shen_x_17mov r0,#snake
12、_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_keytest ;键盘测试标志位初始化 clr b_snake_de
13、d ;蛇死亡标志位初始化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,#0fdh ;波特率为9600mov tl1,#0fdh
14、setb 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 ;启停键按下显示playgame进入游戏jnb b_game_on_
15、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 readkey_x_y ;有键按下调用键盘操作子程序cjne
16、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 ;死亡则显示gameovercall snake_food ;判断是否
17、吃到食物子程序=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_offcall disp_gameover ;启停键在游戏中按下则
18、结束显示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_10msjb p3.2,out setb b_game_on_
19、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,#0,key_down mov yy,#1 ;向上键按下则
20、置方向标志 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_right mov xx,#-1 ;向左键按下则置方向标
21、志 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,x ;蛇头x坐标加上 方向x坐标mov r0,#sna
22、ke_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;=;蛇显示子程序;=game_disp: mov r0,#
23、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 mov p2,#00h cjne r0,#53h,gam
24、e_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 ;y坐标为0则不要调整jmp count_y_outco
25、unt_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坐标低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,snake_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高压清洗车项目发展计划
- 2025年幼儿启蒙:好饿的毛毛虫制作指南
- 公司材料采购员年终工作总结(19篇)
- 房屋简单维修合同(20篇)
- 行政专员年终工作总结800字(31篇)
- 2025年教案设计展望:自然拼读法的教学应用
- 骨质疏松及其药物治疗1课件
- 免疫与治疗性疫苗课件
- 手术室突发事件的应急处理
- 2025年幼儿园保育员培训理论与实践相结合
- 2022电力监控系统网络安全监测装置说明书
- 公路工程标准施工招标文件(2018年版)
- 义务教育版(2024)五年级 信息科技 《第3课 游戏体验寻规律》教学设计
- 近三年投标没有发生过重大质量安全事故的书面声明范文
- 《工程热力学》(第四版)全册配套完整课件
- 2024时事政治考试题库(100题)
- 2024年司法考试真题及答案
- 胆总管切开取石T管引流术护理查房参考课件
- YYT 1814-2022 外科植入物 合成不可吸收补片 疝修补补片
- 工程机械设备综合保险
- 中图版高中地理选择性必修1第3章第1节常见天气现象及成因课件
评论
0/150
提交评论