MPU6050

来源:互联网 发布:知乎 阿提哈德航空 编辑:程序博客网 时间:2024/05/17 06:33
/*


//LCD的画笔颜色和背景色   
u16 POINT_COLOR=0x0000; //画笔颜色  WHITE    RED   GREEN
u16 BACK_COLOR=0xFFFF;  //背景色 


//初始化lcd
//该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!!!
//在其他型号的驱动芯片上没有测试! 
void LCD_Init(void)


//清屏函数
//color:要清屏的填充色


void LCD_Clear(u16 color)


//在指定位置画一个指定大小的圆
//(x,y):中心点
//r    :半径
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r)




//显示字符串
//x,y:起点坐标
//width,height:区域大小  
//size:字体大小
//*p:字符串起始地址  
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)




屏幕 240*320   0<x<240  0<y<320


擦除一个圆的方法:用屏幕背景色在原来的地方重新画圆,这样就相当于擦除


游戏中的圆统一使用半径15,屏幕背景白色,中心圆红色,随机圆蓝色


*/
#include "homework.h"
#include "test.h"
#include "stdlib.h"
#include "math.h"
#include "lcd.h"
#include "MPU6050.h"
#include "iic.h"


//加速度
int16_t ax, ay;
//随机圆的圆心
u16 cx,cy;
//移动轨迹参数
double k, b;
u16 xx[2], yy[2];
extern u8 game_over;
extern u16 global_time;
extern u16 fast_time;
/*******************************************************************************
* Function Name   : homework4_2(void)
* Description     : 随机圆会根据重力加速度移动
* Input           : 无
* Output         : 无 
* Return         : 无
* date : 2016-7-20
* modify : 2016-7-20-19:00
*******************************************************************************/
void homework4_2(void)
{
u16 i, j;
//加入开门狗,防止程序跑飞
myiwdg_init();
//1s喂狗
mytime_init(TIM5, 10000-1, 8400-1, TIM_CounterMode_Up, 0, 0, ENABLE);
IIC_Init();
MPU6050_Init();
LCD_Init();
LCD_Clear(GAME_BACK);
printf("start\n");
//初始化定时器,此时还不能打开定时功能
mytime_init(TIM2, 10000-1, 8400-1, TIM_CounterMode_Up, 3, 3, DISABLE);
mytime_init(TIM3, 1000-1, 84-1, TIM_CounterMode_Up, 3, 2, DISABLE);
//开始游戏
while(1)
{
//得到一个随机圆心坐标
get_rand_location();
POINT_COLOR = GAME_CENTER_PEN;
//在屏幕中间产生一个半径15的圆
LCD_Draw_Circle(WIDTH/2, HEIGHT/2, GAME_CENTER_R);
//开启系统10s定时器,1s一次中断
TIM_Cmd(TIM2, ENABLE);
//开启游戏计时,计算碰撞中心圆的时间,1ms一次中断
TIM_Cmd(TIM3, ENABLE);
while(1)
{
//画随机圆
POINT_COLOR = GAME_RAND_PEN;
LCD_Draw_Circle(cx, cy, GAME_RAND_R);
delay_ms(50);
//在得到新的坐标之前擦除原来的
POINT_COLOR = GAME_BACK;
LCD_Draw_Circle(cx, cy, GAME_RAND_R);
//获取加速度,得到斜率k
getline();
//计算新坐标
get_new_location();
//随机圆不能超出屏幕
check_xy();
//判断是否和中心圆重叠,重叠退出.游戏时间超过10s也退出
if(pow(GAME_CENTER_R+GAME_RAND_R,2)>=(cx-WIDTH/2)*(cx-WIDTH/2)+(cy-HEIGHT/2)*(cy-HEIGHT/2) || game_over==1 )
{
//结束本次游戏,并且结束计时
//关闭系统10s定时器,开始游戏之前关闭所有定时
TIM_Cmd(TIM2, DISABLE); 
//关闭游戏计时,计算碰撞中心圆的时间
TIM_Cmd(TIM3, DISABLE); 
//清空时间
game_over = 0;
global_time = 0;
fast_time = 0;
break;
}

}
}
}
/*******************************************************************************
* Function Name   : get_rand_location(void)
* Description     : 得到一个指定范围的随机坐标
* Input           : 无
* Output         : 无
* Return         : 无
* date : 2016-7-20
* modify : 2016-7-20-19:00
*******************************************************************************/
void get_rand_location(void)
{
//产生随机圆心坐标范围
xx[0] = rand()%75+15;   //15~90
xx[1] = rand()%75+150;  //150~225
yy[0] = rand()%115+15;   //15~130
yy[1] = rand()%115+190;  //190~305
//取随机坐标
cx = xx[rand()%2];
cy = yy[rand()%2];
}


/*******************************************************************************
* Function Name   : void getline(void)
* Description     : 得到轨迹直线的斜率
* Input           : 无
* Output         : 无
* Return         : 无
* date : 2016-7-20
* modify : 2016-7-20-19:00
*******************************************************************************/
void getline(void)
{
    ax = MPU6050_GetData(ACCEL_XOUT_H);
ay = MPU6050_GetData(ACCEL_YOUT_H);
//减少误差,使用double类型的数据
k = (double)ax/(double)ay;
}
/*******************************************************************************
* Function Name   : void check_xy(void)
* Description     : 检测新坐标是否超出屏幕范围 
* Input           : 无
* Output         : 无
* Return         : 无
* date : 2016-7-20
* modify : 2016-7-20-19:00
*******************************************************************************/
void check_xy(void)
{
//圆心坐标的边界 = 屏幕大小-半径
if(cx<0+GAME_RAND_R)
{
cx = GAME_RAND_R;
}
if(cx>WIDTH-GAME_RAND_R)
{
  cx = WIDTH-GAME_RAND_R;
}
if(cy<0+GAME_RAND_R)
{
cy = 0+GAME_RAND_R;
}
if(cy>HEIGHT-GAME_RAND_R)
{
cy = HEIGHT-GAME_RAND_R;
}
}
/*******************************************************************************
* Function Name   : void get_new_location(void)
* Description     : 根据轨迹计算新的圆心坐标
* Input           : 无
* Output         : 无
* Return         : 无
* date : 2016-7-20
* modify : 2016-7-20-19:00
*******************************************************************************/
void get_new_location(void)
{
u16 x_step, y_step;
//根据k,计算step在x、y轴的分量
x_step = abs(GAME_STEP * sqrt(1/(1+k*k)));
y_step = abs(GAME_STEP * sqrt(1/(1+k*k))*k);
//加速度x轴对应屏幕y轴
if(ax>0)
cy += y_step;
else
cy -= y_step;
//加速度y轴对应屏幕y轴
if(ay>0)
cx += x_step;
else
cx -= x_step;
}
0 0
原创粉丝点击