展开全部
下面是我之前写的stc的程序,你可以参考下,都是差不多的。
#include<at89x52.h>
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++);
}
}
#include<at89x52.h>
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++);
}
}
参考资料: 百度一下
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询