基于嵌入式系统2048工程实训报告_第1页
基于嵌入式系统2048工程实训报告_第2页
基于嵌入式系统2048工程实训报告_第3页
基于嵌入式系统2048工程实训报告_第4页
基于嵌入式系统2048工程实训报告_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、等级:工程实践训练项目名称 物联网应用 专业班级 自动化1301 姓 名 黄奎伦 学 号 201301020129 指导教师 汪超,谢一峰(粤嵌) 2016年12月24日目录第1章 实训目的与任务11.1 工程实践训练目的11.2 实训项目要求1第2章 知识点总结12.1 嵌入式系统12.2 Linux操作系统介绍 12.3 交叉开发22.4 SecureCRT的设置与连接22.5 C程序的交叉编译及运行 22.6 函数的定义32.7 Linux文件IO函数32.8 LCD显示原理4 第3章 2048游戏的设计流程图4第4章 相关的c语言游戏程序5第5章 2048游戏展示21第6章 游戏测试2

2、26.1 测试的意义226.2 测试过程22心得体会22电气信息学院工程实践训练评分标准23第1章 实训目的与任务1.1 工程实践训练目的本次自动化工程实践训练第一部分是实训装置的使用说明,讲述了系统的组成、硬件的特点和技术指标、软件的使用介绍。第二部分是实训项目部分,叙述了实训的原理、步骤及注意事项等。通过对实训装置各个仪表的原理、工作情况及实验原理、软硬件的详细介绍,通过实际操作让我们对复杂过程控制系统实训装置有一个充分的认识,又有益于我们对工业生产现场控制系统的了解。培养学生的工程实践能力,进一步提高学生分析和解决实际问题的能力。1.2 实训项目要求 轻松的益智游戏对缓解生活压力调节情绪

3、具有重要的意义。2048这款小游戏是一款流行的数字游戏,游戏设计初衷是一款益智类的游戏,其特点在于轻松,简单,有趣。因此,开发要求做到各项功能要完备、操作要简便、易学易用。所以本周的工程实训要求自己设计一个2048小游戏,以及学习关于嵌入式的基本入门知识。第2章 知识点总结2.1 嵌入式系统嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁减,以适应应用系统对功能、可靠性、成本、体积和功耗等有严格要求的专用计算机系统。2.2 Linux操作系统介绍Linux是一套免费使用和自由传播的类UNIX操作系统,其创始人为美国著名黑客 -林纳斯托瓦兹。它能运行主要的UNIX工具软件、应用程序和网络

4、协议,且支持32位和64位硬件,是一个性能稳定的多用户网络操作系统。操作系统:操作系统是计算机系统中最基本的系统软件,它用于有效地管理系统资源,并为用户使用计算机提供了便利的环境。ubuntu是一个基于linux的免费开源桌面PC操作系统。2.3 交叉开发 一般来说,研发嵌入式产品,由于从产品成本及功能专用性角度出发考虑。嵌入式产品一般只有程序的运行环境,而并没有程序的编译开发环境。所以,我们一般在通用电脑上用各种编译开发软件把程序编译调试好后,再下载到开发板或相关产品上去运行。这个过程,我们称之为交叉开发。2.4 SecureCRT的设置与连接(1)获取连接上的端口号用串口线连接好开发板后,

5、启动开发板。在设备管理器中,查找识别出的端口。 若不能正确识别端口(有感叹号),则需要安装驱动。(2)SecureCRT的设置 点击快速连接,并进行设置a.协议: Serialb.端口: 你电脑识别出的端口号c.波特率: 115200d.把数据流控制中的RTS/CTS(R)勾去掉 其它保持默认设置2.5 C程序的交叉编译及运行由于ARM处理器与Inter处理器其设计架构有本质区别。所以要在arm开发板上运行的程序,则必须要用专用的编译器来编译。(1)在文本编辑软件中编写好C源代码文件,并保存到共享文件夹中。= hello.c(2)在Ubuntu系统的共享目录中,用arm-linux-gcc编译

