www.pudn.com > 24C02-external-I2C-bus-EEPROM-.rar > 24c02.c, change:2013-08-06,size:3756b


#include "24c02.h" 
//包含该头文件可以使用_nop_()函数 
#include <intrins.h> 
 
/*********************************************** 
函数名称:Delay_us 
功    能:STC 1T单片机1us延时程序 
入口参数:us:延时的微秒数 
返 回 值:无	 
备    注:外部时钟11.0592MHz 
************************************************/ 
void Delay_us(unsigned int us) 
{ 
  	while( us--) 
   	{ 
    	_nop_();  
   	}              
} 
/*********************************************** 
函数名称:AT24C02_Start 
功    能:AT24C02开始 
入口参数:无 
返 回 值:无	 
备    注:无 
************************************************/ 
void AT24C02_Start(void) 
{ 
    SDA = 1;                    //拉高数据线 
    SCL = 1;                    //拉高时钟线 
    Delay_us(10);               //延时 
    SDA = 0;                    //产生下降沿 
    Delay_us(10);               //延时 
    SCL = 0;                    //拉低时钟线 
} 
/*********************************************** 
函数名称:AT24C02_Stop 
功    能:AT24C02停止 
入口参数:无 
返 回 值:无	 
备    注:无 
************************************************/ 
void AT24C02_Stop(void) 
{ 
    SDA = 0;                    //拉低数据线 
    SCL = 1;                    //拉高时钟线 
    Delay_us(10);               //延时 
    SDA = 1;                    //产生上升沿 
    Delay_us(10);               //延时 
} 
/*********************************************** 
函数名称:AT24C02_SendACK 
功    能:单片机给AT24C02发送应答信号 
入口参数:ack (0:ACK 1:NAK) 
返 回 值:无	 
备    注:无 
************************************************/ 
void AT24C02_SendACK(bit ack) 
{ 
    SDA = ack;                  //写应答信号 
    SCL = 1;                    //拉高时钟线 
    Delay_us(10);               //延时 
    SCL = 0;                    //拉低时钟线 
    Delay_us(10);               //延时 
} 
/*********************************************** 
函数名称:AT24C02_RecvACK 
功    能:单片机从AT24C02接收应答信号 
入口参数:无 
返 回 值:bit (0:ACK 1:NAK)	 
备    注:无 
************************************************/ 
bit AT24C02_RecvACK(void) 
{	 
	bit ack; 
    SCL = 1;                    //拉高时钟线 
    Delay_us(10);               //延时 
    ack = SDA;                  //读应答信号 
    SCL = 0;                    //拉低时钟线 
    Delay_us(10);               //延时 
 
    return ack; 
} 
/*********************************************** 
函数名称:AT24C02_SendByte 
功    能:向IIC总线发送一个字节数据 
入口参数:dat:发送的数据 
返 回 值:无	 
备    注:无 
************************************************/ 
void AT24C02_SendByte(unsigned char dat) 
{ 
    unsigned char i; 
	unsigned char temp; 
 
    for (i=0; i<8; i++)         //8位计数器 
    { 
		temp=dat; 
		if( (temp&0x80)==0x80 )	//先发送高字节 
	 	{ 
	   		SDA=1; 
	 	} 
	 	else 
	 	{ 
	   		SDA=0; 
	 	} 
        dat <<= 1;              //移出数据的最高位 
        SCL = 1;                //拉高时钟线 
        Delay_us(10);           //延时 
        SCL = 0;                //拉低时钟线 
        Delay_us(10);           //延时 
    } 
    AT24C02_RecvACK(); 
} 
/*********************************************** 
函数名称:AT24C02_RecvByte 
功    能:从IIC总线接收一个字节数据 
入口参数:无 
返 回 值:unsigned char:接收到得数据	 
备    注:无 
************************************************/ 
unsigned char AT24C02_RecvByte(void) 
{ 
    unsigned char i; 
    unsigned char dat = 0; 
 
    SDA = 1;                    //拉高数据线,准备读取数据 
    for (i=0; i<8; i++)         //8位计数器 
    { 
        dat <<= 1; 
        SCL = 1;                //拉高时钟线 
        Delay_us(10);           //延时 
        dat |= SDA;             //读数据 
        SCL = 0;                //拉低时钟线 
        Delay_us(10);           //延时 
    } 
    return dat; 
}