怎样在STC89c52单片机的EEPROM里写入和读出一个unsigned int型的数据啊?

最大可以存多大的数据啊?
2024-11-27 10:41:58
推荐回答(2个)
回答1:

下面是我之前写的stc的程序,你可以参考下,都是差不多的。
#include
unsigned char data TSET1,TSET2;
void eeprom_write(void); //eeprom写
unsigned char eeprom_read(void); //eeprom读
void eeprom_erase(void); //eeprom擦出
void delay(unsigned char t); //延时
void timerset(void); //延时时间的设定
sfr ISP_DATA = 0xe2; /*ISP/IAP操作时的数据寄存器*/
sfr ISP_ADDRH = 0xe3; /*ISP/IAP操作时的地址寄存器高八位*/
sfr ISP_ADDRL = 0xe4; /*ISP/IAP操作时的地址寄存器低八位*/
sfr ISP_CMD = 0xe5; /*ISP/IAP操作时的命令模式寄存器*/
sfr ISP_TRIG = 0xe6; /*ISP/IAP操作时的命令触发寄存器*/
sfr ISP_CONTR = 0xe7; /*ISP/IAP控制寄存器*/
/**************************************************
main主程序
***************************************************/
main()
{
unsigned char flag2=0;
TSET1=10;
eeprom_erase();//擦出
eeprom_write();//写
TSET2=eeprom_read();//读
P1_0=1;//开启振动
while(1)
{
while(flag2==0)
{
timerset();
while(P3_2==1);
if(P3_2==0)
{ delay(TSET2);
P1_0=0;
flag2=1;
}
}

while(flag2==1)
{
timerset();
while(P3_2==0);//等待
if(P3_2==1)
{
delay(TSET2);
P1_0=1;
flag2=0;
}
}

}

}
/*************************************************
延时时间设定程序
*************************************************/
void timerset(void)
{
unsigned char flag3=0,a=0;
if(P3_3==0)//增加
{
for(a=0;a<10;a++);
if(P3_3==0)
{
while(P3_3==0);
if(TSET1<20) TSET1++;
flag3=1;
}
}

if(P3_4==0)//减小
{
for(a=0;a<10;a++);
if(P3_4==0)
{
while(P3_4==0);
if(TSET1>1) TSET1--;
flag3=1;
}
}

if(flag3) //设定完毕后更新EEPROM
{
eeprom_erase();//擦出
eeprom_write();//写
TSET2=eeprom_read();//读
flag3=0;
}
}
/*************************************************
EEPROM写程序
*************************************************/
void eeprom_write(void)
{
unsigned char j;

ISP_ADDRH=0x22;//选择存放数据的高八位地址寄存器
ISP_ADDRL=0x22;//选择存放数据的低八位地址寄存器

ISP_CMD=0x02;//命令模式触发对flash写 ,0x01读,0x02写,0x03擦除

ISP_DATA=TSET1;//存放数据

ISP_CONTR=0x9a;//使能ISP、IAP,,ISPEN=1允许改变FLASH,SWBS=0程序从主程序启动,等待时间为010

ISP_TRIG=0X46;//对ISP_TRIG先写0x46
ISP_TRIG=0XB9;//对ISP_TRIG先写0xB9,使ISP/IAP命令生效

for(j=0;j<2;j++);

}
/********************************************
EEPROM读程序
********************************************/
unsigned char eeprom_read(void)
{
unsigned char j;

ISP_ADDRH=0x22;
ISP_ADDRL=0x22;

ISP_CMD=0x01;

ISP_CONTR=0x9a;

ISP_TRIG=0X46;
ISP_TRIG=0XB9;

for(j=0;j<2;j++);
return(ISP_DATA);

}

/***********************************************
EEPROM擦出程序
***********************************************/
void eeprom_erase(void)
{
unsigned char j;

ISP_ADDRH=0x22;
ISP_ADDRL=0x22;

ISP_CMD=0x03;

ISP_CONTR=0x9a;

ISP_TRIG=0X46;
ISP_TRIG=0XB9;

for(j=0;j<2;j++);

}
/***********************************************
延时子程序
**********************************************/
void delay(unsigned char t)
{
unsigned int i,j;
while(t--)
{
for(i=0;i<600;i++)
for(j=0;j<600;j++);
}
}

回答2:

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