STC单片机内部EEPROM的应用

合集下载

stc单片机eeprom读写程序

stc单片机eeprom读写程序

stc单片机eeprom读写程序以下是STC单片机使用EEPROM进行读写的示例程序:#include <reg52.h>#include <intrins.h>#define EEPROM_ADDR 0xA0 // EEPROM的I2C地址sbit SDA = P2^0; // I2C的数据线sbit SCL = P2^1; // I2C的时钟线// I2C开始信号void I2C_Start(){SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 0;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C停止信号void I2C_Stop(){SDA = 0;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 1;_nop_(); // 延时一段时间}// I2C发送一个字节的数据void I2C_SendByte(unsigned char dat){unsigned char i;for (i = 0; i < 8; i++){SDA = dat & 0x80; // 获取最高位dat <<= 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C接收一个字节的数据unsigned char I2C_ReceiveByte(){unsigned char i, dat = 0;SDA = 1;for (i = 0; i < 8; i++){_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间dat <<= 1;dat |= SDA;SCL = 0;}return dat;}// 在EEPROM中写入一个字节的数据void EEPROM_WriteByte(unsigned char addr, unsigned char dat) {I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令I2C_SendByte(addr); // 发送地址I2C_SendByte(dat); // 发送数据I2C_Stop();}// 从EEPROM中读取一个字节的数据unsigned char EEPROM_ReadByte(unsigned char addr){unsigned char dat;I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令 I2C_SendByte(addr); // 发送地址I2C_Start();I2C_SendByte(EEPROM_ADDR | 1); // 发送读取指令 dat = I2C_ReceiveByte(); // 读取数据I2C_Stop();return dat;}。

STC系列单片机片内EEPROM的应用

STC系列单片机片内EEPROM的应用

(2)向STC12C5A60S2单片机片内EEPROM中某单元写入数据 (假设系统时钟频率为20MHz):
MOV IAP_DATA,#DATA;先将要写入旳数据送至IAP_DATA寄 存器
MOV IAP_ADDRH,#BYTE_ADDRH;送单元地址旳高8位 MOV IAP_ADDRL,#BYTE_ADDRL;送单元地址旳低8位 MOV IAP_CONTR,#10000010B;设置等待时间且允许对
MS1 MS0 • 操作任务旳选择
0
0
待机模式,不操作
0
1
对EEPROM进行读操作
1
0
对EEPROM进行写操作
1
1 对EEPROM进行擦除操作
2.控制寄存器IAP_CONTR
WT2 WT1 WT0 读(2个 时钟)
1 1 1 2个时钟
写(55us) 55个时钟
扇区擦除( 21ms) 21012个时钟
MOV IAP_ADDRH,DPH;送地址旳高8位
MOV IAP_TRIG,#5AH;开启写操作
MOV IAP_TRIG ,#0A5H
LCALL DELAY_55μs ;延时等待
RET
BYTE_READ:
;读
MOV IAP_CONTR,#82H
MOV IAP_CMD,#01H ;读EEPROM命令
• EEPROM分为若干个扇区,每个扇区旳大小为512B,数据 存储器旳擦除操作是按扇区进行旳,能够擦写旳次数在10 万次以上。
• 使用时,同一次修改旳数据应该存储于同一种扇区,不是 同一次修改旳数据最佳存储在不同旳扇区,不一定要存满 。内部EEPROM旳扇区地址如表10-1所示。
起始地址 结束地址 起始地址 结束地址

stc89c52中EEPROM使用方法

stc89c52中EEPROM使用方法

单片机STC‎89C52R‎C内部EEPR‎O M单片机运行时‎的数据都存在‎于RAM(随机存储器)中,在掉电后RA‎M中的数据是无‎法保留的,那么怎样使数据在掉‎电后不丢失呢‎?这就需要使用‎E EPROM‎或FLASH‎R OM 等存储器来实‎现。

在传统的单片‎机系统中,一般是在片外‎扩展存储器,单片机与存储‎器之间通过I‎I C 或SPI 等接口来进行‎数据通信。

这样不光会增‎加开发成本,同时在程序开‎发上也要花更‎多的心思。

在STC 单片机中内置‎了EEPRO‎M(其实是采用ISP/IAP 技术读写内部‎F LASH 来实现EEP‎R OM),这样就节省了‎片外资源,使用起来也更‎加方便。

下面就详细介绍S‎T C 单片机内置E‎E PROM 及其使用方法‎STC 各型号单片机‎内置的EEP‎R OM 的容量最小有‎2K,最大有16K‎,基本上很好地‎满足项目的需‎要,更方便之处就是‎节省了周边的‎E EPROM‎器件,达到节省成本‎的目的,而且内部EE‎P ROM 的速度比外部‎的EEPROM‎的速度快很多‎。

STC 各型号单片机‎内置的EEP‎R OM 是以512 字节为一个扇‎区,EEPROM‎的起始地址=FALSH 容量值+1,那么STC8‎9C52RC‎的起始地址为‎0x2000‎,第一扇区的起‎始地址和结束‎地址0x20‎00~0x21FF‎,第二扇区的起始地址和‎结束地址0x‎2200~0x23FF‎,其他扇区如此‎类推。

深入重点:�传统的EEP‎R OM 是电可擦可编‎程只读存储一‎种掉电后数据‎不丢失的存储‎芯片。

�STC89C‎52RC 的EEPRO‎M是通过ISP‎/IAP 技术读写内部‎F LASH 来实现EEP‎R OM。

�STC89C‎52RC 的EEPRO‎M起始地址为0‎x2000,以512 字节为一个扇‎区,EERPOM‎的大小为2K‎字节。

STC89C‎52RC 与EEPOR‎M实现的寄存器‎有6 个,分别是ISP‎_DATA、ISP_AD‎D RH、ISP_AD‎D RLISP_TR‎I G、ISP_CM‎D、ISP_CO‎N TR。

STC单片机AD转换及EEPROM使用

STC单片机AD转换及EEPROM使用

STC单片机AD转换及EEPROM使用STC单片机AD转换及EEPROM使用随着各种电子设备的普及,信号处理的重要性日益凸显。

而一款好的ADC (Analog to Digital Convertor) 和一个高效的存储平台EEPROM (Electrically Erasable Programmable Read-Only Memory) 就成为建立可靠稳定的信号处理系统的重要组成部分。

本文将讨论STC单片机如何进行AD转换及EEPROM的使用。

首先,AD转换是将模拟信号转换成数字量的过程,是建立信号处理系统的关键步骤之一。

STC单片机内置了一个12位的AD转换器,也就是说,它可以将模拟信号转换成一个12位的数字信号,这是非常精确的。

下面我们来看看如何在代码中使用AD转换。

AD转换的原理很简单,即将待转换的模拟信号输入到AD口,接着启动AD转换。

