51单片机i2c程序代码
时间: 2023-07-02 09:08:27 浏览: 45
以下是51单片机I2C程序代码示例:
```c
#include <reg51.h>
sbit SDA=P2^0; //定义SDA引脚
sbit SCL=P2^1; //定义SCL引脚
void delay_us(unsigned int us) //延时函数
{
while(us--);
}
void I2C_Start() //开始信号
{
SDA=1;
SCL=1;
delay_us(5);
SDA=0;
delay_us(5);
SCL=0;
}
void I2C_Stop() //停止信号
{
SDA=0;
SCL=1;
delay_us(5);
SDA=1;
delay_us(5);
}
void I2C_SendByte(unsigned char dat) //发送一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA=dat&0x80;
dat<<=1;
SCL=1;
delay_us(5);
SCL=0;
delay_us(5);
}
}
unsigned char I2C_ReceiveByte() //接收一个字节
{
unsigned char i,dat=0;
SDA=1;
for(i=0;i<8;i++)
{
dat<<=1;
SCL=1;
delay_us(5);
dat|=SDA;
SCL=0;
delay_us(5);
}
return dat;
}
bit I2C_WaitAck() //等待应答信号
{
bit ack;
SDA=1;
SCL=1;
delay_us(5);
ack=SDA;
SCL=0;
delay_us(5);
return ack;
}
void I2C_SendAck(bit ack) //发送应答信号
{
SDA=!ack;
SCL=1;
delay_us(5);
SCL=0;
delay_us(5);
}
void I2C_Write(unsigned char addr,unsigned char dat) //写一个字节
{
I2C_Start();
I2C_SendByte(addr);
I2C_WaitAck();
I2C_SendByte(dat);
I2C_WaitAck();
I2C_Stop();
}
unsigned char I2C_Read(unsigned char addr) //读一个字节
{
unsigned char dat;
I2C_Start();
I2C_SendByte(addr);
I2C_WaitAck();
I2C_Start();
I2C_SendByte(addr+1);
I2C_WaitAck();
dat=I2C_ReceiveByte();
I2C_SendAck(1);
I2C_Stop();
return dat;
}
void main()
{
unsigned char dat;
I2C_Write(0xa0,0x01); //向0xa0地址写入0x01
dat=I2C_Read(0xa0); //从0xa0地址读取数据
while(1);
}
```
以上代码仅供参考,具体实现根据实际需求进行修改。