6、器对hello.c进行编译,使生成一个可执行程序。arm-linux-gcc hello.c o hello= hello(3)下载到开发板中rz(4)运行hello这个程序chmod +x hello./hello2.6 函数的定义返回类型 函数名(输入参数列表)函数语句;/指令序列。返回类型:函数返回值(return语句后面那个表达式值的类型)一般是单值类型,函数也可以没有返回值(void)函数名:C语言标识符。把一个名字与特定的功能模块相关联输入参数列表:功能模块的输入。格式如下:参数类型 参数名1 , 参数类型2 参数2,函数也可以没有参数。主调函数:调用其他函数的函数被调函数:被别人

7、调用的函数“实际参数”:在函数调用过程中,主调函数传递给被调函数的输入参数值,我们称之为“实际参数”,简称”实参”。“形式参数”:函数定义时,参数列表中的参数。我们称之为”形式参数”,简称”形参”。2.7 Linux文件IO函数#include #include #include open用来打开一个文件int open(const char *pathname, int flags) pathname: 要打开或创建的文件名(带路径名)flags: 打开标志。告诉系统,是以何种方式打开这个文件O_RDONLY : read onlyO_WRONLY : write onlyO_RDWR :

8、read/write以上三个标志选其一。返回值:如果成功返回文件描述符(0,后续所有对文件的操作都必须通过它,因为它代表这个文件。)失败返回-1, 并且errno被设置。2.8 LCD显示原理 屏幕由y行且每行x个像素点的矩阵组成;在屏幕上显示图像,就是给每个像素点显示一种颜色。颜色值,可以量化: Color = xGreen + yBlue + zRed 我们向屏幕设备文件 /dev/fb0 中写入各点颜色值就可以让屏幕显示相应的图片了第3章 2048游戏的设计流程图 是否为有效移动能否继续游戏绘制棋盘矩阵在随机的空位置上显示一个随机值判断手势并做相应移动初始化棋盘矩阵打开屏幕开始游戏 N

9、Y游戏结束 N Y 第4章 相关的c语言游戏程序#include #include #include #include #include /*perror, errno ,.*/#include /*abs的头文件*/#include /*printf*/#include #include #include #include /*time */#include #define LCD_WIDTH 800#define LCD_HEIGHT 480#define LCD_BYTESPERPIXEL 4 /每个像素点占几个字节#define LCD_SIZE (LCD_WIDTH * LCD_HE

10、IGHT *LCD_BYTESPERPIXEL)#define MATRIX_X0 0 /整个棋盘的左上角顶点的x轴坐标#define MATRIX_Y0 0 /整个棋盘的左上角顶点的y轴坐标#define PIECE_SIZE 100 /棋子的像素点大小#define BOARDSIZE 4 / 整个棋盘的大小BORADSIZE * BOARDSIZE#define MOVE_LEFT 1#define MOVE_RIGHT 2#define MOVE_UP 3#define MOVE_DOWN 4unsigned char bmpdataLCD_SIZE ; /读bmp 图片数据临时数组

11、int game_over = 0;/游戏结束的标志,1表示游戏结束/0表示游戏不结束/棋盘矩阵int matrixBOARDSIZEBOARDSIZE =0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;int *plcd = NULL;/指向framebuffer(屏幕显存第一个点的内存)/*lcd_draw_point:在屏幕坐为(x, y)这个点,填充color 这个颜色值。x: x轴坐标y:y轴坐标color:要填充的辨色值返回值:无返回值。*/void lcd_draw_point(int x, int y, int color)int *p = plcd;if (x

12、 = 0 & x =0 & y =0 & x0+w=0 & y0+h=0 & h=0)int i,j;for(i=x0;ix0+w;i+)for(j=y0;jy0+h;j+)LCD_draw_point(i,j,color);elseprintf(draw dect failed!x0=%d y0=%d w=%d h=%dn,x0,y0,w,h);/将所有的图片名保存到一个数组中const char * bmpfiles =military_font_7_2.bmp, / 2military_font_7_4.bmp, / 4military_font_7_8.bmp, /8military_

