接口:I2C_SDA = P2_0; I2C_SCL= P2_1;
总代码
#include "iic.h"
#include <REGX52.H>
//接口定义
sbit IIC_SDA = P2^0;
sbit IIC_SCL = P2^1;
/**********************************
函数名称:IIC_Start
参 数:无
返回 值:无
函数功能:IIC开始
************************************/
void IIC_Start(void)
{
IIC_SCL = 0; //开始不确定SDA为低还是高
IIC_SDA = 1; //拉高SDA线为高电平
IIC_SCL = 1; //拉高SCL线为高电平
IIC_SDA = 0; //在SCL为高时,SDA产生下降沿信号
IIC_SCL = 0; //钳住SCL总线,准备发送或接收数据
}
/**********************************
函数名称:IIC_Stop
参 数:无
返回 值:无
函数功能:IIC结束 当SCL为高时,SDA上升沿
************************************/
void IIC_Stop(void)
{
IIC_SCL = 0; //开始不确定SDA为低还是高
IIC_SDA = 0; //拉低SDA,确保SDA是由低变高
IIC_SCL = 1; //拉高SCL
IIC_SDA = 1; //SDA产生上升沿
}
/**********************************
函数名称:IIC_SendByte
参 数:Byte-发送的字节数据
返回 值:无
函数功能:IIC发送一个字节
************************************/
void IIC_SendByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
IIC_SDA=Byte&(0x80>>i); //先把最高位放在SDA线上
IIC_SCL = 1; //再SCL高电平时,读取SDA
IIC_SCL = 0; //钳住SCL总线,准备下一次发送或者接收
}
}
/**********************************
函数名称:IIC_ReceiveByte
参 数:无
返回 值:Byte-返回接收到的数据
函数功能:IIC接收一个字节
************************************/
unsigned char IIC_ReceiveByte(void)
{
unsigned char i,Byte=0x00;
IIC_SDA = 1; //主机释放SDA
for(i=0;i<8;i++)
{
IIC_SCL = 1; //再SCL高电平时,读取SDA
if(IIC_SDA){Byte |= (0x80>>i);}//先取出最高位放在SDA线上
IIC_SCL = 0; //钳住SCL总线,准备下一次发送或者接收
}
return Byte;
}
/**********************************
函数名称:IIC_SendACK
参 数:应答位-Ack(0为应答;1为非应答)
返回 值:无
函数功能:IIC发送应答
************************************/
void IIC_SendACK(unsigned char Ack)
{
IIC_SDA = Ack;
IIC_SCL = 1;
IIC_SCL = 0;
}
/**********************************
函数名称:IIC_RecAck
参 数:无
返 回 值:应答位-Ack(0为应答;1为非应答)
函数功能:IIC接收应答
************************************/
unsigned char IIC_RecAck(void)
{
unsigned char Ack;
IIC_SDA = 1; //主机释放SDA
IIC_SCL = 1;
Ack = IIC_SDA;
IIC_SCL = 0;
return Ack;
}
分代码,解析
一、IIC开始信号
/**********************************
函数名称:IIC_Start
参 数:无
返回 值:无
函数功能:IIC开始
************************************/
void IIC_Start(void)
{
IIC_SCL = 0; //开始不确定SDA为低还是高
IIC_SDA = 1; //拉高SDA线为高电平
IIC_SCL = 1; //拉高SCL线为高电平
IIC_SDA = 0; //在SCL为高时,SDA产生下降沿信号
IIC_SCL = 0; //钳住SCL总线,准备发送或接收数据
}
二、IIC结束信号
/**********************************
函数名称:IIC_Stop
参 数:无
返回 值:无
函数功能:IIC结束 当SCL为高时,SDA上升沿
************************************/
void IIC_Stop(void)
{
IIC_SCL = 0; //开始不确定SDA为低还是高
IIC_SDA = 0; //拉低SDA,确保SDA是由低变高
IIC_SCL = 1; //拉高SCL
IIC_SDA = 1; //SDA产生上升沿
}
三、IIC发送一个字节
/**********************************
函数名称:IIC_SendByte
参 数:Byte-发送的字节数据
返回 值:无
函数功能:IIC发送一个字节
************************************/
void IIC_SendByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
IIC_SDA=Byte&(0x80>>i); //先把最高位放在SDA线上
IIC_SCL = 1; //再SCL高电平时,读取SDA
IIC_SCL = 0; //钳住SCL总线,准备下一次发送或者接收
}
}
四、IIC接收一个字节
/**********************************
函数名称:IIC_ReceiveByte
参 数:无
返回 值:Byte-返回接收到的数据
函数功能:IIC接收一个字节
************************************/
unsigned char IIC_ReceiveByte(void)
{
unsigned char i,Byte=0x00;
IIC_SDA = 1; //主机释放SDA
for(i=0;i<8;i++)
{
IIC_SCL = 1; //再SCL高电平时,读取SDA
if(IIC_SDA){Byte |= (0x80>>i);}//先取出最高位放在SDA线上
IIC_SCL = 0; //钳住SCL总线,准备下一次发送或者接收
}
return Byte;
}
五、IIC发送应答
/**********************************
函数名称:IIC_SendACK
参 数:应答位-Ack(0为应答;1为非应答)
返回 值:无
函数功能:IIC发送应答
************************************/
void IIC_SendACK(unsigned char Ack)
{
IIC_SDA = Ack;
IIC_SCL = 1;
IIC_SCL = 0;
}
六、IIC接收应答
/**********************************
函数名称:IIC_RecAck
参 数:无
返 回 值:应答位-Ack(0为应答;1为非应答)
函数功能:IIC接收应答
************************************/
unsigned char IIC_RecAck(void)
{
unsigned char Ack;
IIC_SDA = 1; //主机释放SDA
IIC_SCL = 1;
Ack = IIC_SDA;
IIC_SCL = 0;
return Ack;
}