使用c++写51单片机的IIC代码
时间: 2024-01-13 15:02:22 浏览: 79
以下是51单片机的IIC代码:
#include <reg52.h>
#define SDA P2_1
#define SCL P2_0
void delay_us(unsigned int us) // 延迟函数
{
while(us--);
}
void IIC_Start() // IIC起始信号
{
SDA = 1;
SCL = 1;
delay_us(5);
SDA = 0;
delay_us(5);
SCL = 0;
}
void IIC_Stop() // IIC停止信号
{
SDA = 0;
SCL = 1;
delay_us(5);
SDA = 1;
delay_us(5);
}
void IIC_SendByte(unsigned char dat) // IIC发送一个字节
{
unsigned char i;
for(i=0; i<8; i++)
{
SDA = (dat & 0x80) ? 1 : 0;
dat <<= 1;
SCL = 1;
delay_us(5);
SCL = 0;
delay_us(5);
}
}
unsigned char IIC_ReadByte() // IIC读取一个字节
{
unsigned char i;
unsigned char dat;
for(i=0; i<8; i++)
{
SCL = 1;
delay_us(5);
dat <<= 1;
dat |= SDA;
SCL = 0;
delay_us(5);
}
return dat;
}
unsigned char IIC_WaitAck() // IIC等待应答信号
{
unsigned char ack;
SDA = 1;
delay_us(5);
SCL = 1;
delay_us(5);
ack = SDA;
SCL = 0;
delay_us(5);
return ack;
}
void IIC_Ack() // IIC发送应答信号
{
SDA = 0;
delay_us(5);
SCL = 1;
delay_us(5);
SCL = 0;
delay_us(5);
}
void IIC_NAck() // IIC发送非应答信号
{
SDA = 1;
delay_us(5);
SCL = 1;
delay_us(5);
SCL = 0;
delay_us(5);
}
void IIC_Write(unsigned char addr, unsigned char dat) // IIC写操作
{
IIC_Start();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
unsigned char IIC_Read(unsigned char addr) // IIC读操作
{
unsigned char dat;
IIC_Start();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(addr | 0x01);
IIC_WaitAck();
dat = IIC_ReadByte();
IIC_NAck();
IIC_Stop();
return dat;
}
void main()
{
unsigned char dat;
IIC_Write(0x68, 0x00); // 写入寄存器地址0x00
dat = IIC_Read(0x68); // 读取寄存器地址0x00的值
while(1);
}
阅读全文