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

📄 200622894827.c

📁 24系列eeprom的读写程序
💻 C
字号:




#include <intrins.h>
#include <reg52.h>
#define uchar  unsigned char
#define uint   unsigned int
#define ulong  unsigned long
#define NOP5    _nop_();_nop_();_nop_()
#define NOP2    _nop_()

sbit SDA=P1^0;//模拟口线
sbit SCL=P1^1;


////////////////////////////////////////////////////////
///
///24c01--24c1024模拟口线通讯程序
///2006.2   鲁志远
///lzylzy123@yahoo.com.cn
////////////////////////////////////////////////////////
//源程序由函数组成,程序清单如下:


void Init(void)
{
SCL=1;
NOP5;
SDA=1;
NOP5;
}


void start(void)//启动I2C总线,退出时SCL为低
{
   SDA=1;
   NOP5;
   SCL=1;
   NOP5;
   SDA=0;
   NOP5;
   SCL=0;
   NOP5;
}


//---------------------------------------------------------
void stop(void )//*停止I2C总线
{
  SCL=0;
  SDA=0;
  NOP5;
  SCL=1;
  SDA=1;
  NOP5;
}

//---------------------------------------------------------
void ack(void )/*发送应答位*/
{
  SDA=0;
  NOP5;
  SCL=1;
  NOP5;
  SCL=0;
  NOP2;
  SDA=1;
}
//---------------------------------------------------------
void Nack(void )//发送非应答位
{
  SDA=1;
  NOP2;
  SCL=1;
  NOP2;
  SCL=0;
}
//----------------------------------------------------------
bit cack(void )//应答位检查返回1表示应答正常
{
  bit i=0;
  SDA=1;
   NOP2;
  SCL=1;
   NOP2;
   if(SDA==1)
     {i=0;}
      else
        i=1;
   SCL=0;
   SDA=1;
   return(i);
}
//-------------------------------------------------------------
/*向虚拟I2C总线上发送1个数据字节*/
void wrbyt(uchar shu)//向虚拟I2C总线上发送1个数据字节退出时SCL为低
{
uchar data i;

for(i=0;i<8;i++)
  {
     if((shu&0x80)>0)
       {
        SDA=1;
        }
        else
           SDA=0;
	NOP2;
	SCL=1;
	NOP2;
	SCL=0;
    shu=shu<<1;
    }
SCL=0;
SDA=0;
}
//--------------------------------------------------------------
/*从I2C总线上读取1个数据字节*/
uchar rdbyt(void )
{
   uchar n=0x00;
   uchar j;
   for(j=0;j<8;j++)
   {
     SCL=1;
     NOP2;
   if(SDA==0)
      n=n<<1;
      else
         {
	  n=n<<1;
	  n=n+1;
	 }
	// NOP2;
	 SCL=0;
    }
SDA=1;
SCL=1;
return(n);
}

//---------------------------------------------------------
//向24C04随机写一字节
//d数据 n数据地址 x芯片型号
//芯片型号AT24C01--24C16=0;  AT24C0164--AT24C1024=1;
void wr_byta( uchar data d, ulong data n, bit x)
{
  uchar data a=0;
  uchar data j=0;
  uchar data c=0;

  //24c01--24c16操作
  if(x==0)
  {
   j = n/255;//业面地址
   a = n%255;//面内地址
   j = j<<1;
   j = j+0xa0;

    start();//启动I2C总线,退出时SCL为低
      wrbyt(j);//发送1个字节,写芯片地址
      if (cack()==1)//应答位检查返回1表示应答正常
        {
         wrbyt(a);//发送1个字节,写片内地址
		  if (cack()==1)
	        {
		    wrbyt(d);//发送1个字节,写数据
		    if (cack()==1)
		      {
		      stop( );//停止I2C总线
		      }

		   }
         }
   }

  //24c164--24c1024操作
  if(x==1)
  {
	if(n>65025)
	  {
	   c=0xa2;
	   n-=57039;
	   j=n/255;//业面地址
       a=n%255;//面内地址
	  }
	   else
	     {
		  j=n/255;//业面地址
          a=n%255;//面内地址
		  c=0xa0;
		 }

      start();//启动I2C总线,退出时SCL为低
      wrbyt(c);//发送1个字节,写芯片地址
      if (cack()==1)//应答位检查返回1表示应答正常
        {
         wrbyt(j);//发送1个字节,写片内地址1
	     if (cack()==1)
	         {
		  wrbyt(a);//发送1个字节,写片内地址2
		  if (cack()==1)
	           {
		        wrbyt(d);//发送1个字节,写数据
		        if (cack()==1)
		           {
		           stop( );//停止I2C总线
		           }

			   }

	          }
         }
   }
}

