AT24C02程序代码

#include"reg51.h"
#include "intrins.h"
sbit SCL= P1^1;
sbit SDA= P1^3;

unsigned char SystemError;

#define SomeNOP(); { _nop_(); }

delay32()
{
unsigned int i=300;
while(i--);
}

/*--------------------------------------------------------------------------------
  调用方式:void I2CStart(void) ﹫2001/07/0 4
  函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
  EA=0;
  SDA=1; SCL=1; SomeNOP();//INI
  SDA=0; SomeNOP(); //START
  SCL=0;
}

/*--------------------------------------------------------------------------------
  调用方式:void I2CStop(void) ﹫2001/07/0 4
  函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
  SCL=0; SDA=0; SomeNOP(); //INI
  SCL=1; SomeNOP(); SDA=1; //STOP
  EA=1;
}

/*--------------------------------------------------------------------------------
  调用方式:I2CAck(void) ﹫2001/07/0 4
  函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
WaitAck(void)
{
  unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
  SDA=1;SomeNOP();
  SCL=1;SomeNOP();
  SystemError=0x10;
  while(SDA)
       { errtime--;
         if(!errtime)
           {  I2CStop();
              SystemError=0x11;
              return;
           }
       }
  SCL=0;
}


/*--------------------------------------------------------------------------------
 调用方式:void SendAck(void) ﹫2001/07/0 4
 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
---------------------------------------------------------------------------------*/
 void SendNotAck(void)
 {
 SDA=1; SomeNOP();
 SCL=1; SomeNOP();
 SCL=0;
 }


/*--------------------------------------------------------------------------------
 调用方式:void I2CSend(unsigned char ch) ﹫2001/07/0 5
 函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(unsigned char ch)
{
  unsigned char i=8;
  while(i--)
       {
         SCL=0;_nop_();
         SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
         SCL=1; SomeNOP();
       }
  SCL=0;
}

/*--------------------------------------------------------------------------------
  调用方式:unsigned char I2CReceive(void) ﹫2001/07/0 5
  函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
unsigned char I2CReceiveByte(void)
{
  unsigned char i=8;
  unsigned char dat=0;
  SDA=1;
  while(i--)
       {
         dat<<=1;
         SCL=0;SomeNOP();
         SCL=1;SomeNOP();
         dat|=SDA;
       }
  SCL=0;
  return(dat);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*-------------------------------------------------------------------------------------*/
/*  向AT24C02的任意地址写入一个字节                                                    */
/*=====================================================================================*/

WriteCharToAT24C02(unsigned int add,unsigned char dat)
{
 I2CStart();
 I2CSendByte(0xA0);
 WaitAck();
// I2CSendByte((char)(add>>8));delay32();   //如果使用的芯片是AT24C02、AT24C64、AT24C128、AT24C256的话 那么这句话就不需要屏蔽了
// WaitAck();
 I2CSendByte((char)(add));delay32();
 WaitAck();
 I2CSendByte(dat);delay32();
 WaitAck();
 I2CStop();
}

/*-------------------------------------------------------------------------------------*/
/*  从AT24C02的任意地址读入一个字节                                                    */
/*=====================================================================================*/

unsigned char ReadCharFromAT24C02(unsigned int add)
{
 unsigned char a;
 I2CStart();
 I2CSendByte(0xA0);
 WaitAck();
 //I2CSendByte((char)(add>>8));   //如果使用的芯片是AT24C02、AT24C64、AT24C128、AT24C256的话 那么这句话就不需要屏蔽了
 //WaitAck();
 I2CSendByte((char)(add));
 WaitAck();
 I2CStart();
 I2CSendByte(0xA1);
 WaitAck();
 a=I2CReceiveByte();
 SendNotAck();
 I2CStop();
 return(a);
}

main()
{
 unsigned char a;
 WriteCharToAT24C02(0x10,0x55);
 a=ReadCharFromAT24C02(0x10);
 while(1);
}

posted on 2012-07-03 10:50  Arrow.Lu  阅读(359)  评论(0)    收藏  举报