关于STC89C52单片机eeprom问题!

我在程序中向EEPROM写东西,发现复位单片机,数据不丢失,可一旦重新上电,数据就丢失了,我的程序是按照datasheet上写的,应该是没有问题啊!这个问题到底出现在哪儿... 我在程序中向EEPROM写东西,发现复位单片机,数据不丢失,可一旦重新上电,数据就丢失了,我的程序是按照datasheet上写的,应该是没有问题啊!这个问题到底出现在哪儿,请教高手!
由于知道的字数限制,没法直接贴出程序,我把程序贴到空间里了,附上地址:
http://hi.baidu.com/cheng34/blog/item/92f2bdddc5dc482e5882dde0.html
展开
 我来答
zhanghaodianzi
2011-08-14 · TA获得超过1277个赞
知道小有建树答主
回答量:1063
采纳率:83%
帮助的人:241万
展开全部
不要一上电就马上写EEPROM,延时一会在写(读)看看。stc单片机在电压低的时候写进去的数据是不对的。进入主程序之前先延时几百毫秒。
追问
我延时也试过了,不行啊,应该不是延时的问题!
追答
贴出来程序看看。
lyi619521
2011-08-14 · 超过20用户采纳过TA的回答
知道答主
回答量:76
采纳率:0%
帮助的人:51万
展开全部
我做过比的芯片上的E2PROM,觉得应该有一个寄存器时控制上电后数据是否保存,你找找看。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
思香学8
2011-08-14 · TA获得超过3672个赞
知道小有建树答主
回答量:2110
采纳率:69%
帮助的人:484万
展开全部
/********************************
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;

}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式