建网站需要什么手续,建个网址需要多少钱,上市公司做网站,免费秒玩小游戏目录 本章概述 完整代码 main.c MyI2C.c MyI2C.h MPU6050.c MPU6050.h MPU6050_Reg.h OELD.c OLED.h OLED_Font.h 总结 本章概述 多的不说少的不唠#xff0c;这一篇给大家提供MPU6050模块的移植代码#xff0c;源码是江协科技的STM32的软件I2C驱动MPU6050#x…目录本章概述完整代码main.cMyI2C.cMyI2C.hMPU6050.cMPU6050.hMPU6050_Reg.hOELD.cOLED.hOLED_Font.h总结本章概述多的不说少的不唠这一篇给大家提供MPU6050模块的移植代码源码是江协科技的STM32的软件I2C驱动MPU6050本章将改代码移植到CH32V307中来可以当作参考。代码只修改兼容问题必要的部分其余不做修改。完整代码引脚修改CH32OLEDPC4SCLPC5SDACH32MPU6050PC1SCLPC2SDAmain.c#include ch32v30x.h #include debug.h #include OLED.h #include MPU6050.h uint8_t ID; //定义用于存放ID号的变量 int16_t AX, AY, AZ, GX, GY, GZ; //定义用于存放各个数据的变量 int main(void) { /*模块初始化*/ OLED_Init(); //OLED初始化 MPU6050_Init(); //MPU6050初始化 /*显示ID号*/ OLED_ShowString(1, 1, ID:); //显示静态字符串 ID MPU6050_GetID(); //获取MPU6050的ID号 OLED_ShowHexNum(1, 4, ID, 2); //OLED显示ID号 while (1) { Delay_Us(1); MPU6050_GetData(AX, AY, AZ, GX, GY, GZ); //获取MPU6050的数据 OLED_ShowSignedNum(2, 1, AX, 5); //OLED显示数据 OLED_ShowSignedNum(3, 1, AY, 5); OLED_ShowSignedNum(4, 1, AZ, 5); OLED_ShowSignedNum(2, 8, GX, 5); OLED_ShowSignedNum(3, 8, GY, 5); OLED_ShowSignedNum(4, 8, GZ, 5); } }主函数中的循环添加了1us延时也可以加其他动作不加的话程序会跑飞。MyI2C.c#include ch32v30x.h #include debug.h /*引脚配置层*/ /** * 函 数I2C写SCL引脚电平 * 参 数BitValue 协议层传入的当前需要写入SCL的电平范围0~1 * 返 回 值无 * 注意事项此函数需要用户实现内容当BitValue为0时需要置SCL为低电平当BitValue为1时需要置SCL为高电平 */ void MyI2C_W_SCL(uint8_t BitValue) { GPIO_WriteBit(GPIOC, GPIO_Pin_1, (BitAction)BitValue); //根据BitValue设置SCL引脚的电平 Delay_Us(10); //延时10us防止时序频率超过要求 } /** * 函 数I2C写SDA引脚电平 * 参 数BitValue 协议层传入的当前需要写入SDA的电平范围0~0xFF * 返 回 值无 * 注意事项此函数需要用户实现内容当BitValue为0时需要置SDA为低电平当BitValue非0时需要置SDA为高电平 */ void MyI2C_W_SDA(uint8_t BitValue) { GPIO_WriteBit(GPIOC, GPIO_Pin_2, (BitAction)BitValue); //根据BitValue设置SDA引脚的电平BitValue要实现非0即1的特性 Delay_Us(10); //延时10us防止时序频率超过要求 } /** * 函 数I2C读SDA引脚电平 * 参 数无 * 返 回 值协议层需要得到的当前SDA的电平范围0~1 * 注意事项此函数需要用户实现内容当前SDA为低电平时返回0当前SDA为高电平时返回1 */ uint8_t MyI2C_R_SDA(void) { uint8_t BitValue; BitValue GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2); //读取SDA电平 Delay_Us(10); //延时10us防止时序频率超过要求 return BitValue; //返回SDA电平 } /** * 函 数I2C初始化 * 参 数无 * 返 回 值无 * 注意事项此函数需要用户实现内容实现SCL和SDA引脚的初始化 */ void MyI2C_Init(void) { /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //开启GPIOB的时钟 /*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Pin GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOC, GPIO_InitStructure); //将PB10和PB11引脚初始化为开漏输出 /*设置默认电平*/ GPIO_SetBits(GPIOC, GPIO_Pin_1 | GPIO_Pin_2); //设置PB10和PB11引脚初始化后默认为高电平释放总线状态 } /*协议层*/ /** * 函 数I2C起始 * 参 数无 * 返 回 值无 */ void MyI2C_Start(void) { MyI2C_W_SDA(1); //释放SDA确保SDA为高电平 MyI2C_W_SCL(1); //释放SCL确保SCL为高电平 MyI2C_W_SDA(0); //在SCL高电平期间拉低SDA产生起始信号 MyI2C_W_SCL(0); //起始后把SCL也拉低即为了占用总线也为了方便总线时序的拼接 } /** * 函 数I2C终止 * 参 数无 * 返 回 值无 */ void MyI2C_Stop(void) { MyI2C_W_SDA(0); //拉低SDA确保SDA为低电平 MyI2C_W_SCL(1); //释放SCL使SCL呈现高电平 MyI2C_W_SDA(1); //在SCL高电平期间释放SDA产生终止信号 } /** * 函 数I2C发送一个字节 * 参 数Byte 要发送的一个字节数据范围0x00~0xFF * 返 回 值无 */ void MyI2C_SendByte(uint8_t Byte) { uint8_t i; for (i 0; i 8; i ) //循环8次主机依次发送数据的每一位 { MyI2C_W_SDA(Byte (0x80 i)); //使用掩码的方式取出Byte的指定一位数据并写入到SDA线 MyI2C_W_SCL(1); //释放SCL从机在SCL高电平期间读取SDA MyI2C_W_SCL(0); //拉低SCL主机开始发送下一位数据 } } /** * 函 数I2C接收一个字节 * 参 数无 * 返 回 值接收到的一个字节数据范围0x00~0xFF */ uint8_t MyI2C_ReceiveByte(void) { uint8_t i, Byte 0x00; //定义接收的数据并赋初值0x00此处必须赋初值0x00后面会用到 MyI2C_W_SDA(1); //接收前主机先确保释放SDA避免干扰从机的数据发送 for (i 0; i 8; i ) //循环8次主机依次接收数据的每一位 { MyI2C_W_SCL(1); //释放SCL主机机在SCL高电平期间读取SDA if (MyI2C_R_SDA() 1){Byte | (0x80 i);} //读取SDA数据并存储到Byte变量 //当SDA为1时置变量指定位为1当SDA为0时不做处理指定位为默认的初值0 MyI2C_W_SCL(0); //拉低SCL从机在SCL低电平期间写入SDA } return Byte; //返回接收到的一个字节数据 } /** * 函 数I2C发送应答位 * 参 数Byte 要发送的应答位范围0~10表示应答1表示非应答 * 返 回 值无 */ void MyI2C_SendAck(uint8_t AckBit) { MyI2C_W_SDA(AckBit); //主机把应答位数据放到SDA线 MyI2C_W_SCL(1); //释放SCL从机在SCL高电平期间读取应答位 MyI2C_W_SCL(0); //拉低SCL开始下一个时序模块 } /** * 函 数I2C接收应答位 * 参 数无 * 返 回 值接收到的应答位范围0~10表示应答1表示非应答 */ uint8_t MyI2C_ReceiveAck(void) { uint8_t AckBit; //定义应答位变量 MyI2C_W_SDA(1); //接收前主机先确保释放SDA避免干扰从机的数据发送 MyI2C_W_SCL(1); //释放SCL主机机在SCL高电平期间读取SDA AckBit MyI2C_R_SDA(); //将应答位存储到变量里 MyI2C_W_SCL(0); //拉低SCL开始下一个时序模块 return AckBit; //返回定义应答位变量 }MyI2C.h#ifndef __MYI2C_H #define __MYI2C_H void MyI2C_Init(void); void MyI2C_Start(void); void MyI2C_Stop(void); void MyI2C_SendByte(uint8_t Byte); uint8_t MyI2C_ReceiveByte(void); void MyI2C_SendAck(uint8_t AckBit); uint8_t MyI2C_ReceiveAck(void); #endifMPU6050.c#include ch32v30x.h #include MyI2C.h #include MPU6050_Reg.h #define MPU6050_ADDRESS 0xD0 //MPU6050的I2C从机地址 /** * 函 数MPU6050写寄存器 * 参 数RegAddress 寄存器地址范围参考MPU6050手册的寄存器描述 * 参 数Data 要写入寄存器的数据范围0x00~0xFF * 返 回 值无 */ void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data) { MyI2C_Start(); //I2C起始 MyI2C_SendByte(MPU6050_ADDRESS); //发送从机地址读写位为0表示即将写入 MyI2C_ReceiveAck(); //接收应答 MyI2C_SendByte(RegAddress); //发送寄存器地址 MyI2C_ReceiveAck(); //接收应答 MyI2C_SendByte(Data); //发送要写入寄存器的数据 MyI2C_ReceiveAck(); //接收应答 MyI2C_Stop(); //I2C终止 } /** * 函 数MPU6050读寄存器 * 参 数RegAddress 寄存器地址范围参考MPU6050手册的寄存器描述 * 返 回 值读取寄存器的数据范围0x00~0xFF */ uint8_t MPU6050_ReadReg(uint8_t RegAddress) { uint8_t Data; MyI2C_Start(); //I2C起始 MyI2C_SendByte(MPU6050_ADDRESS); //发送从机地址读写位为0表示即将写入 MyI2C_ReceiveAck(); //接收应答 MyI2C_SendByte(RegAddress); //发送寄存器地址 MyI2C_ReceiveAck(); //接收应答 MyI2C_Start(); //I2C重复起始 MyI2C_SendByte(MPU6050_ADDRESS | 0x01); //发送从机地址读写位为1表示即将读取 MyI2C_ReceiveAck(); //接收应答 Data MyI2C_ReceiveByte(); //接收指定寄存器的数据 MyI2C_SendAck(1); //发送应答给从机非应答终止从机的数据输出 MyI2C_Stop(); //I2C终止 return Data; } /** * 函 数MPU6050初始化 * 参 数无 * 返 回 值无 */ void MPU6050_Init(void) { MyI2C_Init(); //先初始化底层的I2C /*MPU6050寄存器初始化需要对照MPU6050手册的寄存器描述配置此处仅配置了部分重要的寄存器*/ MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01); //电源管理寄存器1取消睡眠模式选择时钟源为X轴陀螺仪 MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00); //电源管理寄存器2保持默认值0所有轴均不待机 MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09); //采样率分频寄存器配置采样率 MPU6050_WriteReg(MPU6050_CONFIG, 0x06); //配置寄存器配置DLPF MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18); //陀螺仪配置寄存器选择满量程为±2000°/s MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18); //加速度计配置寄存器选择满量程为±16g } /** * 函 数MPU6050获取ID号 * 参 数无 * 返 回 值MPU6050的ID号 */ uint8_t MPU6050_GetID(void) { return MPU6050_ReadReg(MPU6050_WHO_AM_I); //返回WHO_AM_I寄存器的值 } /** * 函 数MPU6050获取数据 * 参 数AccX AccY AccZ 加速度计X、Y、Z轴的数据使用输出参数的形式返回范围-32768~32767 * 参 数GyroX GyroY GyroZ 陀螺仪X、Y、Z轴的数据使用输出参数的形式返回范围-32768~32767 * 返 回 值无 */ void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ) { uint8_t DataH, DataL; //定义数据高8位和低8位的变量 DataH MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H); //读取加速度计X轴的高8位数据 DataL MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L); //读取加速度计X轴的低8位数据 *AccX (DataH 8) | DataL; //数据拼接通过输出参数返回 DataH MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H); //读取加速度计Y轴的高8位数据 DataL MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L); //读取加速度计Y轴的低8位数据 *AccY (DataH 8) | DataL; //数据拼接通过输出参数返回 DataH MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H); //读取加速度计Z轴的高8位数据 DataL MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L); //读取加速度计Z轴的低8位数据 *AccZ (DataH 8) | DataL; //数据拼接通过输出参数返回 DataH MPU6050_ReadReg(MPU6050_GYRO_XOUT_H); //读取陀螺仪X轴的高8位数据 DataL MPU6050_ReadReg(MPU6050_GYRO_XOUT_L); //读取陀螺仪X轴的低8位数据 *GyroX (DataH 8) | DataL; //数据拼接通过输出参数返回 DataH MPU6050_ReadReg(MPU6050_GYRO_YOUT_H); //读取陀螺仪Y轴的高8位数据 DataL MPU6050_ReadReg(MPU6050_GYRO_YOUT_L); //读取陀螺仪Y轴的低8位数据 *GyroY (DataH 8) | DataL; //数据拼接通过输出参数返回 DataH MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H); //读取陀螺仪Z轴的高8位数据 DataL MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L); //读取陀螺仪Z轴的低8位数据 *GyroZ (DataH 8) | DataL; //数据拼接通过输出参数返回 }MPU6050.h#ifndef __MPU6050_H #define __MPU6050_H void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data); uint8_t MPU6050_ReadReg(uint8_t RegAddress); void MPU6050_Init(void); uint8_t MPU6050_GetID(void); void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ); #endifMPU6050_Reg.h#ifndef __MPU6050_REG_H #define __MPU6050_REG_H #define MPU6050_SMPLRT_DIV 0x19 #define MPU6050_CONFIG 0x1A #define MPU6050_GYRO_CONFIG 0x1B #define MPU6050_ACCEL_CONFIG 0x1C #define MPU6050_ACCEL_XOUT_H 0x3B #define MPU6050_ACCEL_XOUT_L 0x3C #define MPU6050_ACCEL_YOUT_H 0x3D #define MPU6050_ACCEL_YOUT_L 0x3E #define MPU6050_ACCEL_ZOUT_H 0x3F #define MPU6050_ACCEL_ZOUT_L 0x40 #define MPU6050_TEMP_OUT_H 0x41 #define MPU6050_TEMP_OUT_L 0x42 #define MPU6050_GYRO_XOUT_H 0x43 #define MPU6050_GYRO_XOUT_L 0x44 #define MPU6050_GYRO_YOUT_H 0x45 #define MPU6050_GYRO_YOUT_L 0x46 #define MPU6050_GYRO_ZOUT_H 0x47 #define MPU6050_GYRO_ZOUT_L 0x48 #define MPU6050_PWR_MGMT_1 0x6B #define MPU6050_PWR_MGMT_2 0x6C #define MPU6050_WHO_AM_I 0x75 #endifOELD.c#include ch32v30x.h #include OLED_Font.h void OLED_W_SCL(uint8_t Byte) { GPIO_WriteBit(GPIOC, GPIO_Pin_4, (BitAction)Byte); Delay_Us(1); } void OLED_W_SDA(uint8_t Byte) { GPIO_WriteBit(GPIOC, GPIO_Pin_5, (BitAction)Byte); Delay_Us(1); } /*引脚初始化*/ void OLED_I2C_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; GPIO_Init(GPIOC, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_5; GPIO_Init(GPIOC, GPIO_InitStructure); OLED_W_SCL(1); OLED_W_SDA(1); } /** * brief I2C开始 * param 无 * retval 无 */ void OLED_I2C_Start(void) { OLED_W_SDA(1); OLED_W_SCL(1); OLED_W_SDA(0); OLED_W_SCL(0); } /** * brief I2C停止 * param 无 * retval 无 */ void OLED_I2C_Stop(void) { OLED_W_SDA(0); OLED_W_SCL(1); OLED_W_SDA(1); } /** * brief I2C发送一个字节 * param Byte 要发送的一个字节 * retval 无 */ void OLED_I2C_SendByte(uint8_t Byte) { uint8_t i; for (i 0; i 8; i) { OLED_W_SDA(Byte (0x80 i)); OLED_W_SCL(1); OLED_W_SCL(0); } OLED_W_SCL(1); //额外的一个时钟不处理应答信号 OLED_W_SCL(0); } /** * brief OLED写命令 * param Command 要写入的命令 * retval 无 */ void OLED_WriteCommand(uint8_t Command) { OLED_I2C_Start(); OLED_I2C_SendByte(0x78); //从机地址 OLED_I2C_SendByte(0x00); //写命令 OLED_I2C_SendByte(Command); OLED_I2C_Stop(); } /** * brief OLED写数据 * param Data 要写入的数据 * retval 无 */ void OLED_WriteData(uint8_t Data) { OLED_I2C_Start(); OLED_I2C_SendByte(0x78); //从机地址 OLED_I2C_SendByte(0x40); //写数据 OLED_I2C_SendByte(Data); OLED_I2C_Stop(); } /** * brief OLED设置光标位置 * param Y 以左上角为原点向下方向的坐标范围0~7 * param X 以左上角为原点向右方向的坐标范围0~127 * retval 无 */ void OLED_SetCursor(uint8_t Y, uint8_t X) { OLED_WriteCommand(0xB0 | Y); //设置Y位置 OLED_WriteCommand(0x10 | ((X 0xF0) 4)); //设置X位置高4位 OLED_WriteCommand(0x00 | (X 0x0F)); //设置X位置低4位 } /** * brief OLED清屏 * param 无 * retval 无 */ void OLED_Clear(void) { uint8_t i, j; for (j 0; j 8; j) { OLED_SetCursor(j, 0); for(i 0; i 128; i) { OLED_WriteData(0x00); } } } /** * brief OLED显示一个字符 * param Line 行位置范围1~4 * param Column 列位置范围1~16 * param Char 要显示的一个字符范围ASCII可见字符 * retval 无 */ void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char) { uint8_t i; OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8); //设置光标位置在上半部分 for (i 0; i 8; i) { OLED_WriteData(OLED_F8x16[Char - ][i]); //显示上半部分内容 } OLED_SetCursor((Line - 1) * 2 1, (Column - 1) * 8); //设置光标位置在下半部分 for (i 0; i 8; i) { OLED_WriteData(OLED_F8x16[Char - ][i 8]); //显示下半部分内容 } } /** * brief OLED显示字符串 * param Line 起始行位置范围1~4 * param Column 起始列位置范围1~16 * param String 要显示的字符串范围ASCII可见字符 * retval 无 */ void OLED_ShowString(uint8_t Line, uint8_t Column, char *String) { uint8_t i; for (i 0; String[i] ! \0; i) { OLED_ShowChar(Line, Column i, String[i]); } } /** * brief OLED次方函数 * retval 返回值等于X的Y次方 */ uint32_t OLED_Pow(uint32_t X, uint32_t Y) { uint32_t Result 1; while (Y--) { Result * X; } return Result; } /** * brief OLED显示数字十进制正数 * param Line 起始行位置范围1~4 * param Column 起始列位置范围1~16 * param Number 要显示的数字范围0~4294967295 * param Length 要显示数字的长度范围1~10 * retval 无 */ void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) { uint8_t i; for (i 0; i Length; i) { OLED_ShowChar(Line, Column i, Number / OLED_Pow(10, Length - i - 1) % 10 0); } } /** * brief OLED显示数字十进制带符号数 * param Line 起始行位置范围1~4 * param Column 起始列位置范围1~16 * param Number 要显示的数字范围-2147483648~2147483647 * param Length 要显示数字的长度范围1~10 * retval 无 */ void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length) { uint8_t i; uint32_t Number1; if (Number 0) { OLED_ShowChar(Line, Column, ); Number1 Number; } else { OLED_ShowChar(Line, Column, -); Number1 -Number; } for (i 0; i Length; i) { OLED_ShowChar(Line, Column i 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 0); } } /** * brief OLED显示数字十六进制正数 * param Line 起始行位置范围1~4 * param Column 起始列位置范围1~16 * param Number 要显示的数字范围0~0xFFFFFFFF * param Length 要显示数字的长度范围1~8 * retval 无 */ void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) { uint8_t i, SingleNumber; for (i 0; i Length; i) { SingleNumber Number / OLED_Pow(16, Length - i - 1) % 16; if (SingleNumber 10) { OLED_ShowChar(Line, Column i, SingleNumber 0); } else { OLED_ShowChar(Line, Column i, SingleNumber - 10 A); } } } /** * brief OLED显示数字二进制正数 * param Line 起始行位置范围1~4 * param Column 起始列位置范围1~16 * param Number 要显示的数字范围0~1111 1111 1111 1111 * param Length 要显示数字的长度范围1~16 * retval 无 */ void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) { uint8_t i; for (i 0; i Length; i) { OLED_ShowChar(Line, Column i, Number / OLED_Pow(2, Length - i - 1) % 2 0); } } /** * brief OLED初始化 * param 无 * retval 无 */ void OLED_Init(void) { uint32_t i, j; for (i 0; i 1000; i) //上电延时 { for (j 0; j 1000; j); } OLED_I2C_Init(); //端口初始化 OLED_WriteCommand(0xAE); //关闭显示 OLED_WriteCommand(0xD5); //设置显示时钟分频比/振荡器频率 OLED_WriteCommand(0x80); OLED_WriteCommand(0xA8); //设置多路复用率 OLED_WriteCommand(0x3F); OLED_WriteCommand(0xD3); //设置显示偏移 OLED_WriteCommand(0x00); OLED_WriteCommand(0x40); //设置显示开始行 OLED_WriteCommand(0xA1); //设置左右方向0xA1正常 0xA0左右反置 OLED_WriteCommand(0xC8); //设置上下方向0xC8正常 0xC0上下反置 OLED_WriteCommand(0xDA); //设置COM引脚硬件配置 OLED_WriteCommand(0x12); OLED_WriteCommand(0x81); //设置对比度控制 OLED_WriteCommand(0xCF); OLED_WriteCommand(0xD9); //设置预充电周期 OLED_WriteCommand(0xF1); OLED_WriteCommand(0xDB); //设置VCOMH取消选择级别 OLED_WriteCommand(0x30); OLED_WriteCommand(0xA4); //设置整个显示打开/关闭 OLED_WriteCommand(0xA6); //设置正常/倒转显示 OLED_WriteCommand(0x8D); //设置充电泵 OLED_WriteCommand(0x14); OLED_WriteCommand(0xAF); //开启显示 OLED_Clear(); //OLED清屏 }OLED.h#ifndef __OLED_H #define __OLED_H void OLED_Init(void); void OLED_Clear(void); void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char); void OLED_ShowString(uint8_t Line, uint8_t Column, char *String); void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length); void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); #endifOLED_Font.h#ifndef __OLED_FONT_H #define __OLED_FONT_H #include ch32v30x.h /*OLED字模库宽8像素高16像素*/ const uint8_t OLED_F8x16[][16] { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0 0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1 0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 2 0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00, 0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3 0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00, 0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4 0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00, 0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5 0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00, 0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,// 6 0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 7 0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00, 0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8 0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00, 0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9 0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00, 0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10 0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00, 0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,// 11 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14 0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04, 0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, 0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, 0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, 0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, 0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, 0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, 0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27 0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00, 0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,// 28 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,// 29 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00, 0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,// 30 0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00, 0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31 0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00, 0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,// 32 0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00, 0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33 0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00, 0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34 0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00, 0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35 0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00, 0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00, 0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00, 0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38 0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00, 0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08, 0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40 0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00, 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41 0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00, 0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42 0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00, 0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43 0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00, 0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44 0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00, 0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45 0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08, 0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00, 0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47 0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00, 0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00, 0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49 0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00, 0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50 0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00, 0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51 0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00, 0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08, 0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53 0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08, 0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54 0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00, 0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55 0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08, 0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56 0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00, 0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57 0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00, 0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58 0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00, 0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59 0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60 0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00, 0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61 0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 64 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00, 0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65 0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00, 0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, 0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67 0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00, 0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00, 0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69 0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18, 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00, 0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71 0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00, 0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72 0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00, 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73 0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00, 0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74 0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00, 0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75 0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00, 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77 0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00, 0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00, 0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79 0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00, 0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00, 0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81 0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00, 0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00, 0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83 0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00, 0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84 0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00, 0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80, 0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86 0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80, 0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87 0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00, 0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80, 0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90 0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02, 0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92 0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00, 0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93 0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94 }; #endif总结这里只移植了获取数据的代码没有解算姿态角可以自行根据需要选择解算姿态角的算法后面有时间的话我会再更新姿态角的解算。江协科技的平衡车项目教程中应该也有教姿态角的解算感兴趣的可以去学习一下。有需要的可以在评论中留言感谢