4278|2

5

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MPU6050 [复制链接]

MPU6050怎样用呀?

最新回复

/**************************************** / //Update to MPU6050 by shinetop// // MCU: STC89C52 // 2012.3.1//功能: 显示加速度计和陀螺仪的10位原始数据 /**************************************** / //GY-52 MPU3050 IIC测试程序 // 使用单片机STC89C51 //晶振:11.0592M // 显示:LCD1602 // 编译环境 Keil uVision2 // 参考宏晶网站24c04通信程序 // 时间:2011年9月1日 // QQ:531389319 /****************************************/ #include #include     //Keil library #include    //Keil library        #include typedef unsigned char  uchar; typedef unsigned short ushort; typedef unsigned int   uint; //**************************************** // 定义51单片机端口 //**************************************** #define DataPort P0                //LCD1602数据端口 sbit    SCL=P1^1;                        //IIC时钟引脚定义 sbit    SDA=P1^3;                        //IIC数据引脚定义 sbit    Out_1=P3^2;                //LCD1602命令端口                /**************************************** // 定义MPU6050内部地址 #define        SMPLRT_DIV                0x19        //陀螺仪采样率,典型值:0x07(125Hz) #define        CONFIG                        0x1A        //低通滤波频率,典型值:0x06(5Hz) #define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) #define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz) #define        ACCEL_XOUT_H        0x3B #define        ACCEL_XOUT_L        0x3C #define        ACCEL_YOUT_H        0x3D #define        ACCEL_YOUT_L        0x3E #define        ACCEL_ZOUT_H        0x3F #define        ACCEL_ZOUT_L        0x40 #define        TEMP_OUT_H        0x41 #define        TEMP_OUT_L        0x42 #define        GYRO_XOUT_H        0x43 #define        GYRO_XOUT_L        0x44        #define        GYRO_YOUT_H        0x45 #define        GYRO_YOUT_L        0x46 #define        GYRO_ZOUT_H        0x47 #define        GYRO_ZOUT_L        0x48 #define        PWR_MGMT_1        0x6B        //电源管理,典型值:0x00(正常启用) #define        WHO_AM_I        0x75        //IIC地址寄存器(默认数值0x68,只读) #define        SlaveAddress        0xD0        //IIC写入时的地址字节数据,+1为读取 //**************************************** //定义掉电模式变量 sfr WKTCL=0xAA;                                //唤醒定时器低8位计数器 sfr WKTCH=0xAB;                                //唤醒定时器高8位定时器 uchar WK_Count; uchar WK_Limit=250; bit WK_Flag; //**************************************** //定义类型及变量 //**************************************** // int        Temperature,Temp_h,Temp_l;        //温度及高低位数据 // **************************************** //函数声明 //**************************************** void  delay(unsigned int k);                      //延时                                                void  lcd_printf(uchar *s,int temp_data);      //MPU6050操作函数 void  InitMPU6050();                              //初始化MPU6050 void  Delay5us(); void  I2C_Start(); void  I2C_Stop(); void  I2C_SendACK(bit ack); bit   I2C_RecvACK(); void  I2C_SendByte(uchar dat); uchar I2C_RecvByte(); void  I2C_ReadPage(); void  I2C_WritePage(); void  display_ACCEL_x(); void  display_ACCEL_y(); void  display_ACCEL_z(); uchar Single_ReadI2C(uchar REG_Address);                        //读取I2C数据 void  Single_WriteI2C(uchar REG_Address,uchar REG_data);        //向I2C写入/**************************************** / //整数转字符串 void  SeriPushSend(uchar send_data) {   SBUF=send_data;   while(!TI);   TI=0; } //**************************************** //延时 //**************************************** void delay(unsigned int k) {          unsigned int i,j;                  for(i=0;i  详情 回复 发表于 2014-10-23 19:59
 
点赞 关注

回复
举报

951

帖子

1

TA的资源

纯净的硅(中级)

沙发
 
论坛上很多关于MPU6050的代码呢!你搜搜看呢!看一下就明白了呢!
 
个人签名人有的时候真是奇怪,选择了会后悔,放弃了会遗憾,完美只能是一种理想,不是一种存在。
 

回复

22

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
/****************************************
/
//Update to MPU6050 by shinetop//
// MCU: STC89C52

// 2012.3.1//功能: 显示加速度计和陀螺仪的10位原始数据
/****************************************
/
//GY-52 MPU3050 IIC测试程序
// 使用单片机STC89C51
//晶振:11.0592M
// 显示:LCD1602

// 编译环境 Keil uVision2

// 参考宏晶网站24c04通信程序

// 时间:2011年9月1日
// QQ:531389319
/****************************************/
#include
#include     //Keil library
#include    //Keil library       

