馨海林旋律 发表于 2014-4-4 10:54:14

问MPU6050读取到的数据全为257解决办法

不得不说,自学的路好艰难,在这条路上,遇到用51读取MPU6050数据全为257,请问各位遇到这个问题没有?如果遇到了是怎么解决的?不胜感激。。。。。。我用的代码,如下,借用一部分,自写一部分:
//**************************************
//延时5微秒
//**************************************
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_();
}
//**************************************
//延时函数*
//**************************************
void DELAY(unsigned int t)                  
{
    while(t!=0)
    t--;
}
//**************************************
//启动I2C总线的函数
//**************************************
void I2C_Start(void)
{
    SDA=1;
    SCL=1;
    Delay5us();
    SDA=0;
    Delay5us();
    SCL=0;
    Delay5us();
}
//**************************************
//终止I2C总线
//**************************************
void I2C_Stop(void)
{                                                       
    SDA=0;
    SCL=1;
    Delay5us();
    SDA=1;
    Delay5us();
    SCL=0;
   Delay5us();
}
//**************************************
//发送0,在SCL为高电平时使SDA信号为低
//**************************************
void SEND_0(void)   
{
    SDA=0;
    SCL=1;
    Delay5us();
    SCL=0;
    Delay5us();
}
//**************************************
//发送1
//**************************************
void SEND_1(void)
{
    SDA=1;
    SCL=1;
    Delay5us();
    SCL=0;
    Delay5us();
}
//**************************************
//发送完一个字节后检验设备的应答信号
//**************************************
bit Check_Acknowledge(void)
{
    SDA=1;
    SCL=1;
    Delay5us();
    F0=SDA;
    Delay5us();
    SCL=0;
   Delay5us();
    if(F0==1)
      return FALSE;
    else
      return TRUE;
}
//**************************************
//向I2C总线写一个字节
//**************************************
void WriteI2CByte(char REG_data)
{      
    char i;
    for(i=0;i<8;i++)
      if((REG_data<<i)&0x80)
            SEND_1();
      else
            SEND_0();
}
//**************************************
//从I2C总线读一个字节
//**************************************
char ReadI2CByte(void)
{         
    char b=0,i;
    for(i=0;i<8;i++)
    {
      SDA=1;   
      SCL=1;   
      DELAY(10);
      F0=SDA;
      DELAY(10);
      SCL=0;
      if(F0==1)
      {
            b=b<<1;
            b=b|0x01;
      }
      else
            b=b<<1;
   }
      return b;
}
//**************************************
//向MPU6050中写一个字节
//**************************************
void Write_One_Byte(char addr,char thedata)
{
    bit acktemp=1;
    I2C_Start();
    WriteI2CByte(SlaveAddress);
    acktemp=Check_Acknowledge();
    WriteI2CByte(addr);
    acktemp=Check_Acknowledge();
    WriteI2CByte(thedata);
    acktemp=Check_Acknowledge();
    I2C_Stop();
}
//**************************************
//向MPU6050中读一个字节
//**************************************
char Read_One_Byte(char addr)
{
    bit acktemp=1;
    char mydata;
    I2C_Start();
    WriteI2CByte(SlaveAddress);
    acktemp=Check_Acknowledge();
    WriteI2CByte(addr);
    acktemp=Check_Acknowledge();
    I2C_Start();
    WriteI2CByte(SlaveAddress+1);
    acktemp=Check_Acknowledge();
    mydata=ReadI2CByte();
    acktemp=Check_Acknowledge();
    return mydata;
    I2C_Stop();
}
void InitMPU6050()
{
        Write_One_Byte(PWR_MGMT_1, 0x00);        //解除休眠状态
        Write_One_Byte(SMPLRT_DIV, 0x07);
        Write_One_Byte(CONFIG, 0x06);
        Write_One_Byte(GYRO_CONFIG, 0x18);
        Write_One_Byte(ACCEL_CONFIG, 0x01);
}
//**************************************
//合成数据
//**************************************
int GetData(uchar REG_Address)
{
        char H,L;
        H=Read_One_Byte(REG_Address);
        L=Read_One_Byte(REG_Address+1);
        return (H<<8)+L;   //合成数据
}
//**************************************
//在1602上显示10位数据
//**************************************
void Display10BitData(int value,uchar x,uchar y)
{
        value/=64;                                                        //转换为10位数据
        lcd_printf(dis, value);                        //转换数据显示
        DisplayListChar(x,y,dis,4);        //启始列,行,显示数组,显示长度
}
void main()
{
        delay(60);                //上电延时               
        InitLcd();                //液晶初始化
        InitMPU6050();        //初始化MPU6050
        delay(80);
        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),2,1);        //显示X轴角速度
                Display10BitData(GetData(GYRO_YOUT_H),7,1);        //显示Y轴角速度
                Display10BitData(GetData(GYRO_ZOUT_H),12,1);        //显示Z轴角速度
                delay(60);
        }
}

happy阻电 发表于 2014-8-30 11:25:42

我也是一样呀,楼主解决了吗:'(
页: [1]
查看完整版本: 问MPU6050读取到的数据全为257解决办法