欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    嵌入式系统设计课程设计基于μCOSII的贪吃蛇游戏嵌入式系统实现方案设计.doc

    • 资源ID:11064618       资源大小:1.41MB        全文页数:15页
    • 资源格式: DOC        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    嵌入式系统设计课程设计基于μCOSII的贪吃蛇游戏嵌入式系统实现方案设计.doc

    计算机科学与技术学院 嵌入式系统设计课程设计设计题目: 基于C/OS-II的贪吃蛇游戏 嵌入式系统实现方案设计 专业班级: 计算机科学学院2008级(2)班 组 员: 指导教师: 设计时间: 2011/7/42011/7/8 设计地点: 明理楼B319 基于C/OS-II的贪食蛇游戏设计C/OS-II实时操作系统简介C/OS-是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。 C/OS-II 的前身是C/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在嵌入式系统编程杂志的5 月和6 月刊上刊登的文章连载,并把C/OS 的源码发布在该杂志的B B S 上。C/OS 和C/OS-II 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将C/OS-II嵌人到开发的产品中。C/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。C/OS-II 已经移植到了几乎所有知名的CPU 上。严格地说C/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于C/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。一、方案论证方案一如图1.1所示,采用AT89C52和1602液晶显示。AT89C52芯片是一款非常常用的芯片,具有32个IO口及多个定时器中断,添加外部ram后能够实现ucos-II的移植。这里AT89C52作为主控芯片,实现多任务操作。如1602不断刷新显示字符串,流水灯同时产生不同的变化。1602液晶2K*8 RAM流水灯AT89C52图1.1系统框图方案二如图4.2所示,采用MSP430和KS0108的12864液晶显示。MSP430 系列是一个 16 位的、具有精简指令集的、超低功耗的混合型单片机。KS0108是不带中文字库的128*64大液晶。由这两个作为主要芯片,8个并行按键能实现基于ucos-II的贪食蛇游戏设计。12864液晶8个并行按键MSP430图4.2系统框图方案三如图所示,采用STC89C58RD+和ST7920的12864液晶显示C58RD+有32K FLASH, 256 Bytes的片内RAM, 1K 的XRAM。在资源方面完全满足ucos的移植,12864液晶采用带中文字库的ST7920芯片。键盘由4*4矩阵键盘组成。12864液晶发光二极管STC89C58RD+4*4矩阵键盘图1.3系统框图方案对比1、 复杂度从硬件来看最复杂的应该是方案一,需要扩展外部RAM存储器。而且占用了一排通用IO口,造成了资源的浪费。从软件来看最复杂的应该是方案二,MSP430虽然性能优越,但编程较为复杂,需要掌握更多的汇编指令。2、 实用性显然第三种方案更为实用,需要的东西均为模块化设计,只需改动程序便可实现多种功能。而方案二MSP430资源丰富,应该用于更为复杂的程序设计,在这里就有些大材小用了。3、 性价比价格而言方案三与方案二基本差不多,主要是方案三采用国产的STC芯片价格更为实惠。而方案二价格芯片价格较高,不适合做小游戏的开发。综上所述,本课程设计采用方案三。二、硬件系统设计1、单片机最小系统图2.1 STC89C58RD+最小系统2、12864液晶电路液晶接口说明1、 VSS 电源地2、 VDD电源正极3、 NC悬空4、 RS数据/命令选择端5、 RW读/写控制信号6、 E使能信号7-14DataI/O15、PSB串行/并行数据选择16、NC空脚17、/RST复位端18、VOUT接10k到地19、BLA背光正极20、BLK背光负极图2.2 12864液晶接口电路3、矩阵键盘采用4*4矩阵键盘图2.3矩阵键盘4、 led闪烁电路图2.4 led闪烁电路5、整体电路见附录一6、元器件清单名称数量AT89C58RD+1块12864液晶模块1块电路基板1块按键17个40脚单片机底座1个排针20脚1个导线若干表 2.1 元器件清单三、软件设计1、程序框图依据硬件系统设计,软件系统设计主要包括:Task2判断按键方向刷新蛇体12864初始化是否撞墙开机画面游戏初始化吃到食物按任意键开始游戏加100分游戏开始游戏结束分数大于1400图3.1贪食蛇任务框图开始Task1中断初始化Led1=0任务初始化led1=led1任务调度创建任务任务开始图3.2 ucos系统框图图3.3 任务一框图1、 程序清单见附录三2、 内核裁剪未裁剪前:Program Size: data=40.1 xdata=1744 code=8561裁剪内容:修改OS_CPU.H文件:#define CPU_MAX_STK_SIZE0xF8改为0x28修改OS_CFG.H文件:#define OS_MAX_TASKS 10 改为4#define OS_LOWEST_PRIO 10 改为4裁剪后:Program Size: data=40.1 xdata=1021 code=8573四、系统调试1、 软件调试根据程序框图,写出对应的程序,在keilC中进行调试编译,生成.hex文件。在Proteus中画出电路图,并装载上述生成的.hex文件,仿真观察结果,根据结果再对程序进行修改,调试,直到满意为止。图4.1仿真电路图2、硬件调试2.1、检查元器件 在焊接之前应先检查各元器件的好坏。按键: 按键有四个引脚,分为两对,每对之间是导通的,对角线上是断开的,按下按键时导通,则用万用表的二极管档逐一检查好坏。2.2、排列元器件由于本次课程设计采用的是万用板,元器件在电路上的排列要自己排列分布好,以为焊接减少不必要的麻烦。2.3、焊接 在分布好元器件的格局后,开始焊接,先焊接单片机底座、排母、其它元器件。焊接完元器件后即元器件分布在万用板上已定型。然后根据电路图,用导线连接各引脚。在用导线连接时应注意,导线焊接在元器件引脚上时剥皮部分长度要适中。每焊完一个元器件都应该检查是否有错。2.4、调试按照电路图焊接完毕后,检查电路完毕后。单片机和液晶先不装上去,接上电源,用万用表测试单片机和液晶的电源引脚,看其值是否正常,不正常检查电路调试直至正常。以避免烧坏元器件。完成以上步骤后,接上电源装上单片机和液晶,看是否实现功能。如果出错,检查电路,调试,直至出现正确结果。五、心得体会本次课程设计与前几次的课程设计大有不同,第一次使用到了操作系统ucos。这个操作系统虽然很小只有几K不到,但功能依然很强大。Ucos_ii是开源免费的操作系统,而且流行使用已有快20年了,是一个学习资源丰富的操作系统。此次ucos课程设计,学到的东西也很丰富,也很复杂。就操作系统本身而言,移植就必须面临裁剪内核,只有对内核有一定的了解才可能深入的去裁剪一些不需要的模块,好在ucos_ii的移植性非常好,移植需要的代码一般情况下也就是三个主要的C程序,而需要的修改的部分也显得较为简单。只需要修改一些数值,如#define OS_MEM_EN 0将0设置为1则表示启用该模块,为0则不使用该模块。另外对于CPU堆栈空间的设定也是如此。在实现多任务运行时,也有很多方面需要考虑到。例如多任务的管理,毕竟CPU只有一个,怎样才能实现同时运行?就需要了解每个任务的优先级的设定,该任务的运行时间,延时的分配。这些都要先了解该操作系统才能进行的。而在移植贪食蛇游戏就面临了12864芯片不同的情况。已有的贪食蛇游戏是针对不带字库的12864编写的,而我的手上的12864却是带中文字库的。首先在引脚连接方面就出现了不少情况,与一般的1602引脚接法不一样,VO可以悬空,但VOUT脚必须接10K电阻到地,否则液晶无法显示。另外修改程序也花了很长一段时间,不过正是花费时间去考虑这些程序时才让我了解到一个大程序编写规则的重要性。如果将每一个模块都像硬件设计那样分开模块,那么移植的时候只需要针对不同的芯片相应的改动程序即可。所以在以后的编写程序中,规范化,模块化将是编程的重点。六、参考文献1 Jean J Labrosse嵌入式实时操作系统C/OS-IIM.邵贝贝译北京:北京航空航天大学出版社,20032 任哲.嵌入式实时操作系统C/OS-II原理及应用M北京:北京航空航天大学出版社,20033 沈睿. C/OS-在DSP2407 上若干移植问题的研究J.中国水运,2007,5(5):43-44.4 马忠梅编著.单片机的C语言应用程序设计M.北京:北京航空航天出版社,2OO3.5 徐灵伟,刘飞.基于C/OS-的嵌入式中断实现与扩展C.北京:中国控制与决策学会,2007 :999-10026 ucos51移植心得,杨屹,巨龙公司系统集成开发部 七、附录附录一附录二实物反面实物正面附录三#include ".uc_os_IIincludes.h"OS_STK xdata Task1StackCPU_MAX_STK_SIZE;OS_STK xdata Task2StackCPU_MAX_STK_SIZE;sbit led1=P30;void Task1(void xdata * ppdata) reentrantppdata = ppdata;led1=0;while(1)led1=led1;OSTimeDlyHMSM(0, 0, 0, 500);void Task2(void xdata * ppdata) reentrantppdata = ppdata;while(1)snake12864();OSTimeDlyHMSM(0, 0, 0, 50);void InterruptInitial()/* set timer. 50ms, THTL = 3caf when cpu at 12MHz */TMOD |= 0x11;TH0 = 0x70;TL0 = 0x00;/* TR0 is set in OSStart() */ET0 = 1;main()InterruptInitial(); OSInit(); OSTaskCreate(Task1, (void xdata *)0, &Task1Stack0,2);OSTaskCreate(Task2, (void xdata *)0, &Task2Stack0,3); OSStart();#include ".drivergraphcode.h"#include ".driverlcddriver.h"#define uint unsigned int#define uchar unsigned char#define up 0x14#define down 0x44#define left 0x28#define right 0x22#define quit 0x11uchar bdata snake_flag;sbit gameover=snake_flag3;sbit food=snake_flag2;uchar num=0;uchar temp;uchar idata snake_len;uchar xdata snake2562;uchar idata snake_food2;uintmarker;ucharno_counter;void delayms(uint x)uint i;for(;x>0;x-) for(i=0;i<1500;i+);uchar getkey(void)uchar col_code,row_code;P2=0xf0;if(P2!=0xf0)delayms(5);if(P2!=0xf0)row_code=0xfe;while(row_code&0x10)P2=row_code;if(P2!=row_code)col_code=(P2&0xf0)|0x0f;return(row_code)|(col_code);elserow_code=(row_code<<1)|0x01;return(0);bit compare(uchar x,uchar y)uchar counter;for (counter=0;counter<snake_len;counter+)if(snakecounter0=x)&&(snakecounter1=y) return(0);return(1);void set_food(void)uchar i,j;bit compare_flag;i=TL0&0x3f;j=TH0&0x3f;if(i=0) i+;if(i=0x4f) i-;if(j=0x4f) j-;if(j=0) j+;docompare_flag=compare(i,j);if(!compare_flag)i+;j+;if(i>63) i=1;if(j>63) j=1;while(!compare_flag);drawPoint(i,j,1);snake_food0=i;snake_food1=j;food=1;void snake_init(void)marker=0; /分数初值no_counter=0; /吃到的食物snake_len=3; /蛇长度drawPoint(31,30,1); /画蛇,位置drawPoint(32,30,1);drawPoint(33,30,1);snake00=33; /数组中的量snake10=32;snake20=31;snake01=30;snake11=30;snake21=30;snake_flag=0x10;drawRowLine(0,0,63,1);/横线drawRowLine(0,63,63,1);drawCollumLine(0,0,63,1);/竖线drawCollumLine(63,0,63,1);putstrxy(8,0,"score");/右框显示的内容printf_number(8,1,0);putstrxy(8,2,"按退出键");putstrxy(8,3,"退出");void snake_refresh() /刷新蛇uchar k;for(k=snake_len;k>0;k-) snakek0=snakek-10; snakek1=snakek-11;void snake_run(void)uchar i;snake_refresh();switch(snake_flag>>4)case(0x08):if(snake01=1)gameover=1;elsesnake01-;break;case(0x04):if(snake01=62)gameover=1;elsesnake01+;break;case(0x02):if(snake00=1)gameover=1;elsesnake00-;break;case(0x01):if(snake00=62)gameover=1;else snake00+;break;default:break;for(i=(snake_len);i>0;i-)if(snake00=snakei0)&&(snake01=snakei1)gameover=1;break;if(!gameover)if(snake00=snake_food0)&&(snake01=snake_food1)food=0;snake_len+;no_counter+;marker=no_counter*100;printf_number(8,1,marker);else drawPoint(snakesnake_len0,snakesnake_len1,0);drawPoint(snake00,snake01,1);if(no_counter>14)gameover=1;void snake_game(void)uchar key_code;charlcdfill( ); /显示清屏putstrxy(4,0," ");putstrxy(4,1,"贪吃蛇");putstrxy(4,2,"by余世安");putstrxy(2,3,"按任意键开始");while(getkey()=0);charlcdfill( ); /显示清屏snake_init(); /初始化doif(!food) set_food();/设置食物key_code=getkey();/判断按键switch(key_code)case 0:break;case up:if(snake_flag&0xf0)=0x40)break;snake_flag=(snake_flag&0x0f)|0x80;break;case down:if(snake_flag&0xf0)=0x80)break;snake_flag=(snake_flag&0x0f)|0x40;break;case left:if(snake_flag&0xf0)=0x10)break;snake_flag=(snake_flag&0x0f)|0x20;break;case right:if(snake_flag&0xf0)=0x20)break;snake_flag=(snake_flag&0x0f)|0x10;break;case quit:charlcdfill( ); /显示清屏return;default:break;snake_run(); /游戏进行delayms(10); /游戏速度if(gameover&&(no_counter!=15)charlcdfill( );glcdfill(0);putstrxy(4,1,"GAME OVER");putstrxy(0,3,"按任意键重新开始");while(getkey()=0);return;if(gameover&&(no_counter=15)charlcdfill( );glcdfill(0);putstrxy(0,1,"Congratulation!");putstrxy(0,3,"按任意键重新开始");while(getkey()=0);return; while(1);void snake12864(void)lcm_init();charlcdfill( ); /显示清屏 lcdgraphon(); /开图形模式 GXPOS=0,GYPOS=0;putimage(Img_1);delayms(300);glcdfill(0); /图形区域清屏 lcdgraphoff(); /关图形模式 while(1)snake_game();

    注意事项

    本文(嵌入式系统设计课程设计基于μCOSII的贪吃蛇游戏嵌入式系统实现方案设计.doc)为本站会员(土8路)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

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




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开