不得不说,自学的路好艰难,在这条路上,遇到用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);
}
}
|