当转换结束后,检测转换结束标志位,然后将转换结果读出。

这里具体介绍一下代码的实现方法。

首先,需要定义AD口的引脚、参考电压及转换效率等参数。

代码如下:#define ADC_PIN 0x01 //定义AD口所连接的引脚为P1.1#define ADC_REF 0x80 //定义参考电压为内部参考电压#define ADC_MODE 0xC0 //定义转换效率为最快接着,需要配置AD口所连接的引脚,使其成为输入口。

代码如下:P1ASF = 0x02; //定义P1.1为AD口输入接下来,启动AD转换,等待转换结束标志位的出现。

代码如下:ADC_CONTR = ADC_REF | ADC_MODE | ADC_PIN; //配置AD口ADC_CONTR |= 0x08; //启动AD转换while (!(ADC_CONTR & 0x20)); //等待转换结束标志位最后,将AD转换结果读出。

代码如下:uint16_t value;value = ADC_RES;value |= ADC_RESL << 8;我们可以看到,在STC单片机中使用AD转换非常方便,只需要简单的几行代码就可以完成。

STC单片机EEPROM读写程序

STC单片机EEPROM读写程序

STC单片机EEPROM读写程序在单片机中,EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以用于存储数据,即使在断电情况下,数据也会被保留。

因此,掌握STC单片机的EEPROM读写程序对于开发嵌入式系统非常重要。

一、EEPROM简介EEPROM是一种可重复擦写的存储器,可用于存储小量数据。

与Flash存储器相比,EEPROM具有更快的写入和擦除速度。

在STC单片机中,EEPROM的存储容量通常较小,一般在几个字节到几千字节之间。

二、EEPROM读操作在STC单片机中,进行EEPROM读操作需要按照以下步骤进行:1. 初始化I2C总线:STC单片机使用I2C总线进行EEPROM读写操作,因此需要先初始化I2C总线。

通过设置相关寄存器,设置I2C 总线的速度和地址。

2. 发送设备地址:确定要读取的EEPROM设备的地址,并发送到I2C总线。

3. 发送寄存器地址:确定要读取的EEPROM寄存器地址,并将其发送到I2C总线。

4. 发送读命令:向EEPROM发送读命令,以启动读操作。

5. 读取数据:从EEPROM中读取数据,并保存到变量中。

6. 结束读操作:完成读操作后,关闭I2C总线。

三、EEPROM写操作类似于读操作,进行EEPROM写操作也需要按照一定的步骤进行:1. 初始化I2C总线:同样地,首先需要初始化I2C总线。

2. 发送设备地址:确定要写入的EEPROM设备的地址,并发送到I2C总线。

3. 发送寄存器地址:确定要写入的EEPROM寄存器地址,并将其发送到I2C总线。

4. 发送写命令:向EEPROM发送写命令,以启动写操作。

5. 写入数据:将要写入EEPROM的数据发送到I2C总线。

6. 结束写操作:完成写操作后,关闭I2C总线。

四、注意事项在进行EEPROM读写操作时,需要注意以下几点:1. 确保正确的设备地址:要与EEPROM的地址匹配,否则无法进行有效的读写操作。

关于STC单片机EEPROM的应用总结

关于STC单片机EEPROM的应用总结

关于STC单片机EEPROM的应用总结关于STC单片机EEPROM的应用总结当在程序运行的过程中你希望修改某个变量并且此变量的值在掉电以后不丢失,那么你就可以采用将变量数据写入EEPROM的方式来实现。

什么是EEPROM,即Electrically Erasable ProgrammableRead_Only Memory首先它是一种存储器,并且可以通过高电压来进行反复擦写的存储器。

具有掉电数据不丢失的特点。

比如常用的24C系列,93C系列的器件。

一般这种器件采用I2C的方式与单片机进行通讯,对于这种通讯方式及器件的应用另作总结。

这里主要总结一下,STC12C5204AD芯片内部包含的EEPROM的应用方法。

STC12C5201AD系列单片机内部集成了EEPROM是与程序空间分开的,利用ISP/IAP技术可将内部data flash当EEPROM,擦写10万次以上。

EEPROM可分为若干个扇区,每个扇区包含512字节。

使用时建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要用满。

数据存储器的擦除操作是按扇区进行的。

在程序中可对EEPROM进行字节读写/字节编程/扇区擦除操作。

在工作电压Vcc偏低时,建议不要进行EEPROM/IAP操作。

以免发生数据错误。

应用的步骤1、声明与EEPROM相关的寄存器2、编写EEPROM初始化函数3、编写字节擦除函数4、编写字节编程函数5、编写字节读取函数6、在需要读取EEPROM字节内容时直接调用字节读取函7、在需要进行写EEPROM字节时,先调用字节擦除函数,将字节内容擦除成FFH后,在调用字节编程函数,将数据写入到EEPROM的地址单元中。

与EEPROM应用相关的寄存器符号描述地址位地址及符号复位值IAP_DATAISP/IAP flash data register1111 1111BIAP_ADDRHISP/IAP flash address highC3H0000 0000BIAP_ADDRLISP/IAP flash address lowC4HIAP_CMDISP/IAP flash command register C5HMS1MS0IAP_TRIGISP/IAP flash command trigger C6HxxxxxxxxxBIAP_CONTRISP/IAP control registerC7HSWRSTCMD_FAILWT2WT1WT00000X000BPCONPower control87HSOMDSMOD0LVDFPOFGF1GF0PDIDL00110000B1、IAP_DATA:ISP/IAP数据寄存器ISP/IAP操作时的数据寄存器。

stc89c52中EEPROM使用方法

stc89c52中EEPROM使用方法

单片机STC89C52RC 内部EEPROM单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。

在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC 或SPI 等接口来进行数据通信。

这样不光会增加开发成本,同时在程序开发上也要花更多的心思。

