/*
stc89le52rc內(nèi)部EEPROM的C51讀寫(xiě)程序
串口命令(9600)
1.0x35可以寫(xiě)eeprom第一個(gè)字節(jié)數(shù)據(jù)0x0c
2.0x34可以使用檢查eeprom第一個(gè)字節(jié)的數(shù)據(jù),正確就會(huì)反饋一串字符
3.0x33可以讀取eeprom前256個(gè)字節(jié)數(shù)據(jù)
*/
#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) //讀取數(shù)據(jù)
{
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) //寫(xiě)入數(shù)據(jù)
{
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); //寫(xiě)已經(jīng)有數(shù)據(jù)的扇區(qū)前要寫(xiě)擦除
NOP5;
NOP5;
NOP5; //可以適當(dāng)增減延時(shí)
NOP5;
NOP5;
NOP5;
NOP5;
EEPROM_WRITE(DATA_FLASH_START_ADDR,TEST_CODE);//寫(xiě)一個(gè)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();
}
}