单片机掉电数据保存共5页

合集下载

单片机程序存储空间和数据存储空间详解

单片机程序存储空间和数据存储空间详解

创作编号:GB8878185555334563BT9125XW创作者:凤呜大王*单片机程序程序存储空间(ROM)和数据存储空间(RAM)详解问题:STC89C52RC单片机:8K字节程序存储空间,512字节数据存储空间,内带2K 字节EEPROM存储空间;它们分别存的是什么?8K的程序存储空间是存储代码,也就是你写的程序生成的HEX文件的,相当于电脑系统的C盘。

512字节相当于内存,存储空间存储变量,像u8 x,y,z,u32 a之类的临时变量掉电后数据丢失。

2K eeprom相当于电脑系统的硬盘,数据写入后掉电不丢失。

主要是单片机在运行的过程中写入数据或者读取数据。

像设置的闹铃值,设置好了就不用每次都去设置了,保存在单片机里面,即使掉电了,设置的数据也不会丢失,只需单片机上电再读取就好了。

单片机原理及系统结构在此先详细分析51单片的存储器结构和寻址方法,再分析片外存储器的扩展,最后给出设计原理并分析系统结构。

图一:存储空间分布51单片机存储器结构分析8051单片机的存储器在物理结构上分为程序存储器空间和数据存储器空间,共有4个存储空间:片内程序存储器、片外程序存储器以及片内数据存储器、片外数据存储器空间。

这种程序存储和数据存储分开的结构形式被称为哈佛结构。

MCS-51使用哈弗结构,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。

所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某地址。

而ARM (甚至是x86)这种冯诺依曼结构的MCU/CPU,它的地址空间是统一并且连续的,代码存储器/RAM/CPU寄存器,甚至PC机的显存,都是统一编址的,只是不同功能的存储器占据不同的地址块,各自为政。

MCS-51单片机存储器的配置特点①内部集成了4K的程序存储器ROM;②内部具有256B的数据存储器RAM(用户空间+SFR空间);③可以外接64K的程序存储器ROM和数据存储器RAM。

单片机掉电保护)总结

单片机掉电保护)总结

单片机应用系统断电时的数据保护方法在测量、控制等领域的应用中,常要求单片机内部和外部RAM中的数据在电源掉电时不丢失,重新加电时,RAM中的数据能够保存完好,这就要求对单片机系统加接掉电保护电路。

掉电保护通常可采用以下三种方法:一是加接不间断电源,让整个系统在掉电时继续工作,二是采用备份电源,掉电后保护系统中全部或部分数据存储单元的内容;三是采用EEPROM来保存数据。

由于第一种方法体积大、成本高,对单片机系统来说,不宜采用。

第二种方法是根据实际需要,掉电时保存一些必要的数据,使系统在电源恢复后,能够继续执行程序,因而经济实用,故大量采用[1]。

EEPROM既具有ROM掉电不丢失数据的特点,又有RAM随机读写的特点。

但由于其读写速度与读写次数的限制,使得EEPROM不能完全代替RAM。

下面将介绍最常用的一些掉电保护的处理方法,希望能对相关设计人员在实际工作中有所帮助。

1 简单的RAM数据掉电保护电路在具有掉电保护功能的单片机系统中,一般采用CMOS单片机和CMOS RAM。

CMOS型RAM存储器静态电源小,在正常工作状态下一般由电源向片外RAM供电,而在断电状态下由小型蓄电池向片外RAM供电,以保存有用数据,采用这种方法保存数据,时间一般在3-5个月[2]。

然而,系统在上电及断电过程中,总线状态的不确定性往往导致RAM内某些数据的变化,即数据受到冲失。

因此对于断电保护数据用的RAM存储器,除了配置供电切换电路外,还要采取数据防冲失措施,当电源突然断电时,电压下降有个过程,CPU在此过程中会失控,可能会误发出写信而冲失RAM中的数据,仅有电池是不能有效完成数据保护的,还需要对片选信号加以控制,保证整个切换过程中CS引脚的信号一直保持接近VCC。

通常,采用在RAM的CS和VCC引脚之间接一个电阻来实现COMS RAM的电源切换,然而,如果在掉电时,译码器的输出出现低电平,就可能出现问题,图1给出一种简单的电路设计,它能够避免上述问题的产生。

单片机系统中的掉电检测与数据存储问题

单片机系统中的掉电检测与数据存储问题

5)理论Байду номын сангаас算
(1)按恒流充放电的简化计算:Q = CV = IT.Q是电量,C是电容量,V是电压,I是电流,T是时间
那么T=CV/I,在本例中可以估算时间为 T= 0.0033f*(5.0V-3.8V) / 0.012A = 0.33s,即330ms.
330/8.5 = 38.8mS,即最多可以保存38字节数据到EEPROM中,38字节对于本应用已经足够。
1)总体思路
由于电能表的计量是要求持续性的,而主供电系统不可能是持续的,注意这里需要一个掉电检测与数据存储的问题。首先检测出供电系统已经断电,然后启用备用电源存储数据,而且数据必须存储在掉电不易失的存储器(如EEPROM,FLASH等)中。
本应用中,需要检测出掉电后备用电源能提供足够的电能供单片机进行数据存储。总体思路,本应用中单片机采用的是STC89C58RD+,单片机内部已经集成了16K的EEPROM,所以不需要另外外接存储器。ADE7755已经自带了电源监控功能,前面的ADE7755的介绍中已经有所描述,所以亦无须担心。这里只需要解决好单片机的掉电问题即可。在系统的稳压前端设置监测点,当监测点的电压下降到另一个基准比较电压时产生单片机外部中断。当单片机接收到外部中断后启动数据存储程序,将数据存储到片内EEPROM内。当主供电系统恢复供电后,单片机首先读取EEPROM数据,然后再恢复计数。
3)备用电源
虽然备用电源可以采用可充电电池,大电容等方案,但由于这里所需要的电量并不是很大,持续时间也不需要很长,只需要能完成数据存储即可。所以这里选择了大电容作为备用电源这一方案。选择了在稳压后端与单片机电源端直接并联了两个达3300uF的大容量电解电容。同时,为安全起见,在单片机的电源输入端还串入了一个低正向压降压降的二极管来阻止大电容向除单片机意外的其他电路放电。

掉电保存方案

掉电保存方案

掉电保存方案
掉电保存方案主要通过在系统中加入掉电检测电路和掉电数据保存功能来实现。

下面是一种常见的单片机掉电检测电路和掉电数据保存方案:
单片机掉电检测电路通常由法拉电容实现。

法拉电容具有大容量、高储能的特性,能够储存足够多的电能。

在电源断电的情况下,法拉电容可以通过电荷泵电路等将电力输送给单片机,使其保持工作状态,并将数据保存在存储器中。

