关于STC89C52单片机eeprom问题!
我在程序中向EEPROM写东西,发现复位单片机,数据不丢失,可一旦重新上电,数据就丢失了,我的程序是按照datasheet上写的,应该是没有问题啊!这个问题到底出现在哪儿...
我在程序中向EEPROM写东西,发现复位单片机,数据不丢失,可一旦重新上电,数据就丢失了,我的程序是按照datasheet上写的,应该是没有问题啊!这个问题到底出现在哪儿,请教高手!
由于知道的字数限制,没法直接贴出程序,我把程序贴到空间里了,附上地址:
http://hi.baidu.com/cheng34/blog/item/92f2bdddc5dc482e5882dde0.html 展开
由于知道的字数限制,没法直接贴出程序,我把程序贴到空间里了,附上地址:
http://hi.baidu.com/cheng34/blog/item/92f2bdddc5dc482e5882dde0.html 展开
3个回答
展开全部
我做过比的芯片上的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;
}
}
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;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询