52单片机内部EEPROM

合集下载

STC89C52内部EEPROM

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_DA T A: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_DA TA 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的出错情况,而后提供一些应对方法。

 出错情况
 1.EEPROM读写的时序可能有小小的不对。

 2.在掉电时,在电压降低到一定程度后到完全没电之间的一段时间内,在MCU与EEPROM的读写信号线上出现非控制的快速随机电平,这些电平可能会组合出一些被EEPROM认为合法的写命令,结果将EEPROM中的值修改掉;
 3.在上电的复位期间,I/O脚上电平未定,也可能随机组合出一些写命令; 4.在读EEPROM操作过程中,出现了复位(如充电复位)等,形成类似于(二)的情况;
 5.在电压降低后,可能会出现MCU跑飞了,结果运行到了写EEPROM的底层驱动程序中,强将数据写入了进去。

 解决方法
 1.按Datasheet上的时序,发现多数时候读写正确,但有时偶尔不对,这时可以降低读写的速度,多几个NOP。

 2.为防止读EEPROM的过程中出现复位,可以在MCU复位后200ms内禁止读写EEPROM,因充电引起的复位抖动,一般在数十毫秒内,过了这段时间,再出现复位的可能性不大,
 3.在写EEPROM的底层驱动程序中,在执行写动作时,判断一下某些标。

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

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

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

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

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

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

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

flash 是用来放程序的,可以称之为程序存储器,可以擦出写入但是基本都是整个扇区进行的 .一般来说单片机里的 flash 都用于存放运行代码,在运行过程中不能改; EEPROM 是用来保存用户数据,运行过程中可以改变,比如一个时钟的闹铃时间初始化设定为 12:00,后来在运行中改为 6:00,这是保存在 EEPROM 里, 不怕掉电,就算重新上电也不需要重新调整到 6:00下面是网上详细的说法,感觉不错:FLASH 和 EEPROM 的最大区别是 FLASH 按扇区操作, EEPROM 则按字节操作, 二者寻址方法不同,存储单元的结构也不同, FLASH 的电路结构较简单,同样容量占芯片面积较小,成本自然比 EEPROM 低,因而适合用作程序存储器, EEPROM 则更多的用作非易失的数据存储器。

当然用 FLASH 做数据存储器也行, 但操作比EEPROM 麻烦的多,所以更“人性化”的 MCU 设计会集成 FLASH 和 EEPROM 两种非易失性存储器,而廉价型设计往往只有 FLASH ,早期可电擦写型 MCU 则都是EEPRM 结构,现在已基本上停产了。

在芯片的内电路中, FLASH 和 EEPROM 不仅电路不同,地址空间也不同,操作方法和指令自然也不同, 不论冯诺伊曼结构还是哈佛结构都是这样。

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

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

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

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

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

在S‎T C 单片‎机中内置了‎E EPRO‎M(其实是‎采用IAP‎技术读写‎内部FLA‎S H 来‎实现EEP‎R OM),‎这样就节省‎了片外资源‎,使用起来‎也更加方便‎。

下面就详‎细介绍ST‎C单片‎机内置EE‎P ROM ‎及其使用方‎法。

‎f lash‎是用来放程‎序的,可以‎称之为程序‎存储器,可‎以擦出写入‎但是基本都‎是整个扇区‎进行的.‎一般来说‎单片机里的‎f lash‎都用于存放‎运行代码,‎在运行过程‎中不能改;‎EEP‎R OM是用‎来保存用户‎数据,运行‎过程中可以‎改变,比如‎一个时钟的‎闹铃时间初‎始化设定为‎12:00‎,后来在运‎行中改为6‎:00,这‎是保存在E‎E PROM‎里,不怕掉‎电,就算重‎新上电也不‎需要重新调‎整到6:0‎0下面‎是网上详细‎的说法,感‎觉不错:‎F LASH‎和EEP‎R OM的最‎大区别是F‎L ASH按‎扇区操作,‎E EPRO‎M则按字节‎操作,二者‎寻址方法不‎同,存储单‎元的结构也‎不同,FL‎A SH的电‎路结构较简‎单,同样容‎量占芯片面‎积较小,成‎本自然比E‎E PROM‎低,因而适‎合用作程序‎存储器,E‎E PROM‎则更多的用‎作非易失的‎数据存储器‎。

当然用F‎L ASH做‎数据存储器‎也行,但操‎作比EEP‎R OM麻烦‎的多,所以‎更“人性化‎”的MCU‎设计会集成‎F LASH‎和EEPR‎O M两种非‎易失性存储‎器,而廉价‎型设计往往‎只有 FL‎A SH,早‎期可电擦写‎型MCU则‎都是EEP‎R M结构,‎现在已基本‎上停产了。

52单片机工作原理

52单片机工作原理

52单片机工作原理52单片机是一种广泛应用于嵌入式系统中的单片机。

作为一个嵌入式系统的核心部件,单片机可以通过它的工作原理实现各种操作和功能。