当电源恢复供电时,单片机将继续执行任务,并且可以从存储器中恢复掉电前保存的数据。

掉电数据保存方案通常采用数据备份和恢复机制。

在系统运行过程中,单片机可以定期将重要的数据备份到非易失性存储器中,如EEPROM、Flash等。

当电源断电时,单片机可以立即将剩余的数据写入存储器中,确保数据不会丢失。

当电源恢复供电时,单片机可以从存储器中恢复数据,确保数据的完整性。

另外,为了避免电源断电时对单片机的干扰,可以采用低功耗技术来降低单片机的工作电流,使其在断电时能够快速进入休眠状态。

同时,可以在单片机外部添加去抖动电路、滤波电路等抗干扰措施,以确保数据的准确性。

总的来说,掉电保存方案需要在硬件和软件方面进行全面设计和实现。

硬件方面需要选择合适的法拉电容、非易失性存储器等器件,软件方面需要编写相应的掉电检测和数据备份程序,以确保系统在掉电时能够正确地保存数据并恢复工作状态。

在掉电瞬间将数据存入EEPROM的方法

在掉电瞬间将数据存入EEPROM的方法

∙在掉电瞬间将数据存入E2PROM的方法∙作者:广西-陈瑜峰发布时间:2009-11-18 阅读次数:280 字体大小: 【小】【中】【大】在单片机的应用中,一些需要高速处理且掉电后需要保存的数据多放在单片机片内RAM中,采用备用电池保存RAM中的数据。

备用电池使用期限有限,存储的数据易受干扰,可靠性低。

将数据存在E2PROM中可靠性较高。

如果数据量较小(10个字节以内),则可采用在掉电瞬间靠电容储能将需要保存的数据存入E2PROM的方法。

在单片机系统中,常用X25045来存储数据。

89C2051和X25045的耗电量都比较低,当稳压电源的滤波电容在3000μF以上时,一检测到掉电立即关掉耗电量较大的输出,则电容的储能可以保证单片机在系统掉电后继续工作40ms以上。

X25045的存储时间为2ms/字节,50Hz交流电压掉电可在20ms内检测到,因此可以将10个字节的数据存入X25045。

这样,在单片机的正常运行期间数据存储在内部RAM中,存取速度快,掉电后数据存入E2PROM中,数据保存的可靠性高,系统电路简单、成本低。

1.硬件电路及原理由于电容的储能只能保证单片机在掉电后40ms内正常工作,掉电检测电路必须在尽可能短的时间内准确地检测到掉电。

将50Hz的交流电压转换为50Hz占空比约为50%的脉冲信号,单片机检测50Hz脉冲,如果脉冲停止则判断为掉电,立即转入掉电处理程序。

硬件电路如图1所示。

220V交流电经过变压器TI,输出9V交流电,通过1kΩ电阻R2接到光耦D1的输入端。

当交流电正半周A、B两点间的电压大于光耦的导通电压时,光耦导通,经过74LS14整形反相后输出一个高电平到单片机;当A、B两点间的电压小于光耦的导通电压时,74LS14输出一个低电平到单片机,输入到单片机的是一个占空比略小于50%的脉冲信号,高电平的脉冲宽度在5~10ms之间。

将扫描周期定为5ms,可以保证用最短的时间准确地检测到掉电(如图2所示)。

单片机掉电检测电路与单片机掉电数据保存

单片机掉电检测电路与单片机掉电数据保存

单片机掉电检测电路与单片机掉电数据保存
摘要: 单片机在正常工作时,因某种原因造成突然掉电,将会丢失数据存储器(RAM)里的数据。

在某些应用场合如测量、控制等领域,单片机正常工作中采集和运算出一些重要数据,待下次上电后需要恢复这些重要数据。

因此,在一些没有后备供电系统的单片机应用系统中,有必要在系统完全断电之前,把这些采集到的或计算出的重要数据存在在EEPROM 中。

为此,...
单片机在正常工作时,因某种原因造成突然掉电,将会丢失数据存储器(RAM)里的数据。

在某些应用场合如测量、控制等领域,单片机正常工作中采集和运算出一些重要数据,待下次上电后需要恢复这些重要数据。

因此,在一些没有后备供电系统的单片机应用系统中,有必要在系统完全断电之前,把这些采集到的或计算出的重要数据存在在EEPROM 中。

为此,通常做法是在这些系统中加入单片机掉电检测电路与单片机掉电数据保存。

用法拉电容可从容实现单片机掉电检测与数据掉电保存。

电路见下图。

这里首先用6V 供电(如7806),为什幺用6V 不用5V 是显而易见的.电路中的二极管们一般都起两个作用,一是起钳位作用,钳去0.6V,保证使大多数51 系列的单片机都能在4.5V--5.5V 之间的标称工作电压下工作.而4.5-5.5 间这1V 电压在0.47F 电容的电荷流失时间就是我们将来在单片机掉电检测报警后我们可以规划的预警回旋时间。

二是利用单向导电性保证向储能电容0.47F/5.5V 单向冲电。

两只47 欧电阻作用:第一,对单片机供电限流。

一般地单片机电源直接接。

单片机掉电保护总结完整版

单片机掉电保护总结完整版

单片机掉电保护总结Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】单片机应用系统断电时的数据保护方法在测量、控制等领域的应用中,常要求单片机内部和外部RAM中的数据在电源掉电时不丢失,重新加电时,RAM中的数据能够保存完好,这就要求对单片机系统加接掉电保护电路。

掉电保护通常可采用以下三种方法:一是加接不间断电源,让整个系统在掉电时继续工作,二是采用备份电源,掉电后保护系统中全部或部分数据存储单元的内容;三是采用EEPROM来保存数据。

由于第一种方法体积大、成本高,对单片机系统来说,不宜采用。

第二种方法是根据实际需要,掉电时保存一些必要的数据,使系统在电源恢复后,能够继续执行程序,因而经济实用,故大量采用[1]。

EEPROM既具有ROM掉电不丢失数据的特点,又有RAM随机读写的特点。

但由于其读写速度与读写次数的限制,使得EEPROM 不能完全代替RAM。

下面将介绍最常用的一些掉电保护的处理方法,希望能对相关设计人员在实际工作中有所帮助。

1简单的RAM数据掉电保护电路在具有掉电保护功能的单片机系统中,一般采用CMOS单片机和CMOSRAM。

CMOS 型RAM存储器静态电源小,在正常工作状态下一般由电源向片外RAM供电,而在断电状态下由小型蓄电池向片外RAM供电,以保存有用数据,采用这种方法保存数据,时间一般在3-5个月[2]。

然而,系统在上电及断电过程中,总线状态的不确定性往往导致RAM内某些数据的变化,即数据受到冲失。

