社区
单片机/工控
帖子详情
新人求教!!! STC89C52单片机掉电数据保存程序
Stenph
2017-10-21 10:08:24
求STC89C52单片机关掉电源之后能把程序中的某个变量(比如说a)保存下来,下次启动之后还是变成上次的数据。比如第一次用的时候a=100而关电源时是a=200,;那么下次开机时a=200....一次类推。希望要纯软件,不希望用到硬件功能。希望大佬能给完整的代码。
...全文
3311
4
打赏
收藏
新人求教!!! STC89C52单片机掉电数据保存程序
求STC89C52单片机关掉电源之后能把程序中的某个变量(比如说a)保存下来,下次启动之后还是变成上次的数据。比如第一次用的时候a=100而关电源时是a=200,;那么下次开机时a=200....一次类推。希望要纯软件,不希望用到硬件功能。希望大佬能给完整的代码。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
of123
2017-10-25
打赏
举报
回复
STC89C52 中有 4KB 称为 EEPROM 的非易失性存储空间,实质上也是 Flash。分开称呼是为了和程序存储所用的 Flash 加以区分。 你可以将掉电不丢的数据写入其中。因为也是 Flash 介质,也需要先擦后写。它的页长是 512 字节。
of123
2017-10-23
打赏
举报
回复
无论什么芯片,掉电保护的原理,就是将数据写入非易失性存储器。 现在的芯片,一般集成的非易失性存储器是 NOR Flash。它的特点是页擦后才能字节写或字写。 因此,你的保存策略要适当改变。假设你只保存一个变量,占用 4 字节,你的 Flash 页长是 512 字节。那么你需要 2 页来缓存它,才能保证任何情况下不会丢失所有(上一次和当前)数据。 开始时,你向第一页陆续写入。开机读取则是逆向的,读到的第一个不为 FFFFFFFF 的单元就是你上次的数据。你同时记下地址,下次就写入下一个单元地址。当第一页写满时,你先写第二页的起始单元,然后擦除第一页。这样,无论哪一个瞬间掉电,你都不会失去所有数据。第二页写满的处理方法类似。 很显然,你上电读的规则是,首先读第二页起始单元,如果为空,从第一页最后单元逆向搜索;否则从第二页最后单元逆向搜索。 更精致的防止写操作中途掉电的方案是,用 8 字节来表示你的变量,4 字节变量加上 4 字节 00000000 完成标志。如果逆向搜索到最后非空单元不是全 0,则再向前搜索。(其实,如果你用 3 字节足以容纳变量的话,对于 51 系列以字节为单位写入的芯片,后面加 1 字节完成标志就够了。) 如果你要保存的变量不止 1 个,你就将所有要保留的数据组成固定格式的串,以完成标志结尾。你的串长最好是能被页长整除的。否则,页尾空闲区不足串长时,就要从下一页开始写整个串。也就是串不跨页。
The sleeping lion
2017-10-23
打赏
举报
回复
我的开发板烧进程序之后就会自动保存,比如烧进蜂鸣器响的程序断电以后再开了还是会响直到你重新烧一个新的程序
tianxj001
2017-10-22
打赏
举报
回复
1
可以采用内部EEPROM ,其实是用FLASH模拟的。有专门的操作命令,具体的看
http://blog.sina.com.cn/s/blog_72359bde0101975q.html
数据
处理救星降世Power Query
0/ Excel
数据
处理新利器来了,准备好了吗?1/ 比网红函数VLOOKUP还全面的功能。——查(查询)2/ 取其精华,去其糟粕。——筛(筛选)3/ 拆分就像同学会,拆散一对是一对。——拆(拆分)4/ 天下大势,合久必分,分久必合。——合(合并)5/ 隔空取物,犹如探囊取物——提(提取)6/ 百转千回后的峰回路转。——转(转换)7/ 它判断真假的唯一标准。——判(判断)8/ 人以群分,物以类聚。——聚(聚合)9/ 我自己的难题自己造函数,不
求教
别人。——技法(自定义函数)
如何赚取积分啊,
新人
求教
!
新人
,
求教
!
C语言错误c2224,
新人
C语言简单
求教
!第一次发帖望通过
最近在自学C语言,小白
求教
,大神勿喷以下是我做的一个书上例题的C语言小
程序
,利用结构体编写一个通讯录,输入姓名电话,然后输出这些信息。我做了一点改变,struct notebook man[n];,
程序
本来是struct notebook man[NUM],(定义#define NUM 10).我想输入人数,来确定通讯录中的人数(例题中是10人)。这里是什么问题呢??
求教
!!!输出错误如下:D:\...
连接错误!!!
求教
!!!无法运行!!!
#include #include using namespace std; bool isprimer(int n);//返回ture时,是素数。 int main() { int n; cout 输出1000以内所有素数 "<
web预约功能实现问题
求教
!!
@请问下写一个web端预约功能,前台和后台代码写完后,都要传到服务器吗?用到html,js,java等不同种类的语言,是都放在一个环境下运行吗?有没有一个最简单让前端和后端相互响应的
程序
给我借鉴下啊(能表明一个原理就行)?
求教
求教
!! xxxie大佬们。 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, ...
单片机/工控
27,375
社区成员
28,769
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章