STC89C52单片机可以掉电保存数据吗?

我想将一个时间数据用按键输入到单片机并且通过数码管显示出来,(不用备用电池)断电过若干年后再开机这个数据还在,还显示出来,按键不限,用四位的数码管显示,格式如:5555 秒,求程序

可以,单片机中, 保存数据有两种。

一种是,Volatile memory,断电後数据消失。

一种是,Non-Volatile memory,断电後数据不消失。应该要确认,单晶片是否有提供"可供写入的Non-Volatile memory"。

有的单片机,数据可以存放在程序储存的空间(FALSH),有的是额外提供数据储存空间如(EEPROM), 依照单片机的不同产品定位而有不同。


扩展资料:

单片机也被称为单片微控器,属于一种集成式电路芯片。在单片机中主要包含CPU、只读存储器ROM和随机存储器RAM等,多样化数据采集与控制系统能够让单片机完成各项复杂的运算,无论是对运算符号进行控制,还是对系统下达运算指令都能通过单片机完成。

由此可见,单片机凭借着强大的数据处理技术和计算功能可以在智能电子设备中充分应用。简单地说,单片机就是一块芯片,这块芯片组成了一个系统,通过集成电路技术的应用,将数据运算与处理能力集成到芯片中,实现对数据的高速化处理。

参考资料来源:百度百科-单片机

参考资料来源:百度百科-STC89C52

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-05-03

可以,单片机中,保存数据有两种。其中一个副本是易失性内存,当电源关闭时,数据将消失。

一种是非易失性内存,即数据不会在断电后消失。您应该验证单个芯片是否提供了可写的非易失性内存。

有些单片机,数据可以存储在程序存储空间(FALSH),有些附加的数据存储空间(EEPROM),根据单片机的不同产品定位而有不同。

扩展资料:

单片机又称一百单片机,属于集成电路芯片。在单片机中主要包含CPU、只读存储器ROM和随机存取存储器RAM等,多样化的数据采集和控制系统可以使单片机完成各种复杂的操作,无论是控制操作符号,还是对系统的操作指令都可以通过单片机来完成。

因此,单片机具有强大的数据处理技术和计算功能,可以在智能电子设备中得到充分的应用。简单地说,单片机就是众所周知的一种芯片,这种芯片形成了一个系统。

通过集成电路技术的应用,将数据的计算和处理能力装入芯片,实现数据的高速处理。

本回答被网友采纳
第2个回答  推荐于2017-10-12
使用24C08 EEPROM,不断的把数据传入EEPROM里。
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit scl=P1^5; //24c08 SCL
sbit sda=P3^6; //24c08 SDA

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar sec; //定义计数值,每过1秒,sec加1
uint write; //写标志位

/********************************************************************
* 名称 : delay1()
* 功能 : 短暂延时
* 输入 : x
* 输出 : 无
***********************************************************************/
void delay1(uchar x)
{
uint i;
for(i=0; i<x; i++)
;
}

/********************************************************************
* 名称 : flash()
* 功能 : 延时,时间为2个NOP,大概为2US
* 输入 : 无
* 输出 : 无
***********************************************************************/
void flash(void)
{
_nop_();
_nop_();
}

/********************************************************************
* 名称 : x24c02_init()
* 功能 : 24c02初始化子程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void x24c02_init(void)
{
scl = 1;
flash();
sda = 1;
flash();
}

/********************************************************************
* 名称 : start(void)
* 功能 : 启动I2C总线
* 输入 : 无
* 输出 : 无
***********************************************************************/
void start(void)
{
sda = 1;
flash();
scl = 1;
flash();
sda = 0;
flash();
scl = 0;
flash();
}

/********************************************************************
* 名称 : stop()
* 功能 : 停止I2C总线
* 输入 : 无
* 输出 : 无
***********************************************************************/
void stop()
{
sda = 0;
flash();
scl = 1;
flash();
sda = 1;
flash();
}

/********************************************************************
* 名称 : writex()
* 功能 : 写一个字节
* 输入 : j(需要写入的值)
* 输出 : 无
***********************************************************************/
void writex(uchar j)
{
uchar i,temp;
temp = j;
for(i=0; i<8; i++)
{
temp = temp << 1;
scl = 0;
flash();
sda = CY;
flash();
scl = 1;
flash();
}
scl = 0;
flash();
sda = 1;
flash();
}

/********************************************************************
* 名称 : readx()
* 功能 : 读一个字节
* 输入 : 无
* 输出 : 读出的值
***********************************************************************/
uchar readx(void)
{
uchar i, j, k = 0;
scl = 0;
flash();
sda = 1;
for(i=0; i<8; i++)
{
flash();
scl = 1;
flash();
if(sda == 1)
{
j = 1;
}
else j = 0;
k = (k << 1) | j;
scl = 0;
}
flash();
return(k);
}

