MPU6050使用I2C协议读出X轴原始数据的51单片机程序
void i2_sj_x(uchar addr,uchar Data) //往设备内写入数据(参数 1、寄存器地址 2、写入的数据)
{
i2_qs(); //起始信号
i2_fs(SlaveAddress); //设备地址+写信号
i2_fs(addr); //寄存器内部地址
i2_fs(Data); //写入设备的数据
i2_tz(); //停止信号
}
uchar i2_sj_d(uchar addr) //读取数据(参数 寄存器地址)
{
uchar Data;
i2_qs(); //起始信号
i2_fs(SlaveAddress); //设备地址+写信号
i2_fs(addr); //寄存器内部地址
i2_qs(); //起始信号
i2_fs(SlaveAddress+1); //设备地址+读信号
Data = i2_js(); //读取数据
i2_ack(0); //ACK应答
i2_tz(); //停止信号
return Data; //返回读取的数据
}
//*******************I2C操作协议******************************
void mup6050()
{
i2_sj_x(PWR_MGMT_1, 0x00);
i2_sj_x(SMPLRT_DIV, 0x07);
i2_sj_x(CONFIG, 0x06);
i2_sj_x(GYRO_CONFIG, 0x18);
i2_sj_x(ACCEL_CONFIG, 0x01);
/*
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);//加速计自检、测量范围及高通滤波频率
*/
}
/**************************************串口**********************************/
void CSH (void) //初始化串口
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
//ES = 1; //打开串口中断
}
void SendByte(unsigned char dat) //发送一个字符
{
SBUF = dat; //SBUF 串行数据缓冲器
while(!TI); //TI发送中断标志位 (当数据发送完毕后由硬件置 1 否则等待硬件置 1)
TI = 0;
}
/************************************************************************************/
void main(void)
{
uchar dat1,dat2,i;
mup6050();
CSH();
/*
i2_sj_x(3,0x0f); //数据写入24c02
DelayMs(50);
dat = i2_sj_d(3); //从24c02中读取数据
*/
//P1 = dat; //使用8个LED显示读出的数据
while(1)
{
dat1 = i2_sj_d(GYRO_XOUT_H);
dat2 = i2_sj_d(GYRO_XOUT_H+1);
P1 = dat1;
for(i=0;i<100;i++)
DelayMs(10);
P1 = dat2;
for(i=0;i<100;i++)
DelayMs(10);
SendByte(dat1);
SendByte(dat2);
}
评论