原创 24c01~24c1024全系列EEPROM的读写程序

2008-8-22 14:09 8103 11 12 分类: MCU/ 嵌入式
这是我写的一个读写全系列EEPROM的程序,现贴出来让大家享用,不知对大家是否有一定的帮助,以后再有好的程序还会贴出来和大家分享。

//**********************************************************************************
//**  一个通用的24C01-24C1024共11种EEPROM的字节读写操作程序,                  ******
//**  M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256      ******
//**  21c01,24c02:1010A2A1A0R/W; 24C04:1010A2A1P0R/W; 24C08:1010A2P1P0R/W     ******
//**  24C16:1010P2P1P0R/W;
//**  以上5种芯片的读写格式为:start-device addr-ack-word addr-ack-data-ack-stop ***
//**  24c32-24c512:1010A2A1A0R/W; 24C1024:1010A2A1P0R/W; 24c1024:1010A2A1P0R/W *****
//**  以上6种芯片的读写格式为:start-device addr-ack-first word addr-ack-second word addr-ack-data-ack-stop
//**  进行读写的字节数,EEPROM首址,EEPROM控制字节,                          ******
//**  以及EEPROM类型。此程序结构性良好,具有极好的容错性,程序机器码也不多:   ******
//**********************************************************************************
#i nclude <reg51.h>
#i nclude <string.h>
#i nclude <stdio.h>
#i nclude <intrins.h>

sbit SDA =P1^1;
sbit SCL =P1^4;
sbit WP =P1^7;
sbit  light =P1^0;
sbit  power =P1^6;


#define   uchar   unsigned char
#define   uint    unsigned int


void iic_delay10ms();
void iic_delay(void);
void iic_start(void);
void iic_stop(void);
void iic_ack(void);
void read_byte(void);
void send_byte(void);
void initial(void);
void ok(void);
void error(void);
void read_eeprom(void);
void write_eeprom(void);
void init(void);


uchar  ack_flag,send_data,receive_data[32]; 
uchar  rw,type,device_addr,addr[3],num;


void main(void)

 initial();
 power =0;
 light =0;


 while(1)
 { 
  ES =1;
  rw =0x55;
   WP =0;
  while(rw ==0x55);
  ES =0;
  switch(type)
   {
    case 0x01:
    case 0x02:
    case 0x04:
    case 0x08:
    case 0x16: 
     type =0x02;
     addr[1] |=0xa0;
     device_addr <<=1;
     addr[1] |=device_addr;
     break;
    default:
     type =0x03;
     addr[2] |=0xa0;
     device_addr <<=1;
     addr[2] |=device_addr;     
   } 
  if(rw ==0x01)  //读EEPROM
  {
   read_eeprom();
  }
  else if(rw ==0x00) //写EEPROM
  {
   write_eeprom();
  }
  else        //error command
  {   
   error(); 
   ACC =0x01;
   SBUF =ACC;
   while(!TI);
   TI =0;  
  }   
 }
}


void read_eeprom(void)
{
 uchar i;
 WP =1;
 iic_start();
 for(i=1;i<=type;i++)
  {
   send_data =addr[type-i];
   send_byte();
   iic_ack();
   if(ack_flag ==0x01)
    break;
  }
 if(ack_flag ==0x00)
  { 
   iic_start();
   addr[type-1] |=0x01;
   send_data =addr[type-1];
   send_byte();
   iic_ack();
   if(ack_flag ==0x00)
   {    
    for(i=0;i<num;i++)
     {
      read_byte();
      SBUF =send_data;
      while(!TI);
      TI =0;
      SDA =0;
      SCL =1;
      iic_delay();
      SCL =0;
     }
    iic_stop();
    rw =0x55;
   }
   else
   {
    error();
    ACC =0x03;
    SBUF =ACC;
    while(!TI);
    TI =0;
   }
  }
 else
  {  
   error(); 
   ACC =0x02;
   SBUF =ACC;
   while(!TI);
   TI =0; 
  }
}


void write_eeprom(void)
{
 uchar i; 
 WP =0;
 iic_start();
 for(i=1;i<=type;i++)
  {
   send_data =addr[type-i];
   send_byte();
   iic_ack();
   if(ack_flag ==0x01)
    break;
  }
 if(ack_flag ==0x00)
 {
  for(i=0;i<num;i++)
  {
  send_data =receive_data;
  send_byte();
  iic_ack();
  iic_delay10ms();  
  }
   iic_stop();
   rw =0x55;
 }
 else
 {
  error();
  ACC =0x04;
  SBUF =ACC;
  while(!TI);
  TI =0;
 }
}



void read_byte(void)
{
 uchar  i,temp=0x80;
 send_data =0x00;
 SCL =0;
  for(i=0;i<8;i++)
  { 
  SDA =1;
  SCL =1;
    if(SDA)
   send_data |=temp;
    temp/=2;   
    SCL =0;
    iic_delay();
  } 
}


