/********************************** I2C 总线驱动 ******************************
#i nclude "AT89X52.h"
#i nclude <intrins.h>
#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();} //定义空指令
sbit SDA = P1^3; //模拟I2C 数据传输位
sbit SCL = P1^2; //模拟I2C 时钟控制位
bit bdata I2C_Ack; //应答标志位
/************************************ I2C_Start *******************************
void I2C_Start()
{
SDA = 1; //发送起始条件的数据信号
_Nop();
SCL = 1;
SomeNOP(); //起始条件建立时间大于4.7us,延时
SDA = 0; //发送起始信号
SomeNOP(); //起始条件建立时间大于4us,延时
SCL = 0; //钳住I2C 总线准备发送或接收数据
/******解释:I2C 总线在空闲状态下都是被上拉为高电平的,所以当它们处于低电平时就表
示忙的状态.***/
_nop_();
_nop_();
}
/************************************ I2C_Stop ********************************
void I2C_Stop()
{
SDA = 0; //发送结束条件的数据信号
_Nop();
SCL = 1; //发送结束条件的时钟信号
SomeNOP();//结束条件建立时间大于4us,延时
SDA = 1; //发送I2C 总线结束信号
SomeNOP();
}
/************************************ I2C_CheckAck ****************************
bit I2C_CheckAck(void)
{
uchar errtime = 255; // 因故障接收方无 Ack,超时值为255
SDA = 1; //发送器先释放SDA
SomeNOP();
SCL = 1;
SomeNOP(); //时钟电平周期大于 4 us
while(SDA) //判断SDA 是否被拉低
{
errtime--;
if(errtime==0)
{
I2C_Stop();
return(0);
}
}
SCL = 0;
_nop_();
return(1);
}
/************************************ I2C_SendB *******************************
void I2C_SendB(uchar c)
{
uchar BitCnt;
for (BitCnt=0; BitCnt<8; BitCnt++) //要传送的数据长度为8 位
{