51单片机I2C协议示例
时间: 2023-07-21 10:09:51 浏览: 49
以下是一个51单片机使用I2C协议的简单示例:
```c
#include <reg51.h>
#define SDA P2_0 // 数据线
#define SCL P2_1 // 时钟线
sbit ACK = P2_2; // 确认信号
void I2C_Start();
void I2C_Stop();
void I2C_SendByte(unsigned char dat);
unsigned char I2C_ReceiveByte();
void Delay() {
unsigned int i;
for(i = 0; i < 1000; i++); // 延时函数
}
void main() {
unsigned char dataToSend = 0x55;
unsigned char dataReceived;
while(1) {
// 主设备发送数据
I2C_Start();
I2C_SendByte(0xA0); // 从设备地址 + 写位
I2C_SendByte(dataToSend);
I2C_Stop();
Delay();
// 主设备接收数据
I2C_Start();
I2C_SendByte(0xA1); // 从设备地址 + 读位
dataReceived = I2C_ReceiveByte();
ACK = 0; // 发送非应答信号
I2C_Stop();
// 对接收到的数据进行处理
// ...
Delay();
}
}
void I2C_Start() {
SDA = 1;
Delay();
SCL = 1;
Delay();
SDA = 0;
Delay();
SCL = 0;
Delay();
}
void I2C_Stop() {
SDA = 0;
Delay();
SCL = 1;
Delay();
SDA = 1;
Delay();
}
void I2C_SendByte(unsigned char dat) {
unsigned char i;
for(i = 0; i < 8; i++) {
SDA = (dat & 0x80) >> 7;
Delay();
SCL = 1;
Delay();
SCL = 0;
Delay();
dat <<= 1;
}
SDA = 1;
Delay();
SCL = 1;
Delay();
while(SDA) {} // 等待应答
SCL = 0;
Delay();
}
unsigned char I2C_ReceiveByte() {
unsigned char i, dat = 0;
SDA = 1;
for(i = 0; i < 8; i++) {
SCL = 1;
Delay();
dat = (dat << 1) | SDA;
SCL = 0;
Delay();
}
return dat;
}
```
这个示例演示了主设备向从设备发送数据,并从从设备接收数据。主设备通过I2C_Start()函数发送起始条件,通过I2C_SendByte()函数发送数据,并通过I2C_Stop()函数发送停止条件。从设备通过I2C_ReceiveByte()函数接收数据,并通过ACK信号发送应答。
请注意,示例中的SDA、SCL和ACK定义为特定的引脚(P2_0、P2_1和P2_2),你需要根据自己的硬件连接进行相应的修改。此外,示例中的延时函数Delay()需要根据实际情况进行调整,以保证时序的正确性。