/********************************************************************
* 名称 : clock()
* 功能 : I2C总线时钟
* 输入 : 无
* 输出 : 无
***********************************************************************/
void clock(void)
{
uchar i = 0;
scl = 1;
flash();
while((sda == 1) && (i < 255))
{
i++;
}
scl = 0;
flash();
}

/********************************************************************
* 名称 : x24c02_read()
* 功能 : 从24c02中读出值
* 输入 : address(要在这个地址读取值)
* 输出 : 从24c02中读出的值
***********************************************************************/
uchar x24c02_read(uchar address)
{
uchar i;
start();
writex(0xa0);
clock();
writex(address);
clock();
start();
writex(0xa1);
clock();
i = readx();
stop();
delay1(10);
return(i);
}

/********************************************************************
* 名称 : x24c02_write()
* 功能 : 想24c02中写入数据
* 输入 : address(地址) , info(值)
* 输出 : 无
***********************************************************************/
void x24c02_write(uchar address, uchar info)
{
EA = 0;
start();
writex(0xa0);
clock();
writex(address);
clock();
writex(info);
clock();
stop();
EA = 1;
delay1(50);
}

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时,延时时间为 1ms * i
* 输入 : i(延时1ms的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
uchar x, j;
for(j=0; j<i; j++)
for(x=0; x<=148; x++)
;
}

/********************************************************************
* 名称 : LED()
* 功能 : 显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LED() //LED显示函数
{
P2 = 0x06;
P0 = table[sec / 10];
Delay_1ms(5);
P2 = 0x07;
P0 = table[sec % 10];
Delay_1ms(5);
}

/********************************************************************
* 名称 : time0()
* 功能 : 定时中断函数,每秒中sec加一,并且写标识write使能
* 输入 : del
* 输出 : 无
***********************************************************************/
void time0(void) interrupt 1 using 3 //定时中断服务函数
{
static uchar Count = 0;
TH0 = (65536 - 50000) / 256; //对TH0 TL0赋值
TL0 = (65536 - 50000) % 256; //重装计数初值
Count++; //每过250ust tcnt加一
if(Count == 20) //计满20次(1秒)时
{
Count = 0; //重新再计
sec++;
write = 1; //1秒写一次24C08
if(sec == 100) //定时100秒,在从零开始计时
{
sec = 0;
}
}
}