#include
typedef unsigned char  uchar;

typedef unsigned short ushort;

typedef unsigned int   uint;

//****************************************

// 定义51单片机端口

//****************************************

#define DataPort P0                //LCD1602数据端口
sbit    SCL=P1^1;                        //IIC时钟引脚定义

sbit    SDA=P1^3;                        //IIC数据引脚定义
sbit    Out_1=P3^2;                //LCD1602命令端口                /****************************************
// 定义MPU6050内部地址

#define        SMPLRT_DIV                0x19        //陀螺仪采样率,典型值:0x07(125Hz)

#define        CONFIG                        0x1A        //低通滤波频率,典型值:0x06(5Hz)

#define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)

#define        ACCEL_XOUT_H        0x3B

#define        ACCEL_XOUT_L        0x3C

#define        ACCEL_YOUT_H        0x3D

#define        ACCEL_YOUT_L        0x3E

#define        ACCEL_ZOUT_H        0x3F
#define        ACCEL_ZOUT_L        0x40

#define        TEMP_OUT_H        0x41
#define        TEMP_OUT_L        0x42

#define        GYRO_XOUT_H        0x43
#define        GYRO_XOUT_L        0x44       

#define        GYRO_YOUT_H        0x45

#define        GYRO_YOUT_L        0x46

#define        GYRO_ZOUT_H        0x47
#define        GYRO_ZOUT_L        0x48

#define        PWR_MGMT_1        0x6B        //电源管理,典型值:0x00(正常启用)

#define        WHO_AM_I        0x75        //IIC地址寄存器(默认数值0x68,只读)

#define        SlaveAddress        0xD0        //IIC写入时的地址字节数据,+1为读取
//****************************************
//定义掉电模式变量
sfr WKTCL=0xAA;                                //唤醒定时器低8位计数器

sfr WKTCH=0xAB;                                //唤醒定时器高8位定时器
uchar WK_Count;

uchar WK_Limit=250;
bit WK_Flag;

//****************************************
//定义类型及变量
//****************************************
//
int        Temperature,Temp_h,Temp_l;        //温度及高低位数据
//

****************************************
//函数声明
//****************************************

void  delay(unsigned int k);                      //延时                                               

void  lcd_printf(uchar *s,int temp_data);     

//MPU6050操作函数
void  InitMPU6050();                              //初始化MPU6050

void  Delay5us();

void  I2C_Start();

void  I2C_Stop();
void  I2C_SendACK(bit ack);

bit   I2C_RecvACK();
void  I2C_SendByte(uchar dat);

uchar I2C_RecvByte();
void  I2C_ReadPage();
void  I2C_WritePage();
void  display_ACCEL_x();
void  display_ACCEL_y();
void  display_ACCEL_z();

uchar Single_ReadI2C(uchar REG_Address);                        //读取I2C数据

void  Single_WriteI2C(uchar REG_Address,uchar REG_data);        //向I2C写入/****************************************
/
//整数转字符串

void  SeriPushSend(uchar send_data)
{

  SBUF=send_data;
  while(!TI);
  TI=0;

}

//****************************************

//延时

