×
单片机 > 单片机程序设计 > 详情

AT89C51ED2 的EEPROM 读写操作总结

发布时间:2020-06-04 发布时间:
|
今天因为要用到ED2的EEPROM,写点东西总结一下,以防日后忘了。

先引用网上有朋友问到的一个问题。

////////

哪位高手用过AT89C51ED  EEPROM   保存数据

下面程序写数据到EEPROM:

#define EEPROM_VC_ADD 0X0100

     adr = EEPROM_VC_ADD;
//     ACC = c1;
     while(EECON & 0x01);
     EA = 0;
     ACC = 44;
     EECON = 0x02;
     XBYTE[EEPROM_VC_ADD] = ACC;
//     *(unsigned char xdata*)adr = ACC;
     EECON = 0x00;
     EA = 1;

下面程序读数据从EEPROM:

     while(EECON & 0x01);
     EA = 0;
     EECON = 0x02;
     ACC = XBYTE[EEPROM_VC_ADD+1];
//     ACC = *(unsigned char xdata*)adr;
     EECON = 0x00;
     EA = 1;


结果: 读出的数据总是00;

哪位大侠能赐教。在此先谢了。

///////////////////////////////////////////////////////////

其实这个朋友的程序操作步骤是对。只是出现了一个小问题,在读EEPROM的时候,不能将数据暂存在ACC中,因为在   执行   ACC = XBYTE[EEPROM_VC_ADD+1]后,

EECON=0x00编译出来是:

CLR A

MOV    EECON,A

也就是ACC已经被清零了,所以返回的值永远是零。

 

下面我的一个测试程序。

#include "REG51xD2.h"
# include "ABSACC.H"
unsigned int xdata test1 _at_ 0x500;
unsigned long xdata test2 _at_ 0x6f0;
unsigned int test3;
unsigned long test4;
unsigned char temp;
unsigned char w_dat[10]={1,2,3,4,5,6,7,8,9,0};
unsigned char r_dat[10];
unsigned char R_EEPROM_BYTE(unsigned int addr)
{
    bit ea_temp;
    unsigned char dat;
    while((EECON&0x01)!=0);//EEBUSY = 0? 等待
    ea_temp = EA;
    EA=0;
    EECON = 0x02; //EEE=1; 使能EEPROM
    dat = XBYTE[addr]; // Read DATA;   //******不能暂存在ACC中。
    EECON= 0x00; //     编译出来是 CLR   A;MOV    EECON,A
    EA=ea_temp;
    return dat; //返回读出值
}
void R_EEPROM_nBYTE(unsigned int saddr,unsigned char num)
{
unsigned char i;
for(i=0;i {
   r_dat[i]=R_EEPROM_BYTE(saddr++);
}
}

void W_EEPROM_BYTE(unsigned int addr ,unsigned char dat)
{
bit ea_temp;
while((EECON&0x01)!=0);
ea_temp=EA;
EA = 0;
EECON = 0x02; // EEE=1;
XBYTE[addr]=dat;
EECON = 0x00;
EA = ea_temp;
}
void W_EEPROM_nBYTE (unsigned char num,unsigned int saddr,unsigned char *s )
{
unsigned char i;
for(i=0;i    W_EEPROM_BYTE(saddr++,*s++);
}

void main()
{
while(1)
{
   AUXR = 0x10;
   test1 = 0x1234;
   test2 = 0x98765432;
   test3=test1;
   test4 =test2;
   test1++;
   test2++;

   W_EEPROM_nBYTE(10,0x0000,w_dat);

   R_EEPROM_nBYTE(0x0000,10);

}

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析