下面我们将围绕“52单片机工作原理”进行阐述。

1. 简介52单片机是一款基于哈佛结构的单片机,其芯片内部集成了CPU、存储器、IO口、定时器、串口等功能单元。

在程序存储方式上,52单片机采用的是EPROM或者FLASH存储器,同时还提供存储保护功能。

加上其强大的功能、易于编程和广泛的应用,使得52单片机成为目前最受欢迎的单片机之一。

2. CPU52单片机内部的CPU采用的是8051指令集,包括了51条指令,同时还支持扩展指令。

CPU的时钟频率可以通过内部主频发生器和分频器进行调整。

其基本操作流程如下:1)取指令:CPU从存储器中取出指令并存储到指令寄存器中。

2)执行指令:CPU根据指令进行相应的操作,例如读取数据、计算等。

3)更新程序计数器:CPU根据指令长度对程序计数器进行相应的更新,以便指向下一条指令地址。

3. 存储器52单片机内部包括ROM和RAM两种存储器。

其中,ROM用来存储程序代码,RAM用来存储变量和中间结果。

ROM的大小可以根据需求进行选择,而RAM的大小则是由芯片生产厂家固定的。

在使用时,程序指令需要从ROM中读取,而变量则需要在RAM中进行存储,两者之间需要进行相应的数据传送。

4. IO口52单片机的IO口是用来进行输入输出的,其中包括8个口线和一个口线复用器。

该复用器可以将多个IO口线进行复用,从而扩展了单片机的IO口数量。

IO口可以进行数字信号的输入和输出操作,同时还可以进行模拟信号的输出。

5. 定时器52单片机内部包括两个定时器,分别是Timer0和Timer1。

这些定时器可以产生不同的中断信号,并可以在指定的时间后自动重新启动。

定时器的使用可以带来一系列的功能,例如定时器中断、音频播放、PWM控制等。

6. 串口52单片机内部还集成了两个串口,分别是UART0和UART1。

stc8952EEprom

