⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c读写eeprom程序.c

📁 一个在通用i2c程序基础上加入自己的修改
💻 C
字号:
I2C读写EEPROM程序
[ 2007-5-23 9:34:00 | By: ly_zw ]
#i nclude <reg51.h>
#i nclude <intrins.h>
#define uchar  unsigned char
#define uint  unsigned int

sbit SDA=P0^4;
sbit SCL=P0^5;
sbit P0_0=P0^0;               //
void  delay()
{
   _nop_();   
   _nop_();
   _nop_();
   _nop_();
   _nop_();
}

void delayms(uint dlycnt)
{
  uint i;
  for(;dlycnt>0;dlycnt--)
     {
       for(i=0;i<124;i++)
       {;}
     }
  
}

void  Start()       //SCL为高时,SDA由高到低的变化就是一个起始状态
{
  SCL=0;
  _nop_();
  SDA=1;
  _nop_();
  SCL=1;
  delay();
  SDA=0;
  delay();
  SCL=0;
  _nop_();
}
void  Stop()       //SCL为高时,SDA由低到高的变化就是一个起始状态
{
  SDA=0;
  _nop_();
  SCL=1;
  _nop_();
  SDA=1;
  delay();
  SCL=0;
  _nop_();
}

void  SendByte(uchar SData)     //发送数据SCL为低时数据SDA改变,SCL为高时发送
{
  uchar j;
  for(j=0;j<8;j++)
  {
     SCL=0;
     SData<<=1;
     SDA=CY;
     SCL=1;
     delay();
  }
  SCL=0;
}
uchar ReceiveByte()        //接收数据
{
   uchar i;
   uchar RData;
   RData=0;

   for(i=0;i<8;i++)
   {  
      SDA=1;
      _nop_();
      SCL=1;
      _nop_();
      _nop_();
      RData=RData<<1;
      RData=RData|SDA;
      _nop_();
      _nop_();
      SCL=0;
    }
   return(RData);
}

bit  ReceiveAck()                    //主机接收应答信号 
{
  bit Ack;
  SDA=1;                  
  _nop_();
  _nop_();
  SCL=1;           
  _nop_();
  _nop_();
  Ack=SDA;
  _nop_();
  _nop_();
  SCL=0;
  _nop_();
  return(Ack);
}
void SendAck()
{
  SDA=0;
  _nop_();
  _nop_();
  SCL=1;
  delay();          
  SCL=0;
  _nop_();
  _nop_();
}

void SendNoAck()
{
  SDA=1;
  _nop_();
  _nop_();
  SCL=1;
  delay();   
  SCL=0;
  _nop_();
  _nop_();
}
void SendToSubAddress(uchar SlaveAddress,uchar SubAddress,uchar *pSData,uchar N)
{
  uchar i;
  Start();
  SendByte(SlaveAddress);    //选择器件地址
  ReceiveAck();
  SendByte(SubAddress);    //发送字地址
  ReceiveAck();

  for(i=0;i<N;i++)
  {
    SendByte(pSData[i]);
    ReceiveAck();
  }
  Stop();
}
void ReceiveFromSubAddress(uchar SlaveAddress,uchar SubAddress,uchar *pRData,uchar N)
{
  uchar i;
  Start();
  SendByte(SlaveAddress);    //发送器件地址
  ReceiveAck();
  SendByte(SubAddress);    //发送字地址
  ReceiveAck();
  Start();                              //I2C 开始
  SendByte(SlaveAddress+1);    //读设备
  ReceiveAck();
  for(i=0;i<N-1;i++)
  {
     pRData[i]=ReceiveByte();
     SendAck();
  }
  pRData[i]=ReceiveByte();
  SendNoAck();
  Stop();
}

main()
{ 
  uint i;
  uchar *pData;
  uchar a[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  uchar b[16];
  pData=a;
  SendToSubAddress(0xA0,0,pData,16);
  delayms(1);
  ReceiveFromSubAddress(0xA0,0x20,pData,16);
  delayms(1);
  for(i=0;i<17;i++)
  {
    P0_0=0;
    if(a[i]!=*pData)
      P0_0=1;
    pData++;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -