logo资料库

51内部EEPROM掉电保存.doc

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
/*STC89C51RC, STC89LE51RC 0x2000 共八个扇区 STC89C52RC, STC89LE52RC 0x2000 共八个扇区 STC89C54RD+,STC89LE54RD+ 0x8000 共五十八个扇区 STC89C55RD+,STC89LE55RD+ 0x8000 共五十八个扇区 STC89C58RD+,STC89LE58RD+ 0x8000 共五十八个扇区*/ #include #include //sfr 定义特殊功能寄存器 sfr ISP_DATA =0xe2;//ISP/IAP 操作时的数据寄存器,从 Flash 读出的数据放在此处,向 Flash 写的数据也需放在此处 sfr ISP_ADDRH =0xe3;//ISP/IAP 操作时的地址寄存器高八位 ISP_ADDRL =0xe4;//ISP/IAP 操作时的地址寄存器低八位 sfr sfr ISP_CMD 方可生效 sfr sfr /* 定义命令 */ #define uchar unsigned char #define uint unsigned int /*16bit 无符号整型*/ =0xe5;//ISP/IAP 操作时的命令模式寄存器,须命令触发寄存器触发 ISP_TRIG ISP_CONTR =0xe6;//ISP/IAP 操作时的命令触发寄存器 =0xe7;//ISP/IAP 控制寄存器 /*8bit 无符号整型*/ #define READ_AP_and_Data_Memory_Command #define PROGRAM_AP_and_Data_Memory_Command 0x02 /*字节编程数据存储区*/ #define SECTOR_ERASE_AP_and_Data_Memory_Command 0x03 /*扇区擦除数据存储*/ #define DEBUG_Data_Memory_Begin_Sector_addr 0x2000//扇区地址 0x01 /*字节读数据存储区*/ #define DELAY_CONST 60000//延时 #define WAIT_TIME uchar num; 0x01 /* 打开 ISP,IAP 功能 */ void ISP_IAP_enable(void) { EA=0;/* 关中断 */ ISP_CONTR=ISP_CONTR & 0x18; ISP_CONTR=ISP_CONTR|WAIT_TIME; ISP_CONTR=ISP_CONTR|0x80; /* 0001,1000 */ /* 1000,0000 */ } /* 关闭 ISP,IAP 功能 */ void ISP_IAP_disable(void) { ISP_CONTR=ISP_CONTR&0x7f;/* 0111,1111 */ ISP_TRIG=0x00; EA=1;/* 开中断 */
} /* 字节读 */ uchar byte_read(uint byte_addr) { ISP_ADDRH = ISP_ADDRL = ISP_CMD ISP_CMD (uchar)(byte_addr >> 8); (uchar)(byte_addr & 0x00ff); = = ISP_CMD&0xf8;/* 1111,1000 */ ISP_CMD|READ_AP_and_Data_Memory_Command;/* 0000,0001 */ } 0x46; 0xb9; = = ISP_IAP_enable(); ISP_TRIG ISP_TRIG _nop_(); ISP_IAP_disable(); return (ISP_DATA); /* 扇区擦除 */ void sector_erase(uint sector_addr) { ISP_CMD&0xf8;/* 1111,1000 */ (uchar)(get_sector_addr >> 8); 0x00; = = uint get_sector_addr=0; get_sector_addr=(sector_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */ ISP_ADDRH = ISP_ADDRL = ISP_CMD ISP_CMD ISP_CMD|SECTOR_ERASE_AP_and_Data_Memory_Command;/* 0000,0011 */ ISP_IAP_enable(); ISP_TRIG ISP_TRIG _nop_(); ISP_IAP_disable(); 0x46;/* 触发 ISP_IAP 命令 */ 0xb9;/* 触发 ISP_IAP 命令 */ = = } /* 字节编程 */ void byte_program(uint byte_addr, uchar original_data) { (uchar)(byte_addr >> 8); (uchar)(byte_addr & 0x00ff); & 0xf8; = = | ISP_ADDRH = ISP_ADDRL = ISP_CMD ISP_CMD PROGRAM_AP_and_Data_Memory_Command; ISP_DATA ISP_CMD ISP_CMD original_data; = /* 1111,1000 */ /* 0000,0010 */
ISP_IAP_enable(); ISP_TRIG ISP_TRIG _nop_(); ISP_IAP_disable(); = = } 0x46; 0xb9; /* 触发 ISP_IAP 命令 */ /* 触发 ISP_IAP 命令 */ void delay1(uint counter) { uint temp=0; for(temp=counter;temp>0;temp--) { _nop_(); _nop_(); _nop_(); } } //**************主函数********************* #include #include"EEPROM.h" #include"smg.h" void main() { num=byte_read(DEBUG_Data_Memory_Begin_Sector_addr);//字节读(程序开始时读取 EEPROM 中数据) if(num>=60)num=0;//防止首次上电时读取出错?? while(1) { if(num<60) { display(num); num++;delay(5); delay1(DELAY_CONST); sector_erase(DEBUG_Data_Memory_Begin_Sector_addr);//擦出扇区 byte_program (DEBUG_Data_Memory_Begin_Sector_addr,num);//字节编程 } if(num==60)num=0; } }
分享到:
收藏