不要一上电就马上写EEPROM,延时一会在写(读)看看。stc单片机在丛凳电压低的时候写进去的缺拿数据是不对的渗扮旅。进入主程序之前先延时几百毫秒。
我做过比的芯片上的E2PROM,觉得应该有一个寄存器时控制上电后数据是否保存,你找找看。
/********************************
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;
}
}