因此对于断电保护数据用的RAM存储器,除了配置供电切换电路外,还要采取数据防冲失措施,当电源突然断电时,电压下降有个过程,CPU在此过程中会失控,可能会误发出写信而冲失RAM中的数据,仅有电池是不能有效完成数据保护的,还需要对片选信号加以控制,保证整个切换过程中CS引脚的信号一直保持接近VCC。

通常,采用在RAM的CS和VCC引脚之间接一个电阻来实现COMSRAM的电源切换,然而,如果在掉电时,译码器的输出出现低电平,就可能出现问题,图1给出一种简单的电路设计,它能够避免上述问题的产生。

AVR单片机掉电数据保护应用实例

AVR单片机掉电数据保护应用实例

片 机 电容 的 电压 恰好 处于 复 位 电压 以上 和 正 常 工作 电压 以
电路 中 参 数 可 以保 证 截 止 时 间超 过 1 ms,在 此 时 间 之 内 0
下 , 会 出现上 面的 现象 。这是本 人在 实际 应用 当中所 遇到 的 CP 已经进 入 正 常工作 状 态 ,在 程 序 中将 OU 就 U T端 置 “ I 1I 电
_
慢 放 电, 提供 单 片机 向 e po 存储 数据 所需 要 的时间 。所选 独 给单 片机供 电 , 片 机耗 电通 常小 于 5毫 安 , e rm 单 由于 使用 C 4 的电容 小 , 提供 的 时间 短 , 存储 数 据 不可 靠 , 选 电容 大提 供 ( 2 0If 电容 , 路 电源 的放 电时 间较长 。 另外 一路 电源经 所 20 J ) 该 时 间长 , 存储 数据 可 靠。 但是 随 之而来 的 问题是 , 电后 电容 过 d 掉 2送 到 电路 负载 中 ( c = .V) V c 53 ,通 常此路 电源 的 电流 较 放 电过程 中 , 片机 的供 电电压在 缓 慢下 降 , 单 当下将 到某 个值 大 , 过 几 十 毫 安 。 超 但还 没有 降到 复位 门 限 电压 之前 , 果此 时再 次开机 , 如 则单 片 这样 ,在 断 电后 , c V c由于 放 电 电流大 而且 滤 波 电容 小 ,
机不 能正 常启动 , 导致单 片机 重复 上 电后工作 混乱 。下面具 体 很 快放 电 , 常在 几毫秒 以 内。而 另 外一 路 c u v 由于滤 波 通 p_ , 分析 这一过 程并 给 出解 决 的办 法。 电容 大 而且 放 电电流 小 ,所 以放 电很慢 ,> 2 0If 0 6X t2 0 J 1 — X

单片机的空闲模式与掉电模式

单片机的空闲模式与掉电模式

单片机的空闲模式与掉电模式首先,我们来介绍一下单片机的空闲模式。

空闲模式是指单片机在没有接收到外部处理请求时停止运行主程序,转入一种低功耗模式。

在空闲模式中,单片机可以关闭一些不必要的模块、外设和时钟源,以达到最低功耗状态。

同时,虽然主程序停止运行,但空闲模式下,单片机仍能继续监测并执行中断服务程序,以确保在有需要时能立即响应外部处理请求。

空闲模式可以有效降低功耗,延长电池寿命,减少能源消耗。

接下来,我们来介绍一下单片机的掉电模式。

掉电模式是指单片机完全关闭或部分关闭,并停止运行主程序和中断服务程序。

在掉电模式下,单片机的工作状态处于最低功耗状态,只保持最基本的功能,以极低的功耗维持芯片的存储数据等必要功能。

单片机的掉电模式分为多个级别,不同级别的掉电模式将关闭不同的模块和外设,实现不同程度的功耗降低。

通过选择合适的掉电模式,可以在保证基本功能的同时,实现最小功耗的芯片工作状态。

在单片机的掉电模式中,可以通过外部中断、看门狗定时器或RTC(实时时钟)来唤醒单片机,以便在有需求时重新启动芯片,恢复正常工作。

这样既保证了低功耗,又能满足外部处理请求的及时响应。

掉电模式与空闲模式相比,功耗更低,但需要更长的启动时间。

因此,在实际应用中,需要根据实际需求和性能要求选择合适的模式。

总结起来,单片机的空闲模式与掉电模式都是为了实现节能和低功耗设计的。

空闲模式通过停止主程序的运行,关闭不必要的模块和外设,降低功耗,延长电池寿命。

掉电模式进一步降低功耗,通过部分或完全关闭芯片,只保持基本存储数据和最低功耗功能,实现极低功耗状态。

这两种模式都可以通过外部触发唤醒信号来重新启动芯片,以满足外部处理请求的需求。

在实际应用中,根据需求和性能要求选择合适的模式,以实现最佳的节能效果。

单片机程序存储空间和数据存储空间详解

单片机程序存储空间和数据存储空间详解

单片机程序程序存储空间(ROM)和数据存储空间(RAM)详解问题:STC89C52RC单片机:8K字节程序存储空间,512字节数据存储空间,内带2K字节EEPROM存储空间;它们分别存的是什么?8K的程序存储空间是存储代码,也就是你写的程序生成的HEX文件的,相当于电脑系统的C盘。

512字节相当于内存,存储空间存储变量,像u8 x,y,z,u32 a之类的临时变量掉电后数据丢失。

2K eeprom相当于电脑系统的硬盘,数据写入后掉电不丢失。

主要是单片机在运行的过程中写入数据或者读取数据。

像设置的闹铃值,设置好了就不用每次都去设置了,保存在单片机里面,即使掉电了,设置的数据也不会丢失,只需单片机上电再读取就好了。

单片机原理及系统结构在此先详细分析51单片的存储器结构和寻址方法,再分析片外存储器的扩展,最后给出设计原理并分析系统结构。

图一:存储空间分布51单片机存储器结构分析8051单片机的存储器在物理结构上分为程序存储器空间和数据存储器空间,共有4个存储空间:片内程序存储器、片外程序存储器以及片内数据存储器、片外数据存储器空间。

这种程序存储和数据存储分开的结构形式被称为哈佛结构。

MCS-51使用哈弗结构,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。

所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某地址。

而ARM(甚至是x86)这种冯诺依曼结构的MCU/CPU,它的地址空间是统一并且连续的,代码存储器/RAM/CPU寄存器,甚至PC机的显存,都是统一编址的,只是不同功能的存储器占据不同的地址块,各自为政。

MCS-51单片机存储器的配置特点①内部集成了4K的程序存储器ROM;②内部具有256B的数据存储器RAM(用户空间+SFR空间);③可以外接64K的程序存储器ROM和数据存储器RAM。

从物理结构的角度讲,51单片机的存储系统可以分为四个存储空间:既片内ROM,RAM和片外ROM、RAM。

