STC 89C51系列 EEPROM测试程序

1测试程序

2证明程序

1

/*
单片机内置的 EEPROM测试程序
适用 
STC89C51
STC89C52
STC89C53
STC89C54
STC89C58
STC89C510
STC89C512
STC89C514

测试晶振:11.05926M 12M 都可以用 

功能:
读取指定地址的一个字节内容,并显示在8 P1总线上

擦除一个扇区,修改取指定地址的一个字节内容,并显示在8 P1总线上

*/

#include <reg51.h>
#include <intrins.h>

/******************EEPROM用到的sfr中的寄存器地址stc型号不同地址不同*****************************************/
sfr IAP_DATA    = 0xE2;   //IAP操作时的数据寄存器(从flash读数据和写数据都在此处)
sfr IAP_ADDRH   = 0xE3;   //IAP操作时的地址寄存器高8位
sfr IAP_ADDRL   = 0xE4;   // IAP操作时的地址寄存器低8位
sfr IAP_CMD     = 0xE5; //IAP命令模式寄存器(需命令触发寄存器触发方生效)3种模式
sfr IAP_TRIG    = 0xE6; //IAP命令触发寄存器,在IAP_CONTR.7=1时;对IAP_TRIG先写//入46h,再写入B9h,IAP命令生效
sfr IAP_CONTR   = 0xE7; //IAP控制寄存器
 
/***********定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数(属于IAP_CONTR寄存器)***********/
#define ENABLE_ISP 0x82     //实测  12M  11.0592M 都可以使用

void DELAY_MS (unsigned int a)
{
    unsigned int i;
    while ( --a != 0 )
    {
        for (i=0;i<=110;i++);
    }
}

/*************关闭IAP功能子程序*****************************/
void IAP_Disable()      //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
{                       //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关    
    IAP_CONTR = 0;      //关闭IAP 功能
    IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
    IAP_TRIG = 0;       //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
    IAP_ADDRH = 0;      //高八位地址清0
    IAP_ADDRL = 0;      //低八位地址清0
}
 
/**********EEPROM读一字节子程序***********************/
unsigned char Byte_Read(unsigned int add)      //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
{
    IAP_DATA = 0x00;             //IAP数据寄存器清0
    IAP_CONTR = ENABLE_ISP;      //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x01;              //IAP/ISP/EEPROM 字节读命令
 
    IAP_ADDRH = (unsigned char)(add>>8);    //设置目标单元地址的高8 位地址
    IAP_ADDRL = (unsigned char)(add&0xff);    //设置目标单元地址的低8 位地址
 
    EA = 0;
    IAP_TRIG = 0x46;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xB9;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    EA = 1;
    IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    return (IAP_DATA);
}
 
 
/************EEPROM字节编程子程序**************************/
void Byte_Program(unsigned int add,unsigned char ch)  //字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
{
    IAP_CONTR = ENABLE_ISP;         //打开 IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字节编程命令
 
 
    IAP_ADDRH = (unsigned char)(add>>8);    //设置目标单元地址的高8 位地址
    IAP_ADDRL = (unsigned char)(add&0xff);    //设置目标单元地址的低8 位地址
 
    IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
    EA = 0;
    IAP_TRIG = 0x46;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xB9;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    EA = 1;
    IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}
 
