STC12C4052AD EEPROM测试

/*
单片机内置的 EEPROM测试程序
适用 :
STC12C5A60S2  只有两个扇区 0x0000~0x01FF,0x0200~02FF
测试晶振: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<=600;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 = 0x0000;  // 属于第一个扇区
unsigned int  address2 = 0x01FF;  // 属于第一个扇区

/************     系统初始化时  读取一次两个扇区状态 ******************************/
P1 = Byte_Read(address1);     //显示出来
DELAY_MS(500);
P1 = Byte_Read(address2);     //显示出来
DELAY_MS(500);	

/************     擦除这个扇区的512字节 并写入显得数据 读取一次两个扇区状态 ******************************/
//Sector_Erase(address1);      //无论是擦除address1还是address2
Sector_Erase(address2);        //无论是擦除address1还是address2
Byte_Program(address1,mydata1);
Byte_Program(address2,mydata2);
P1 = Byte_Read(address1);     //显示出来
DELAY_MS(500);
P1 = Byte_Read(address2);     //显示出来
DELAY_MS(500);	

/************     擦除这个扇区的512字节 并写入显得数据 读取一次两个扇区状态 ******************************/
//Sector_Erase(address1);      //无论是擦除address1还是address2
Sector_Erase(address2);        //无论是擦除address1还是address2
P1 = Byte_Read(address1);      //P1 的led灯都不亮
DELAY_MS(500);
P1 = Byte_Read(address2);      //P1 的led灯都不亮
DELAY_MS(500);	

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

while(1);
}
时间: 2024-10-23 02:56:29

STC12C4052AD EEPROM测试的相关文章

STC12C5A60S2 EEPROM 测试

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

单片机期末实训---- 密码锁和交通灯

交通灯汇编代码: ORG 0000H LJMP MAIN A_BIT EQU 20H B_BIT EQU 21H C_BIT EQU 22H D_BIT EQU 23H TEMP1 EQU 24H TEMP2 EQU 25H TEMP3 EQU 26H TEMP4 EQU 27H ORG 0003H LJMP INTER0 ORG 0013H LJMP INTER1 ORG 0050H MAIN: ;定义中断 MOV SP,#60H SETB IT0 ;边沿触发 SETB EX0;允许外部中断0

AC6102开发板USB3.0测试和使用说明

AC6102开发板USB3.0测试和使用说明 概述 AC6102上集成了一颗Cypress 推出的高性能USB3.0传输芯片CYUSB3014,Cypress称之为EZ-USBFX3.该芯片性能强劲,功能强大,接口简单,非常适合用于各种需要高速数据传输的场合,以下为摘自EZ-USBFX3数据手册中关于该芯片的介绍: 赛普拉斯EZ-USBFX3是新一代USB3.0外设控制器,具有高度集成的灵活特性,可帮助开发人员为任何系统添加USB3.0功能.EZ-USBFX3具有一个可进行完全配置的并行通用可编

NTB EEPROM设置与跨节点数据传输

NTB EEPROM设置与跨节点数据传输 双控双活系统中除了需要监测系统状态的心跳之外,还需要能够跨节点传输数据的通道.PCIE非透明桥(NTB)由于其基于标准的PCIE规范,软件依赖少,速度快,配置简便,受到许多人的青睐.基于PCIE NTB进行跨节点数据传输的原理很简单,如下图所示意: 较之于普通的PCIE/PCI设备的配置空间寄存器,NTB上多了bar2/3,bar4/bar5的地址转换寄存器,本地节点发送过来的命中bar2/bar3或者bar4/bar5的TLP的地址高位会转换成相应的地

stc89c52开发板遥控器解码 红外线发射 内置 eeprom 存储 串口显示编码

单片机,大概三年前,就买了一本 <爱上单片机> 最后就学会,用面包板了,编程书上基本没讲. 看原理图,看时序图,看数据手册, 都没讲. 而且书上自带的代码写的很烂. 1,缩近控制不好 2,命名混乱 3,做if 的时候 不变的常量放在左侧,这是很基本的约定 ... 最后,还是什么也没有学会. 直到去年,开始学 ARM 了. 学完了 ARM 前面发的(s3c2440)以后, 在回头看单片机,发现单片机真是,简单的不得了! 但是也发现,单片机,不如 ARM 功能强大.速度也慢.很多控制器,没有,要用

JTAG 测试

http://blog.csdn.net/zrlean/article/details/7516724 1 引言 “边界扫描”是一种可测性设计技术,即在电子系统的设计阶段就考虑其测试问题[1]. BSDL(boundary scan des cription language) 语言硬件描述语言(VHDL)的一个子集,是对边界扫描器件的边界扫描特性的描述,主要用来沟通边界扫描器件厂商.用户与测试工具之间的联系,其应用包括:厂商将BSDL描述作为边界扫描器件的一部分提供给用户:BSDL描述为自动测

USB3.0测试和使用说明

概述 AC6102上集成了一颗Cypress 推出的高性能USB3.0传输芯片CYUSB3014,Cypress称之为EZ-USBFX3.该芯片性能强劲,功能强大,接口简单,非常适合用于各种需要高速数据传输的场合,以下为摘自EZ-USBFX3数据手册中关于该芯片的介绍: 赛普拉斯EZ-USBFX3是新一代USB3.0外设控制器,具有高度集成的灵活特性,可帮助开发人员为任何系统添加USB3.0功能.EZ-USBFX3具有一个可进行完全配置的并行通用可编程接口GPIFII,它可与任何处理器.ASIC

V3学院带你学习EEPROM读写实验

一.实验背景在消费者电子电讯和工业电子中看上去不相关的设计里经常有很多相似的地方例如几乎每个系统都包括一些智能控制通常是一个单片的微控制器,通用电路例如LCD驱动器远程I/O,RAM,EEPROM或数据转换器,面向应用的电路譬如收音机和视频系统的数字调谐和信号处理电路或者是音频拨号电话的DTM发生器,为了使这些相似之处对系统设计者和器件厂商都得益而且使硬件效益最大电路最简单Philips开发了一个简单的双向两线总线实现有效的IC之间控制这个总线就称为Inter IC或I2C总线现在Philips

转载:Pixhawk源码笔记五:存储与EEPROM管理

转自:新浪@WalkAnt 第六部分 存储与EEPROM管理 详细参考:http://dev.ardupilot.com/wiki/learning-ardupilot-storage-and-eeprom-management/ 用户参数.航点.集结点.地图数据以及其他有用的信息需要存储.ArduPilot提供4个基本存储接口: 1.AP_HAL::Storage对象:hal.storage: 2.StorageManager库,是hal.storage更高级别的封装: 3.DataFlash