找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3633|回复: 11
收起左侧

单片机如何实现第一次开机时显示默认数据,以后每次开机记忆上次关机时的数据

[复制链接]
ID:65581 发表于 2019-11-25 09:16 | 显示全部楼层 |阅读模式
如何实现第一次开机时显示默认数据,以后每次开机记忆上次关机时的数据?
回复

使用道具 举报

ID:213173 发表于 2019-11-25 13:23 | 显示全部楼层
利用EEPROM掉电时保存数据。首次上电复位初始化时读取的空白数据是0xff,不在规定范围就采用默认数据。以后上电复位初始化先读取EEPROM中保存的数据。
回复

使用道具 举报

ID:25310 发表于 2019-11-25 14:21 | 显示全部楼层
硬件上做掉电检测,掉电时保存数据到EEPROM,再次开机初始化后读取存入的数据。
回复

使用道具 举报

ID:609989 发表于 2019-11-25 14:24 | 显示全部楼层
使用EEPROM
回复

使用道具 举报

ID:123289 发表于 2019-11-25 17:43 | 显示全部楼层
简单:在你每次关机前,将你需要开机显示的数据,保存到非易失性存储器中,这样开机时就可以取到数据显示了。你能做到吗?
回复

使用道具 举报

ID:647989 发表于 2019-11-25 19:20 | 显示全部楼层
你可以外接一个存储器,开机读取就行
回复

使用道具 举报

ID:7485 发表于 2019-11-25 19:59 | 显示全部楼层
第一次开机一般都是开发人员操作,到了用户手中肯定不是第一次开机。你只要考虑每次关机前保存需要保存的数据即可(保存方法视电路设计,有些也许需要外挂EEPROM),再开机时调出,或送显示,或送相关寄存器。
回复

使用道具 举报

ID:581066 发表于 2019-11-25 21:32 | 显示全部楼层
使用内部flash保存数据,不知道楼主是使用的什么单片机,但是如果使用stc89c52rc 或者是STM32F103c8t6这两个都是可以的,不需要外加什么东西,代码就可以实现.
51如下
sfr ISP_DATA  = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD   = 0xe5;
sfr ISP_TRIG  = 0xe6;
sfr ISP_CONTR = 0xe7;


/*--------------------空停顿--------------------*/

void Nop(){}



/*--------------------开ISP,IAP--------------------*/

void ISP_IAP_enable()
{
//EA = 0;
ISP_CONTR = ISP_CONTR & 0x18;
ISP_CONTR = ISP_CONTR | 0x01;
ISP_CONTR = ISP_CONTR | 0x80;
}



/*--------------------关ISP,IAP--------------------*/

void ISP_IAP_disable()
{
ISP_CONTR = ISP_CONTR & 0x7F;
ISP_TRIG = 0x00;
//EA = 1;
}



/*--------------------触发代码--------------------*/

void ISPgoon()
{
ISP_IAP_enable();
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
Nop();
}



/*--------------------扇区擦除--------------------*/

void ISP_erase(uchar sector)                                        //扇区号(0~7)
{
ISP_ADDRL = 0;
ISP_ADDRH = (8192 + 512*(uint)sector)>>8;
ISP_CMD = ISP_CMD & 0xF8;
ISP_CMD = ISP_CMD | 0x03;
ISPgoon();
ISP_IAP_disable();
}



/*--------------------字节写(强制操作)--------------------*/        //必须确认,目标区域的bin值已置11111111,否则在写入前应先擦除该扇区

void ISP_write(uchar sector,uint offset,uchar ByteData)                //扇区号(0~7),地址偏移量(0~511),8位数据
{
offset = 8192 + 512*(uint)sector + offset;
ISP_ADDRL = offset;
ISP_ADDRH = offset>>8;
ISP_CMD = ISP_CMD & 0xF8;
ISP_CMD = ISP_CMD | 0x02;
ISP_DATA = ByteData;
ISPgoon();
ISP_IAP_disable();
}



/*--------------------字节读(强制操作)--------------------*/

uchar ISP_read(uchar sector,uint offset)                        //扇区号(0~7) ,地址偏移量(0~511)
{
offset = 8192 + 512*(uint)sector + offset;
ISP_ADDRL = offset;
ISP_ADDRH = offset>>8;
ISP_CMD = ISP_CMD & 0xF8;
ISP_CMD = ISP_CMD | 0x01;
ISPgoon();
ISP_IAP_disable();
return (ISP_DATA);
}



/*--------------------空白地址定位--------------------*/

uint ISP_locat(uchar sector)                                        //扇区号0~7
{
uint offset;
for(offset=0;offset<512&&ISP_read(sector,offset)!=255;offset++);
return (offset);                //返回512说明扇区已满
}



/*--------------------整型写(自动管理扇区空间)--------------------*/

void ISP_UintWrite(uchar sector,uint UintData)                        //扇区号(0~7),16位数据(0~65534,系统定义65535为空)
{
uint offset;
offset=ISP_locat(sector);        //低位
if(offset==512)                //扇区已满
{
ISP_erase(sector);                //擦除扇区
offset=0;
}
ISP_write(sector,offset,UintData);
ISP_write(sector,offset+1,UintData>>8);
}



/*--------------------整型读(自动管理扇区空间)--------------------*/

uint ISP_UintRead(uchar sector)                                        //扇区号(0~7)
{
uint offset;
offset=ISP_locat(sector);        //比高字节大1
if(offset<2)                        //这种情况说明整个扇区是空的
offset=2;                        //取第扇区上2个地址,即将第1和第0个地址位作为读取区,防止报错
return (((uint)ISP_read(sector,offset-1)<<8)+ISP_read(sector,offset-2));
}
对于STM32F103我就上传到附件了
希望能帮到你吧

flash保存数据.7z

188.03 KB, 下载次数: 9

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:65581 发表于 2019-11-26 07:38 | 显示全部楼层
wulin 发表于 2019-11-25 13:23
利用EEPROM掉电时保存数据。首次上电复位初始化时读取的空白数据是0xff,不在规定范围就采用默认数据。以后 ...

谢谢,多谢指教!!!!!!
回复

使用道具 举报

ID:65581 发表于 2019-11-26 07:39 | 显示全部楼层
1723848676 发表于 2019-11-25 21:32
使用内部flash保存数据,不知道楼主是使用的什么单片机,但是如果使用stc89c52rc 或者是STM32F103c8t6这两 ...

多谢指教!!!!!
回复

使用道具 举报

ID:65581 发表于 2019-11-26 17:38 | 显示全部楼层
wulin 发表于 2019-11-25 13:23
利用EEPROM掉电时保存数据。首次上电复位初始化时读取的空白数据是0xff,不在规定范围就采用默认数据。以后 ...

我用的是STM8S系列的,如何知道EEPROM首次上电复位初始化是读取的数据是0xff?我查数据手册也查不到?
回复

使用道具 举报

ID:213173 发表于 2019-11-26 19:25 | 显示全部楼层
realwudongcan 发表于 2019-11-26 17:38
我用的是STM8S系列的,如何知道EEPROM首次上电复位初始化是读取的数据是0xff?我查数据手册也查不到?

我这是依据STC单片机利用ISP/IAP技术将内部Data Flash当EEPROM而言的。STM8S是否采用相同方式不得而知。但不管采用的是什么技术,没有写入数据的存储器无非全0或全1。只要在扇区起始地址写入特定数据作为标识,同样可以判断是否首次上电。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表