//-----------------------------------------------------------------------
//向24C04随机读一字节
//n数据地址 x芯片类型
//芯片型号AT24C01--24C16=0;  AT24C0164--AT24C1024=1;
uchar rd_byta(ulong data  n, bit x)
{
  uchar data c=0;
  uchar data a=0;
  uchar data j=0;
  uchar data tt=0;
  if(x==0)
  {
  j = n/255;//业面地址
  a = n%255;//面内地址
  j = j<<1;
  j = j+0xa0;
  start();//启动I2C总线
  wrbyt(j);//发送1个字节,写芯片地址
  if (cack()==1)//应答位检查返回1表示应答正常
      {
       wrbyt(a);//发送1个字节,写片内地址
       if (cack()==1)//应答位检查返回1表示应答正常
          {
           j=j>>1;
           j=j<<1;
	   j=j+1;  //设置读标志
           start();//重新启动I2C总线
           wrbyt(j);//发送1个字节写芯片地址和读信息
           if (cack()==1)//应答位检查返回1表示应答正常
              {
               tt=rdbyt( );
              // Nack( );    //*发送应答位*/
               stop( );//*停止I2C总线
	   }
	  }
       }
 return(tt);
   }

if(x==1)
  {
  if(n>65025)
    {
     c=0xa2;
     n-=57039;
     j=n/255;//业面地址
     a=n%255;//面内地址
    }
     else
        {
         j = n/255;//业面地址
         a = n%255;//面内地址
         c=0xa0;
        }

  start();//启动I2C总线
  wrbyt(c);//发送1个字节,写芯片地址
  if (cack()==1)//应答位检查返回1表示应答正常
      {
       wrbyt(j);//发送1个字节,写片内地址
       if (cack()==1)//应答位检查返回1表示应答正常
          {
           wrbyt(a);//发送1个字节,写片内地址
          if (cack()==1)//应答位检查返回1表示应答正常
            {
             c=c>>1;
             c=c<<1;
	     c=c+1;  //设置读标志
             start();//重新启动I2C总线
             wrbyt(c);//发送1个字节写芯片地址和读信息
             if (cack()==1)//应答位检查返回1表示应答正常
               {
                tt=rdbyt( );
                Nack( );    //*发送应答位*/
                stop( );//*停止I2C总线
	       }
	   }
          }

       }
 return(tt);
   }
}

/*---------------------------------------------------------
向24C04随机写多字节,
每次一页面:
24c01,24c02:8字节,
24c04,24c08,24c16:16字节.
24c32,24c64:32字节.
24c128,24c256:64字节.
24c512:128字节.
24c1024:256字节.
d数据头 p数据个数, n数据起使地址  x芯片型号
芯片型号AT24C01--24C16=0;  AT24C0164--AT24C1024=1; */

void wr_byta_8x( uchar data *d, uchar data p, ulong data n, bit x)
{
  uchar data a=0;
  uchar data j=0;
  uchar data c=0;
  uchar data i=0;

  //24c01--24c16操作
  if(x==0)
  {
   j = n/255;//业面地址
   a = n%255;//面内地址
   j = j<<1;
   j = j+0xa0;

    start();//启动I2C总线,退出时SCL为低
      wrbyt(j);//发送1个字节,写芯片地址
      if (cack()==1)//应答位检查返回1表示应答正常
        {
            wrbyt(a);//发送1个字节,写片内地址
            for(i=0; i<p; i++)
            {
	    cack();
	    wrbyt(d[i]);//发送1个字节,写数据
            }
            if (cack()==1)
	     {
              stop( );//停止I2C总线
             }
         }
   }

  //24c164--24c1024操作
  if(x==1)
  {
	if(n>65025)
	  {
	   c=0xa2;
	   n-=57039;
	   j=n/255;//业面地址
       a=n%255;//面内地址
	  }
	   else
	     {
		  j=n/255;//业面地址
          a=n%255;//面内地址
		  c=0xa0;
		 }

      start();//启动I2C总线,退出时SCL为低
      wrbyt(c);//发送1个字节,写芯片地址
      if (cack()==1)//应答位检查返回1表示应答正常
        {
         wrbyt(j);//发送1个字节,写片内地址1
	     if (cack()==1)
	         {
		  wrbyt(a);//发送1个字节,写片内地址2
                  for(i=0; i<p; i++)
                    {
	            if (cack()==1)
	              {
                      wrbyt(d[i]);//发送1个字节,写数据
	              }
                    }
                  if (cack()==1)
	            {
	            stop( );//停止I2C总线
	            }
               }
         }
   }
}