单片机存储用户方法

单片机存储用户方法

单片机存储用户方法
以下是一些常见的方法:
1. 内部存储器:大多数单片机都内置了一定容量的存储器,如RAM(随机存取存储器)和EEPROM(电可擦除可编程只读存储器)。

你可以使用这些内部存储器来存储用户数据。

- RAM:用于临时存储数据,掉电后数据会丢失。

适用于存储临时变量、运算结果等。

- EEPROM:可用于长期存储用户数据,即使掉电数据也不会丢失。

但写入次数有限,通常在几千次到十万次之间。

2. 外部存储器:如果需要存储大量用户数据或需要更长久的数据保存,可以考虑使用外部存储器,如Flash 存储器、EEPROM 芯片或SD 卡等。

- Flash 存储器:具有较大的存储容量,可擦写次数较多(通常在数万次到百万次之间),适合长期存储用户数据。

- EEPROM 芯片:与单片机内部的EEPROM 类似,但提供更大的存储容量。

- SD 卡:提供较大的存储容量,并且易于插拔和数据传输。

3. 文件系统:对于更复杂的应用,可以考虑在单片机上使用文件系统来组织和管理用户数据。

文件系统可以提供文件和文件夹的概念,方便数据的存储、读取和删除。

关于断电延时和EEPROM数据保存STC掉电保存数据程序

关于断电延时和EEPROM数据保存STC掉电保存数据程序

关于断电延时和EEPROM数据保存(申酷!!)EEPROM, 申酷, 数据, 延时, 断电原来想用AD检测断电的,做出来测试几遍不行,听了各位的意见。

就花了一个下午完成用一个I/O断电检测电路。

把法拉电容改小了,节约开支,一个2200uf的普通电容就足够了。

经测试能正常保存数据到EEPROM。

电路见下面的图片链接。