/********************************************************************
* 名称 : Time0_Init()
* 功能 : 定时器0的初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Init(void)
{
TMOD = 0x01; //定时器工作在方式1
ET0 = 1;
EA = 1;
TH0 = (65536 - 50000) / 256; //对TH0 TL0赋值
TL0 = (65536 - 50000) % 256; //使定时器0.05秒中断一次
TR0 = 1; //开始计时
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
P2 = 0x00;
x24c02_init(); //初始化24C02
Time0_Init();
sec = x24c02_read(2); //读出保存的数据赋于sec
while(1)
{
LED();
if(write == 1) //判断计时器是否计时一秒
{
write =0 ; //清零
x24c02_write(2,sec); //在24c08的地址2中写入数据sec
}
}
}
这样断电后,再来电,会从上次断电的地方再开始。本回答被提问者采纳
第3个回答  推荐于2017-10-08
小程序用这个太复杂了 不如直接eeprom读写使能 每步写入保存

一一一一一一一一代表你要执行的程序 步骤

#include <STC89C52RC.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

void cc(uint addr); //擦除
void xcx(uint addr,uchar dat); //写储存
uchar dcx(uint addr); //读储存
void Q0(); //清除寄存器

void main(void)
{
uchar V;
V = dcx(0x2002); // 开机读取EEPROM区2002h数据,还原状况
if(V == 2) {那么数码管显示2}

while(1)
{
一一一一一一一一一一一一
cc(0x2000); // 擦除第1个扇区(2000h~21FFh)
xcx(0x2002,2); // 对EEPROM区2002h写入2
一一一一一一一一一一一一
cc(0x2000); // 擦除第1个扇区(2000h~21FFh)
xcx(0x2002,6); // 对EEPROM区2002h写入6
}
}
void cc(uint addr)

{
ISP_CONTR = 0x81; // 开IAP
ISP_CMD = 0x03; // EEPROM擦除使能
ISP_ADDRL = addr; // 低八位,
ISP_ADDRH = addr>>8; // 高八位。
EA =0;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
Q0(); // 关闭ISP/IAP
}
void xcx(uint addr,uchar dat)
{
ISP_CONTR = 0x81;
ISP_CMD = 0x02; // EEPROM写入使能
ISP_ADDRL = addr;
ISP_ADDRH = addr>>8;
ISP_DATA = dat; // 数据进ISP_DATA
EA = 0;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
Q0(); // 关闭ISP/IAP
}
uchar dcx(uint addr)
{
uchar dat;
ISP_CONTR = 0x81;
ISP_CMD = 0x01; // 用户可以对"Data Flash/EEPROM区"进行字节读
ISP_ADDRL = addr;
ISP_ADDRH = addr>>8;
EA = 0;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
dat = ISP_DATA; // 取出数据
Q0(); // 关闭ISP/IAP
return dat;
}
void Q0()
{
ISP_CONTR = 0; // 关闭IAP功能
ISP_CMD = 0; // 待机模式,无ISP操作
ISP_TRIG = 0; // 关闭IAP功能, 清与ISP有关的特殊功能寄存器
}
第4个回答  2011-07-26
STC89C52单片机可以掉电保存程序,可以不用电池保存N多年。
如果想修改程序里面的一些初始化数据,原来的全部程序就都必须重写。

STC89C52单片机可以掉电保存数据吗?
可以,单片机中,保存数据有两种。其中一个副本是易失性内存,当电源关闭时,数据将消失。一种是非易失性内存,即数据不会在断电后消失。您应该验证单个芯片是否提供了可写的非易失性内存。有些单片机,数据可以存储在程序存储空间(FALSH),有些附加的数据存储空间(EEPROM),根据单片机的不同产品定位...

STC89C52单片机可以掉电保存数据吗?
可以,单片机中, 保存数据有两种。一种是,Volatile memory,断电後数据消失。一种是,Non-Volatile memory,断电後数据不消失。应该要确认,单晶片是否有提供"可供写入的Non-Volatile memory"。有的单片机,数据可以存放在程序储存的空间(FALSH),有的是额外提供数据储存空间如(EEPROM), 依照单片机的不同...

STC89C52单片机能进行掉电保存吗?
STC89C52单片机可以用EEPROM进行掉电保存,当需要保存的数据变化时,写EEPROM保存一次,下次开机从EEPROM读出来就行了。

STC89C52单片机可以掉电保存数据吗?
完全可以,参数可以随时调整,随时存储,不过每次调整一下都要按存储键才能存储。本人用的就是89C52和90C52两种单片机。参数可以随时调整,随时存储,不过每次调整一下都要按存储键才能存储。

STC89C52单片机掉电保存如何实现?
STC89C52单片机掉电保存很容易的,利用内部的EEPROM就可以保存,每当需要保存的数据变化时,就写一次EEPROM保存,开机时再读出保存的数据就行了。见下表。

89c52单片机怎么进入掉电模式
不是所有的89C52单片机都可以进入掉电模式的,STC89C52可以进入掉电模式。1、当PCON寄存器的D1也就是PCON.1或者叫PD位置1时,单片机进入掉电模式,该模式也叫停机模式。2、进入掉电模式后,内部晶振停震,CPU、定时器、看门狗、串口都停止工作,外部中断继续工作。如果低电压检测被允许,也可以继续工作...

求STC89c52详细介绍。说说它与51单片机的特点,优点等,最好能稍微多点...
STC89C52的独特之处在于,即使在空闲模式下,它仍支持0Hz静态逻辑操作,允许RAM、定时器\/计数器、串口和中断在CPU停机时继续工作。而在掉电保护模式下,数据存储被保留,振荡器暂停,仅在接到中断或硬件复位时才恢复工作。其工作频率最高可达35MHz,可选择6T\/12T模式。与AT89S52单片机相比,STC89C52在程序...

单片机(stc89c52)中烧入的程序会因为断电而消失吗
不会的,烧写进去的程序是保存在ROM中的,早期的单片机烧写必须要用12V的电压才行,好像有的需要20V左右的,这个都是早期的.后来出现了ISP技术,就是在供电电压下可直接进行编程的,但是写入的程序都是在ROM中的,而且这个ROM和内部的RAM甚至eeprom 在物理上是隔离的,只有通过ISP程序才能写入到ROM中.放在RAM...

STC89C52特性
大大简化了程序的更新和调试过程,提高了工作效率。相比之下,AT89S52单片机虽然也有8K字节的程序存储空间,但数据存储空间只有256字节,远低于STC89C52RC。更为重要的是,AT89S52没有内建的EEPROM存储,这意味着数据的长期保存需要外部设备支持,这在一定程度上增加了系统的复杂性和成本。

stc单片机掉电不丢失数据
完全可以不使用AT24C02。STC89C52自带4K的EEPROM,你的应用程序可以对其进行编程、读写操作,应该不复杂,可以仔细阅读一下DATASHEET中的相关说明,而且其中还有例程代码。不过实验的时候要小心,因为这4K存储区出厂时烧录了串口下载程序的代码,如果将这部分程序所在空间给改写了,虽然芯片并未损坏,但将来就...

相似回答