//****************************************
void delay(unsigned int k)
{       
  unsigned int i,j;               
  for(i=0;i        
  {       
    for(j=0;j<940;j++);

  }

}


//**************************************

//延时5微秒(STC11f04)//不同的工作环境,需要调整此函数
//当改用其他MCU时,请调整此延时函数//**************************************

void Delay5us()
{       
  _nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();  
  _nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();
  _nop_();
}//**************************************

//I2C起始信号

//**************************************

void I2C_Start()
{

SDA = 1;                    //拉高数据线

SCL = 1;                    //拉高时钟线

Delay5us();                 //延时

SDA = 0;                    //产生下降沿

Delay5us();                 //延时

SCL = 0;                    //拉低时钟线

}//**************************************

//I2C停止信号//**************************************

void I2C_Stop()
{

  SDA = 0;                    //拉低数据线

  SCL = 1;                    //拉高时钟线

  Delay5us();                 //延时

  SDA = 1;                    //产生上升沿

  Delay5us();                 //延时

}
//**************************************//I2C发送应答信号

//入口参数:ack (0:ACK 1:NAK)

//**************************************

void I2C_SendACK(bit ack)

{

   SDA = ack;                  //写应答信号

   SCL = 1;                    //拉高时钟线

   Delay5us();                 //延时

   SCL = 0;                    //拉低时钟线

   Delay5us();                 //延时

}
//**************************************

//I2C接收应答信号
//**************************************

bit I2C_RecvACK()

{

   SCL = 1;                    //拉高时钟线

   Delay5us();                 //延时

   CY = SDA;                   //读应答信号

   SCL = 0;                    //拉低时钟线

   Delay5us();                 //延时

   return CY;

}//**************************************

//向I2C总线发送一个字节数据

//**************************************

void I2C_SendByte(uchar dat)

{

  uchar i;

  for (i=0; i<8; i++)         //8位计数器

  {

    dat <<= 1;              //移出数据的最高位

    SDA = CY;               //送数据口

    SCL = 1;                //拉高时钟线

     Delay5us();             //延时

    SCL = 0;                //拉低时钟线

    Delay5us();             //延时

  }

  I2C_RecvACK();

}

//**************************************

//从I2C总线接收一个字节数据

//**************************************

uchar I2C_RecvByte()

{

  uchar i;

  uchar dat = 0;

  SDA = 1;                    //使能内部上拉,准备读取数据,

  for (i=0; i<8; i++)         //8位计数器

  {

    dat <<= 1;

    SCL = 1;                //拉高时钟线

    Delay5us();             //延时

    dat |= SDA;             //读数据               

    SCL = 0;                //拉低时钟线

    Delay5us();             //延时

  }

   return dat;

}

//**************************************

//向I2C设备写入一个字节数据

//**************************************

void Single_WriteI2C(uchar REG_Address,uchar REG_data)

{

  I2C_Start();                  //起始信号

  I2C_SendByte(SlaveAddress);   //发送设备地址+写信号

  I2C_SendByte(REG_Address);    //内部寄存器地址,

  I2C_SendByte(REG_data);       //内部寄存器数据,

  I2C_Stop();                   //发送停止信号

}

//**************************************
//从I2C设备读取一个字节数据

//**************************************
uchar Single_ReadI2C(uchar REG_Address)

{
       
  uchar REG_data;  I2C_Start();                   //起始信号
  I2C_SendByte(SlaveAddress);    //发送设备地址+写信号
  I2C_SendByte(REG_Address);     //发送存储单元地址,从0开始       
  I2C_Start();                   //起始信号
       
  I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号
  REG_data=I2C_RecvByte();       //读出寄存器数据
       
  I2C_SendACK(1);                //接收应答信号
       
  I2C_Stop();                    //停止信号
       
  return REG_data;

}
//**************************************

//初始化MPU6050
//**************************************
void InitMPU6050()

{
       
   Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态
       
   Single_WriteI2C(SMPLRT_DIV, 0x07);
       
   Single_WriteI2C(CONFIG, 0x06);
       
   Single_WriteI2C(GYRO_CONFIG, 0x18);
       
   Single_WriteI2C(ACCEL_CONFIG, 0x01);

}
int GetData(uchar REG_Address)
{
       
   uchar H,L;
   H=Single_ReadI2C(REG_Address);   
   L=Single_ReadI2C(REG_Address+1);
  return (H<<8)+L;   //合成数据


}
void Display10BitData(int value)
{  
       
       
   if(abs(value)>20)
       
   {
               
     WK_Count=WK_Limit;
   }
       
   if(WK_Flag==0)
       
   {
               
     SeriPushSend(value>=0);
       
     SeriPushSend(abs(value)/256);
       
     SeriPushSend(abs(value)%256);
   }

}
void init_uart()

{
       
  TMOD=0x21;               
  TH1=0xfd;
  TL1=0xfd;       
  SCON=0x50;
  PS=1;      //串口中断设为高优先级别
  TR0=1;           //启动定时器       
  TR1=1;
  ET0=1;     //打开定时器0中断               
  ES=1;       
  EA=1;

}


//*********************************************************

//主程序

//*********************************************************
void main()

{
       
  delay(500);                //上电延时               

//InitLcd();                //液晶初始化
       
  init_uart();
  InitMPU6050();        //初始化MPU6050
       
  delay(150);
       
  WKTCL=0xFF;                //4096*560us       
  WKTCH=0x80;
       
  WK_Flag=0;
       
  while(1)
       
  {
               
     Display10BitData(GetData(ACCEL_XOUT_H),2,0);        //显示X轴加速度
       
     Display10BitData(GetData(ACCEL_YOUT_H),7,0);        //显示Y轴加速度
       
     Display10BitData(GetData(ACCEL_ZOUT_H),12,0);        //显示Z轴加速度
       
     Display10BitData(GetData(GYRO_XOUT_H));        //显示X轴角速度
               
     Display10BitData(GetData(GYRO_YOUT_H));        //显示Y轴角速度
               
     Display10BitData(GetData(GYRO_ZOUT_H));        //显示Z轴角速度
               
     SeriPushSend(0x0d);               
       
     delay(10);       
       
  }


 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表