/*************EEPROM擦除扇区子程序**************************/
void Sector_Erase(unsigned int add)       //擦除扇区, 入口:DPTR = 扇区地址
{
    IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇区擦除命令
 
    IAP_ADDRH = (unsigned char)(add>>8);    //设置目标单元地址的高8 位地址
    IAP_ADDRL = (unsigned char)(add&0xff);    //设置目标单元地址的低8 位地址
 
    EA = 0;
    IAP_TRIG = 0x46;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xB9;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    EA = 1;
    IAP_Disable();     //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                       //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}

void main (void){

unsigned char mydata  = 0x0F;
unsigned int  address = 0x2000;

P1 = Byte_Read(address);     //读取当前地址存储的8个bit,并显示出来
DELAY_MS(1000);	

Sector_Erase(address);       //擦除这个地址所在的扇区
Byte_Program(address,mydata);//写入新的8个bit
P1 = Byte_Read(address);      //读取当前地址存储的8个bit,并显示出来

while(1);
}

2

/*
单片机内置的 EEPROM测试程序
适用 
STC89C51
STC89C52
STC89C53
STC89C54
STC89C58
STC89C510
STC89C512
STC89C514

测试晶振:11.05926M 12M 都可以用 

功能:
读取指定地址的一个字节内容,并显示在8 P1总线上

擦除一个扇区,修改取指定地址的一个字节内容,并显示在8 P1总线上

*/

#include <reg51.h>
#include <intrins.h>

/******************EEPROM用到的sfr中的寄存器地址stc型号不同地址不同*****************************************/
sfr IAP_DATA    = 0xE2;   //IAP操作时的数据寄存器(从flash读数据和写数据都在此处)
sfr IAP_ADDRH   = 0xE3;   //IAP操作时的地址寄存器高8位
sfr IAP_ADDRL   = 0xE4;   // IAP操作时的地址寄存器低8位
sfr IAP_CMD     = 0xE5; //IAP命令模式寄存器(需命令触发寄存器触发方生效)3种模式
sfr IAP_TRIG    = 0xE6; //IAP命令触发寄存器,在IAP_CONTR.7=1时;对IAP_TRIG先写//入46h,再写入B9h,IAP命令生效
sfr IAP_CONTR   = 0xE7; //IAP控制寄存器
 
/***********定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数(属于IAP_CONTR寄存器)***********/
#define ENABLE_ISP 0x82     //实测  12M  11.0592M 都可以使用

void DELAY_MS (unsigned int a)
{
    unsigned int i;
    while ( --a != 0 )
    {
        for (i=0;i<=110;i++);
    }
}

/*************关闭IAP功能子程序*****************************/
void IAP_Disable()      //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
{                       //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关    
    IAP_CONTR = 0;      //关闭IAP 功能
    IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
    IAP_TRIG = 0;       //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
    IAP_ADDRH = 0;      //高八位地址清0
    IAP_ADDRL = 0;      //低八位地址清0
}
 
/**********EEPROM读一字节子程序***********************/
unsigned char Byte_Read(unsigned int add)      //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
{
    IAP_DATA = 0x00;             //IAP数据寄存器清0
    IAP_CONTR = ENABLE_ISP;      //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x01;              //IAP/ISP/EEPROM 字节读命令
 
    IAP_ADDRH = (unsigned char)(add>>8);    //设置目标单元地址的高8 位地址
    IAP_ADDRL = (unsigned char)(add&0xff);    //设置目标单元地址的低8 位地址
 
    EA = 0;
    IAP_TRIG = 0x46;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xB9;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    EA = 1;
    IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    return (IAP_DATA);
}
 
 
/************EEPROM字节编程子程序**************************/
void Byte_Program(unsigned int add,unsigned char ch)  //字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
{
    IAP_CONTR = ENABLE_ISP;         //打开 IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字节编程命令
 
 
    IAP_ADDRH = (unsigned char)(add>>8);    //设置目标单元地址的高8 位地址
    IAP_ADDRL = (unsigned char)(add&0xff);    //设置目标单元地址的低8 位地址
 
    IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
    EA = 0;
    IAP_TRIG = 0x46;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xB9;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    EA = 1;
    IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}
 
/*************EEPROM擦除扇区子程序**************************/
void Sector_Erase(unsigned int add)       //擦除扇区, 入口:DPTR = 扇区地址
{
    IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇区擦除命令
 
    IAP_ADDRH = (unsigned char)(add>>8);    //设置目标单元地址的高8 位地址
    IAP_ADDRL = (unsigned char)(add&0xff);    //设置目标单元地址的低8 位地址
 
    EA = 0;
    IAP_TRIG = 0x46;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xB9;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    EA = 1;
    IAP_Disable();     //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                       //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}

void main (void){

unsigned char mydata1  = 0xF0;
unsigned char mydata2  = 0x0F;
unsigned int  address1 = 0x2000;
unsigned int  address2 = 0x21FF;

Sector_Erase(address1);        //为了数据的写入
Byte_Program(address1,mydata1);
Byte_Program(address2,mydata2);

P1 = Byte_Read(address1);     //显示出来
DELAY_MS(500);
P1 = Byte_Read(address2);     //显示出来
DELAY_MS(500);	

//Sector_Erase(address1);       //无论是擦除address1还是address2
Sector_Erase(address2);       
P1 = Byte_Read(address1);     //读取到的是0xFF
DELAY_MS(500);
P1 = Byte_Read(address2);     //读取到的是0xFF
DELAY_MS(500);	

/*
可以证明:
A和B属于用一个扇区
擦除A或者B 字节的地址
再次读取A或B 都已经改变为0xFF
*/

while(1);
}
时间: 2024-10-06 07:05:47

STC 89C51系列 EEPROM测试程序的相关文章

24系列EEPROM应用注意事项

24系列EEPROM应用注意事项 1 概述用户在使用EEPROM偶尔会出现数据丢失的情况,尤其在上下电或电源抖动过程中,会出现不确定的干扰.为了防止故障发生,建议用户按规定条件使用,避免在异常条件下操作.关于数据丢失的原因,需根据实际使用情况来分析.2 注意事项在具体应用中,请注意以下事项:1) VCC电源确定是在1.8V~5.5V范围内,VCC脚附近加一个0.1uF电容.2) SCL和SDA外部上拉,上拉电阻范围1K~10K.3) 若应用板上干扰较大,在SCL和SDA线上串几十欧姆的电阻来去毛