该解决方案的程序:#include <stc12c2052ad.H>#include <intrins.h> //汇编头文件#define uchar unsigned char#define uint unsigned intsbit p12 = P1^2;uchar i;void delay(uint z) //延时ms{uint x,y;for(x=112;x>0;x--)for(y=z;y>0;y--);}void init_232(void) //串口初始化{SCON = 0x50;TMOD |= 0x20;TH1 = 0xfa; //波特率 9600TL1 = 0xfa;PCON |= 0x80;EA = 1;ES = 1;TR1 = 1;}void send_char(uchar w) //串口发送一个字符{SBUF = w;while(TI == 0);TI = 0;}void send_string(uchar *s,uint string_length) //串口发送一个字符串{uint i = 0;do{send_char(*(s + i));i++;}while(i < string_length);}/*EEPROM字符读取*/uchar eeprom_read(uchar x,y){ISP_ADDRH = x;ISP_ADDRL = y;ISP_CONTR = 0x9b;ISP_CMD = 0x01;ISP_TRIG = 0x46;ISP_TRIG = 0xb9;_nop_();ISP_CONTR=0;ISP_CMD=0;ISP_TRIG=0;return(ISP_DATA);}/*EEPROM字符写入*/void eeprom_write(uchar x,y,z){ISP_DATA = z;ISP_ADDRH = x;ISP_ADDRL = y;ISP_CONTR = 0x9b;ISP_CMD = 0x02;ISP_TRIG = 0x46;ISP_TRIG = 0xb9;_nop_();ISP_CONTR=0;ISP_CMD=0;ISP_TRIG=0;/*EEPROM扇区擦除*/void eeprom_erase(uchar x,y){ISP_ADDRH = x;ISP_ADDRL = y;ISP_CONTR = 0x9b;ISP_CMD = 0x03;ISP_TRIG = 0x46;ISP_TRIG = 0xb9;_nop_();ISP_CONTR=0;ISP_CMD=0;ISP_TRIG=0;}void main(){init_232();i = 0;delay(10);while(1){if((p12 == 0) && (i == 0)){eeprom_erase(0x10,0x00); //擦除第一扇区delay(1);eeprom_write(0x10,0x00,0x88); //在第一扇区写入88 delay(1);i = 1;}}}/*串口接收中断函数*/void RS232() interrupt 4uchar ch = 0;if(RI){ch = SBUF;RI = 0;send_char(ch);}switch(ch){case 1: send_char(eeprom_read(0x10,0x00)); //串口助手输入16进制1,读EEPROM第一扇区break;case 2: send_char(eeprom_read(0x12,0x00)); //串口助手输入16进制2,读EEPROM第2扇区break;case 3: eeprom_write(0x10,0x00,0x55); //串口助手输入16进制3,写EEPROM第一扇区55break;case 4: eeprom_write(0x12,0x00,0x66); //串口助手输入16进制4,写EEPROM第2扇区66break;case 5: eeprom_erase(0x10,0x00); //串口助手输入16进制5,擦除EEPROM第一扇区break;case 6: eeprom_erase(0x12,0x00); //串口助手输入16进制6,擦除EEPROM第2扇区break;default: break;}}这是一段stc单片机EEPROM掉电存储程序,麻烦大家帮我看看哈,怎么调用时输出有问题啊,希望给个调用的例子悬赏分:0 - 提问时间2010-8-21 19:32#include < reg52.h >#include < absacc.h >#include < intrins.h >#include " ..\h_files\eeprom.h "/**************************************************************************************************/ void isp_iap_enable ( void ){EA = 0 ; /*关中断*/ISP_CONTR = ISP_CONTR & 0x18 ;ISP_CONTR = ISP_CONTR | WAIT_TIME ;ISP_CONTR = ISP_CONTR | 0x80 ; /*ISPEN = 1*/}/**************************************************************************************************/ void isp_iap_disable ( void ){ISP_CONTR = ISP_CONTR & 0x7f ; /*ISPEN = 0*/ISP_TRIG = 0x00 ;EA = 1 ; /*开中断*/}/**************************************************************************************************/ void isp_iap_goon ( void ){isp_iap_enable ( ) ; /*打开ISP,IAP功能*/ISP_TRIG = 0x46 ; /*触发ISP,IAP命令字节1*/ISP_TRIG = 0xb9 ; /*触发ISP,IAP命令字节2*/_nop_ ( ) ;}/**************************************************************************************************/ UINT8 byte_read ( UINT16 byte_addr ){ISP_ADDRH = ( UINT8 ) ( byte_addr >> 8 ) ; /*地址赋值*/ISP_ADDRL = ( UINT8 ) ( byte_addr & 0x00ff ) ;ISP_COMD = ISP_COMD & 0xf8 ; /*清除低3位*/ISP_COMD = ISP_COMD | RE_COMMAND ; /*写入读命令*/isp_iap_goon ( ) ; /*触发执行*/isp_iap_disable ( ) ; /*关闭ISP,IAP功能*/return ( ISP_DATA ) ; /*返回读到的数据*/}/**************************************************************************************************/ void sector_erase ( UINT16 sector_addr ){UINT16 i_sector_addr ;i_sector_addr = ( sector_addr & 0xfe00 ) ; /*取扇区地址*/ISP_ADDRH = ( UINT8 ) ( i_sector_addr >> 8 ) ;ISP_ADDRL = 0x00 ;ISP_COMD = ISP_COMD & 0xf8 ; /*清空低3位*/ISP_COMD = ISP_COMD | ER_COMMAND ; /*擦除命令3*/isp_iap_goon ( ) ; /*触发执行*/isp_iap_disable ( ) ; /*关闭ISP,IAP功能*/}/**************************************************************************************************/ void byte_write ( UINT16 byte_addr , UINT8 original_data ){ISP_ADDRH = ( UINT8 ) ( byte_addr >> 8 ) ; /*取地址*/ISP_ADDRL = ( UINT8 ) ( byte_addr & 0x00ff ) ;ISP_COMD = ISP_COMD & 0xf8 ; /*清空低3位*/ISP_COMD = ISP_COMD | PR_COMMAND ; /*写命令2*/ISP_DATA = original_data ; /*写入数据准备*/isp_iap_goon ( ) ; /*触发执行*/isp_iap_disable ( ) ; /*关闭ISP,IAP功能*/}提问者:smu_east - 一级网友推荐答案/**************************************************************************************************** ********************************/#include <reg52.h>#include <stdio.h>#include <string.h>#include <intrins.h>/**************************************************************************************************** ********************************/#define Uchar unsigned char#define Uint unsigned int#define Ulong unsigned long//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值/**************************************************************************************************** ********************************/sfr IAP_DATA = 0xE2;sfr IAP_ADDRH = 0xE3;sfr IAP_ADDRL = 0xE4;sfr IAP_CMD = 0xE5;sfr IAP_TRIG = 0xE6;sfr IAP_CONTR = 0xE7;/**************************************************************************************************** ********************************///全局变量及共用体变量/**************************************************************************************************** ********************************/Uchar buff[8];Uchar buff1[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};union union_temp16{ Uint un_temp16;Uchar un_temp8[2];}my_unTemp16;//定义共用体,给存储eeprom使用/**************************************************************************************************** ********************************///函数声明区/**************************************************************************************************** ********************************/void Read_8byte(Uchar *buf,Uint add,Uchar bitt); //读多个字节,调用前需打开IAP 功能void Program_8byte(Uchar *buf,Uint add,Uchar bitt);//写多个字节,调用前需打开IAP 功能void Sector_Erase(Uint add); //擦除扇区void IAP_Disable(); //关闭IAP 功能void Delay(); //延时函数void mcu_ini(void);//mcu初始化函数/**************************************************************************************************** ********************************///主函数区/**************************************************************************************************** ********************************/void main (void){Uchar i;P1 = 0xF0; //演示程序开始,让P1[3:0] 控制的灯亮Delay(); //延时P1 = 0x0F; //演示程序开始,让P1[7:4] 控制的灯亮Delay() ; //延时Sector_Erase(0x4000); //擦除整个扇区Program_8byte(buff1,0x4000,8);P2 = 0x55;//P2.7亮Read_8byte(buff,0x4000,8);while (1)//CPU 在此无限循环执行此句{P0 = ~buff[i];Delay(); //延时i++;if(i==8){i=0;P2 ^= 0xff;Delay();}//延时}}/**************************************************************************************************** ****************************///读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节/**************************************************************************************************** ****************************/Uchar Byte_Read(Uint add){IAP_DATA = 0x00;IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令my_unTemp16.un_temp16 = add;IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址//EA = 0;IAP_TRIG = 0x46; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xB9; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();//EA = 1;return (IAP_DATA);}/**************************************************************************************************** ****************************///读多个字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节/**************************************************************************************************** ****************************/void Read_8byte(Uchar *buf,Uint add,Uchar bitt){ Uchar i;for (i=0;i<bitt;i++){buf[i]= Byte_Read(add+i);}IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}/**************************************************************************************************** ****************************///字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据/**************************************************************************************************** ****************************/void Byte_Program(Uint add, Uchar ch){IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令my_unTemp16.un_temp16 = add;IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器//EA = 0;IAP_TRIG = 0x46; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xB9; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();//EA = 1;}/**************************************************************************************************** ****************************///多字节写入函数/**************************************************************************************************** ****************************/void Program_8byte(Uchar *buf,Uint add,Uchar bitt){ Uchar i;for (i=0;i<bitt;i++){Byte_Program(add+i, buf[i]);}IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}/**************************************************************************************************** ***********************************///扇区擦除, 入口:DPTR = 扇区地址/**************************************************************************************************** ***********************************/void Sector_Erase(Uint add){IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令my_unTemp16.un_temp16 = add;IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址//EA = 0;IAP_TRIG = 0x46; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xB9; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();//EA = 1;IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}/**************************************************************************************************** ***********************************///关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关/**************************************************************************************************** ***********************************/void IAP_Disable(){IAP_CONTR = 0; //关闭IAP 功能IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用IAP_ADDRH = 0;IAP_ADDRL = 0;}/**************************************************************************************************** ***********************************///延时函数/**************************************************************************************************** ***********************************/void Delay(){Uchar i;Uint d=100;while (d--){i=255;while (i--);}}你这个是STC89系列的EPROM代码要是STC12C系列就不一样了回答者:yoya0303 - 八级2010-8-24 20:06这个是连续读写8个字节的程序我调试过了,直接ctrl+c,ctrl+v,主程序调用就可以了#define IAP_BYTE_READ 1#define IAP_BYTE_WRITE 2#define IAP_BYTE_ERASE 3#define ENABLE_IAP 0x84#define EEPROM_DATA_ADDR 0x00UCHAR EEPROM_data[8];UCHAR EEPROM_num;UCHAR EEPROM_addr;void read_EEPROM_DATA(){EEPROM_addr=25;for(EEPROM_num=0;EEPROM_num<8;EEPROM_num++){IAP_ADDRH=0x00;IAP_ADDRL=EEPROM_addr;IAP_CONTR=ENABLE_IAP;IAP_CMD=IAP_BYTE_READ;IAP_TRIG=0x5a;IAP_TRIG=0xa5;nop();EEPROM_data[EEPROM_num]=IAP_DATA;IAP_CONTR=0x00;IAP_CMD=0x00;EEPROM_addr++;}IAP_TRIG=0xff;IAP_ADDRH=0xff;IAP_ADDRL=0xff;}void write_EEPROM_DATA(){EEPROM_addr=25;for(EEPROM_num=0;EEPROM_num<8;EEPROM_num++) {IAP_DATA=EEPROM_data[EEPROM_num];IAP_ADDRH=0x00;IAP_ADDRL=EEPROM_addr;IAP_CONTR=ENABLE_IAP;IAP_CMD=IAP_BYTE_WRITE;IAP_TRIG=0x5a;IAP_TRIG=0xa5;nop();nop();nop();nop();IAP_CONTR=0x00;IAP_CMD=0x00;EEPROM_addr++;Delay_10ms();}IAP_TRIG=0x00;IAP_ADDRH=0xff;IAP_ADDRL=0xff;}。

