用C语言实现IIC驱动程序
时间: 2024-01-21 15:48:59 浏览: 78
IIC协议用C语言实现
5星 · 资源好评率100%
这里提供一个简单的IIC驱动程序,可用于AT89C51单片机,供参考。
```c
#include <reg51.h>
sbit SDA=P2^0; //SDA引脚定义
sbit SCL=P2^1; //SCL引脚定义
void IIC_Start()
{
SDA=1; //SDA先置高电平
SCL=1; //SCL先置高电平
SDA=0; //SDA由高电平变为低电平,发起起始信号
SCL=0; //SCL保持低电平
}
void IIC_Stop()
{
SDA=0; //SDA先置低电平
SCL=1; //SCL先置高电平
SDA=1; //SDA由低电平变为高电平,发起停止信号
SCL=0; //SCL保持低电平
}
void IIC_SendByte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++) //循环8次发送8位数据
{
if(dat&0x80) //从高位开始发送
SDA=1;
else
SDA=0;
SCL=1; //SCL置高电平,数据线SDA上的数据被读取
SCL=0; //SCL置低电平
dat<<=1; //数据左移一位,准备发送下一位
}
}
unsigned char IIC_RecvByte()
{
unsigned char i;
unsigned char dat=0;
for(i=0;i<8;i++) //循环8次读取8位数据
{
dat<<=1; //数据左移一位,准备接收下一位
SCL=1; //SCL置高电平,数据线SDA上的数据被读取
if(SDA) //如果SDA上的数据为1,则将dat的最低位设为1
dat|=0x01;
SCL=0; //SCL置低电平
}
return dat;
}
unsigned char IIC_Write(unsigned char addr,unsigned char dat)
{
IIC_Start(); //发起起始信号
IIC_SendByte(addr); //发送设备地址
if(IIC_RecvByte()!=0x00) //如果从设备返回的应答信号不为0x00,则说明设备没有响应,返回错误
{
IIC_Stop();
return 1;
}
IIC_SendByte(dat); //发送数据
if(IIC_RecvByte()!=0x00) //如果从设备返回的应答信号不为0x00,则说明设备没有响应,返回错误
{
IIC_Stop();
return 1;
}
IIC_Stop(); //发起停止信号
return 0; //写操作成功,返回0
}
unsigned char IIC_Read(unsigned char addr,unsigned char *dat)
{
IIC_Start(); //发起起始信号
IIC_SendByte(addr); //发送设备地址
if(IIC_RecvByte()!=0x00) //如果从设备返回的应答信号不为0x00,则说明设备没有响应,返回错误
{
IIC_Stop();
return 1;
}
*dat=IIC_RecvByte(); //读取数据
IIC_SendByte(0x00); //向从设备发送一个应答信号
IIC_Stop(); //发起停止信号
return 0; //读操作成功,返回0
}
```
以上代码中,IIC_Start()函数用于发起起始信号,IIC_Stop()函数用于发起停止信号,IIC_SendByte()函数用于发送一个字节的数据,IIC_RecvByte()函数用于接收一个字节的数据,IIC_Write()函数用于向设备写入一个字节的数据,IIC_Read()函数用于从设备读取一个字节的数据。
需要注意的是,IIC通信需要同时控制SDA和SCL两个引脚,因此需要使用bit位来定义这两个引脚。此外,在发送和接收数据时,需要按照IIC通信协议的规定进行操作,包括先发送设备地址,再发送数据等等。如果不按照协议规定进行操作,可能会导致通信失败。
阅读全文