硬件和软件兼容i2c协议的24Cxx系列EEPROM存储器(转)

源:硬件和软件兼容i2c协议的24Cxx系列EEPROM存储器 硬件上由于24c01的A0A1A2管脚不允许悬空,故暂时的想法是兼容24c02 ---24c16 使用一个dip8封装的芯片插座,A0 A1 A2管脚都悬空即可,换芯片方便 软件上24c02地址只有8位,而其他型号是大于8位的,故地址参数使用16位 256个字节作为一个大页,即largePage,测试芯片24c04空间有512字节 上代码,求测试和讨论 #include "MY51.H" //转载请注明:http://xo

STC12C5A60S2 EEPROM 测试

/* 单片机内置的 EEPROM测试程序 适用 : STC12C5A60S2  只有两个扇区 0x0000~0x01FF,0x0200~02FF 测试晶振:11.05926M 12M 都可以用  功能: 读取指定地址的一个字节内容,并显示在8 P1总线上 擦除一个扇区,修改取指定地址的一个字节内容,并显示在8 P1总线上 */ #include <reg51.h> #include <intrins.h> /******************EEPROM用到的sfr中的寄存器地址

STC12C4052AD EEPROM测试

/* 单片机内置的 EEPROM测试程序 适用 : STC12C5A60S2  只有两个扇区 0x0000~0x01FF,0x0200~02FF 测试晶振:11.05926M 12M 都可以用  功能: 读取指定地址的一个字节内容,并显示在8 P1总线上 擦除一个扇区,修改取指定地址的一个字节内容,并显示在8 P1总线上 */ #include <reg51.h> #include <intrins.h> /******************EEPROM用到的sfr中的寄存器地址

I.MX6 AT24Cxx eeprom Linux i2c-gpio

/************************************************************************** * I.MX6 AT24Cxx eeprom Linux i2c-gpio * 声明: * 很多时候当我们使用Linux系统管理硬件的时候,更多的是通过芯片中的控制器, * 但有时候,我们也会遇到芯片中的控制不够用,或者在设计的过程中出现意外,如没 * 有想到控制器存在,本文中的内容就是因为I2C中第四个控制器不存在,但硬件上却 * 认为其存在,

EEPROM工作原理透彻详解

EEPROM(Electrically Erasable Programmable read only memory)即电可擦可编程只读存储器,是一种掉电后数据不丢失(不挥发)存储芯片. EERPOM的基本结构有几种,这里讲解比较常用的FLOTOX管结构,如下图所示: FLOTOX(Floating Gate Tunneling Oxide)MOS管即浮栅隧道氧化层晶体管,它是在标准CMOS工艺的基础上衍生的技术. 如上图所示,在传统的MOS管控制栅下插入一层多晶硅浮栅,浮栅周围的氧化层与绝缘层

毕业回馈-89c51之定时器/计数器(Timer/Count)

今天分享的是89c51系列单片机的内部资源定时器/计数器,在所有的嵌入式系统中都包含这两个内部功能. 首先先了解几个定时器/计数器相关的概念: ?时钟周期:时钟周期 T 是时序中最小的时间单位,具体计算的方法就是1/时钟源频率,(一般单片机采用的是11.0592mHz) ?机器周期:我们的单片机完成一个操作的最短时间.标准51单片机,一个机器周期是 12 个时钟周期,也就是 12/11059200 秒. ?定时器:当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数

EEPROM原理详解

EEPROM(Electrically Erasable Programmable read only memory)即电可擦可编程只读存储器,是一种掉电后数据不丢失(不挥发)存储芯片. EERPOM的基本结构有几种,这里讲解比较常用的FLOTOX管结构,如下图所示: FLOTOX(Floating Gate Tunneling Oxide)MOS管即浮栅隧道氧化层晶体管,它是在标准CMOS工艺的基础上衍生的技术. 如上图所示,在传统的MOS管控制栅下插入一层多晶硅浮栅,浮栅周围的氧化层与绝缘层

Keil C51与Keil ARM共存

转自:http://blog.chinaunix.net/uid-20734916-id-3988537.html Keil和MDK共存,按照以下步骤:1 先安装 Keil C51,安装目录改为:"D:\Keil2"(我是安装在D盘的)2 再安装RealView MDK,目录:"D:\Keil" 3 把Keil2下的C51文件夹全部复制到 Keil下4 把Keil2下的 UV4(或者UV3)下的所有文件复制粘贴到 Keil下的UV4文件夹里,注意,如果提示有  重复