基于stm32f103c8t6核心版的IIC总线连接MPU6050和四针oled的keil程序
时间: 2023-09-30 15:09:02 浏览: 97
以下是基于STM32F103C8T6核心板的IIC总线连接MPU6050和四针OLED的Keil程序:
首先需要导入相关的库文件和头文件。
```
#include "stm32f10x.h"
#include "delay.h"
#include "i2c.h"
#include "mpu6050.h"
#include "oled.h"
```
然后需要定义相关的IIC地址和MPU6050初始化参数。
```
#define MPU6050_ADDRESS 0xD0
MPU6050_InitTypeDef MPU6050_InitStruct;
```
接下来是主函数部分,首先进行系统初始化。
```
int main(void)
{
SystemInit();
delay_init();
I2C_Init();
MPU6050_Init(&MPU6050_InitStruct);
OLED_Init();
while (1)
{
MPU6050_ReadData();
OLED_ShowString(0, 0, "MPU6050");
OLED_ShowString(0, 2, "Accel X:");
OLED_ShowNum(64, 2, MPU6050_GetAccelX(), 5, 12);
OLED_ShowString(0, 4, "Accel Y:");
OLED_ShowNum(64, 4, MPU6050_GetAccelY(), 5, 12);
OLED_ShowString(0, 6, "Accel Z:");
OLED_ShowNum(64, 6, MPU6050_GetAccelZ(), 5, 12);
OLED_ShowString(0, 8, "Gyro X:");
OLED_ShowNum(64, 8, MPU6050_GetGyroX(), 5, 12);
OLED_ShowString(0, 10, "Gyro Y:");
OLED_ShowNum(64, 10, MPU6050_GetGyroY(), 5, 12);
OLED_ShowString(0, 12, "Gyro Z:");
OLED_ShowNum(64, 12, MPU6050_GetGyroZ(), 5, 12);
delay_ms(100);
}
}
```
在主函数中,首先进行系统初始化。然后初始化IIC总线和MPU6050传感器。接着初始化OLED屏幕。在while循环中,读取MPU6050传感器的数据,并将数据显示在OLED屏幕上。为了避免刷新过快,延时100ms。
最后是IIC总线的初始化代码和MPU6050传感器的读取数据代码。
```
void I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 400000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
void MPU6050_ReadData(void)
{
int16_t Accel_X_RAW = 0, Accel_Y_RAW = 0, Accel_Z_RAW = 0;
int16_t Gyro_X_RAW = 0, Gyro_Y_RAW = 0, Gyro_Z_RAW = 0;
uint8_t data[14];
I2C_ReadBytes(MPU6050_ADDRESS, 0x3B, data, 14);
Accel_X_RAW = (data[0] << 8) | data[1];
Accel_Y_RAW = (data[2] << 8) | data[3];
Accel_Z_RAW = (data[4] << 8) | data[5];
Gyro_X_RAW = (data[8] << 8) | data[9];
Gyro_Y_RAW = (data[10] << 8) | data[11];
Gyro_Z_RAW = (data[12] << 8) | data[13];
MPU6050_SetAccelX(Accel_X_RAW);
MPU6050_SetAccelY(Accel_Y_RAW);
MPU6050_SetAccelZ(Accel_Z_RAW);
MPU6050_SetGyroX(Gyro_X_RAW);
MPU6050_SetGyroY(Gyro_Y_RAW);
MPU6050_SetGyroZ(Gyro_Z_RAW);
}
```
其中,IIC总线的初始化代码使用了GPIOB6和GPIOB7两个引脚,并设置为开漏输出。MPU6050传感器的读取数据代码使用了I2C_ReadBytes函数,该函数可以读取MPU6050传感器的14个数据。然后将读取到的数据解析并设置到相应的变量中。最后通过MPU6050_Set函数将变量设置到MPU6050_InitTypeDef结构体中。
阅读全文