单片机的存储器结构

单片机的存储器结构

位地址
7CH 74H 6CH 64H 5CH 54H 4CH 44H 3CH 34H 2CH 24H 1CH 14H 0CH 04H
7BH 73H 6BH 63H 5BH 53H 4BH 43H 3BH 33H 2BH 23H 1BH 13H 0BH 03H
7AH 72H 6AH 62H 5AH 52H 4AH 42H 3AH 32H 2AH 22H 1AH 12H 0AH 02H
单片机原理及应用
51单片机的存储器分为程序存储器(ROM)和数据存储 器(RAM)。
程序存储器ROM(Read Only Memory),即只读存储 器,其特点是在程序正常运行时,CPU对ROM存储器只能进 行读操作。它通常用来存储固定不变的程序和数据,如引导 程序、基本输入输出系统程序等。系统掉电后,ROM中的信 息不会丢失。
片内数据存储器可使用8位地址进行访问,其最大可寻址的范围为256个地址单元。 访问片外数据存储器采用间接寻址方式,间接寻址寄存器有以下两种:
➢ R0或R1:二者都是8位寄存器,寻址范围最大为256个单元。 ➢ DPTR:16位地址指针,寻址范围可达64KB。
在访问片外数据存储器时,寻址范围如果超过了256B,就不能用R0或R1作为间接寻 址寄存器了,这时必须使用DPTR寄存器作为间接寻址寄存器。
3. 用户RAM区(30H—7FH) 在片内RAM的低128单元中,通用寄存器占32个单元,位寻址区占16个单元,剩下 的80个单元为供用户使用的一般RAM区,其地址空间为30H~7FH。这部分区域的使用 没有任何规定和限制,但应注意的是,堆栈一般开辟在这个区域中。
12
单片机原理及应用
数据存储器RAM(Random Access Memory),即可 随机读写存储器。它用于存放程序运行期间的中间数据,可 随时进行读写操作。系统掉电时,数据会全部丢失。

51单片机空闲和掉电模式详解

51单片机空闲和掉电模式详解

51单片机空闲和掉电模式应用我们知道单片机内部有一个电源管理寄存器PCON,这个寄存器的最低两位,IDL和PD这两位分别用来设定是否使单片机进入空闲模式和掉电模式。

1. 空闲模式当单片机进入空闲模式时,除CPU处于休眠状态外,其余硬件全部处于活动状态,芯片中程序未涉及到的数据存储器和特殊功能寄存器中的数据在空闲模式期间都将保持原值。

但假若定时器正在运行,那么计数器寄存器中的值还将会增加。

单片机在空闲模式下可由任一个中断或硬件复位唤醒,需要注意的是,使用中断唤醒单片机时,程序从原来停止处继续运行,当使用硬件复位唤醒单片机时,程序将从头开始执行。

让单片机进入空闲模式的目的通常是为了降低系统的功耗,举个很简单的例子,大家都用过数字万用表,在正常使用的时候表内部的单片机处于正常工作模式,当不用时,又忘记了关掉万用表的电源,大多数表在等待数分钟后,若没有人为操作,它便会自动将液晶显示关闭,以降低系统功耗,通常类似这种功能的实现就是使用了单片机的空闲模式或是掉电模式。

以STC89系列单片机为例,当单片机正常工作时的功耗通常为4mA~7mA,进入空闲模式时其功耗降至2mA,当进入掉电模式时功耗可降至0.1μA以下。

2. 休眠-掉电模式当单片机进入掉电模式时,外部晶振停振、CPU、定时器、串行口全部停止工作,只有外部中断继续工作。

使单片机进入休眠模式的指令将成为休眠前单片机执行的最后一条指令,进入休眠模式后,芯片中程序未涉及到的数据存储器和特殊功能寄存器中的数据都将保持原值。

可由外部中断低电平触发或由下降沿触发中断或者硬件复位模式换醒单片机,需要注意的是,使用中断唤醒单片机时,程序从原来停止处继续运行,当使用硬件复位唤醒单片机时,程序将从头开始执行。

【例】:开启两个外部中断,设置低电平触发中断,用定时器计数并且显示在数码管的前两位,当计到5时,使单片机进入空闲(休眠)模式,同时关闭定时器,当单片机响应外部中断后,从空闲(休眠)模式返回,同时开启定时器。

单片机系统中的掉电检测和数据保护

单片机系统中的掉电检测和数据保护

收稿日期:2002-10 作者简介:陈卫兵(1966—),男,工程师,原从事研发工作,现在南通职业大学任教。

单片机系统中的掉电检测和数据保护陈卫兵,束 慧(南通职业大学电子工程系,江苏南通226007) 摘要:讨论单片机系统中的一种实用掉电检测和数据保护电路。

关键词:单片机;电源监测;掉电保护;看门狗Detection and Data Protection for Pow er 2fail in SCM SystemsCHE N Wei 2bing ,SH U Hui(Nantong V ocational C ollege ,Jiangsu 226007,China )Abstract :This paper discusses a practical circuit in detail ,which about detection and data protection for power 2fail in SC M systems.K ey w ords :single chip microcom puter ;supply 2v oltage m onitor ;data protection for power 2fail ;watchdog 在单片机系统的实际应用中,经常会遇到这样两种情况:第一种是系统电压瞬时欠压导致单片机程序“跑飞”,使系统不能正常工作;第二种是系统意外掉电导致重要数据丢失而不能恢复。

为了尽量避免这两种情况的发生,需要加上掉电检测和保护电路,以提高系统的抗干扰性和安全性。

掉电检测和保护电路能够检测到电源电压的下降。

当电源电压还没有降到危及系统正常工作的电压以前就及时发出警告信号,单片机系统在收到此信号后,立即转入中断服务程序进行数据的保护和备用电源的切换工作,待干扰脉冲过去或系统重新上电后恢复被保护的数据。

过去常用分立元件、后备电池和RAM 构成这种电路。

随着集成电路技术的发展,出现了不少专用电源监测芯片,这里所要介绍的就是用MAXI M 公司的MAX813L 和DA LLAS 半导体公司的DS12887构成的一种实用的掉电检测和保护电路。

基于单片机掉电保护电路的设计

基于单片机掉电保护电路的设计

