文档库 最新最全的文档下载
当前位置:文档库 › 基于AT89C51的I2C驱动程序

基于AT89C51的I2C驱动程序

/*******************************************************************************************/

#include"I2C.h"

bit ack;
void I2C_Start() //I2C开始信号
{
SCL=1;
_Nop();
SDA=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
_Nop();
}
void I2C_Stop() //I2C终止信号
{
SDA=0;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0;
}
/********************************************************************/
void Ack_I2c(bit a) //确定是发ACK信号,还是/ACK信号
{
if(a==0)
SDA=1; // ACK信号
else
SDA=0; // /ACK信号
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
_Nop();
}
void I2C_WriteChar(uchar Data) //单字节写入
{
uchar i,Temp;
SCL=0; //数据在低电平时变化,高电平时稳定,每一个时钟脉冲传送一位
for(i=0;i<=7;i++)
{
Temp=(Data&0x80); //从高位开始发
if(Temp==0x80)
SDA=1;
else
SDA=0;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
Data=Data<<1;
}
SDA=1;
SCL=1;// 第九个脉冲
_Nop();
_Nop();
if(SDA==1)ack=0; //读SDA线
else ack=1;
_Nop();
SCL=0; //时钟脉冲结束
}
/********************************************************************/
//多字节数据写入
bit SendByte_m(uchar Cdata,uchar Address,uchar *s,uchar num)
{
uchar i;

I2C_Start();
I2C_WriteChar(Cdata); //发控制字A0,R/W=0 允许写
if(ack==0)return(0);
I2C_WriteChar(Address); //器件内单元地址
if(ack==0)return(0);

for(i=0;i{
I2C_WriteChar(*s);
if(ack==0)return(0);
s++;
}
I2C_Stop();
return(1);
}
/*****************************************************************************************************************/
uchar I2C_ReadChar() //在I2C中读出单个字节
{
uchar i,temp;
SDA=1; //SDA输入
for(i=0;i<=7;i++)
{
_Nop();
SCL=0; //此次脉冲结束
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=1; //脉冲开始
_Nop();
_Nop();
temp=temp<<1; //先左移一位
if(SDA=

=1) //读SDA线
temp=temp|0x01; //若接收到的位为1,则数据的最后一位置1
else
temp=temp&0xfe; //若接收到的位为0,则数据的最后位置0
}

_Nop();
return(temp);
}
/***********************************************************************************************/
//写入一个字节(功能层)
uchar I2C_ReadData(uchar Code,uchar address)
{
uchar temp; //伪写
I2C_Start();
I2C_WriteChar(Code);
if(ack==0)return(0);
I2C_WriteChar(address);
if(ack==0)return(0);

I2C_Start();
I2C_WriteChar(Code+1); //允许读
if(ack==0)return(0);
temp=I2C_ReadChar();
Ack_I2c(1);
I2C_Stop();
return(temp);
}










相关文档