mpu6050和51单片机串口通信,串口助手显示数据完整例程
时间: 2023-05-29 13:04:31 浏览: 155
以下是mpu6050和51单片机串口通信,串口助手显示数据完整例程:
#include <reg51.h>
#define MPU6050 0xD0 // MPU6050的地址为0xD0
sbit SCL = P1^0; // I2C时钟线
sbit SDA = P1^1; // I2C数据线
unsigned char buffer[14]; // 存放MPU6050的数据
void delay(unsigned int i) // 延时函数
{
unsigned int j;
while(i--)
{
for(j=0; j<125; j++);
}
}
void I2C_start() // I2C起始信号
{
SDA = 1;
SCL = 1;
delay(1);
SDA = 0;
delay(1);
SCL = 0;
}
void I2C_stop() // I2C停止信号
{
SDA = 0;
SCL = 1;
delay(1);
SDA = 1;
delay(1);
}
void I2C_write(unsigned char dat) // I2C写数据
{
unsigned char i;
for(i=0; i<8; i++)
{
SDA = dat & 0x80;
SCL = 1;
delay(1);
SCL = 0;
dat <<= 1;
}
}
unsigned char I2C_read(unsigned char ack) // I2C读数据
{
unsigned char i, dat=0;
SDA = 1;
for(i=0; i<8; i++)
{
SCL = 1;
delay(1);
dat <<= 1;
dat |= SDA;
SCL = 0;
}
if(ack)
SDA = 0;
else
SDA = 1;
SCL = 1;
delay(1);
SCL = 0;
SDA = 1;
return dat;
}
void I2C_ack() // I2C应答信号
{
SDA = 0;
SCL = 1;
delay(1);
SCL = 0;
SDA = 1;
}
void I2C_nack() // I2C非应答信号
{
SDA = 1;
SCL = 1;
delay(1);
SCL = 0;
SDA = 1;
}
void MPU6050_init() // MPU6050初始化
{
I2C_start();
I2C_write(MPU6050);
I2C_write(0x6B); // PWR_MGMT_1寄存器
I2C_write(0x00); // 唤醒MPU6050
I2C_stop();
delay(10);
I2C_start();
I2C_write(MPU6050);
I2C_write(0x1B); // GYRO_CONFIG寄存器
I2C_write(0x10); // 陀螺仪量程为+/-1000dps
I2C_stop();
delay(10);
I2C_start();
I2C_write(MPU6050);
I2C_write(0x1C); // ACCEL_CONFIG寄存器
I2C_write(0x10); // 加速度计量程为+/-8g
I2C_stop();
delay(10);
}
void MPU6050_read() // 读取MPU6050数据
{
unsigned char i;
I2C_start();
I2C_write(MPU6050);
I2C_write(0x3B); // MPU6050的寄存器地址
I2C_start();
I2C_write(MPU6050 | 1);
for(i=0; i<14; i++)
{
buffer[i] = I2C_read(i==13 ? 0 : 1);
}
I2C_stop();
}
void UART_init() // 串口初始化
{
SCON = 0x50; // 8位数据,无校验位,1位停止位
TMOD = 0x20; // 设置计数器为模式2
TH1 = 0xFD; // 波特率为9600
TL1 = 0xFD;
TR1 = 1; // 启动计数器
}
void UART_send(unsigned char dat) // 串口发送数据
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void main()
{
unsigned char i;
MPU6050_init();
UART_init();
while(1)
{
MPU6050_read();
for(i=0; i<14; i++)
{
UART_send(buffer[i]);
}
}
}
在上述代码中,我们先定义了MPU6050的I2C地址为0xD0,并且通过sbit定义了SCL和SDA两个I2C总线引脚。接下来,我们定义了一些I2C操作函数,包括起始信号、停止信号、写数据、读数据、应答信号、非应答信号等。其中,MPU6050_init函数用于初始化MPU6050,将其唤醒,并设置陀螺仪和加速度计的量程。MPU6050_read函数用于读取MPU6050的数据,并将其存储在buffer数组中。UART_init函数用于初始化串口,设置波特率为9600,并启动计数器。UART_send函数用于发送数据到串口。
在主函数中,我们先调用MPU6050_init函数和UART_init函数进行初始化,然后进入一个死循环中。在循环中,我们调用MPU6050_read函数读取MPU6050的数据,并将其发送到串口中,以便我们可以通过串口助手查看MPU6050的数据。