基于单片机掉电保护电路的设计单片机在现代电子设备中扮演着至关重要的角色,它可以控制各种功能,实现各种应用。

然而,由于外部环境的影响或者其他原因,有时候单片机可能会遭遇掉电情况,导致数据丢失或者系统崩溃。

因此,为了解决这一问题,人们设计了各种掉电保护电路,用来保护单片机、保护数据、保护系统。

本文将探讨。

首先,我们需要了解单片机掉电保护电路的基本原理。

掉电保护电路通常由电源管理芯片、超级电容、二极管、稳压电路等组成。

当电源突然中断时,电源管理芯片可以快速检测到电压的下降,并通过超级电容提供稳定的电流,保持单片机继续工作。

同时,二极管和稳压电路可以防止过流过压,确保系统的安全运行。

这样,即使在短暂的掉电情况下,单片机也能够正常运行,保护数据不丢失。

其次,我们可以通过实际案例来详细介绍单片机掉电保护电路的设计。

以一款智能家居控制系统为例,该系统由单片机控制各种家用电器的开关,实现智能化控制。

然而,由于电力不稳定或者其他原因,系统可能会遭遇掉电情况。

为了保护系统的稳定运行,工程师设计了一套掉电保护电路。

该电路通过合理选择电源管理芯片和超级电容,可以在掉电瞬间提供稳定的电流,确保单片机正常工作。

同时,二极管和稳压电路可以防止电压波动损坏系统电路。

通过这样的设计,即使在极端环境下,智能家居控制系统也能够安全可靠地运行。

除了设计原理和实际案例,我们还可以对单片机掉电保护电路进行优化和改进。

例如,可以通过添加更多的保护元件来提高保护性能,或者通过优化电路结构来减小体积和功耗。

另外,还可以考虑使用新型材料或器件来提高电路的可靠性和稳定性。

通过不断地改进和优化,单片机掉电保护电路可以在更加恶劣的环境下工作,为电子设备的稳定运行提供有力保障。

让我们总结一下本文的重点,我们可以发现,基于单片机的掉电保护电路设计是一个重要而又具有挑战性的课题。

通过深入研究和不断实践,我们可以设计出更加稳定、可靠的电路,保护单片机、保护数据、保护系统。

AT24C02数据掉电存储

AT24C02数据掉电存储

{ Sda = temp & 0x80; temp <<= 1; Scl = 1; Scl = 0; } } unsigned char ReadByte(void) { unsigned char i; unsigned char x; for(i = 0;i < 8;i++) { Scl = 1; x <<= 1; x |= (unsigned char)Sda; Scl = 0; } return x; } 3:应答信号
AT24C02 数据掉电存储
项目说明: 1.利用定时器,每 1s 计一次数。并且将这个数保存到 AT24C02 中。 2.任意时刻给开发板断电,再次上电时先从 AT24C02 中读出之前保存的数。看 看是不是断电时候的数据。 完整代码: #include <reg52.h> #include "digitron_drv.h" #include "IIC_drv.h" uint8 gNum; /*定时器 0 初始化*/ void TimerInit(void) { TMOD = 0x01; TH0 = (65536-50000)/256; TL0 = (65536-50000)%256; EA = 1; ET0 = 1; TR0 = 1; } /*定时器 0 中断函数*/ void Time0(void) interrupt 1 { uint8 times; TH0 = (65536-50000)/256; TL0 = (65536-50000)%256; times++; if(20 == times) { times = 0; gNum++; if(gNum == 100) { gNum = 0; } WriteIIC(0xa0,0,gNum); } }

STC单片机掉电断电失电瞬间EEPROM数据保存处理办法

STC单片机掉电断电失电瞬间EEPROM数据保存处理办法

STC单片机掉电断电失电瞬间EEPROM数据保存处理办法写作:欧阳autooy871公司:荣致电子科技有限公司(专业电子、程序开发承接商)Q Q:417179642淘宝:由于客户在请人设计开发一设备,但是设备用户处总停电,造成设备及其周边耗材损耗严重,因此请我司在现有STC为主要芯片的基础上做掉电瞬间EEPROM里的20个参数保存,上电后通过读取EEPROM中的参数回到掉电的状态,基于此,荣致电子科技做了大量的工作,并选用了很多种方案:1、通过1法拉大电容做掉电临时备份电池。

2、通过备份电池或者DS1302里的31个字节ram+电池方案。

3、通过MAX813L检测掉电,然后通过普通STC10某个引脚读取MAX813L的第五脚高低电平状态。

4、购买铁电芯片来不停的存储用户数据。

基于以上4种方案,荣致电子科技做了大量的试验与验证工作,最后敲定方案3经济、安全、可靠,并且存储20个参数无任何问题,具体实施细节如下:一、割掉单片机单独供电VCC线路.二、外部进电源VCC接IN5819二极管后单独给单片机供电.三、VCC5V通过4.7K与2K电阻分压给MAX813L第四脚,高于1.25V即可。

四、MAX813L第五脚连接至STC10单片机某个引脚,如:P2.0。

五、通过软件来检测P2.0引脚的电平状态,如果为低,立刻关闭所有的外部输出,然后进行EEPROM的写操作,通过延时约100ms后即可很好的保存在掉电时的动态参数。

通过各类验证,在断电几十次的情况下,所有的参数及执行程序未发生丢失及错误的情况,说明可用。

具体图纸如下:我的PCB图纸:还可以借用MAX813L的复位等功能来实现。

20121212。

单片机掉电保护总结

单片机掉电保护总结

单片机掉电保护总结 TYYGROUP system office room 【TYYUA16H-TYY-TYYYUA8Q8-单片机应用系统断电时的数据保护方法在测量、控制等领域的应用中,常要求单片机内部和外部RAM中的数据在电源掉电时不丢失,重新加电时,RAM中的数据能够保存完好,这就要求对单片机系统加接掉电保护电路。

掉电保护通常可采用以下三种方法:一是加接不间断电源,让整个系统在掉电时继续工作,二是采用备份电源,掉电后保护系统中全部或部分数据存储单元的内容;三是采用EEPROM来保存数据。

由于第一种方法体积大、成本高,对单片机系统来说,不宜采用。

第二种方法是根据实际需要,掉电时保存一些必要的数据,使系统在电源恢复后,能够继续执行程序,因而经济实用,故大量采用[1]。

EEPROM既具有ROM掉电不丢失数据的特点,又有RAM随机读写的特点。

但由于其读写速度与读写次数的限制,使得EEPROM不能完全代替RAM。

下面将介绍最常用的一些掉电保护的处理方法,希望能对相关设计人员在实际工作中有所帮助。

1简单的RAM数据掉电保护电路在具有掉电保护功能的单片机系统中,一般采用CMOS单片机和CMOSRAM。

