怎样在STC89c52单片机的EEPROM里写入和读出一个unsigned int型的数据啊?
答案:1 悬赏:20 手机版
解决时间 2021-11-08 03:15
- 提问者网友:低吟詩仙的傷
- 2021-11-07 12:51
怎样在STC89c52单片机的EEPROM里写入和读出一个unsigned int型的数据啊?
最佳答案
- 五星知识达人网友:長槍戰八方
- 2021-11-07 13:19
下面是我之前写的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;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
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;
}
}
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++);
}
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);
}
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++);
}
}参考资料:百度一下
#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;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
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;
}
}
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++);
}
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);
}
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++);
}
}参考资料:百度一下
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
正方形一边上任一点到这个正方形两条对角线的 |
阴历怎么看 ? |