13、font_7_16.bmp, / 16military_font_7_32.bmp,military_font_7_64.bmp,military_font_7_128.bmp,military_font_7_256.bmp,military_font_7_512.bmp,military_font_7_1024.bmp,military_font_7_2048.bmp,military_font_7_4096.bmp,military_font_7_8192.bmp,military_font_7_16384.bmp,military_font_7_32768.bmp,military_fo

14、nt_7_65536.bmp,;/*get_bmpfiles_index:根据你要显示的数字(2,4,8,16,.)返回你对应的文件名的下标返回值:返回 x对应的文件名在数组bmpfiles的下标*/int get_bmpfiles_index(int x)/*draw_bmp_byname:把一张bmp图片显示在屏幕上特定的位置bmpfile:要显示的bmp图片的文件名x0: 在屏幕上显示的左上角顶点的x轴坐标y0: 在屏幕上显示的左上角顶点的y轴坐标w: 位图宽度h: 位图高度返回值:无返回值.*/void draw_bmp_byname(const char *bmpfile, int

15、x0, int y0, int w, int h)int fd;int x, y;fd = open(bmpfile, O_RDONLY);if (fd = -1)perror(open bmpfile error:);return ;lseek(fd, 54, SEEK_SET);read(fd, bmpdata, w*h*3);close(fd);int i = 0;for (y = 0; y h; y+)unsigned char r,g ,b;int color;for (x = 0; x w; x+)/已知图片色深为24位b = bmpdatai+;g = bmpdatai+;r =

