分享

stc89le52rc内部EEPROM的C51读写程序

 昵称9287347 2012-03-23

/*
stc89le52rc内部EEPROM的C51读写程序
串口命令(9600)
1.0x35可以写eeprom第一个字节数据0x0c
2.0x34可以使用检查eeprom第一个字节的数据,正确就会反馈一串字符
3.0x33可以读取eeprom前256个字节数据

*/
#include<math.h>
#include<stdio.h>
#include<reg52.h>
#include <intrins.h>
#define NOP5 _nop_();_nop_();_nop_(); _nop_();_nop_();
#define uchar unsigned char
#define uint unsigned int

sfr AUXR = 0x8e;
sfr AUXR1 = 0xa2;
sfr P4 = 0xe8;
sfr XICON = 0xc0;
sfr IPH = 0xb7;
sfr WDT_CONTR = 0xe1;
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;

#define ENABLE_ISP 0x81     //小于20MHZ使用
#define DATA_FLASH_START_ADDR 0x2000//stc89le52rc eeprom起始地址
#define TEST_CODE 0x34

uchar code start_string[]={"EEPROM first data correct!\n"};
uint i=0,k;

uchar EEPROM_READ(uint flash_addres);
void IAP_disable();
void EEPROM_FORMAT(uint flash_addres);
void EEPROM_WRITE(uint flash_addres, isp_data);
void test_read();
void send_byte(uchar bt);
void send_string(uchar *ptr, uchar len);
void read_string(uint start_addr,uint num);

void read_string(uint start_addr, uint num)
{
static uint j,temp;
for(j=0;j<num;j++)
{
   temp=EEPROM_READ(start_addr+j);
   NOP5;
   send_byte(temp);
}
}
void send_string(uchar * ptr, uchar len)
{
static uint j;
for(j=0;j<len;j++)
{
   send_byte(*(ptr+j));
}
}

void send_byte(uchar by)
{
SBUF=by;
while(!TI);
TI=0;
}

void IAP_disable()
{
ISP_CONTR=0;
ISP_CMD=0;
ISP_TRIG=0;
}
uchar EEPROM_READ(uint flash_addres) //读取数据
{
uchar read;
ISP_ADDRH=flash_addres>>8;
ISP_ADDRL=flash_addres;
ISP_CONTR=ENABLE_ISP;
ISP_CMD=0x01 ;  

EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9 ;
NOP5;
read=ISP_DATA;
IAP_disable();
EA=1;

return(ISP_DATA);
}

void EEPROM_WRITE(uint flash_addres,isp_data) //写入数据
{
ISP_ADDRH=flash_addres>>8;
ISP_ADDRL=flash_addres;
ISP_CONTR=ENABLE_ISP;
ISP_CMD=0x02 ;

EA=0;
ISP_DATA=isp_data;

ISP_TRIG=0x46;
ISP_TRIG=0xb9;
IAP_disable();
EA=1;
}

void EEPROM_FORMAT(uint flash_addres) //擦除
{
ISP_ADDRH=flash_addres>>8;
ISP_ADDRL=flash_addres;
ISP_CONTR=ENABLE_ISP;
ISP_CMD=0x03;

EA=0;

ISP_TRIG=0x46;
ISP_TRIG=0xb9;
IAP_disable();
EA=1;

}
void test_read()
{
if(RI)
{
   RI=0;
   switch(SBUF)
   {
    case 0x34:
     k=EEPROM_READ(DATA_FLASH_START_ADDR);
     NOP5;
     if(0x0c==k)
     {
      send_string(start_string,sizeof(start_string));
     }
     send_byte(k);
     k=0;
    break;
    case 0x33:
     read_string(DATA_FLASH_START_ADDR, 256);
     break;
    case 0x35:
    
     EEPROM_FORMAT(DATA_FLASH_START_ADDR); //写已经有数据的扇区前要写擦除
     NOP5;
     NOP5;
     NOP5;          //可以适当增减延时
     NOP5;
     NOP5;
     NOP5;
     NOP5;
     EEPROM_WRITE(DATA_FLASH_START_ADDR,TEST_CODE);//写一个0x0c
     break;
    default:
     if(0xff==i)
     {
      i=0;
     }
     k=EEPROM_READ(DATA_FLASH_START_ADDR+(i++));
     send_byte(DATA_FLASH_START_ADDR+i);
     send_byte(k);
     k=0;
    break;
   }

}
void init()
{
TMOD=0x20;SCON=0x50;
TL1=0xfd;TH1=0xfd;
TR1=1;ET1=1;ES=1;

}
void main()
{
init();

while(1)
{
   test_read();
}
}
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多