//-----------------------------------------------------------------------
//向24C04读多字节
//n数据地址 x芯片类型
//d数据头 X数据个数, n数据起使地址  x芯片型号
//芯片型号AT24C01--24C16=0;  AT24C0164--AT24C1024=1;
void rd_byta_8x(uchar data *d, uchar data p, ulong data  n, bit x)
{
  uchar data c=0;
  uchar data a=0;
  uchar data j=0;
  uchar data i=0;

  if(x==0)
  {
  j = n/255;//业面地址
  a = n%255;//面内地址
  j = j<<1;
  j = j+0xa0;
  start();//启动I2C总线
  wrbyt(j);//发送1个字节,写芯片地址

  if (cack()==1)//应答位检查返回1表示应答正常
      {
       wrbyt(a);//发送1个字节,写片内地址
       if (cack()==1)//应答位检查返回1表示应答正常
          {
           j=j>>1;
           j=j<<1;
	   j=j+1;  //设置读标志

          for(i=0; i<(p); i++)
              {
              start();//重新启动I2C总线
              wrbyt(j);//发送1个字节写芯片地址和读信息
             if (cack()==1)//应答位检查返回1表示应答正常
              {
              d[i]=rdbyt();
              ack( );    //*发送应答位*/
              }
             }
            stop( );//停止I2C总线

         }
       }
   }


if(x==1)
  {
  if(n>65025)
    {
     c=0xa2;
     n-=57039;
     j=n/255;//业面地址
     a=n%255;//面内地址
    }
     else
        {
         j = n/255;//业面地址
         a = n%255;//面内地址
         c=0xa0;
        }

  start();//启动I2C总线
  wrbyt(c);//发送1个字节,写芯片地址
  if (cack()==1)//应答位检查返回1表示应答正常
      {
       wrbyt(j);//发送1个字节,写片内地址
       if (cack()==1)//应答位检查返回1表示应答正常
          {
           wrbyt(a);//发送1个字节,写片内地址
          if (cack()==1)//应答位检查返回1表示应答正常
            {
             c=c>>1;
             c=c<<1;
	     c=c+1;  //设置读标志

             for(i=0; i<(p); i++)
              {
              start();//重新启动I2C总线
              wrbyt(c);//发送1个字节写芯片地址和读信息
              if (cack()==1)//应答位检查返回1表示应答正常
               {
               d[i]=rdbyt();
               ack( );    //*发送应答位*/
               }
             }
            stop( );//停止I2C总线
	   }
          }
       }
   }
}

//---------------------------------------
//延时10MS,延时时间为yan10ms*W
void   yan10ms(uchar w)
{
   uchar data k;
   uint  data i;
   for(k=0;k<=w;k++)
   {
   for(i=0;i<=0x800;i++)
     {
     ;
     }
   }
}


//--------------------------------------------------------------//
void main (void)
{
 uchar data a1 = 0;
 uchar data a2 = 0;
 uchar data cc[24]={0};

while(1)
{
   for(a1=0; a1<24; a1++)
  {
  cc[a1]=a1*10+1;
  }

  ////24c256多字节读写 
  wr_byta_8x( &cc, 24, 0x10, 1);  
  rd_byta_8x( &cc, 24, 0x10, 1);  
  //单字节读写
  for(a1=0; a1<20; a1++)
  {
  wr_byta(10+a1,0x10+a1,1);
  yan10ms(10);
  }
  for(a1=0; a1<20; a1++)
  {
  a2=rd_byta(10+a1,1);
  yan10ms(10);
  }
  
  ////24c01多字节读写 
  wr_byta_8x( &cc, 8, 0x10, 0);  
  rd_byta_8x( &cc, 8, 0x10, 0);  
  //单字节读写
  for(a1=0; a1<20; a1++)
  {
  wr_byta(10+a1,0x10+a1,0);
  yan10ms(10);
  }
  for(a1=0; a1<20; a1++)
  {
  a2=rd_byta(10+a1,0);
  yan10ms(10);
  }
  
  
  
 }
}


⌨️ 快捷键说明

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