极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12616|回复: 1

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

[复制链接]
发表于 2014-4-4 10:54:14 | 显示全部楼层 |阅读模式
不得不说,自学的路好艰难,在这条路上,遇到用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);
        }
}
回复

使用道具 举报

发表于 2014-8-30 11:25:42 | 显示全部楼层
我也是一样呀,楼主解决了吗
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-7 21:05 , Processed in 0.045394 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表