关于STC89C52单片机eeprom问题!

2024-11-14 14:36:54
推荐回答(3个)
回答1:

不要一上电就马上写EEPROM,延时一会在写(读)看看。stc单片机在丛凳电压低的时候写进去的缺拿数据是不对的渗扮旅。进入主程序之前先延时几百毫秒。

回答2:

我做过比的芯片上的E2PROM,觉得应该有一个寄存器时控制上电后数据是否保存,你找找看。

回答3:

/********************************
eprom.h
********************************/

#ifndef __EPROM_H__
#define __EPROM_H__

#include "REG52.h"
#include "myfun.h"
#include "intrins.h"

#define CMD_IDLE 0 //STAND_BY
#define CMD_READ 1 //BYTE_READ
#define CMD_PROGRAM 2 //BYTE_PROGRAM
#define CMD_ERASE 3 //SECTOR_ERASE

/岁首肆/#define ISP_EN 0x80//SYCLK<40M

#define IAP_EN 0x81//SYCLK<20M

//#define ISP_EN 0x82//SYCLK<10M

//#define ISP_EN 0x83//SYCLK<5M
#define IAP_ADRESS 0x04000

void IAP_WRITE(uint add,uchar date);
uchar IAP_READ(uint add);
void IAP_ERASE(uint add);

/*****************************
STC89C52/51 4K EPROM 2000h-->2FFFh sector cnt=8

STC89C54 45K EPROM 4000h-->F3FFh sector cnt=90

*****************************/乎轿
sfr ISP_DATA =0xe2;
sfr ISP_ADDRH =0xe3;
sfr ISP_ADDRL =0xe4;
sfr ISP_CMD =0xe5;//-----MS1,MS0
sfr ISP_TRIG =0xe6;
sfr ISP_CONTR =0xe7;//芹李ISPEN,SWBS,SWRST,--WT2,WT1,WT0

#endif

/********************************
eprom.c
********************************/
#include "EPROM.h"

void IAP_STOP()
{
ISP_CONTR=0;
ISP_CMD=0;
ISP_TRIG=0;
ISP_ADDRH=0x40;
ISP_ADDRL=0;

}

void IAP_WRITE(uint add,uchar date)
{
ISP_CONTR=IAP_EN;
ISP_CMD=CMD_PROGRAM;

ISP_ADDRL=add;
add>>=8;
ISP_ADDRH=add;

ISP_DATA=date;

ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
IAP_STOP();

}

void IAP_ERASE(uint add)
{
ISP_CONTR=IAP_EN;
ISP_CMD=CMD_ERASE;

ISP_ADDRL=add;
add>>=8;
ISP_ADDRH=add;

ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
IAP_STOP();

}

uchar IAP_READ(uint add)
{
uchar date=0;

ISP_CONTR=IAP_EN;
ISP_CMD=CMD_READ;

ISP_ADDRL=add;
add>>=8;
ISP_ADDRH=add;

ISP_TRIG=0x46;
ISP_TRIG=0xb9;

_nop_();
date=ISP_DATA;
IAP_STOP();

return date;
}
/**************************
main.c
***************************/

#include "uart.h"
#include "EPROM.h"

sbit K1=P3^3;
sbit LED=P1^0;

void main()
{
uchar temp=0,j=0;
uart_init();
//IAP_ERASE(IAP_ADRESS);//只有字节是0FFH时才可以进行字节编程
//STC官方文档

while(1)
{

j=IAP_READ(IAP_ADRESS);

j++;
IAP_ERASE(IAP_ADRESS);
IAP_WRITE(IAP_ADRESS,j);

j=IAP_READ(IAP_ADRESS);
uart_byte(j);

while(K1);
LED=0;
delay_8_15nus(1000);//15ms
LED=1;

}
}