51单片机的EEPROM程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//Open IAP function, and set wait time Leabharlann Baidu/Set ISP/IAP/EEPROM READ
//Set ISP/IAP/EEPROM address low //Set ISP/IAP/EEPROM address high //Send trigger command1 (0x5a) //Send trigger command2 (0xa5) //MCU will hold here until ISP/IAP/EEPROM
*
* 说明:1.只存 50 个字节数据(可自行修改).
*
2.存储地址从 0 开始.
*
3.低压不要操作.
*
4.上电约 200ms 之后可操作.
*/
#include "STC_EEPROM.h"
/**-*-*-*-*-*-*-*-*-*-*-*-*-*-* STC_EEPROM 向上应用层 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**/ /**
-----------------------------*/ void IapEraseSector(u16 Sec_Addr) {
IAP_CONTR = STC_ENABLE_IAP; IAP_MOD = STC_CMD_ERASE; IAP_ADDRL = Sec_Addr; IAP_ADDRH = Sec_Addr >> 8; IAP_TRIG = 0x5A; IAP_TRIG = 0xA5; NOP( );
/* operation complete */ Value = IAP_DATA; IapIdle();
//Read ISP/IAP/EEPROM data //Close ISP/IAP/EEPROM function
return Value; }
//Return Flash data
/**-*-*-*-*-*-*-*-*-*--*-*-*-*- * STC_EEPROM 工作子层 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**/
u8 STC_Read_EEPROM(u16 Addr) {
return IapReadByte(Addr);
}
/**-*-*-*-*-*-*-*-*-*--*-*-*-*-*- STC_EEPROM 工作层 -*-*-*-*-*-*--*-*-*-*-*-*-*-*-*-**/
/*---------------------------1.Erase one sector area 2.Input: addr (ISP/IAP/EEPROM address) 3.Output:
/**-*-*-*-*-*-*-*-*-*--*-*-*-*- * STC_EEPROM 工作子层 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**/ void IapIdle(void);
#endif
* 向 EEPROM 中写一个字节 */ void STC_Write_EEPROM(u16 Addr, u8 Value) {
u8 i; u8 temp_data[50];
for(i=0; i<50; i++) temp_data[i] = IapReadByte(STC_IAP_SecAddr+i);
IapEraseSector(STC_IAP_SecAddr);
temp_data[Addr] = Value; for(i=0; i<50; i++)
IapProgramByte(STC_IAP_SecAddr+i, temp_data[i]);
}
/** * 从 EEPROM 中读一个字节 */
/* operation complete */ IapIdle();
}
/*---------------------------1.Program one byte to ISP/IAP/EEPROM area 2.Input: addr (ISP/IAP/EEPROM address) 3.dat (ISP/IAP/EEPROM data) 4.Output:
//Set ISP/IAP/EEPROM PROGRAM
command
IAP_ADDRL = Addr;
//Set ISP/IAP/EEPROM address low
IAP_ADDRH = Addr >> 8;
//Set ISP/IAP/EEPROM address high
IAP_DATA = Value;
//Open IAP function, and set wait time //Set ISP/IAP/EEPROM ERASE command
//Set ISP/IAP/EEPROM address low //Set ISP/IAP/EEPROM address high //Send trigger command1 (0x5a) //Send trigger command2 (0xa5) //MCU will hold here until ISP/IAP/EEPROM
//Close IAP function
IAP_MOD = 0;
//Clear command to standby
IAP_TRIG = 0;
//Clear trigger register
IAP_ADDRH = 0x80;
//Data ptr point to non-EEPROM area
IAP_ADDRL = 0;
//Clear IAP address to prevent misuse
}
第二个文件:“STC_EEPROM.H”
源码如下(自己建立’.H’文件 并拷贝到里面):
/**
* 作者:一片云 * 日期:2013.11.23
* 名称:STC 单片机的 EEPROM 的操作
*
* 说明:1.只存 50 个字节数据(可自行修改).
#define #define #define #define #define
STC_CMD_IDLE
0
STC_CMD_READ
1
STC_CMD_PROGRAM 2
STC_CMD_ERASE
3
STC_ENABLE_IAP 0x83
//Stand-By //Byte-Read
//Byte-Program //Sector-Erase //SYSCLK<=12MHz
-----------------------------*/ void IapProgramByte(u16 Addr, u8 Value) {
IAP_CONTR = STC_ENABLE_IAP;
//Open IAP function, and set wait time
IAP_MOD = STC_CMD_PROGRAM;
名称:STC12 单片机的 EEPROM 功能 作者:一片云 QQ: 2279536733
上传日期:2014 年 1 月 9 号
说明:共有两个文件,自己到时候整理下。
第一个文件:“STC_EEPROM.C” 源码如下(自己建立’.c’文件 并拷贝到里面):
/** * 作者:一片云 * 日期:2013.11.23 * 名称:STC 单片机的 EEPROM 的操作
/* operation complete */ IapIdle( );
}
/*---------------------------1.Read one byte from ISP/IAP/EEPROM area 2.Input: addr (ISP/IAP/EEPROM address) 3.Output:Flash data
/**-*-*-*-*-*-*-*-*-*--*-*-*-*-*- STC_EEPROM 工作层 -*-*-*-*-*-*--*-*-*-*-*-*-*-*-*-**/
void IapEraseSector(u16 Sec_Addr); void IapProgramByte(u16 Addr, u8 Value); u8 IapReadByte(u16 Addr);
#define STC_IAP_SecAddr 0x0000
//Sector Start address
/**-*-*-*-*-*-*-*-*-*-*-*-*-*-* STC_EEPROM 向上应用层 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**/
void STC_Write_EEPROM(u16 Addr, u8 Value); u8 STC_Read_EEPROM(u16 Addr);
*
2.存储地址从 0 开始.
*
3.低压不要操作.
*
4.上电约 200ms 之后可操作.
*/
#ifndef __STC_EEPROM_H #define __STC_EEPROM_H
#include "STC12.h"
/**-*-*-*-*-*-*-*-*-*-*-*-*-*-* STC_EEPROM 操作定义 - *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**/
/*----------------------------
1.Disable ISP/IAP/EEPROM function
2.Make MCU in a safe state
----------------------------*/
void IapIdle(void)
{
IAP_CONTR = 0;
//Write ISP/IAP/EEPROM data
IAP_TRIG = 0x5A;
//Send trigger command1 (0x5a)
IAP_TRIG = 0xA5;
//Send trigger command2 (0xa5)
NOP( );
//MCU will hold here until ISP/IAP/EEPROM
----------------------------*/ u8 IapReadByte(u16 Addr) {
u8 Value;
IAP_CONTR = STC_ENABLE_IAP; IAP_MOD = STC_CMD_READ; command IAP_ADDRL = Addr; IAP_ADDRH = Addr >> 8; IAP_TRIG = 0x5A; IAP_TRIG = 0xA5; NOP( );