CMOS型RAM存储器静态电源小,在正常工作状态下一般由电源向片外RAM供电,而在断电状态下由小型蓄电池向片外RAM供电,以保存有用数据,采用这种方法保存数据,时间一般在3-5个月[2]。

然而,系统在上电及断电过程中,总线状态的不确定性往往导致RAM内某些数据的变化,即数据受到冲失。

因此对于断电保护数据用的RAM存储器,除了配置供电切换电路外,还要采取数据防冲失措施,当电源突然断电时,电压下降有个过程,CPU在此过程中会失控,可能会误发出写信而冲失RAM中的数据,仅有电池是不能有效完成数据保护的,还需要对片选信号加以控制,保证整个切换过程中CS引脚的信号一直保持接近VCC。

通常,采用在RAM的CS和VCC引脚之间接一个电阻来实现COMSRAM的电源切换,然而,如果在掉电时,译码器的输出出现低电平,就可能出现问题,图1给出一种简单的电路设计,它能够避免上述问题的产生。

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

用法拉电容从容实现单片机掉电数据保存
电路见下:这里首先用6V供电(如7806),为什么用6V不用5V是显而易见的.这里的二极管们一般都起两个作用,一是利用单向导电性保证向储能电容0.47F/5.5V单向冲电;二是起钳位作用,钳去0.6V,保证使大多数51系列的单片机都能在4.5V--5.5V之间的标称工作电压下工作.而4.5-5.5间这1V电压在0.47F电容的电荷流失时间就是我们将来在掉电报警后我们可以规划的预警回旋时间.
两只47欧电阻也有两个作用:
1:和47UF和0.01UF电容一起用于加强电源滤波.
2.对单片机供电限流
一般电子工程师都喜欢把单片机电源直接接7805上,这是个非常不好的习惯,为什么?7805可提供高达2A的供电电流,异常时足够把单片机芯片内部烧毁.有这个电阻47欧姆电阻挡作及时把芯片或者极性插反也不会烧单片机和三端稳压器,但这电阻也不能太大,上限不要超过220欧,否则对单片机内部编程时,会编程失败(其实是电源不足).
3.对0.47F/5.5V储能电容,串入的这只47欧电阻消除"巨量法拉电容"的上电浪涌.实现冲电电流削峰
大家算一算要充满0.47F电容到5.5V,即使用5.5A恒流对0.47F电容冲电,也需要0.47秒才能冲到5.5V,既然知道了这个问题,大家就清楚:
1.如果没有47欧姆电阻限流,上电瞬间三端稳压器必然因强大过电流而进入自保.
2.长达0.47秒(如果真有5.5A恒流充电的话)缓慢上电,如此缓慢的上电速率,将使得以微分(RC电路)为复位电路的51单片机因为上电太慢无法实现上电复位.(其实要充满0.47UF电容常常需要几分种).
3.正因为上电时间太慢,将无法和今天大多数主流型以在线写入(ISP)类单片机与写片上位计算机软件上预留的等待应答时间严重不匹配(一般都不大于500MS),从而造成应答失步,故总是提示"通信失败".
知道这个道理你就不难理解这个电路最上面的二极管和电阻串联起来就是必须要有上电加速电路.这里还用了一只(内部空心不带蓝色的)肖特基二极管(1N5819)从法拉电容向单片机VCC放电,还同时阻断法拉电容对上
电加速电路的旁路作用,用肖特基二极管是基于其在小电流下导通电压只有0.2V左右考虑的,目的是尽量减少法拉电容在掉电时的电压损失.多留掉点维持时间.
三极管9014和钳制位二极管分压电阻垫位电阻(470欧姆)等构成基极上发射极双端输入比较器,实现掉电检测和发出最高优先级的掉电中断,这部分电路相当于半只比较器LM393,但电路更简单耗电更省(掉电时耗电小于0.15MA).
47K电阻和470欧姆二极管1N4148一道构成嵌位电路,保证基极电位大约在0.65V左右(可这样计算0.6(二极管导通电压)+5*0.47/47),这样如果9014发射极电压为0(此时就是外部掉电),三极管9014正好导通,而且因为51单片机P3.2高电平为弱上拉(大约50UA),此时9014一定是导通且弱电流饱和的,这样就向单片机内部发出最高硬件优先级的INX0掉电中断.
而在平时正常供电时,因发射极上也大约有6*0.22/2.2=0.6V电压上顶,不难发现三极管9014一定处于截止状态,而使P3.2维持高电平的.
下面还有两个重要软硬件要点和建议:
1.硬件要点:凡是驱动单片机外部口线等的以输出高电平驱动外部设备,其电源不能和电片机的供电电压VCC去争抢(例如上拉电阻供电不取自单
片机VCC).而应直接接在电源前方,图中4.7K电阻和口线PX.Y就是一个典型示例,接其它口线PX.Y'和负载也雷同.这里与上拉4.7K电阻相串联二极管也有两个作用:
1.钳去0.6V电压以便与单片机工作电压相匹配,防止口线向单片机内部反推电.造成单片机口线功能紊乱.
2.利用二极管单向供电特性,防止掉电后单片机通过口线向电源和外部设备反供电.
上面的硬件设计,在与软件结合起来(见下面叙述)就可以保证在掉电期间,不会因法拉电容上的积累电荷为已经掉电的外部电路无谓供电和向电源反供电造成电容能量泄放缩短掉电维持时间.
2.软件要点:首先INX0在硬件上(设计)是处于最高优先级的,这里还必须要在软件保证最高级别的优先.从而确保掉电时外部中断0能打断其他任何进程,最高优先地被检测和执行.其次在INX0的中断程序入口,还要用: MOV P1,#00H
MOV P2,#00H
MOV P3,#00H
MOV P0,#00H
SJMP 掉电保存
来阻断法拉电容的电荷通过单片机口线外泄和随后跳转掉电写入子程序
模块.(见硬件要点)
有了上面的预备和细节处理,下面我们信心百倍地一道来计算0.47UF的电容从5.5V跌落到4.5V(甚至可以下到3.6V)所能维持的单片机掉电工作时间.
这里设单片机工作电流为20MA(外设驱动电流已经被屏蔽)不难算出:
T=1V*0.47*1000(1000是因为工作电流为豪安)/20=23.5秒!!!!!
天!这个对单片机而言相当于从原始社会到共产主义社会的历史慢长.休说是写内部FLASH ROM,就是从新写片子本身都能写5
希望以上资料对你有所帮助,附励志名言3条::
1、世事忙忙如水流,休将名利挂心头。

粗茶淡饭随缘过,富贵荣华莫强求。

2、“我欲”是贫穷的标志。

事能常足,心常惬,人到无求品自高。

3、人生至恶是善谈人过;人生至愚恶闻己过。

相关文档
最新文档