void send_byte(void)
{
  uchar  i,temp=0x80;
  for(i=0;i<8;i++)
  {
    if((send_data&temp)==temp)
    {
      SDA =1;      //sda=1
    }
  else
    {
      SDA =0;     //sda=0
    }
     temp /=2;
     iic_delay();
     SCL =1;
     iic_delay();
     SCL =0;
     iic_delay();
  }
}


void iic_start(void)
{
 SDA =1;
 SCL =1;
 WP =0;
 iic_delay();
 SDA =0;
 iic_delay();
 SCL =0;
}


void iic_stop(void)
{
 SDA =0;
 SCL =1;
 iic_delay();
 SDA =1;
 //WP =1;
}


void    iic_ack(void)
{
 ack_flag =0x00;       //ack_flag等于0x00时有应答
 SDA =1;     
   iic_delay();
  SCL =1;
    iic_delay();
    if(SDA)
    {
      ack_flag =0x01;
    }
    SCL =0;
}


void    iic_delay(void)
{
 _nop_();
 _nop_();
 _nop_();
 _nop_();
}


void   iic_delay10ms(void)
{
#pragma ASM
 mov  r6,#200
 mov  r7,#10
delay:
 nop
 nop
 nop
 djnz r6,delay
 mov  r6,#200
 djnz r7,delay
#pragma ENDASM 
}


void initial(void)

 TMOD =0x21;
 TH1 =0xfd;
 TL1 =0xfd;
 TH0 =0xfd;
 TL0 =0xfd;
 SCON =0x50;
 TR1 =1;
 EA =1;
 ES =1;
 ET0 =1; 
 PT0 =1;
}


void ok(void)
{
 ACC =0x55;
 SBUF =ACC;
 while(!TI);
 TI =0;
 ACC =0xaa;
 SBUF =ACC;
 while(!TI);
 TI =0; 
}


void error(void)
{
 ACC =0xaa;
 SBUF =ACC;
 while(!TI);
 TI =0;
 ACC =0x55;
 SBUF =ACC;
 while(!TI);
 TI =0;
 rw =0x55;
}


void es_int(void)interrupt 4

 uchar i;
 RI =0;
  type =SBUF;      //型号
  while(!RI);
  RI =0;
  device_addr =SBUF;  //器件地址
  for(i=0;i<3;i++)
  {
   while(!RI);
   RI =0;
   addr[2-i] =SBUF;  //地址高、中、低位字节
  }  
  while(!RI);
  RI =0;
  num =SBUF;      //要操作的字节数
  while(!RI);
  RI =0;
  rw =SBUF;
  if(rw ==1)      //接收到要读的命令
  {
   ok();
  }
  else         //接收到要写的命令
  {   
   for(i=0;i<num;i++)
   {
    while(!RI);
    RI =0;
    receive_data=SBUF;
   }   
   ok();
  }
  //else
  //{
  // error();
  //} 
}

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户3768741 2016-5-16 04:20

挺好的,感谢楼主。
相关推荐阅读
用户138170 2008-08-22 14:15
SST39VF6401操作的API接品函数
HI ,大家好,今天是2008年的第一天,不知大家上班是否很忙呢?随着项目的进展,工作也越来起忙了,虽然是第一天也没有一点空闲呀,上午写了一个对SST39VF6401操作的API函数,这也是我整个项目...
用户138170 2008-08-22 14:13
实现PS/2标准接口的通讯程序
这是PS/2接口的键盘的通讯程序,程序只是实现了接收数据和发送数据,其中还有很多BUG之处,但功能完全可以实现,放在这城供大家学习,如果有人用于商业用途,请和我联系。magicchip@163.com...
用户138170 2008-08-22 14:10
AT89C2051比较器的应用
这是AT89C2051的一个特殊应用,用它的比较器做一个光强调节器,应用在全静态LED显示屏上。当初的情况是原有LED 显示屏的光控是用专用的AD转换芯片做的,比较贵。最后用这个方案做为一个补丁用了一...
用户138170 2008-08-22 08:55
led 显示屏控制系统之软件设计
前段时间上传了一个关于LED显示屏的硬件设计,现上传一个软件,这个软件比较简单,是上学时间写的一个小程序,程序虽小,但它也是一个显示程序,它的框架和现实LED显示的程序是一样的,如果把这个程序和上一次...
用户138170 2008-08-22 08:53
led 显示屏控制系统之硬件设计
led 显示屏控制系统之硬件设计                                设计人:magicchip   LED点阵式显示屏发展到今天在朝着两个方向发展,高端产品主要是全彩色显示...
EE直播间
更多
我要评论
1
11
关闭 站长推荐上一条 /3 下一条