贪吃蛇嵌入式系统课程设计报告.doc_第1页
贪吃蛇嵌入式系统课程设计报告.doc_第2页
贪吃蛇嵌入式系统课程设计报告.doc_第3页
贪吃蛇嵌入式系统课程设计报告.doc_第4页
贪吃蛇嵌入式系统课程设计报告.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式系统课程设计报告姓 名: 学 号: 题 目: 分组情况:组长:组员: 任务分配:概述1.1. 内容简介有一款经典的小游戏叫“贪食蛇”,又名贪吃蛇。就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的蛋,越吃越长。只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命。本课程设计的内容就是使用我们学习过的嵌入式系统的知识,在UP-NETARM3000 嵌入式开发硬件平台上和uc/os-ii的软件开发框架下,实现的键盘,触摸屏,LCD等硬件功能的统一的完整系统。1.2. 功能描述1 可以通过嵌入式设备的键盘和触摸屏同时控制游戏流程,键盘中起作用的是方向键(2,4,6,8);同时方向键也是贪吃蛇移动的开始键。在触摸屏中可以进行的菜单操作,包括:难度设置,暂停游戏和帮助信息。 2 贪吃蛇是由绿色连续的若干方形组成,程序中随机地出现一些“食物”(用红色的矩形表示),贪吃蛇通过吃“食物”增加自身的长度并增加相应的分值。同时,程序再随机产生一个“食物”。 3 贪吃蛇撞到矩形边界,或者自己身体的一部分,游戏即告结束。4 为了增加难度,每个“食物”都有一个计数器,贪吃蛇每走一步,计数器都会增加1,当计数器达到上限时,食物会变成石头,贪吃蛇撞到石头上,游戏也会结束。 5 贪吃蛇每吃掉一个“食物”,分值会相应增加,增加的幅度与从“食物”产生到被吃掉的时间间隔有关,时间间隔约小,分值增加越多。所以PLAYER必须尽快把食物吃掉,越早得分越高。否则它会变成石头,石头越多难度越大。2. 系统总体设计2.1. 系统硬件设计 因为条件有限,系统采用北京博创兴业科技有限公司生产UP-NETARM3000 嵌入式开发平台。UP-NETARM3000 嵌入式开发平台是一个完整的开发系统,硬件完整(包括ARM7TDMI 结构芯片S3C44B0X,工作频率60MHz;显示:320240 象素、256 色LCD,带四线电阻式触摸屏;键盘:17 键数字小键盘等),安装比较简单,完全可以实现本课题。硬件布局见图2-1-1:图2-1-12.2. 系统软件设计-多任务uc/os-II是实时多任务的嵌入式操作系统,它的内核是抢占式的实时内核,可以管理多达64个任务,高优先级的任务总是被先执行(如果该任务不是处在等待或挂起状态),其中保留8个任务给系统任务。本系统软件使用多任务编程技术,总体有5个任务来实现,其中有几个系统附加任务,我们并没有用uc/os-II的初始化函数OSAddTask_Init()创建,这样我们可以更好的了解uc/os-II的多任务调度。系统软件的总体结构如图2-2-1 图2-2-1各任务介绍:1.键盘任务,负责监听用户在键盘上的动作,以消息方式发送给主任务,主任务对用户的键盘操作做出相应的响应。 2.触摸屏任务,负责监听用户在触摸屏上的动作,以消息方式发送给主任务,主任务对用户的触摸屏操作做出相应的响应。 3.游戏主任务,负责等待接受键盘扫描任务和触摸屏扫描任务发送来的消息,决定贪吃蛇的下一步走向以及整个游戏的状态(是否结束,是否暂停等等)。4.贪吃蛇移动任务,用于实现贪吃蛇的不断移动,它受到主任务的控制。5.LCD刷新任务,负责LCD图形界面的更新。3. 原理概述键盘扫描原理zlg7289A是一片具有串行接口的,可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示键盘接口的全部功能。zlg7289A内部含有译码器,可直接接受BCD码或16进制码,并同时具有2种译码方式。此外,还具有多种控制指令,如消隐闪烁左移右移段寻址等。键盘在本课题中的作用是,贪吃蛇的方向控制,具体讲是使用键盘的2,4,6,8键作为方向键。 LCD控制原理 S3C44B0X 中具有内置的LCD 控制器,它具有将显示缓存(在系统存储器中)中的LCD图象数据传输到外部LCD 驱动电路的逻辑功能。可支持灰度LCD 和彩色LCD。在灰度LCD 上,使用基于时间的抖动算法(time-based dithering algorithm)和FRC (Frame Rate Control)方法,可以支持单色、4 级灰度和16 级灰度模式的灰度LCD。这使我们的软件界面丰富多彩,便于区别蛇,食物,石头等。触摸屏控制原理本系统触摸屏的控制是使用的FM7843芯片。FM7843是4线电阻触摸屏转换接口芯片。它是一款具有同步串行接口的12位取样模数转换器。在125kHz吞吐速率和2.7V电压下的功耗为750W,而在关闭模式下的功耗仅为0.5W。因此,ADS7843以其低功耗和高速率等特性,被广泛应用在采用电池供电的小型手持设备上。触摸屏在本课题中用于菜单,点触式的菜单,包括难度设置,暂停,帮助等菜单项。 本课题未使用嵌入式开发平台上的所有硬件,如串口,电机,音频,以太网等,所以在此不再赘述。4. 系统软件实现4.1. 数据结构设计 一个好的程序必须有一个好的数据结构。对于嵌入式程序的开发也是一样。在本程序中一个非常重要的问题就是如何表示贪吃蛇,因为好的表示,贪吃蛇的行为(移动,吃食物,碰壁等)才容易处理。另一个重要的问题就是性能:众所周知,嵌入式设备对性能是非常敏感的,于是如何优化贪吃蛇的表示,从而保证资源的最大化利用也是一个重要的问题。 本软件的主要数据结构:二维数组。如图4-1-1。 图4-1-1 这是一个8X8的二维整形数组GRID88,为了方便说明,矩阵中每一个点的取值有上,下,左,右,食物,石头,空白七种取值,那么这个矩阵的具体赋值如下: 0 1 2 3 4 5 6 7 0 空白,空白,空白,空白,空白,空白,空白,空白, 1 空白, 右 , 下 ,空白,空白,空白,空白,空白, 2 空白,空白, 下 ,空白, 右 , 右 ,空白,空白, 3 空白,空白, 下 ,空白, 上 ,空白,空白,空白, 4 空白,空白, 右 , 右 , 上 ,空白,空白,空白, 5 空白,空白,空白,空白,空白,空白,空白,空白, 6 空白,空白,空白,食物,空白,空白,石头,空白, 7 空白,空白,空白,空白,空白,空白,空白,空白 1.贪吃蛇的表示:取值为上下左右的点为贪吃蛇的身体部分,其下标表示点位置,其取值表示点的方向,这样就可以记录蛇的形状,同时用两个坐标对表示蛇的头尾,即头下标(2,5),尾下标(1,1)。 2.贪吃蛇的移动:如果GRID26=空白,需要GRID11=空白,GRID26=GRID25=右,同时修改头下标为(2,6),尾下标为(1,2)。如果GRID26=食物,只需要GRID26=GRID25=右,同时头下标(2,6)。如果GRID26=石头,游戏结束。移动一步后的矩阵如下(以第一种情况为例,其他同理): 0 1 2 3 4 5 6 7 0 空白,空白,空白,空白,空白,空白,空白,空白, 1 空白,空白, 下 ,空白,空白,空白,空白,空白, 2 空白,空白, 下 ,空白, 右 , 右 , 右 ,空白, 3 空白,空白, 下 ,空白, 上 ,空白,空白,空白, 4 空白,空白, 右 , 右 , 上 ,空白,空白,空白, 5 空白,空白,空白,空白,空白,空白,空白,空白, 6 空白,空白,空白,食物,空白,空白,石头,空白, 7 空白,空白,空白,空白,空白,空白,空白,空白 3.计分:上述中,上下左右空白食物石头分别对应一个整数的值(或一个范围)。食物刚产生时有一个初值假设为11,石头对应的整数值为31,取值在11-30范围内的都是食物,贪吃蛇每移动一步,食物的值增加1,当增大到31时,食物就变成了石头,这样31-11=20步内食物未被吃到就会变成石头。假设在第11步吃掉了食物,那么吃掉前食物的值增加到11+11=22,那么你的得分会加上31-22=9分。在第16步吃掉食物,那么吃掉食物前,食物的值增加到11+16=27,那么你的得分会加上31-27=4分。4.2. 主任务设计负责游戏初始化,等待键盘扫描任务和触摸屏扫描任务发送来的消息,决定贪吃蛇的下一步走向以及整个游戏的状态(是否结束,是否暂停等等)。流程图如图4-2-1。 图4-2-14.3. 键盘任务设计 负责监听用户在键盘上的动作,以消息方式发送给主任务,主任务对用户的键盘操作做出相应的响应。键盘任务本是系统附加任务,在这里我们自己实现,具体原理就是使用查询方式,调用系统函数GetKey,并以获得的参数创建消息结构,然后使用SendMessage将消息发送出去。源码如下:void Key_Scan_Task(void *Id) U32 key;POSTMSG pMsg;for(;) key=GetKey(0); /无限期等待键盘按下 pMsg=OSCreateMessage(OSM_KEY,key&0xffff,key16); if(pMsg) SendMessage(pMsg);4.4. 触摸屏任务设计 负责监听用户在触摸屏上的动作,以消息方式发送给主任务,主任务对用户的触摸屏操作做出相应的响应。原理同键盘任务。4.5. 贪吃蛇移动任务设计负责贪吃蛇的不断移动,是一个无限循环。其循环体的执行,受主任务的控制,具体讲就是多任务的同步。因为主任务的优先级比此任务高,主任务主要负责系统消息的处理,如果没有系统消息,主任务就会在挂起状态,所以贪吃蛇移动任务就会执行。我们定义了一个信号量Game_Run_Sem,任务先执行OSSemPend函数,等待这个信号量,如果这个信号量有效(主任务释放),那么执行移动一步的操作。移动一步的操作在数据结构的设计中有详细讲解。具体参考源程序snakeMoving函数:void snakeMoving() /贪吃蛇移动一步的函数 int x,y; getnext(hX,hY,&x,&y); /获得贪吃蛇头的下一个点坐标 if(gridfXfY+=STONE) /如果食物变成了石头,则产生新的食物 drawdot(fX,fY,BLACK); /绘制黑色石头 genFood(); /产生新的食物 if(x18|y12) /坐标在矩阵中越界了,即蛇撞到墙壁了 state = GAMEOVER; else if(gridxy=EMPTY) /前方是空白处 gridxy=gridhXhY; hX=x;hY=y; drawdot(hX,hY,GREEN); drawdot(tX,tY,YELLOW); getnext(tX,tY,&x,&y); gridtXtY=EMPTY; tX=x;tY=y; else if(gridxy=FOOD&gridxySTONE)/前方是食物 score+=(STONE - gridfXfY); gridxy=gridhXhY; hX=x;hY=y; drawdot(hX,hY,GREEN); genFood(); else /蛇撞到身体或者石头了 state=GAMEOVER;4.6. LCD刷新任务设计 负责刷新LCD显示。在其他任务向显示缓冲区绘制图形后,会OSTimeDly一段时间,这时系统后台会通过邮箱通知此任务执行LCD_Fresh函数进行LCD显示刷新。源码如下:void LCD_Fresh_Task(void *Id)INT8U err;for(;) OSMBoxPend(LCD_Fresh_MBox,0,&err); /等待系统后台刷新通知LCD_Fresh();OSTimeDly(250);5. 结论 这次对贪吃蛇的开发可以说是第一次开发一个完整的嵌入式应用程序。通过这次完整的开发过程,对嵌入式开发有了更深入的认识。 嵌入式软件开发与硬件的关系比常规的软件开发密切的多。在编程的过程中曾经因为一些硬件上的问题而耽误了不少时间。在嵌入式平台上开发应用程序,首先需要针对自己操作的嵌入式硬件平台做充分的了解,否则在开发的过程中肯定会处处碰壁。 谈到程序错误,在嵌入式开发中不得不谈的就是程序的调试。嵌入式开发中的调试工作是一个痛苦的过程。由于我们缺少必要的模拟设备,每次更新一些细节都要重新

温馨提示

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

评论

0/150

提交评论