stc8952EEprom
ISP_DATA=original_data?/* 写入数据准备*/
ISPgoon()?/* 触发执行*/
ISP_IAP_disable()?/* 关闭IAP 功能*/
}
/*
字节写并校验
*/
unsigned char byte_write_verify(unsigned int byte_addr, unsigned char
SWRST:0:不操作,1:产生软件系统复位,硬件自动清零。
ISP_CONTR 中的SWBS 与SWRST 这两个功能位,可以实现单片机的软件启动,并
启动到ISP 区或用户程序区,这在“STC 单片机自动下载”一节,亦有所应用。
如:
ISP_CONTR=0x60? 则可以实现从用户应用程序区软件复位到ISP 程序区开始运行
ISP_CMD 0xE5 ISP/IAP闪存命令寄存器MS2
MS1 MS0 xxxxx000
ISP_TRIG 0xE6 ISP/IAP 闪存命令触发xxxxxxxx
ISP_CONTR 0xE7 ISP/IAP 控制寄存器ISPEN SWBS SWRST WT2
WT1 WT0 00xx000
ISP_CMD: ISP/IAP 操作时的命令模式寄存器,须命令触发寄存器触发方可生效。
ISP_TRIG:ISP/IAP 操作时的命令触发寄存器。
当ISPEN(ISP_CONTR.7)=1 时,对ISP_TRIG 先写入0x46,再写入0xb9,ISP/IAP
命令才会生效。
单片机芯片型号起始地址内置EEPROM 容量(每扇区512 字节)
程序。
ISP_CONTR=0x20? 则可以实现从ISP 程序区软件复位到用户应用程序区开始运行

STC89C52单片机内部EEPROM保存数据的应用例子程序

STC89C52单片机内部EEPROM保存数据的应用例子程序

STC89C52单片机内部EEPROM保存数据的应用例子程序STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。

知识点:ISP与IAP介绍ISP:In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。

比如我们通过电脑给STC单片机下载程序,或给AT89S51单片机下载程序,这就是利用了ISP技术。

IAP:In Application Programable 是指在应用编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候可以提供一种改变flash数据的方法。

通俗点讲,也就是说程序自己可以往程序存储器里写数据或修改程序。

这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就是通过IAP技术来实现的,即片子在出厂前就已经有一段小的boot程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。

大家要注意千万不要尝试去擦除这段ISP引导程序,否则恐怕以后再也下载不了程序了。

STC单片机内部有几个专门的特殊功能寄存器负责管理ISP/IAP功能的,见表1。

每个扇区为512字节,建议大家在写程序时,将同一次修改的数据放在同一个扇区,方便修改,因为在执行擦除命令时,一次最少要擦除一个扇区的数据,每次在更新数据前都必须要擦除原数据方可重新写入新数据,不能直接在原来数据基础上更新内容。

下面通过一个例子来讲解STC系列单片机EEPROM的具体用法。

【例】:在TX-1C实验板上实现如下描述,操作STC单片机自带的EEPROM,存储一组按秒递增的二位数据,并且将数据实时显示在数码管上,数据每变化一次就往EEPROM中写入一次,当关闭实验板电源,再次开启电源时,从EEPROM中读取先前存储的数据,接着递增显示。

熟悉stc89c5152rc的EEPROM操

熟悉stc89c5152rc的EEPROM操
自己写的代码,按键部分有问题,请大家帮忙看一下
这个代码脱离按键部分时,EEPROM的操作是对的,就是在主程序中对EEPROM操作有效,按键部分好像不能控制EEPROM的读擦写。
表现为:按键确认部分是正确的,但是按键按下以后好像一直处于按下状态,不能走后面的程序了。
代码是用T0一秒定时代替按键的防抖。
自己想不出问题出在什么地方了,请大家帮忙给看一下啊。
复制内容到剪贴板代码:
//====================================================================
//目的:熟悉stc89c51/52rc的EEPROM操作
//
//版本日期:09-03-04
sfr ISP_ADDRL = 0xE4; //定义EEPROM地址寄存器的低8位
sfr ISP_CMD = 0xE5; //定义ISP的命令寄存器地址
sfr ISP_TRIG = 0xE6; //定义ISP命令触发寄存器地址
sfr ISP_CONTR = 0xE7; //定义ISP控制寄存器地址
{
uchar Addrh,Addrl;
ISP_CONTR = ENABLE_ISP;
ISP_CMD = ISP_BYTE_PROGRAM;
Addrh = Address >> 8;
Addrl = Address & 0x00ff;
ISP_ADDRH = Addrh;
void IspErase(uint Address)
{
uchar Addrh,Addrl;
ISP_CONTR = ENABLE_ISP;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit en=P2^7;
sbit rs=P2^6;
sbit rw=P2^5;
void delay(unsigned char z)
{
unsigned char j,i;
for (i=0;i<z;i++)
for (j=0;j<110;j++)
;
}
/******************定义命令字节******************/
#define Read_COM 0x01 //字节读数据命令
#define Prog_COM 0x02 //字节编程数据命令
#define Erase_COM 0x03 //扇区擦除数据命令
#define En_Wait_TIME 0x81 //设置等待时间,并使能ISP/IAP
#define Start_ADDRH 0x20 //扇区地址高位
#define Start_ADDRL 0x00 //扇区地址低位
/****************特殊功能寄存器声明****************/
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&IAP功能*****************/
void ISP_IAP_disable(void)
{
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
}
/*********************字节读**********************/
uchar Byte_read(uint byte_addr)
{
EA = 0; //关中断
ISP_CONTR = En_Wait_TIME; //开启ISP&IAP,并送等待时间ISP_CMD = Read_COM; //送字节读命令字
ISP_ADDRH = (uchar)(byte_addr >> 8); //送地址高字节
ISP_ADDRL = (uchar)(byte_addr & 0x00ff); //送地址低字节
ISP_TRIG = 0x46; //送触发命令字0x46
ISP_TRIG = 0xB9; //送触发命令字0xB9
_nop_();
ISP_IAP_disable(); //关闭ISP&IAP功能
EA = 1; //开中断
return (ISP_DA TA);
}
/*********************字节编程*********************/
void Byte_program(uint byte_addr,uchar isp_iap_data)
{
EA = 0; //关中断
ISP_CONTR = En_Wait_TIME; //开启ISP&IAP,并送等待时间ISP_CMD = Prog_COM; //送字节编程命令字
ISP_ADDRH = (uchar)(byte_addr >> 8); //送地址高字节
ISP_ADDRL = (uchar)(byte_addr & 0x00ff); //送地址低字节
ISP_DATA = isp_iap_data; //送数据进ISP_DATA
ISP_TRIG = 0x46; //送触发命令字0x46
ISP_TRIG = 0xB9; //送触发命令字0xB9
_nop_();
ISP_IAP_disable(); //关闭ISP&IAP功能
EA = 1; //开中断
}
/*********************扇区擦除*********************/
void Sector_erase(uint sector_addr)
{
EA = 0; //关中断
ISP_CONTR = En_Wait_TIME; //开启ISP&IAP;并送等待时间ISP_CMD = Erase_COM; //送扇区擦除命令字
ISP_ADDRH = (uchar)(sector_addr >> 8); //送地址高字节
ISP_ADDRL = (uchar)(sector_addr & 0X00FF); //送地址低字节
ISP_TRIG = 0X46; //送触发命令字0x46
ISP_TRIG = 0XB9; //送触发命令字0xB9
_nop_();
ISP_IAP_disable(); //关闭ISP&IAP功能
EA = 1;
}
void main()
{
Sector_erase(0x2000); //扇区擦除
Byte_program(0x2000,0x88); //写EEPROM
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P0=Byte_read(0x2000); //读EEPROM while(1);
}。

相关文档
最新文档