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多年。
如果想修改程序里面的一些初始化数据,原来的全部程序就都必须重写。