16、 bmpdatai+;color = (r 16) | (g 8) | b;lcd_draw_point(x0+ x, y0 + (h -1 - y) ,color);/*draw_matrix:把棋盘矩阵在屏幕上显示出来*/void draw_matrix()int i, j;for (i = 0; i BOARDSIZE; i+)for (j = 0; j = 1,x = 3int x = (random() % 3) + 1;int i;for(i = 0; i 30) & (abs_x 2 * abs_y)close(fd);return MOVE_RIGHT;else if(x_cz

17、 2 * abs_y)close(fd);return MOVE_LEFT;else if(y_cz 30) & (abs_y 2 * abs_x)close(fd);return MOVE_UP;else if(y_cz 2 * abs_x)close(fd);return MOVE_DOWN;elsex1 = y1 = -1;continue;close(fd);/*change_matrix:根据手指滑动(direction),变换棋盘矩阵*/int change_matrix()int direction = get_finger_direction();if (direction =

18、 MOVE_LEFT)fin_left();else if (direction = MOVE_RIGHT)fin_right();else if (direction = MOVE_UP)fin_up();elsefin_down();/*fin_left:手指左划后棋子移动及合并的方式*/void fin_left()/int fin = get_finger_direction();int i, j;/i为矩阵行下标,j为矩阵列下标int value, save_zero;for(i = 0; i BOARDSIZE; i+)value = 0;save_zero= 0;for(j =

19、0; j BOARDSIZE ; j+)if (matrixij = 0)continue;if (value = 0)value = matrixij;elseif (value = matrixij)/合并matrixisave_zero+ = value * 2;value = 0; else matrixisave_zero+ = value;value = matrixij;matrixij = 0;if (value != 0)matrixisave_zero = value;/*fin_right:手指上划后棋子移动及合并的方式*/void fin_right()int i, j

20、;/i为矩阵行下标,j为矩阵列下标int value;int save_zero;for(i = 0; i = 0 ; j-)if(matrixij = 0)continue;if(value = 0)value = matrixij;elseif(value = matrixij)matrixisave_zero- = 2 * value;value = 0;elsematrixisave_zero- = value;value = matrixij;matrixij = 0;if(value != 0)matrixisave_zero = value;/*fin_up:手指上划后棋子移动及

21、合并的方式*/void fin_up()int i, j;/i为矩阵行下标,j为矩阵列下标int value;int save_zero;for(j = 0; j BOARDSIZE; j+)value = 0;save_zero= 0;for(i = 0; i BOARDSIZE ; i+)if(matrixij = 0)continue;if(value = 0)value = matrixij;elseif(value = matrixij)matrixsave_zero+j =2 * value;value = 0;elsematrixsave_zero+j = value;value

22、 = matrixij;matrixij = 0;if(value != 0)matrixsave_zeroj = value;/*fin_down:手指上划后棋子移动及合并的方式*/void fin_down()int i, j;/i为矩阵行下标,j为矩阵列下标int value;int save_zero;for(j = 0; j = 0 ; i-)if(matrixij = 0)continue;if(value = 0)value = matrixij;elseif(value = matrixij)matrixsave_zero-j = 2 * value;value = 0;els

23、ematrixsave_zero-j = value;value = matrixij;matrixij = 0;if(value != 0)matrixsave_zeroj = value;/*move_judge:判断是否还能移动return value:1 game over0 continue*/int move_judge()int i, j;if(get_zero_num() != 0)return 0;for(i = 0; i BOARDSIZE; i+)for(j = 0; j BOARDSIZE ; j+)if (j != BOARDSIZE -1)if (matrixij

24、= matrixij+1)return 0;if (i != BOARDSIZE - 1)if (matrixij = matrixi+1j)return 0;return 1;/*rand1_matrix:移动之后随机产生一个数字填充到任意一个0的位置上*/void rand_matrix()int pos = (random() % get_zero_num() + 1;int s = 2, 4, 8, 2;int s_i = (random() % 4);set_matrix(pos, ss_i);draw_matrix();/*主函数*/int main()int fd;/*step

25、1: 打开屏幕*/fd = open(/dev/fb0, O_RDWR);if (fd = -1)perror(open fb0 failed:);return -1;/*step 2: mmap*/plcd = mmap(NULL, /第一个参数,为映射后的内存地址, /为NULL,表示让操作系统自行分配 800*480*4, /第二个参数,为映射的长度。PROT_WRITE, /第三个参数,为映射内存区域的权限MAP_SHARED, /第四个参数,为映射标志,sharedfd, /第五个参数,为文件描述符,表示您要/映射哪个文件0 /第六个参数为偏移量,表示您要从文件的/哪个位置开始映射)

26、;lcd_draw_dect(0, 0, 800, 480, 0xffffff);/画背景srandom( time(NULL) ); /设置随机数种子,种子一样,产生的/随机数是一样的init_matrix();/初始化棋盘,并在任意x个位置,填充x个数字,并显示while (game_over = 0) /游戏没结束/*step1: 把原来的矩阵的值保存在matrix_vi数组中*/int matrix_v1BOARDSIZEBOARDSIZE;int i, j;for (i = 0; i BOARDSIZE;+i)for (j = 0; j BOARDSIZE; +j)matrix_v1

27、ij = matrixij;/*step 2: 变换矩阵*/change_matrix();/*step 3:检查矩阵是否有变动*/int flag = 0;/矩阵是否有变化标志位for (i = 0; i BOARDSIZE; +i)for (j = 0; j BOARDSIZE; +j)if (matrix_v1ij != matrixij)flag = 1;i = j = BOARDSIZE;if (flag)/矩阵有变动rand_matrix();draw_matrix(); else /矩阵没有变动draw_matrix();/*step 4:判断游戏是否结束*/game_over = move_judge();printf(Game Over);munmap(plcd, 800*480*4);clo

温馨提示

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

评论

0/150

提交评论