当前位置:文档之家› 乒乓球弹壁模拟实验报告

乒乓球弹壁模拟实验报告

上海电力学院嵌入式系统课程设计报告题目: 乒乓球的弹壁模拟演示姓名:学号:院系:电子与信息工程学院专业年级:电子信息工程2010级同组成员:2013 年7月10日一、实验目的ARM9硬件平台程序设计要求通过对ARM硬件体系结构和S3C2410实验箱硬件模块的理解,能够自行创建、设置工程和编写程序代码、编译、调试运行来实现某种简单的应用,如计算器、电子闹钟等。

加强对C语言和ARM汇编指令的编程锻炼以及ARM硬件接口功能的理解。

二、实验环境硬件:PC机,ARM仿真器,S32410实验箱软件:Keil uVision三、实验内容设计题目:乒乓球的弹壁模拟演示设计要求:在LCD 屏幕上模拟给乒乓球一初始速度,假设该环境无能量损耗,让乒乓球在该环境下进行弹壁运动。

1.基本要求(1)该环境设有上下左右四面墙,让乒乓球在该环境下自由运动,碰到墙壁则反弹,否则按照匀速方式运动。

(2)在教学实验箱的LCD 上绘制四面墙和一个乒乓球,按下开始键则给乒乓球一初始速度,指定一个方向开始运动;按下停止键则停止乒乓球的运动;按下暂停键则暂停乒乓球的运动,再按该键则继续运动。

2. 扩展内容(1)假设该环境有重力,让乒乓球模拟在有重力的环境下运动。

(2)用键盘按键可设定乒乓球的运动速度,也可利用按键在乒乓球运动的过程中给它提速。

(3)统计乒乓球碰撞的次数,并将其在LCD 上显示出来。

四、设计思路1、本次实验所需用到的硬件模块:①LCD(用来显示乒乓球撞壁过程);②键盘(用来控制乒乓球的运动和速度);③LED(用来显示乒乓球的碰撞次数)。

2、因为本次实验要使LCD显示,并通过键盘产生中断控制乒乓球的运动状态和速度,所以本次实验主要同到的.c 文件主要是keyboard.c,lcd.c,led.c和main.c,主要在这几个文件上进行编程。

本次实验的关键是如何在LCD中显示乒乓球,乒乓球在碰到壁后如何实现计数加一,如何用键盘产生中断控制乒乓球的状态及速度。

