各个型号容量及扇区请查datasheet

#include <reg52.h>
#include "intrins.h" typedef unsigned char byte;
typedef unsigned int word; /* Declare SFR associated with the IAP */
sfr IAP_DATA = 0xC2; //Flash data register
sfr IAP_ADDRH = 0xC3; //Flash address HIGH
sfr IAP_ADDRL = 0xC4; //Flash address LOW
sfr IAP_CMD = 0xC5; //Flash command register
sfr IAP_TRIG = 0xC6; //Flash command trigger
sfr IAP_CONTR = 0xC7; //Flash control register /* Define ISP/IAP/EEPROM command */
#define CMD_IDLE 0 //Stand-By
#define CMD_READ 1 //Byte-Read
#define CMD_PROGRAM 2 //Byte-Program
#define CMD_ERASE 3 //Sector-Erase /* Define ISP/IAP/EEPROM operation const for IAP_CONTR */
#define ENABLE_IAP 0x80 //if SYSCLK < 30MHz
#define ENABLE_IAP 0x81 //if SYSCLK < 24MHz
#define ENABLE_IAP 0x82 //if SYSCLK < 20MHz
#define ENABLE_IAP 0x83 //if SYSCLK < 12MHz
#define ENABLE_IAP 0x84 //if SYSCLK < 6MHz
#define ENABLE_IAP 0x85 //if SYSCLK < 3MHz
#define ENABLE_IAP 0x86 //if SYSCLK < 2MHz
#define ENABLE_IAP 0x87 //if SYSCLK < 1MHz //Start address for STC12C5201AD series EEPROM
#define IAP_ADDRESS 0x0000 void Delay(byte n)
{
word x;
while(n--)
{
x = 0;
while(++x);
}
} /* Disable ISP/IAP/EEPROM function Make MCU in a safe state */ void IapIdle()
{
IAP_CONTR = 0; //close IAP function
IAP_CMD = 0; //clear command to standby
IAP_TRIG = 0; //clear tirgger register
IAP_ADDRH = 0x80; //data ptr point to non EEPROM area
IAP_ADDRL = 0; //clear IAP address to prevent mususe
} /* read one byte from isp/iap/eeprom area input:addr(isp iap eeprom address) output:flash data */
byte IapReadByte(word addr)
{
byte dat; IAP_CONTR = ENABLE_IAP; //Open IAP function and set wait time
IAP_CMD = CMD_READ; //Set ISAP READ command
IAP_ADDRL = addr; //Set ISP address low
IAP_ADDRH = addr >> 8; //Set IAP address high
IAP_TRIG = 0x5a; //Send trigger command1(0x5a)
IAP_TRIG = 0xa5; //Send trigger command2(0xa5)
_nop_(); //MCU will hold here until IAP operation complete dat = IAP_DATA; //Read IAP EEPROM data
IapIdle(); //Close ISP function return dat; //Return Flash data
} /* Program one byte to ISP area Input:addr (address) dat(data) Output:- */
void IapProgramByte(word addr, byte dat)
{
IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
IAP_CMD = CMD_PROGRAM; //Set EEPROM PROGRAM command
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_DATA = dat;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_(); IapIdle();
} /* Erase one sector area Input:addr */
void IapEraseSector(word addr)
{
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_ERASE;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_(); IapIdle();
} int main()
{
word i; P1 = 0xfe;
Delay(10);
IapEraseSector(IAP_ADDRESS); for(i = 0; i < 512; ++i)
{
if(IapReadByte(IAP_ADDRESS + i) != 0xff)
{}
} P1 = 0xfc;
Delay(10);
for(i = 0; i < 512; ++i)
{
IapProgramByte(IAP_ADDRESS + i, (byte)i);
} P1 = 0xf8;
Delay(10);
for(i = 0; i < 512; ++i)
{
if(IapReadByte(IAP_ADDRESS + i) != (byte)i)
{}
} P1 = 0xf0;
while(1); return 0;
}