在STC 单片机中内置了EEPROM(其实是采用ISP/IAP 技术读写内部FLASH 来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。

下面就详细介绍STC 单片机内置EEPROM 及其使用方法STC 各型号单片机内置的EEPROM 的容量最小有2K,最大有16K,基本上很好地满足项目的需要,更方便之处就是节省了周边的EEPROM 器件,达到节省成本的目的,而且内部EEPROM 的速度比外部的EEPROM 的速度快很多。

STC 各型号单片机内置的EEPROM 是以512 字节为一个扇区,EEPROM 的起始地址=FALSH 容量值+1,那么STC89C52RC 的起始地址为0x2000,第一扇区的起始地址和结束地址0x2000~0x21FF,第二扇区的起始地址和结束地址0x2200~0x23FF,其他扇区如此类推。

深入重点:�传统的EEPROM 是电可擦可编程只读存储一种掉电后数据不丢失的存储芯片。

�STC89C52RC 的EEPROM 是通过ISP/IAP 技术读写内部FLASH 来实现EEPROM。

�STC89C52RC 的EEPROM 起始地址为0x2000,以512 字节为一个扇区,EERPOM 的大小为2K 字节。

STC89C52RC 与EEPORM 实现的寄存器有6 个,分别是ISP_DATA、ISP_ADDRH、ISP_ADDRLISP_TRIG、ISP_CMD、ISP_CONTR。

STC单片机内部EEPROM的应用

STC单片机内部EEPROM的应用

ISP_IAP_enable()?/* 打开IAP 功能*/
for(i=0?i<len?i++)
{
/* 写一个字节*/
ISP_ADDRH=(unsigned char)(in_addr >> 8)?
ISP_TRIG=0xb9?/* 触发ISP_IAP 命令字节2 */
_nop_()?
}
/*
字节读
*/
unsigned char byte_read(unsigned int byte_addr)
{
ISP_ADDRH=(unsigned char)(byte_addr>>8)? /* 地址赋值*/
stc单片机EEPROM读写(一)
EEPROM 操作函数:
#define RdCommand 0x01
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01
#define PerSector 512
unsigned char xdata Ttotal[512]?
/*
打开ISP,IAP 功能
*/
void ISP_IAP_enable(void)
D7 D6 D5 D4 D3 D2 D1 D0
ISPEN SWBS SWRST - - WT2 WT1 WT0
启动到ISP 区或用户程序区,这在“STC 单片机自动下载”一节,亦有所应用。
如:
ISP_CONTR=0x60? 则可以实现从用户应用程序区软件复位到ISP 程序区开始运行

STC89C52RC内部EEPROM应用

STC89C52RC内部EEPROM应用
函数:关闭ISP/IAP操作
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
voidclose_isp_iap()
{
ISP_CONTR = 0;//关闭IAP功能
ISP_CMD = 0;//待机模式,无ISP操作
ISP_TRIG = 0;//关闭IAP功能,清与ISP有关的特殊功能寄存器
STC89C52RC内部EEPROM应用
【源码】
/************************************
功能:STC89C52RC EEPROM保存关电前LED的亮灭状况
单片机:STC89C52RC
晶振:11.0592MHz
编译环境:Keil uVision4 V9.00
************************************/
LED1 = 1;
LED2 = 0;//亮第二个灯
}
while(1)
{
if(!K1)
{
while(!K1);
eraser(0x2000);//擦除第1个扇区(2000h~21FFh)
write(0x2002, 1);//对EEPROM区2002h写入1
LED1 = 0;
LED2 = 1;
}
if(!K2)
ISP_ADDRL =addr;
ISP_ADDRH =addr>> 8;
EA = 0;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
dat = ISP_DATA;//取出数据
close_isp_iap();//关闭ISP/IAP
returndat;

单片机EEPROM存储技术研究与应用分析

单片机EEPROM存储技术研究与应用分析

单片机EEPROM存储技术研究与应用分析单片机(微控制器)是一种集成了中央处理器、存储器与外围设备接口的集成电路芯片,常用于各种电子设备控制系统中。

EEPROM(Electrically Erasable Programmable Read-Only Memory)存储技术是一种可擦写的非易失性存储器技术,在单片机中广泛应用于存储重要的数据和程序。

本文将对单片机EEPROM存储技术进行研究与应用分析,探讨其原理、特点、应用场景以及未来的发展趋势。

一、EEPROM存储技术原理EEPROM存储技术是一种非易失性存储器技术,其存储单元可以通过电编程和电擦除来改变其状态。

与传统的ROM存储器不同,EEPROM存储器可以随时擦除和编程,使其适用于存储需要频繁更新或修改的数据和程序。

EEPROM存储单元由一对浮动门和控制电路组成。

当进行编程操作时,控制电路通过给浮动门施加高电压,从而使电荷注入存储单元。

而在擦除操作中,通过施加高电压,擦除浮动门上的电荷。

这种电编程和擦除的行为使得EEPROM存储器具有了可随时修改的特性。

二、EEPROM存储技术特点1. 非易失性存储:EEPROM存储器在断电或掉电情况下仍然能够保持数据和程序,不需要外部电源供电维持存储信息,确保了数据的长期保存。

2. 随机读写访问:与传统的EPROM存储器相比,EEPROM存储器可以进行随机读写访问,而不需要整体擦除。

3. 多次擦写操作:EEPROM存储器可以进行多次擦写操作,可达到10万次以上,具有较高的可靠性和耐久性。

4. 体积小巧:EEPROOM存储器芯片体积小巧,适合于嵌入式系统和各种小型电子设备中的应用。

5. 低功耗:EEPROM存储器对功耗要求较低,可以在电池供电的场景中广泛应用。

三、EEPROM存储技术应用场景1. 数据存储:EEPROM 存储技术可用于存储各种配置信息、参数设置、状态信息等,在控制系统、仪器仪表、工业自动化等领域得到广泛应用。

关于STC15F2KA60S2内E2ROM的应用

关于STC15F2KA60S2内E2ROM的应用

STC15F2K60S2内E2PROM 应用1.目的单片机运行时的数据都存在于RAM (随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用内部EEPROM (EEPROM 可以擦写100000次)或FLASHROM 等存储器来实现。

在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC 或SPI 等接口来进行数据通信。

这样不光会增加开发成本,同时在程序开发上也要花更多的心思。

在STC 单片机中内置了EEPROM (其实是采用ISP/IAP 技术读写内部FLASH 来实现EEPROM ),正是因为有了IAP ,从而可以使单片机可以将数据写入到程序存储器中,使得数据如同烧入的程序一样,掉电不丢失。

当然写入数据的区域与程序存储区要分开来,以使程序不会遭到破坏。

这样就节省了片外资源,使用起来也更加方便。

下面就详细介绍STC 单片机内置EEPROM 及其使用方法 2.STC15F2K60S2系列单片机的内部结构图STC15F2K60S2系列单片机的内部结构框图如下图所示,STC15F2K60S2系列单片机中包含中央处理器(CPU )、程序存储器(Flash )、数据存储器(SRAM )、定时器、IO 口、高速A/D 转换、看门狗、UART 高速异步串行通信口1/串行通信口2,CCP/PWM/PCA,一组高速同步串行端口SPI ,片内高精度R/C 时钟及高可靠复位等模块,STC15F2K60S2系列单片机几乎包含了数据采集和控制中的所有单元模块。

内部高可靠复位(8STC15F2K60系列内部结构框图3.IAP 及EEPROM 新增特殊功能寄存器介绍:ISP/ IAP从Flash读出的数据放在此处,向Flash写的数据也放在此处IAP/ISP地址寄存器IAP-ADDRH和IAP-ADDRLIAP-ADDRH:ISP/IAP操作时的地址寄存器高八位。

STC内部EEPROM应用函数

STC内部EEPROM应用函数

STC内部EEPROM应用函数作者:pc63 来源:单片机学习网编辑导读:STC12C5410AD系列头文件|stc单片机AD和EEPROM的驱动C程序|STC89C51RC/RD+系列头文件|STC12C5404AD 单片机控制74LS164子程序|SST89C54/58简介|STC12C5A60S2系列双串口1T 8051单片机头文件|STC11F60XE高速总线系列1T 8051单片机头文件|利用宏晶科技的IAP单片机开发自己的ISP程序|STC89C58RD+ 内部EEPROM 放数据FLASH-ISP-IAP|STC单片机选型指南正文:STC12C5410系列单片机内带2K EEPROM,分成4个扇区,每个扇区512byte。

使用时注意以下几点:1、有三个基本命令:字节读,字节写,扇区擦除2、没有字节擦除,只有扇区擦除。

如果要改变扇区中de某个字节,保留其它字节内容不变,必须先把其它字节读出来保存,然后擦除整个扇区,再把改动de字节内容和保存de其它字节内容写入扇区。

3、扇区读写de时间短,擦除de时间比较长,要注意扇区擦除函数de调用位置,比如最好不要放在定时中断中。

4、每个扇区用de越少越方便。

以下shi应用函数:#include <functi title="东哥电子商城,提供单片机学习开发板,实验板,编程器,仿真器,无线发射接收模块,各种电子元器件.">单片机deEEPROM 测试起始地址void iap_disable () {ISP_ADDRL = 0xff;ISP_ADDRH = 0xff;ISP_CONTR = 0; //关闭 IAP 功能ISP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用ISP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用}uchar byte_read (uint address){uchar i;ISP_ADDRL = address; //设置目标单元地址ISP_ADDRH = address >> 8;ISP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置 Flash 操作等待时间 ISP_CMD = ISP_IAP_BYTE_READ; //设置为IAP/ISP/EEPROM 字节读模式命令 //EA=0;ISP_TRIG = 0x46;ISP_TRIG = 0xb9; //先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此,送完B9h 后,ISP/IAP 命令立即被触发起动for (i = 0;i < 30;i++);//EA=1;iap_disable (); //;关闭 IAP 功能, 清相关de特殊功能寄存器,使CPU 处于安全状态,一次连续deIAP 操作完成之后建议关闭IAP 功能,不需要每次都关i = ISP_DATA; //读出de数据在ISP_DATA 单元中,送入累加器Areturn i;}void byte_program (uint address,uchar wr_data) {uchar i;ISP_ADDRL = address; //设置目标单元地址ISP_ADDRH = address >> 8;ISP_DATA = wr_data; //要编程de数据先送进ISP_DATA 寄存器ISP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置 Flash 操作等待时间 ISP_CMD = ISP_IAP_BYTE_PROGRAM; //设置为IAP/ISP/EEPROM 字节编程模式命令//EA=0;ISP_TRIG = 0x46;ISP_TRIG = 0xb9; //先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此,送完B9h 后,ISP/IAP 命令立即被触发起动for (i = 0;i < 30;i++);//EA=1;iap_disable (); //;关闭 IAP 功能, 清相关de特殊功能寄存器,使CPU 处于安全状态}void sector_erase (uint address) {uchar i;ISP_ADDRL = address; //设置目标单元地址ISP_ADDRH = address >> 8;ISP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置 Flash 操作等待时间 ISP_CMD = ISP_IAP_SECTOR_ERASE; //设置为IAP/ISP/EEPROM 扇区擦除模式命令//EA=0;ISP_TRIG = 0x46;ISP_TRIG = 0xb9; //先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此,送完B9h 后,ISP/IAP 命令立即被触发起动for (i = 0;i < 30;i++);//EA=1;iap_disable ();。

STC单片机内部EEPROM使用程序

STC单片机内部EEPROM使用程序

END
;定义Flash 操作等待时间及允许IAP/ISP/EEPROM操作的常数
;ENABLE_IAP EQU 80H ;系统工作时钟<30MHz时,对IAP_CONTR寄存器设置此值
ENABLE_IAP EQU 81H ;系统工作时钟<24MHz时,对IAP_CONTR寄存器设置此值
MOV IAP_ADDRL, DPL ;设置目标单元地址的低8位地址
CLR EA
MOV IAP_TRIG, #46H ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV IAP_TRIG, #0B9H ;送完A5h后,ISP/IAP命令立即被触发起动
NOP
MOV A, IAP_DATA ;读出的数据在IAP_DATA单元中,送入累加器A
ACALL IAP_Disable ;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
;一次连续的IAP操作完成之后建议关闭IAP功能,不需要每次都关
CLR EA
MOV IAP_TRIG, #46H ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV IAP_TRIG, #0B9H ;送完A5h后,ISP/IAP命令立即被触发起动
NOP
MOV IAP_TRIG, #0 ;清命令触发寄存器,使命令触发寄存器无触发,此句可不用
MOV IAP_ADDRH, #0FFH ;送地址高字节单元为00,指向非EEPROM区
MOV IAP_ADDRL, #0FFH ;送地址低字节单元为00,防止误操作
ACALL IAP_Disable ;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,

stc系列单片机eeprom操作

stc系列单片机eeprom操作

stc系列单片机eeprom操作前言: stc单片机在中国大陆在中低端市场中占有大半壁江山.片内EEPROM是掉电保存数据的最理想选择.stc单片机的片内eeprom以扇区为单位,每个扇区大小是512 字节.以下是我亲自编写的对stc单片机(89系列除外)操作子函数,可以模块化使用,欢迎电子爱好者与我多多交流.本人QQ704157083 tel :186******** .工作地点:深圳..南山区. 从事软件和电子这行,爱好交朋友,一起开发有创意的产品.过目请留言!----------------------------------------------------------------------------------------------------------------------//增加寄存器sfr IAP_CONTR =0xC7; // ;软复位寄存器sfr IAP_DATA =0xC2 ; //数据寄存器;寄存器的地址不能改sfr IAP_adrRH =0xC3; // 地址高8位寄存器sfr IAP_adrRL = 0xC4; //命令触发器sfr IAP_CMD=0xC5; //;命令寄存器sfr IAP_TRIG=0xC6; //;命令触发器//************************************************************* **************** ****//增加通用函数.//(1) eeprom 函数写一个数据eg1: rom_writearea(1,100,0x99,12); 在片区1 地址100 中写入0x99 晶振12M// 读一个数据: eg2: rom_readarea(1,100,12); 在片区1 地址100 中读出数据晶振12M// 写一个数组:eg3: rom_write_array(1,100,a,10,12); 在片区1,起始地址100, 写入数组a ,数组大小10,晶振12Mxdata char xram[512] ; // 定义一个备份片区的数组.rom_readbyte(unsigned int adr,unsigned char fso);rom_readarea(unsigned int area,unsigned int adr_toread,unsigned char fso);void rom_writebyte(unsigned int adr,unsigned char dat,unsigned char fso);void rom_clear(unsigned int adr,unsigned char fso) ;void iap_disable();void rom_writearea(unsigned int area,unsigned int adr,unsigned char dat,unsigned char fso); // 写之前备份,扇区地址,字节地址,数据内容void rom_write_array(unsigned int area,unsigned int adr_towrite,unsigned char *p,unsigned int num,unsigned char fso);choose_area(unsigned char area); //选择片区//^^^^^^^^^^^^^^^^^^^^^^^^rom_readbyte(unsigned int adr,unsigned char fso){DPH=adr>>8; //取高字节DPL=adr; //取低字节if(fso==6){IAP_CONTR=0X84 ;}else if(fso==12){IAP_CONTR=0X8B; //;,<=12m晶振固定写法允许改变rom <=6M IAP_CONTR=0X84}IAP_CMD=0X01; //;01h为读取命令IAP_adrRH=DPH; //获取指针高八位IAP_adrRL=DPL; //获取指针低八位//EA=0;IAP_TRIG=0X5A; //两条触发命令,使命令执行IAP_TRIG=0XA5;// a=IAP_DATA; //;获取数据iap_disable();return(IAP_DATA);}//^^^^^^^^^^^^^^^^^^^^^^^^rom_readarea(unsigned int area,unsigned int adr_toread,unsigned char fso){unsigned int adr ; //扇区首地址adr=choose_area(area);IAP_DATA= rom_readbyte(adr+adr_toread,fso);//读取数据return(IAP_DATA);}//^^^^^^^^^^^^^^^^^^^^^^^^void rom_writebyte(unsigned int adr,unsigned char dat,unsigned char fso){DPH=adr>>8; //取高字节DPL=adr; //取低字节if(fso==6){IAP_CONTR=0X84 ;}else if(fso==12){IAP_CONTR=0X8B; //;,<=12m晶振固定写法允许改变rom <=6M IAP_CONTR=0X84}IAP_CMD=0X02; //;02h为写入命令IAP_adrRH=DPH; //获取指针高八位IAP_adrRL=DPL; //获取指针低八位IAP_DATA=dat; //把数据放入数据寄存器中,用于写//EA=0;IAP_TRIG=0X5A; //两条触发命令,使命令执行IAP_TRIG=0XA5;iap_disable();}//^^^^^^^^^^^^^^^^^^^^^^^^void rom_writearea(unsigned int area,unsigned int adr_towrite,unsigned char dat,unsigned char fso){unsigned int i,j ; //循环变量unsigned int adr ; //扇区首地址adr=choose_area(area);for (i=0;i<512;i++) //读扇区的所有数据,进行备份.{xram[i]=rom_readbyte(adr+i,fso);}rom_clear(area,fso); //清除要写入的扇区xram[adr_towrite]=dat ; //要写入的数据先放到数组中来for (j=0;j<512;j++) //将数组中的数据写入扇区中..{rom_writebyte(adr+j,xram[j],fso);}}//^^^^^^^^^^^^^^^^^^^^^^^^void rom_write_array(unsigned int area,unsigned int adr_towrite,unsigned char *p,unsigned int num,unsigned char fso){unsigned int i,j ; //循环变量unsigned int adr ; //扇区首地址adr=choose_area(area);for (i=0;i<512;i++) //读扇区的所有数据,进行备份.xram[i]=rom_readbyte(adr+i,fso);}rom_clear(area,fso); //清除要写入的扇区for(i=0;i<num;i++)< p="">{xram[adr_towrite+i]=*(p+i); //将数组的内容写入备份数组XRAM中}for (j=0;j<512;j++) //将数组中的数据写入扇区中..{rom_writebyte(adr+j,xram[j],fso);}}//^^^^^^^^^^^^^^^^^^^^^^^^void rom_clear(unsigned int area,unsigned char fso) //清除一片扇区{unsigned int adr ; //扇区首地址adr=choose_area(area);DPH=adr>>8; //取高字节DPL=adr; //取低字节if(fso==6){IAP_CONTR=0X84 ;}else if(fso==12){IAP_CONTR=0X8B; //;,<=12m晶振固定写法允许改变rom <=6M IAP_CONTR=0X84}IAP_CMD=0X03; //;03h为擦除命令IAP_adrRH=DPH; //获取指针高八位IAP_adrRL=DPL; //获取指针低八位//EA=0;IAP_TRIG=0X5A; //两条触发命令,使命令执行IAP_TRIG=0XA5;iap_disable();}//^^^^^^^^^^^^^^^^^^^^^^^^void iap_disable() // 关闭iap编程{IAP_CONTR=0X00; //关闭rom控制器命令IAP_CMD=0X00; //清除读写擦命令choose_area(unsigned char area){unsigned int adr;switch (area) //扇区编号从1开始到16扇区. {case 1: adr=0x0000;break;case 2: adr=0x0200;break;case 3: adr=0x0400;break;case 4: adr=0x0600;break;case 5: adr=0x0800;break;case 6: adr=0x0A00;break;case 7: adr=0x0C00;break;case 8: adr=0x0E00;break;case 9: adr=0x1000;break;case 10: adr=0x1200;break;case 11: adr=0x1400;break;case 12: adr=0x1600;break;case 13: adr=0x1800;break;case 14: adr=0x1A00;break;case 15: adr=0x1C00;break;case 16: adr=0x1E00;break;}return (adr);}//**********************************************************en d</num;i++)<>。

单片机片内大容量EEPROM的一种巧妙应用

单片机片内大容量EEPROM的一种巧妙应用

单片机片内大容量EEPROM的一种巧妙应用引言MCS-51 单片机是目前国内应用最广泛的一种单片机型。

全球各单片机生产厂商在MCS-51 内核基础上,派生了大量的51 内核系列单片机,极大地丰富了MCS-51 的种群。

其中STC 公司推出了STC89 系列单片机,增加了大量新功能,提高了51 的性能,是MCS-51 家族中的佼佼者。

早期的单片机控制系统,采用单片机加片外EEPROM 配合,来存储一些需要预置的重要参数,并在数码管上显示出来。

由于单片机控制的整流器要求实时性很强,而早期EEPROM 的写周期在10 ms 左右,因此运行参数的预置是在整流器待机的情况下进行的。

而很多情况下需要在运行的同时记录数据,如用单片机控制的12脉波汽车电泳整流器要求在运行的同时实时记录重要数据,而且在掉电时不丢失。

由于在12 脉波整流器中运行的单片机程序,其周期必须小于1.67 ms(交流电网的1 个周期是20 ms,除以12 就是l_67 ms),这就要求实时记录的时间在1ms 以下甚至更短(考虑到程序的执行时间)。

经查阅资料发现,目前很多EEPROM 达不到这个要求[1],即使时间最短的AT89S8252 单片机片内。

EEP- ROM 的写周期也是2.5 ms。

本文通过对EEPROM 的巧妙应用,实现了整流器在线记录数据的功能。

1 寻找符合要求的单片机设备使用的是Atmel 公司的AT89C52(40DIP 封装)单片机和EEPROM 芯片2817A。

要想在不改变原设备电路板的情况下完成要求的功能,就只能在兼容的MCS-51 系列单片机中想办法。

AT89S8252 片内含有2 KB 的EEPROM,经编程测试发现,它虽然能实时记录数据并且断电不丢失,但是在向片内EEPROM 中记录1 个数据时,能引起输出电压和电流的波动,不能满足实际运。

STC89C52内部EEPROM

STC89C52内部EEPROM

单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。

在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC 或SPI 等接口来进行数据通信。

这样不光会增加开发成本,同时在程序开发上也要花更多的心思。

在STC 单片机中内置了EEPROM(其实是采用IAP 技术读写内部FLASH 来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。

下面就详细介绍STC 单片机内置EEPROM 及其使用方法。

STC 各型号单片机内置的EEPROM 的容量各有不同,见下表:(内部EEPROM 可以擦写100000 次以上)上面提到了IAP,它的意思是“在应用编程”,即在程序运行时程序存储器可由程序自身进行擦写。

正是是因为有了IAP,从而可以使单片机可以将数据写入到程序存储器中,使得数据如同烧入的程序一样,掉电不丢失。

当然写入数据的区域与程序存储区要分开来,以使程序不会遭到破坏。

要使用IAP 功能,与以下几个特殊功能寄存器相关:ISP_DATA:ISP/IAP 操作时的数据寄存器。

ISP/IAP 从Flash 读出的数据放在此处,向Flash 写的数据也需放在此处ISP_ADDRH:ISP/IAP 操作时的地址寄存器高八位。

ISP_ADDRL:ISP/IAP 操作时的地址寄存器低八位。

ISP_CMD:ISP/IAP 操作时的命令模式寄存器,须命令触发寄存器触发方可生效。

ISP_TRIG:ISP/IAP 操作时的命令触发寄存器。

当ISPEN(ISP_CONTR.7)=1 时,对ISP_TRIG 先写入0x46,再写入0xb9,ISP/IAP 命令才会生效。

单片机芯片型号起始地址内置EEPROM 容量(每扇区512 字节)STC89C51RC,STC89LE51RC 0x2000 共八个扇区STC89C52RC,STC89LE52RC 0x2000 共八个扇区STC89C54RD+,STC89LE54RD+ 0x8000 共五十八个扇区STC89C55RD+,STC89LE55RD+ 0x8000 共五十八个扇区STC89C58RD+,STC89LE58RD+ 0x8000 共五十八个扇区寄存器标识地址名称7 6 5 4 3 2 1 0 初始值ISP_DATA 0xE2 ISP/IAP闪存数据寄存器11111111ISP_ADDRH 0xE3 ISP/IAP 闪存地址高位00000000ISP_ADDRL 0xE4 ISP/IAP 闪存地址低位00000000ISP_CMD 0xE5 ISP/IAP闪存命令寄存器MS2MS1 MS0 xxxxx000ISP_TRIG 0xE6 ISP/IAP 闪存命令触发xxxxxxxxISP_CONTR 0xE7 ISP/IAP 控制寄存器ISPEN SWBS SWRST WT2WT1 WT0 00xx000B7 B6 B5 B4 B3 B2 B1 B0 命令/操作模式选择保留命令选择-----0 0 0 待机模式,无ISP/IAP 操作-----0 0 1 对用户的应用程序Flash 区及数据Flash 区字节读-----0 1 0 对用户的应用程序Flash 区及数据Flash 区字节编程-----0 1 1 对用户的应用程序Flash 区及数据Flash 区扇区擦除ISP_CONTR:ISP/IAP 控制寄存器。

关于EEPROM的应用总结

关于EEPROM的应用总结

关于EEPROM的应用总结关于EEPROM的应用总结当在程序运行的过程中你希望修改某个变量并且此变量的值在掉电以后不丢失,那么你就可以采用将变量数据写入EEPROM的方式来实现。

什么是EEPROM,即Electrically Erasable ProgrammableRead_Only Memory首先它是一种存储器,并且可以通过高电压来进行反复擦写的存储器。

具有掉电数据不丢失的特点。

比如常用的24C系列,93C系列的器件。

一般这种器件采用I2C的方式与单片机进行通讯,对于这种通讯方式及器件的应用另作总结。

这里主要总结一下,STC12C5204AD芯片内部包含的EEPROM的应用方法。

STC12C5201AD系列单片机内部集成了EEPROM是与程序空间分开的,利用ISP/IAP技术可将内部data flash当EEPROM,擦写10万次以上。

EEPROM可分为若干个扇区,每个扇区包含512字节。

使用时建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要用满。

数据存储器的擦除操作是按扇区进行的。

在程序中可对EEPROM进行字节读写/字节编程/扇区擦除操作。

在工作电压Vcc偏低时,建议不要进行EEPROM/IAP操作。

以免发生数据错误。

应用的步骤1、声明与EEPROM相关的寄存器2、编写EEPROM初始化函数3、编写字节擦除函数4、编写字节编程函数5、编写字节读取函数6、在需要读取EEPROM字节内容时直接调用字节读取函数即可7、在需要进行写EEPROM字节时,先调用字节擦除函数,将字节内容擦除成FFH后,在调用字节编程函数,将数据写入到EEPROM的地址单元中。

与EEPROM应用相关的寄存器符号描述地位地址及符号复位值址IAP_DATA ISP/IAP flash dataregisterC2H11111111BIAP_AD DRH ISP/IAP flashaddress highC3H00000000BIAP_AD DRL ISP/IAP flashaddress lowC4HIAP_CMDISP/IAP flashcommand registerC5HMS1MSIAP_TRIGISP/IAP flashcommand triggerC6HxxxxxxxxxBIAP_CO NTR ISP/IAP controlregisterC7HIAPENSWBS SWRSTCMD_FAILWT2WT1WT0000X000BPCON Power control87H SOMDSMOD0LVDFPOFGF1GFPDIDL00110000B1、IAP_DATA:ISP/IAP数据寄存器ISP/IAP操作时的数据寄存器。

单片机内的Flash与EEPROM作用及区别

单片机内的Flash与EEPROM作用及区别
FLASH 和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有 FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了。
更多的心思。在STC 单片机中内置了EEPROM(其实是采用IAP 技术读写内部FLASH 来
实现EEPROM),这样就节省了片外资源,使用起来也更加方便。下面就详细介绍STC 单
片机内置EEPROM 及其使用方法。
flash是用来放程序的,可以称之为程序存储器,可以擦出写入但是基本都是整个扇区进行的.
在芯片的内电路中,FLASH和EEPROM不仅电路不同,地址空间也不同,操作方法和指令自然也不同,不论冯诺伊曼结构还是哈佛结构都是这样。技术上,程序存储器和非易失数据存储器都可以只用FALSH结构或EEPROM结构,甚至可以用“变通”的技术手段在程序存储区模拟“数据存储区”,但就算如此,概念上二者依然不同,这是基本常识问题。
单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无
法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等
存储器来实现。在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通
过IIC 或SPI 等接口来进行数据通信。这样不光会增加开发成本,同时在程序开发上也要花

51单片机STC单片机IAP(EEPROM)的使用

51单片机STC单片机IAP(EEPROM)的使用

#include<stc12c5410ad.h>//到宏晶网站下载头文件或自己在现有的头文件上加上相应的寄存器定义即可。

#include<intrins.h>#define uchar unsigned char#define uint unsigned int/****************uart init***********/void UART_inti(void){AUXR=0x40;//定时器1速度是普通8051的12倍,不分频TMOD=0x20;//定时器1工作在方式2,用来产生波特率SCON=0x50;//串口工作在方式1,允许接收TL1=0xF7;//波特率为38400;FB为115200TH1=0xF7;PCON=0x00;//SMOD=0TR1=1; //产生波特率}void ISP_write(uint ISP_addr,uchar ISP_data)//stc12c5404启始地址2800h ;IAP_CMD 1读,2写,3擦除{ISP_DATA=ISP_data; //送数据ISP_ADDRL=ISP_addr%256;ISP_ADDRH=ISP_addr/256;//送高低地址ISP_CONTR=0x83;//IAP ENABLE ,SET CPU WAIT TIME ISP_CMD=2;//写字节模式ISP_TRIG=0x46;ISP_TRIG=0xB9;//触发启动ISP_nop_();//等待写入ISP_CONTR=0x00;//禁止ISP/IAp操作ISP_CMD=0;ISP_TRIG=0x00;}uchar ISP_read(uint ISP_addr)//stc12c5404启始地址2800h ;IAP_CMD 1读,2写,3擦除{uchar recivedata;ISP_ADDRL=ISP_addr%256;ISP_ADDRH=ISP_addr/256;//送高低地址ISP_CONTR=0x83;//IAP ENABLE ,SET CPU WAIT TIME ISP_CMD=1;//写字节模式ISP_TRIG=0x46;ISP_TRIG=0xB9;//触发启动ISP_nop_();//等待读recivedata=ISP_DATA;ISP_CONTR=0x00;//禁止ISP/IAp操作ISP_CMD=0;ISP_TRIG=0x00;return recivedata;}void ISP_erase(uint ISP_addr)//stc12c5404启始地址2800h ;IAP_CMD 1读,2写,3擦除{ISP_ADDRL=ISP_addr%256;ISP_ADDRH=ISP_addr/256;//送高低地址ISP_CONTR=0x83;//IAP ENABLE ,SET CPU WAIT TIMEISP_CMD=3;//写字节模式ISP_TRIG=0x46;ISP_TRIG=0xB9;//触发启动ISP_nop_();//等待擦除ISP_CONTR=0x00;//禁止ISP/IAp操作ISP_CMD=0;ISP_TRIG=0x00;}//主程序只为测试时随意编写的,可以根据需要做相应的修改即可。

STC51单片机EEPROM的使用方法

STC51单片机EEPROM的使用方法

STC51单片机EEPROM的使用方法STC51单片机有类似flash的功能EEPROM,可以掉电保存数据,不同型号的可以保存不同大小的数据,以12C5A60S2为例,EEPROM的大小为2K,分为两个扇区,掉电保存在很多地方需要。

首先寄存器的问题,不同系列的STC单片机的与EEPROM有关的寄存器不同,比如10/11/12系列的sfr ISP_DATA = 0xC2;sfr ISP_ADDRH = 0xC3;sfr ISP_ADDRL = 0xC4;sfr ISP_CMD = 0xC5;sfr ISP_TRIG = 0xC6;sfr ISP_CONTR = 0xC7;89/90系列的sfr ISP_DATA = 0xe2;sfr ISP_ADDRH = 0xe3;sfr ISP_ADDRL = 0xe4;sfr ISP_CMD = 0xe5;sfr ISP_TRIG = 0xe6;sfr ISP_CONTR = 0xe7;注意寄存器一定要按数据手册中的配置,ISP触发命令也不相同,详情请看下方代码其次是关于扇区问题,不同型号的MCU扇区个数不尽相同,详情请查询数据手册,在这里我以12C5A60S2为例,一共2扇区,每扇区512B,地址区间为0x0000~0x03FF,使用时请勿超出范围。

EEPROM使用时有三个功能,分别为读、写、和擦除,由ISP_CMD寄存器控制,分别对应1/2/3下面为此项内容的代码部分,分别为初始化、读、擦除和写,本程序为11.0592MHz晶振,STC12C5A60S2的MCU,以下程序测试可用EEPROM.cvoid DisableEEPROM(void){ISP_CONTR = 0;//禁止ISP/IAP操作ISP_CMD = 0;//去除ISP/IAP命令ISP_TRIG = 0;//防止ISP/IAP命令误触发ISP_ADDRH = 0xff;//指向非EEPROM区,防止误操作ISP_ADDRL = 0xff;//指向非EEPROM区,防止误操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ISPEN:ISP/IAP功能允许位。

0:禁止ISP/IAP编程改变Flash,1:允许编程改变FlashSWBS:软件选择从用户主程序区启动(0),还是从ISP程序区启动(1)。

SWRST:0:不操作,1:产生软件系统复位,硬件自动清零。

ISP_CONTR中的SWBS与SWRST这两个功能位,可以实现单片机的软件启动,并启动到ISP区或用户程序区,这在“STC单片机自动下载”一节,亦有所应用。

如:ISP_CONTR=0x60; 则可以实现从用户应用程序区软件复位到ISP程序区开始运行程序。

ISP_CONTR=0x20; 则可以实现从ISP程序区软件复位到用户应用程序区开始运行程序。

(以上的建议时钟是(WT2、WT1、WT0)取不同的值时的标称时钟,用户系统中的时钟不要过高,否则可能使操作不稳定。

)以下是具体的实现代码:EEPROM操作函数:#define RdCommand 0x01#define PrgCommand 0x02#define EraseCommand 0x03#define Error 1#define Ok 0#define WaitTime 0x01#define PerSector 512unsigned char xdata Ttotal[512];/*---------------------------------------------------------------------打开 ISP,IAP 功能---------------------------------------------------------------------*/void ISP_IAP_enable(void){EA=0;/* 关中断*/ISP_CONTR|=0x18;/*0001,1000*/ISP_CONTR|=WaitTime;/*写入硬件延时*/ISP_CONTR|=0x80;/*ISPEN=1*/}/*---------------------------------------------------------------------关闭 ISP,IAP 功能---------------------------------------------------------------------*/void ISP_IAP_disable(void){ISP_CONTR&=0x7f;/* ISPEN = 0 */ISP_TRIG=0x00;EA=1;/* 开中断 */}/*----------------------------------------------------------------------公用的触发代码----------------------------------------------------------------------*/void ISPgoon(void){ISP_IAP_enable();/* 打开 ISP,IAP 功能 */ISP_TRIG=0x46;/* 触发ISP_IAP命令字节1 */ISP_TRIG=0xb9;/* 触发ISP_IAP命令字节2 */_nop_();}/*-----------------------------------------------------------------------字节读-----------------------------------------------------------------------*/unsigned char byte_read(unsigned int byte_addr){ISP_ADDRH=(unsigned char)(byte_addr>>8); /* 地址赋值*/ ISP_ADDRL=(unsigned char)(byte_addr&0x00ff);ISP_CMD&=0xf8; /* 清除低3位 */ISP_CMD|=RdCommand;/* 写入读命令*/ISPgoon();/* 触发执行*/ISP_IAP_disable();/* 关闭ISP,IAP功能*/return ISP_DATA;/* 返回读到的数据*/}/*------------------------------------------------------------------------扇区擦除------------------------------------------------------------------------*/void sectorerase(unsigned int sector_addr){unsigned int iSectorAddr;iSectorAddr=(sector_addr&0xfe00);/* 取扇区地址*/ISP_ADDRH=(unsigned char)(iSectorAddr>>8);ISP_ADDRL=0x00;ISP_CMD&=0xf8;/* 清空低3位*/ISP_CMD|=EraseCommand;/* 擦除命令3*/ISPgoon();/* 触发执行 */ISP_IAP_disable();/* 关闭ISP,IAP功能*/}/*-------------------------------------------------------------------------------------字节写-------------------------------------------------------------------------------------*/void byte_write(unsigned int byte_addr, unsigned char original_data){ISP_ADDRH=(unsigned char)(byte_addr>>8); /* 取地址*/ISP_ADDRL=(unsigned char)(byte_addr & 0x00ff);ISP_CMD&=0xf8;/* 清低3位*/ISP_CMD|=PrgCommand;/* 写命令2*/ISP_DATA=original_data;/* 写入数据准备*/ISPgoon();/* 触发执行*/ISP_IAP_disable();/* 关闭IAP功能*/}/*-----------------------------------------------------------------字节写并校验-----------------------------------------------------------------*/unsigned char byte_write_verify(unsigned int byte_addr, unsigned char original_data){ISP_ADDRH=(unsigned char)(byte_addr>>8); /* 取地址*/ISP_ADDRL=(unsigned char)(byte_addr&0xff);ISP_CMD&=0xf8;/* 清低3位*/ISP_CMD|=PrgCommand;/* 写命令2*/ISP_DATA=original_data;ISPgoon();/* 触发执行*//* 开始读,没有在此重复给地址,地址不会被自动改变*/ISP_DATA=0x00;/* 清数据传递寄存器*/ISP_CMD&=0xf8;/* 清低3位*/ISP_CMD|=RdCommand;/* 读命令1*/ISP_TRIG=0x46;/* 触发ISP_IAP命令字节1 */ISP_TRIG=0xb9;/* 触发ISP_IAP命令字节2 */_nop_();/* 延时*/ISP_IAP_disable();/* 关闭IAP功能*/if(ISP_DATA==original_data)/* 读写数据校验*/return Ok;/* 返回校验结果*/elsereturn Error;}/*--------------------------------------------------------------------------数组写入--------------------------------------------------------------------------*/unsigned char arraywrite(unsigned int begin_addr, unsigned int len, unsigned char *array){unsigned int i;unsigned int in_addr;/* 判是否是有效范围,此函数不允许跨扇区操作 */if(len > PerSector)return Error;in_addr = begin_addr & 0x01ff;/* 扇区内偏移量 */if((in_addr+len)>PerSector)return Error;in_addr = begin_addr;/* 逐个写入并校对 */ISP_IAP_enable();/* 打开IAP功能 */for(i=0;i<len;i++){/* 写一个字节 */ISP_ADDRH=(unsigned char)(in_addr >> 8);ISP_ADDRL=(unsigned char)(in_addr & 0x00ff);ISP_DATA=array; /* 取数据 */ISP_CMD&=0xf8;/* 清低3位 */ISP_CMD|=PrgCommand;/* 写命令2 */ISP_TRIG=0x46;/* 触发ISP_IAP命令字节1 */ISP_TRIG=0xb9;/* 触发ISP_IAP命令字节2 */_nop_();/* 读回来 */ISP_DATA=0x00;ISP_CMD&=0xf8;/* 清低3位*/ISP_CMD|=RdCommand;/* 读命令1*/ISP_TRIG=0x46;/* 触发ISP_IAP命令字节1 */ISP_TRIG=0xb9;/* 触发ISP_IAP命令字节2 */_nop_();/* 比较对错 */if(ISP_DATA!=array){ISP_IAP_disable();return Error;}in_addr++;/* 指向下一个字节*/}ISP_IAP_disable();return Ok;}/*----------------------------------------------------------------------------- 扇区读出----------------------------------------------------------------------------- *//* 程序对地址没有作有效性判断,请调用前事先保证他在规定范围内 */ void arrayread(unsigned int begin_addr, unsigned char len){unsigned int iSectorAddr;unsigned int i;iSectorAddr = begin_addr; // & 0xfe00; /* 取扇区地址*/ISP_IAP_enable();for(i=0;i<len;i++){ISP_ADDRH=(unsigned char)(iSectorAddr>>8);ISP_ADDRL=(unsigned char)(iSectorAddr & 0x00ff);ISP_CMD&=0xf8;/* 清低3位*/ISP_CMD|=RdCommand;/* 读命令1*/ISP_DATA=0;ISP_TRIG=0x46;/* 触发ISP_IAP命令字节1 */ISP_TRIG=0xb9;/* 触发ISP_IAP命令字节2 */_nop_();Ttotal=ISP_DATA;iSectorAddr++;}ISP_IAP_disable();/* 关闭IAP功能*/}主函数对EEPROM操作函数进行调用:#include <stc51rd.h>#include <intrins.h>#include <stc_eeprom.h>#include <ados.h>int i;void delay(unsigned int time){while(time--);}void main(){_ADOS(22.1184);//ADOS自动下载//for(i=0;i<100;i++)//{//Ttotal=i;//}//arraywrite(0x8000,100,Ttotal);/*第一次运行时向EEPROM中写入数据然后再将写入函数注释掉,将先前写入的数据读出,输出在P2口上。

相关文档
最新文档