欢迎来到工友文库! | 帮助中心 工友共享,造福你我!
工友文库
全部分类
  • 行业文库 >
    行业文库
    行业标准 农林牧渔 能源矿业 电力热力 水利环境 材料技术 地理测绘 建筑工程 机械工程 制造加工 交通物流 网络计算 电气机电 信息通讯 汽车行业 航空航天 船舶工程 光电工程 住宿餐饮 财会金融 房地产业 城建规划 装饰装修 家电维修 电商行业 租赁商务 批发零售 居民服务 教育服务 医药卫生 体育行业 公共管理 图书管理 外语翻译 休闲旅游 文艺传媒 其他行业
  • 商业文档 >
    商业文档
    企业计划 工程管理 广告经营 财务报表 物业管理 质控管理 企业文化 绩效管理 商务礼仪 创业孵化 市场营销 经营企划 销售管理 营销创新 资本运营 招商加盟 合同协议 信息管理 励志材料 人事档案 员工关系 薪酬管理 招聘面试 其它文档
  • 办公文书 >
    办公文书
    统计图表 总结报告 演讲致辞 心得体会 述职报告 工作计划 解决方案 调研报告 事务文书 经验事迹 往来文书 规章制度 申请范文 求职简历 活动策划 会议纪要 党建材料 软件教程 其他文书
  • PPT模板库 >
    PPT模板库
    扁平风格 创意新颖 动画效果 动态模板 简约风格 静态模板 环保绿色 卡通风格 立体风格 欧洲风格 手绘风格 创意黑板 相册风格 星空风格 炫酷科技 中国风格 医疗风格 高端商务 工作常用 总结报告 毕业答辩 节日庆典 公益风格 化妆美容 婚礼策划 餐饮美食 培训课件 融资路演 商业策划 英文模板 党政机关 述职竞聘
  • 小学初中 >
    小学初中
    幼儿教育 小学语文 小学数学 小学英语 初中语文 初中数学 初中英语 初中物理 初中化学 初中地理 初中生物 初中政治 初中历史 思想品德 小学竞赛 初中竞赛 其他学科
  • 高中教育 >
    高中教育
    高中语文 高中数学 高中英语 高中物理 高中化学 高中生物 高中地理 高中政治 高中历史 高考资料 高中竞赛 其他学科
  • 高等教育 >
    高等教育
    基础课 艺术类 哲学类 体育类 水利类 测绘类 法学类 历史学 社会学 心理学 教育学 政治学 统计学 房地产 语言文化 生物科学 医药卫生 天文气象 地理科学 环境科学 系统科学 材料科学 机械仪表 图书档案 土建工程 海洋工程 轻工纺织 工程力学 能源动力 光电工程 电力技术 市政工程 财会金融 工商管理 语言文学 广播影视 公安司法 汽车汽修 交通运输 水产加工 植物生产 森林资源 动物科学 食品加工 餐饮旅游 公共事业 新闻传播学 农林业工程 城镇规划管理 水文与水资源 地矿及资源勘查 航空航天与武器 管理科学与工程 农林业经济管理 机电设备及自动化 计算机与信息科学 大学生竞赛资料
  • 执业资格考试 >
    执业资格考试
    财会类考试 建筑类考试 外贸类考试 外语类考试 医药类考试 管理类考试 公务员类考试 司法法律考试 教师资格考试 计算机类考试 公共服务类考试 其他资格证考试
  • 一线采风 >
    一线采风
    一线新闻 事迹宣传 工友作品
  • 教育视频 >
    教育视频
    幼儿教育视频 小学教育视频 初中教育视频 高中教育视频 大学教育视频 C#自学视频教程 软件视频教程 英语视频教学 其他教学视频
  • 换一换
    首页 工友文库 > 资源分类 > DOCX文档下载
     

    勇者大冒险游戏机智能控制设计.docx

    • 资源ID:3399       资源大小:507.65KB        全文页数:47页
    • 资源格式: DOCX        下载权限:注册会员/VIP会员    下载费用:2金币 【人民币2元】
    下载资源需要2金币 【人民币2元】
    已注册用户请登录:
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,既可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰   

    勇者大冒险游戏机智能控制设计.docx

    “三星视界杯”第十二届智能控制设计大赛 初级组 勇者大冒险游戏机 目 录 一、设计要求3 1、基本要求3 2、拓展要求3 二、方案比较3 1、显示方案3 2、控制方案4 3、碰撞检测方法4 三、硬件设计5 1、51单片机最小系统5 2、独立按键模块5 3、液晶显示模块5 4、红外接收模块5 5、蜂鸣器模块6 四、软件设计7 1、设计思路7 2、程序流程图8 3、算法讲解9 五、作品功能及其实现15 1、作品实现功能15 2、测试方法与测试结果16 六、模块电路及电路图17 1、51单片机最小系统17 2、独立按键电路原理图17 3、液晶显示电路原理图18 4、红外接收模块18 5、蜂鸣器接线图18 附录程序源代码19 一、设计要求 1. 基本要求 1 实现关卡障碍、陷阱的显示(关卡地图可参照超级马里奥); 2 用按键实现对勇者跳跃、前进、后退等动作的控制; 3 设计良好的人机界面,用于展示游戏记录、分数、关卡级别等信息。 2. 拓展要求 1 动作可以有对应的游戏音效,游戏背景音乐; 2 可以有敌人出现来阻碍勇者,阻碍方式不限; 3 可采用声音强度控制人物移动(可参照“不要停八分音符酱”游戏); 4 其他拓展功能。 二、方案比较 1、显示方案 ① 方案一 采用12864液晶屏进行显示,汉字图形点阵液晶显示模块,可显示汉字及图形,内置 8192 个中文汉字(16X16点阵)、128 个字符(8X16点阵)及 64X256 点阵显示 RAM(GDRAM)。 ② 方案二 采用240128液晶屏进行显示,可完成图形方式,文本方式以及图形与文本混合显示。Intel8080系列微处理器接口,可与MCU 单片机直接连接,广泛应用于各类仪器仪表与电子设备上。 方案选择12864液晶屏地址不连续,且分为上下两个屏,240128液晶屏地址连续,不分屏,易于操作,综合考虑后采用方案二。 2、控制方案 ① 方案一 独立键盘输入,即一个键盘对应一个IO口,通过IO口高低电频变化,来判断按键是否按下。 ② 方案二 矩阵键盘输入,相对于独立键盘矩阵键盘可以在占用较少的IO口的情况下,最大化按键的数量。 ③ 方案三 使用红外发射和接收模块进行控制,通过红外遥控实现对游戏人物的远距离操控。 方案选择本作品设置前进键、后退键、跳跃键、复位键共四个按键,占用IO口较少,为简化操作,与方案二相比较,考虑采用方案一。方案三与方案一不冲突,且可作为拓展功能。综合考虑后决定采用方案一与方案三相结合的控制方案。 3、碰撞检测方法 ① 方案一 实时检测勇者的地址与障碍物的地址范围是否有重叠,如果有重叠则判断为相撞。 ② 方案二 实时读取勇者和障碍物的地址显示内容,与勇者和障碍物的图形编码比较,如果不同则判断为相撞。 方案选择方案一直接对勇者和障碍物的地址进行数值比较,根据计较结果进行判断。方案二首先要读取液晶屏对应地址的显示内容,再与图形编码比较进行判断,而读取液晶屏显示内容会占用额外的开销,需要执行时间,会影响程序的运行。综合考虑后决定采用方案一。 三、硬件设计 1、51单片机最小系统 STC89C516RD芯片作为主控芯片,具有操作简单的优点,有64K flash程 序存储器,1280字节SRAM,对于本作品,内存足够; 2、独立按键模块 4个独立按键进行操控,其中两个控制勇者的左右移动,一个作为跳跃键,一个作为单片机复位键,按键数量少,采用独立按键的方式使得操作非常简单; 3、液晶显示模块 游戏界面的显示采用240128液晶屏,可完成图形方式,文本方式以及图形与文本混合显示。Intel8080系列微处理器接口,可与MCU 单片机直接连接,广泛应用于各类仪器仪表与电子设备上。 4、红外接收模块 本作品的红外协议采用的是NEC协议该协议一旦检测到遥控器的按键被按下,则发出红外信号,一个完整的信号周期具有一个引导码、两个地址码和两个数据码,通过检测每个脉冲的脉宽来判断是逻辑1还是逻辑0,具体规则如下逻辑1为2.25ms,脉冲时间560us;逻辑0为1.12ms,脉冲时间560us。 首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit 的命令码(也是从低有效位开始发),而后也是8bit 的命令码的反码。如下图 以上是一个正常的序列,但可能存在一种情况如果一直按着1个键的话发送的是以108ms为周期的重复码,如下图 5、蜂鸣器模块 本作品采用的是有源蜂鸣器,工作电压为3.5v5.5v。 四、软件设计 1、设计思路 1) 所有图形的移动都是通过三个步骤来实现的,即清除图形、改变图形的地址、在新的地址重新显示图形,本作品中所有的图形移动都采取这种方式; 2) 障碍物的随机出现,采用keil c51自带的产生随机数函数rand,但rand 产生的是伪随机数,因此本作品会配合srand函数来产生随机数; 3)按键检测,实时检测按键,并作出相应的动作,如左右移动和跳跃, 另外,按下跳跃键,有“滴”的一声发出; 4)检测勇者的前面是否有箱子阻碍,是通过判断勇者前面的地址范围与箱 子的地址范围是否重叠; 5) 障碍物砸到勇者判定,通过检测勇者的地址与障碍物的地址范围是否有重叠; 6) 若障碍物砸中勇者或者勇者掉进陷阱,则判定游戏结束; 7) 用定时器来控制障碍物的出现和移动。 2、程序流程图 开始 初始化 游戏结束,显示gameover界面 进入游戏 按键遥控操作勇者左右移动和跳跃,躲避障碍物 勇者是否掉进陷阱 勇者是否碰到了障碍物 结束 否 是 是 检测是否通关 否 游戏结束,显示恭喜通关界面 是 否 检测是否超过预定时间 是 否 3、算法讲解 ①按键检测功能函数,如果检测到了独立按键或者红外遥控器的按键按下,则根据实际情况作出相应的判断,主要有以下几种情况 1)没有碰到箱子,也没有掉进陷阱,那么前进一步; 2)碰到了箱子,那么原地不动; 3)为了达到勇者前进的效果,当勇者已经到达了液晶屏的中间,则不移动勇者,而去移动地图,也即屏幕上的其他图形移动已达到勇者前进的效果。 值得一提的是勇者在下落的过程中,如果检测到叫下方地址上存在不为零的数据编码,则停止下落,这样就可以实现勇者跳跃到箱子上,从而实现勇者跳跃过箱子的阻碍。 其实现代码如下 /*检测勇者的前进键是否按下*/ void forward { ifkey10||value64 //如果按键key1或者遥控器的前进键按下,勇者前进 { delay_ms10; ifkey10||value64 { ifdown_flag//1为勇者右转 { clshero_add,16,2; displayhero_add,16,2,hero1; down_flag0; } else { position; ifhero_add3013//若勇者已经到达屏幕的中间,则地图移动 { fori0;i3;i { ifj3positionbox_pos[guanqia_flag][j] { box_add[j2]3566;j; //箱子从右侧出现 } } fori0;i2;i { ifk2positiontrap_pos[guanqia_flag][k] { trap_add4047;k; //陷阱从右侧出现 } } fori0;i2;i //检测勇者是否被箱子阻碍 { ifbox_add[i]0 { ifbox_add[i]hero_add2||box_add[i]-478hero_add2 ifbox_add[i]-hero_add-2300box_add[i]-hero_add-2480||box_add[i]-478-hero_add-2300box_add[i]-478-hero_add-2480 { position--;flag0;break; //若被阻碍,标志位置零 } } } ifflagposition100 //若未被阻碍并且勇者还没到地图的最后场景 { fori0;i2;i { ifbox_add[i]0//箱子移动 { clsbox_add[i],16,2; clsbox_add[i]-478,32,2; ifbox_add[i]3540{box_add[i]0;continue;} box_add[i]--; display_highbox_add[i],16,2; display_highbox_add[i]-478,32,2; } } fori0;i2;i { ifxiaoguai_add[i]0//小怪移动 { clsxiaoguai_add[i],8,1; xiaoguai_add[i]--; display_highxiaoguai_add[i],8,1; } } iftrap_add0//陷阱移动 { display_hightrap_add,10,3; iftrap_add4020trap_add0; iftrap_add0 { trap_add--; clstrap_add,10,3; } } } ifflagposition100 //若被阻碍并且勇者到了地图的最后场景 { clshero_add,16,2; //那么移动勇者 hero_add; displayhero_add,16,2,hero1; down_flag0; } flag1; //标志位置一,等待下次勇者被箱子阻碍 } else//勇者未在屏幕中间 { fori0;i2;i//检测勇者是否被箱子阻碍 {ifbox_add[i]0 ifbox_add[i]hero_add2||box_add[i]-478hero_add2 ifbox_add[i]-hero_add-2300box_add[i]-hero_add-2480||box_add[i]-478-hero_add-2300box_add[i]-478-hero_add-2480 {position--;flag0;break;} } ifflag //若未被阻碍 { clshero_add,16,2; hero_add; displayhero_add,16,2,hero1; down_flag0; } flag1; //标志位置一,等待下次勇者被箱子阻碍 } } ifNEC_flag0 value0; } } } /*检测勇者的后退键是否按下*/ void back { ifkey20||value68 //如果按键key2或者遥控器的后退键按下,勇者后退 { delay_ms10; ifkey20||value68 { ifdown_flag //0为勇者左转 { clshero_add,16,2; displayhero_add,16,2,hero2; down_flag1; } else { fori0;i2;i {ifbox_add[i]0 ifbox_add[i]484-hero_add300box_add[i]484-hero_add1440 {flag0;break;} } ifhero_add300flag { clshero_add,16,2; hero_add--;position--; displayhero_add,16,2,hero2; down_flag1; } flag1; } ifNEC_flag0 value0; } } } /*检测勇者的跳跃键是否按下*/ void jump { ifkey30||value67//如果按键key3或者遥控器的跳跃键按下,勇者跳跃 { delay_ms10; ifkey30||value67 { foot_data[0]read_datahero_add480; foot_data[1]read_datahero_add481; iffoot_data[0]0 x00||foot_data[1]0 x00 { higher4; feng0; delay_ms20; feng1; } ifNEC_flag0 value0; } } ifhigher0 { foot_data[0]read_datahero_add480; foot_data[1]read_datahero_add481; iffoot_data[0]0 x00foot_data[1]0 x00 { clshero_add,16,2; hero_addhero_add30*8; ifdown_flag displayhero_add,16,2,hero1; else displayhero_add,16,2,hero2; } } ifhigher0 { clshero_add,16,2; hero_addhero_add-30*8; ifdown_flag displayhero_add,16,2,hero1; else displayhero_add,16,2,hero2; higher--; } } ②红外遥控编码和解码函数若按下遥控器的按键得时间大于36ms,则遥控器会发出相应的红外信号,具体的编码过程上面已经讲过,其实现代码如下 /*T0和外部中断0实现编码*/ void timer0 interrupt 1 { IRtime; //每触发一次为278us } void int0 interrupt 0 { static uchar i; static bit startflag; ifstartflag { ifIRtime53IRtime32 {i0;NEC_flag1;} IRdata[i]IRtime; IRtime0; i; ifi33 { i0; IR_ok1; } } else { IRtime0; startflag1; } } /*解码函数*/ void IRcordpro { uchar i,k; k17; fori0;i8;i { ifIRdata[ki]5//如果脉宽大于278us*51.39ms,那么判断为1 value|0 x80; ifi7 { value1; } } IRpro_ok1; } /*检测是否解码*/ void NEC_pro { ifIR_ok //判断脉宽是否检测完毕 { IRcordpro; //解码 IR_ok0; //重新等待脉宽检测 ifIRpro_ok //判断解码是否完成 { IRpro_ok0;//重新等待解码完成 } } } 五、作品功能及其实现 1、作品实现功能 ①勇者大冒险的基本操作如勇者的移动、跳跃,可以通过独立按键来实现,也可以通过遥控器上的按键来操作,如按下遥控器的第二行第二个键,则勇者前进; ②开启音乐和结束音乐,跳跃时带有音效开始游戏和结束时时,蜂鸣器会播放一段短暂的音乐; ③实现遥控器的远程操作采用NEC红外协议,由于本游戏实现的功能相对简单,所以只使用了遥控器上的四个键,分别为遥控器面板上的第一行的第二个键(“CH”键)和第二行的三个按键(“后退”键、“前进”键、“跳跃”键),按下“CH”键可以实现对单片机进行软件复位; ④障碍物的随机出现障碍物从屏幕的上方随机出现,阻碍勇者的前进。 2、测试方法与测试结果 硬件外观 游戏界面 红外遥控器(本作品仅使用“CH”和第二行共四个键) 六、模块电路及电路图 1、51单片机最小系统 2、独立按键电路原理图 3、240128液晶显示电路原理图 4、红外接收模块 5、蜂鸣器接线图 附录程序源代码 /******************************************************* 主控芯片STC89C516RD 显示器LCD240128液晶屏 编程环境keil 3 功能勇者大冒险游戏机 ********************************************************/ include reg52.h include intrins.h include stdlib.h include pic.h define uchar unsigned char define uint unsigned int define lcd_data P1 sfr ISP_CONTR0 xe7; sbit CD P34; sbit WR0 P37; sbit RD0 P36; sbit CS P35; sbit RESTP33; sbit FS P20; sbit key1P24; //前进 sbit key2P22; //后退 sbit key3P25; //跳跃 sbit feng P27; //蜂鸣器 uchar time1,time2,time3; char time_value40; //每个关卡设置40s的时间 bit IRpro_ok,IR_ok,NEC_flag; //解码完成检测,脉宽完成检测 uint IRtime; //检测脉宽持续时间 uchar IRdata[33]; //储存红外的33位数据 uchar value; //储存数据码数值(第17位到滴24位) uchar STH0; uchar STL0; uchar xdata seed;//随机数种子 bit flag1,down_flag,start_flag; //flag是勇者是否被阻止标志位,down_flag是转向标志位,start_flag是播放音乐标志位 uint hero_add1140,xiaoguai_add[2],box_add[2],trap_add;//勇者、小怪、箱子、陷阱的地址 uchar higher0,foot_data[3],i,j,k,position1,guanqia_flag,p; //higher是勇者剩余上升步数,foot_data[]是勇者或小怪下方的数据,position表示位置(勇者前进的步数) //guanqia_flag是关卡标志 uchar box_pos[][3]{{20,36,60},{16,30,69},{25,50,70}};//箱子的位置 uchar trap_pos[][2]{{29,67},{20,65},{30,60}};//陷阱的位置 /*------------------------------------------------- 功 能 说 明 delay about 1 us -------------------------------------------------*/ void delay_usuint us_value { whileus_value-- { _nop_; _nop_; } } /*------------------------------------------------- 功 能 说 明 毫秒级延时函数 -------------------------------------------------*/ void delay_msuint ms_value { uint i,j; fori0;ims_value;i forj0;j114;j; } /*开头音乐*/ void delayuint xms { int i,j; fori0;ixms;i forj0;j200;j; } void toneuchar x,uchar y { STH0tonenum[y][x][0]; STL0tonenum[y][x][1]; } void playtoneuchar x,uchar y,uint z { ifx0 { tonex,y; TR11; delayz; TR10; } else delayz; } void playsong_begin { playtone3,1,100; playtone3,1,100; playtone0,1,100; playtone3,1,100; playtone0,1,100; playtone1,1,100; playtone3,1,100; playtone5,1,100; playtone0,1,700; feng1; } /*通关音乐*/ void playsong_end { playtone7,0,100; playtone4,1,100; playtone0,1,100; playtone4,1,100; playtone4,1,50; playtone0,1,50; playtone3,1,50; playtone0,1,50; playtone2,1,50; playtone0,1,50; playtone1,1,100; playtone0,1,700; feng1; } /*------------------------------------------------- 功 能 说 明 判忙状态 -------------------------------------------------*/ void init { TMOD0 x12; //定时器T0工作方式1 定时器0工作方式2 TH00 x00; TL00 x00; TH165536-45872/256; TL165536-45872256; EA1;//开总中断 ET01;//开定时器0中断 TR01;//启动定时器0 IT01; //外部中断0为跳变沿触发方式,来一个下降沿触发一次 EX01;//启动外部中断0 ET11; //开定时器T1中断 TR11; //启动定时器T1 } /*解码函数*/ void IRcordpro { uchar i,k; k17; fori0;i8;i { ifIRdata[ki]5//如果脉宽大于278us*51.39ms,那么判断为1 value|0 x80; ifi7 { value1; } } IRpro_ok1; } /*检测是否解码*/ void NEC_pro { ifIR_ok //判断脉宽是否检测完毕 { IRcordpro; //解码 IR_ok0; //重新等待脉宽检测 ifIRpro_ok //判断解码是否完成 { IRpro_ok0;//重新等待解码完成 } } } void RWCheck { lcd_data0 xff; CD1; WR01; RD00; whilelcd_data0 x030 x03; RD01; } /*------------------------------------------------- 功 能 说 明 读状态位 -------------------------------------------------*/ uchar read_status { uchar temp; RWCheck; lcd_data 0 x00; CS0; CD0; WR01;//A01 is seted to read 128mand RD00;//to read delay_us1; templcd_data; RD01;//read index to reset CS1; return temp; } /*------------------------------------------------- 功 能 说 明 写命令 -------------------------------------------------*/ void wr_uchar { RWCheck; lcd_data 0 x00; CS0; CD 1; RD0 1; WR0 0; lcd_data ; WR0 1; CS 1; } /*------------------------------------------------- 功 能 说 明 写数据 -------------------------------------------------*/ void wr_datauchar wdata { RWCheck; lcd_data 0 x00; CS0; CD 0; RD0 1; WR0 0; lcd_data wdata; WR0 1; CS 1; } /*------------------------------------------------- 功 能 说 明 写双字节数据低位在前,高位在后 -------------------------------------------------*/ void wr__data uchar ,uchar dat1,uchar dat2 { wr_datadat1; wr_datadat2; wr_; } /*------------------------------------------------- 功 能 说 明 文本区清0 -------------------------------------------------*/ void Text_cls { uint i; wr__data0 x24,0 x00,0 x00; wr_0 xb0; fori0;i480;i { wr_data0 x00; } wr_0 xb2; } /*----------------------------------- 功能说明读一个字节数据 ------------------------------------*/ uchar read_datauint address { uint high_address,low_address; uchar temp0 x00; high_addressaddress/256; low_addressaddress256; wr__data0 x24,low_address,high_address; wr_0 xb1; tempread_status; wr_0 xb2; return temp; } /*-------------------------------------------- 功能说明清除函数 参数说明address--清除的起始地址

    注意事项

    本文(勇者大冒险游戏机智能控制设计.docx)为本站会员(admin)主动上传,工友文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知工友文库(发送邮件至gydoc@qq.com或直接QQ联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    copyright@ 2019-2022 工友文库网站版权所有
    经营许可证编号:鲁ICP备19032292号-1


    1
    收起
    展开