51 EEPROM操作模板的更多相关文章

  1. PIC XC8 EEPROM操作

    要做一个报警功能的东东,要求可以通过遥控来改变遥控内容.由于对系统的稳定性要求很高,所以用了看门狗. 可是看门狗复位会引起所有寄存器重置,恢复到默认状态.遥控要改变的内容也被复位了,所以只能借助EEP ...

  2. C语言链表操作模板(添加,删除,遍历,排序)

    C语言链表操作模板,摘自郝斌的C语言视频教程,简单的修改成了纯C格式.当年照着视频学习的时候记录下来的,在使用的时候直接拿来修改修改修改能节约不少时间的. /********************* ...

  3. 像51一样操作STM32的IO(转)

    源:像51一样操作STM32的IO //-------------------------------------------------------------------------------- ...

  4. 子树大小平衡树(Size Balanced Tree,SBT)操作模板及杂谈

    基础知识(包括但不限于:二叉查找树是啥,SBT又是啥反正又不能吃,平衡树怎么旋转,等等)在这里就不(lan)予(de)赘(duo)述(xie)了. 先贴代码(数组模拟): int seed; int ...

  5. python 外键用法 多对多关系 ORM操作 模板相关

    一.app/models中写类(设计表结构) 1.普通类 class  A(models.Model): id=modles.AutoField(primary_key=True) name=mode ...

  6. Jaba_Web--JDBC 删除记录操作模板

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  7. STM8S EEPROM 操作

    STM8S 内置EEPROM,对于非常大须要带记忆的产品来说,是个非常好的资源,下面是我个人摸索出来的,而且验证OK,大家如须要可放心使用. #define EEPROMADDR0X000 ((u32 ...

  8. jeecg入门操作—模板配置(录入界面)

    点击online表单的模板配置,进入模板设计列表页面,点击创建模板 点击创建模板 点击激活 设计完成,点击激活(表单模板可以多个,激活状态只能有一个) 激活后,重新加入功能测试,点击添加页面,效果如下 ...

  9. 51: Luogu 2485 模板

    $des$ 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给定y.z.p,计算满足y^x ≡z(mod p)的最小非负 ...

随机推荐

  1. yum 配置详解(转发)

    一.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...

  2. iOS 大牛

    1,http://lixing123.com 2,http://kayosite.com

  3. hdu 4405 Aeroplane chess(概率+dp)

    Problem Description Hzz loves aeroplane chess very much. The chess map contains N+ grids labeled to ...

  4. Jquery_Ajax文件上传

    如何实现jQuery的Ajax文件上传,PHP如实文件上传.AJAX上传文件,PHP上传文件. [PHP文件上传] 在开始之前,我觉得是有必要把通WEB上传文件的原理简单说一下的.实际上,在这里不管是 ...

  5. Visual Studio 2015 使用ODP.net进行EF开发

    刚转了新公司,以前公司都是用VS+MSSQL作为开发工具的 现在新公司由于数据库是Oracle,而且新公司比较小规模,开发团队也没有什么规范 访问数据库的方式一直使用ADO.net的DataTable ...

  6. 文件atime未变问题的研究

    1. atime, ctime 以及mtime 这三个名词属于文件/文件夹的属性,存在于inode数据结构之中. 通过系统调用stat可以获取stat结构,其中包括:atime(accesstime) ...

  7. [Hapi.js] POST and PUT request payloads

    hapi makes handling POST and PUT payloads easy by buffering and parsing them automatically without r ...

  8. 关于mybatis插入数据库返回主键id

    关于Sequence主键的数据库来说,如: <insert id="add" parameterType="vo.Category"> <se ...

  9. 线程:CyclicBarrier同步工具类

    一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点.比如公司组织活动出去玩,需要在公司门口一起搭车去.每个人从家里出发去公司门口,到达的时间肯定先后不一样,所以公司的车要一直等待,等所有人 ...

  10. 并行查询提高sql查询速度

    新项目在使用Oracle开发中遇到测试库千万级数据导致数据慢,除去加索引和存储过程可以明显提速外,使用并行也可以提速 select /*+parallel(a,8)*/ a.* from a 加上/* ...