IIC总线连接MPU6050和四针oled的32keil程序
时间: 2024-05-06 20:18:02 浏览: 144
用i2c总线驱动OLED程序
5星 · 资源好评率100%
以下是使用Keil软件连接MPU6050和四针OLED显示屏的IIC总线32程序:
```c
#include <reg52.h>
#include <intrins.h>
#define SCL P1_0
#define SDA P1_1
sbit OLED_SCL=P1^0;
sbit OLED_SDA=P1^1;
void delay_ms(unsigned int ms) //延时函数
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<114;j++);
}
void IIC_Start() //IIC起始信号
{
SCL=1;
SDA=1;
_nop_();
SDA=0;
_nop_();
SCL=0;
}
void IIC_Stop() //IIC停止信号
{
SCL=0;
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
}
void IIC_SendByte(unsigned char dat) //IIC发送一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
dat<<=1;
SDA=CY;
SCL=1;
_nop_();
SCL=0;
}
SDA=1;
}
unsigned char IIC_RecvByte() //IIC接收一个字节
{
unsigned char byte=0,i;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
_nop_();
byte<<=1;
byte|=SDA;
SCL=0;
}
return byte;
}
void IIC_SendACK(bit ack) //IIC发送应答信号
{
SDA=!ack;
SCL=1;
_nop_();
SCL=0;
SDA=1;
}
bit IIC_WaitACK() //IIC等待应答信号
{
bit ack;
SDA=1;
SCL=1;
ack=SDA;
SCL=0;
return !ack;
}
void OLED_WriteCmd(unsigned char cmd) //OLED写指令
{
IIC_Start();
IIC_SendByte(0x78);
IIC_WaitACK();
IIC_SendByte(0x00);
IIC_WaitACK();
IIC_SendByte(cmd);
IIC_WaitACK();
IIC_Stop();
}
void OLED_WriteDat(unsigned char dat) //OLED写数据
{
IIC_Start();
IIC_SendByte(0x78);
IIC_WaitACK();
IIC_SendByte(0x40);
IIC_WaitACK();
IIC_SendByte(dat);
IIC_WaitACK();
IIC_Stop();
}
void OLED_Init() //OLED初始化
{
OLED_WriteCmd(0xAE);
OLED_WriteCmd(0x00);
OLED_WriteCmd(0x10);
OLED_WriteCmd(0x40);
OLED_WriteCmd(0x81);
OLED_WriteCmd(0xCF);
OLED_WriteCmd(0xA1);
OLED_WriteCmd(0xC8);
OLED_WriteCmd(0xA6);
OLED_WriteCmd(0xA8);
OLED_WriteCmd(0x3F);
OLED_WriteCmd(0xD3);
OLED_WriteCmd(0x00);
OLED_WriteCmd(0xD5);
OLED_WriteCmd(0x80);
OLED_WriteCmd(0xD9);
OLED_WriteCmd(0xF1);
OLED_WriteCmd(0xDA);
OLED_WriteCmd(0x12);
OLED_WriteCmd(0xDB);
OLED_WriteCmd(0x40);
OLED_WriteCmd(0x20);
OLED_WriteCmd(0x02);
OLED_WriteCmd(0x8D);
OLED_WriteCmd(0x14);
OLED_WriteCmd(0xA4);
OLED_WriteCmd(0xA6);
OLED_WriteCmd(0xAF);
}
void MPU6050_WriteByte(unsigned char addr,unsigned char dat) //MPU6050写一个字节
{
IIC_Start();
IIC_SendByte(0xD0);
IIC_WaitACK();
IIC_SendByte(addr);
IIC_WaitACK();
IIC_SendByte(dat);
IIC_WaitACK();
IIC_Stop();
}
unsigned char MPU6050_ReadByte(unsigned char addr) //MPU6050读一个字节
{
unsigned char dat;
IIC_Start();
IIC_SendByte(0xD0);
IIC_WaitACK();
IIC_SendByte(addr);
IIC_WaitACK();
IIC_Start();
IIC_SendByte(0xD1);
IIC_WaitACK();
dat=IIC_RecvByte();
IIC_SendACK(1);
IIC_Stop();
return dat;
}
void MPU6050_Init() //MPU6050初始化
{
MPU6050_WriteByte(0x6B,0x00);
MPU6050_WriteByte(0x1A,0x00);
MPU6050_WriteByte(0x1B,0x08);
MPU6050_WriteByte(0x1C,0x00);
}
void main()
{
unsigned char i=0,ax,ay,az;
OLED_Init();
MPU6050_Init();
while(1)
{
ax=MPU6050_ReadByte(0x3B);
ay=MPU6050_ReadByte(0x3D);
az=MPU6050_ReadByte(0x3F);
OLED_WriteCmd(0xB0);
OLED_WriteCmd(i+0x00);
OLED_WriteCmd(0x10);
OLED_WriteDat(ax);
OLED_WriteDat(ay);
OLED_WriteDat(az);
delay_ms(50);
i++;
if(i==4)
i=0;
}
}
```
注意事项:
1. 在程序中需要将 OLED_SCL 和 OLED_SDA 分别连接到 P1.0 和 P1.1 两个引脚上。
2. 程序需要先初始化 MPU6050 传感器和 OLED 显示屏。
3. 程序中将 MPU6050 的 X、Y、Z 三个轴的加速度值分别显示在 OLED 的四个页面上,每个页面显示一个轴的数值。您可以根据需求修改程序。
阅读全文