五、软件实现通过下面的流程图简单介绍本实验的主题软件及功能:六、模块功能描述:1.主程序,显示主界面的模块 int main() { sys_init(); lcd_init_app();uart_printf("\n LCD display Test Example (please look at LCD screen)\n");lcd_clr_rect(0,0,800,480,BLACK);//倒计时3秒进入乒乓球弹壁系统的显示界面 Lcd_DspHz24(280,200,GREEN,"欢迎进入乒乓球弹壁模拟演示"); lcd_clr_rect(0,0,800,480,BLACK); Lcd_DspAscII8x16(400,200,WHITE,"3"); lcd_clr_rect(300,150,600,480,BLACK); Lcd_DspAscII8x16(400,200,WHITE,"2"); lcd_clr_rect(300,150,600,480,BLACK);Lcd_DspAscII8x16(400,200,WHITE,"1");LCD_Testlcd.ckeyboard.cmain.cled.c显示个人信息,主要是画乒乓球和墙壁(画球子函数) 用键盘读入键值实现中断控制乒乓球的运动状态和速度显示乒乓球弹壁模拟演示界面,主函数,显示主界面 显示个人信息(学号),计数乒乓球反弹次数功能功能功能功能lcd_clr_rect(300,150,600,480,BLACK);//调用数码管显示程序,在数码管上显示我的学号led8_test();delay(20000); //延迟两秒数码管显示零准备计数iic_write_8led(0x70, 0x17, f_szDigital[0]);iic_write_8led(0x70, 0x16, f_szDigital[0]);iic_write_8led(0x70, 0x15, f_szDigital[0]);iic_write_8led(0x70, 0x14, f_szDigital[0]);iic_write_8led(0x70, 0x13, f_szDigital[0]);iic_write_8led(0x70, 0x12, f_szDigital[0]);iic_write_8led(0x70, 0x11, f_szDigital[0]);iic_write_8led(0x70, 0x10, f_szDigital[0]);//进入乒乓球弹壁模拟演示界面Glib_Rectangle(10,10,790,470,RED);Glib_Rectangle(11,11,791,471,RED);Glib_Rectangle(15,15,785,465,BLUE);Glib_Rectangle(14,14,786,466,BLUE);Glib_Rectangle(20,20,780,460,GREEN);Glib_Rectangle(19,19,781,461,GREEN);Lcd_DspAscII8x16(550,320,GREEN,"20101956");Lcd_DspAscII8x16(550,350,RED,"2010072");Lcd_DspHz24(500,150,GREEN,"乒乓球弹壁模拟演示");Lcd_DspHz24(525,200,BLUE,"电子信息工程");Lcd_DspHz24(550,280,SH,"苏辉");Glib_Rectangle(40,40,410,410,RED); //画乒乓球弹壁范围框Glib_Rectangle(39,39,411,411,RED);Glib_Rectangle(38,38,412,412,RED);Glib_Rectangle(37,37,413,413,RED);Glib_Rectangle(36,36,414,414,RED);Glib_Rectangle(35,35,415,415,RED);Glib_Rectangle(34,34,416,416,RED);Glib_Disc(50,225,10,GREEN); //在设定位置画一个模拟乒乓球模型while(1){color_lcd_test(); //进入测试}}2、数码管显示学号子程序void led8_test(void){uart_printf("\n 8-Segment Digit LED Test Example (Please look at LED)\n");iic_init_8led();iic_write_8led(0x70, 0x17, f_szDigital[2]);iic_write_8led(0x70, 0x16, f_szDigital[0]);iic_write_8led(0x70, 0x15, f_szDigital[1]);iic_write_8led(0x70, 0x14, f_szDigital[0]);iic_write_8led(0x70, 0x13, f_szDigital[1]);iic_write_8led(0x70, 0x12, f_szDigital[9]);iic_write_8led(0x70, 0x11, f_szDigital[5]);iic_write_8led(0x70, 0x10, f_szDigital[6]);}主要程序框图:开始Main 函数显示基本信息及演示界面调用color_lcd_test();键值判断ss 模式 cc 模式hh 模式 没有键被按下调用led 显示模块计数暂停键值判断复位球按照设定的方向运动321等待球减速球加速 +—5 0循环运动3、画圆子程序void Glib_Disc(int x0,int y0,int r,int color){UINT16T x,y;UINT32T xx,rr,xt,yt,rs;UINT16T Dr[4]={0};yt=r;rr=r*r+1; //补偿1 修正方形rs=yt*3/4; //画8分之一圆弧for (xt=0;xt<=rs;xt++){xx=xt*xt;while ((yt*yt)>(rr-xx))yt--;x=x0+xt; //第一二象限上面的弧对应屈区域涂色y=y0-yt;Dr[0]=x;x=x0-xt;Dr[2]=x;Dr[1]=Dr[3]=y;Glib_Line(Dr[0],Dr[1],Dr[2],Dr[3],color);y=y0+yt; //第三四象限下半部分对应区域涂色Dr[0]=x;x=x0+xt;Dr[2]=x; Dr[1]=Dr[3]=y;Glib_Line(Dr[0],Dr[1],Dr[2],Dr[3],color);x=x0+yt; //第一二象限对应下面对应涂色y=y0-xt;Dr[0]=x;x=x0-yt;Dr[2]=x;Dr[1]=Dr[3]=y;Glib_Line(Dr[0],Dr[1],Dr[2],Dr[3],color);y=y0+xt; //第三四象限上面对应区域涂色Dr[0]=x;x=x0+yt;Dr[2]=x;Dr[1]=Dr[3]=y;Glib_Line(Dr[0],Dr[1],Dr[2],Dr[3],color);}}4、键盘读取子程序void keypad_test(void){UINT8T keychar;if(keyscan()){switch(KeyNo){case 0x0000: keychar = 'U'; break; // FUN keycase 0x0001: keychar = 'D'; break;case 0x0002: keychar = '-'; s=s-2;break;case 0x0003: keychar = '0'; cc=ss=hh=0; break;case 0x0004: keychar = '+'; s=s+2;break;case 0x0100: keychar = '*'; break;case 0x0101: keychar = 'C'; break;case 0x0102: keychar = '3'; cc=1;break;case 0x0103: keychar = '2'; ss=1;break;case 0x0104: keychar = '1'; hh=1; break;case 0x0200: keychar = 'F'; break;case 0x0201: keychar = 'B'; break;case 0x0202: keychar = '6'; break;case 0x0203: keychar = '5'; cc=ss=hh=2; break;case 0x0204: keychar = '4'; break;case 0x0300: keychar = 'E'; break;case 0x0301: keychar = 'A'; break;case 0x0302: keychar = '9'; break;case 0x0303: keychar = '8'; break;case 0x0304: keychar = '7'; break;default: break;}if( keychar == 'U')uart_printf(" You have pressed key < FUN >\n");elseuart_printf(" You have pressed key < %c >\n", keychar);}}备注:本次设计我使用了0、1、2、3、5、+、--,共7个键,其中1、2、3用于选择三个不同运动轨迹的球的运动,5用于控制乒乓球的暂停,0用于控制乒乓球的复位,+用于控制乒乓球运行时速度的加快,-用于控制乒乓球运行时速度的减慢。

相关主题