问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

单片机中如何实现永久保存某一程序中的数据?

发布网友 发布时间:2022-04-28 20:37

我来回答

4个回答

热心网友 时间:2022-06-23 02:56

可以外接EEPROM 24C02,下面的程序你可以参考,改动后使用,我试过,读写都正常
;**************************************************/
#define uchar unsigned char
#define uint unsigned int
#define Slaw 0x0a; //写命令字
#define Slar 0xa1; //读命令字
#include "reg52.h"
#include "intrins.h"

sbit Scl=P3^6; //串行时钟
sbit Sda=P3^7; //串行数据

bit Rec; //接收到数据的标志
uchar RecBuf[3]; //接收缓冲区

#define Hidden 0x10; //消隐字符在字形码表中的位置
uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
uchar DispBuf[6]; //6字节的显示缓冲区

uchar code TH0Val=63266/256;
uchar code TL0Val=63266%256;//当晶振为11.0592时,定时2.5ms的定时器初值

//以下是中断程序,用于显示
void Timer0() interrupt 1
{ uchar tmp;
static uchar dCount; //计数器,显示程序通过它得知现正显示哪个数码管
TH0=TH0Val;
TL0=TL0Val;
tmp=BitTab[dCount]; //根据当前的计数值取位值
P2=P2|0xfc; //P2与11111100B相或,将高6位置1
P2=P2&tmp; //P2与取出的位值相与,将某一位清零
tmp=DispBuf[dCount]; //根据当前的计数值取显示缓冲待显示值
tmp=DispTab[tmp]; //取字形码
P0=tmp; //送出字形码
dCount++; //计数值加1
if(dCount==6) //如果计数值等于6,则让其回0
dCount=0;
}

/*发送起始条件*/
void Start(void) /*起始条件*/
{
Sda=1;
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Sda=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
}
void Stop(void) /*停止条件*/
{
Sda=0;
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Sda=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
}
void Ack(void) /*应答位*/
{
Sda=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=0;
}
void NoAck(void) /*反向应答位*/
{
Sda=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=0;
}
void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/
{
uchar BitCounter=8; /*位数控制*/
uchar temp; /*中间变量控制*/
do
{
temp=Data;
Scl=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
if((temp&0x80)==0x80)/* 如果最高位是1*/
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1; /*RLC*/
Data=temp;
BitCounter--;
}while(BitCounter);
Scl=0;
}
uchar Read(void) /*读一个字节的数据,并返回该字节值*/
{
uchar temp=0;
uchar temp1=0;
uchar BitCounter=8;
Sda=1;
do{
Scl=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
if(Sda) /*如果Sda=1;*/
temp=temp|0x01; /*temp的最低位置1*/
else
temp=temp&0xfe; /*否则temp的最低位清0*/
if(BitCounter-1)
{ temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}while(BitCounter);
return(temp);
}
void WrToROM(uchar Data[],uchar Address,uchar Num)
{
uchar i=0;
uchar *PData;
PData=Data;
Start();
Send(0xa0);
Ack();
Send(Address);
Ack();
for(i=0;i<Num;i++)
{
Send(*(PData+i));
Ack();
}
Stop();
}
void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
uchar i=0;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Start();
Send(0xa1);
Ack();
*(PData+i)=Read();
Scl=0;
NoAck();
Stop();
}
}

void Recive() interrupt 4 //串行中断程序
{ static uchar Count=0;
if(TI)
{ TI=0;
return; //如果是发送中断,直接退出
}
RI=0; //清RI标志
RecBuf[Count]=SBUF;
Count++;
Rec=0;
if(Count>=3)
{ Count=0;
Rec=1; //置位标志
}
}

void Init()
{ TMOD=0x21;
RI=0;
TH1=0xfd;
TL1=0xfd;
PCON|=0x80;
TR1=1;
SCON=0x50;

TH0=TH0Val;
TL0=TL0Val;
ET0=1; //开T0中断
EA=1; //开总中断
ES=1;
TR0=1; //T0开始运行
TR1=1;
}

void Calc(uchar Dat1,uchar Dat2) //第一个参数放在第1、2位,第二个参数放入第5、6位
{ DispBuf[0]=Dat1/16;
DispBuf[1]=Dat1%16;

DispBuf[4]=Dat2/16;
DispBuf[5]=Dat2%16;
}

void main()
{ uchar RomDat[4];
Init(); //初始化
DispBuf[2]=Hidden;
DispBuf[3]=Hidden;
for(;;)
{
Calc(RecBuf[1],RomDat[0]); //分别显示地址和数据
if(Rec) //接收到数据
{ Rec=0; //清除标志
if(RecBuf[0]==0) //第一种功能,写入
{ RomDat[0]=RecBuf[2];
WrToROM(RomDat,RecBuf[1],1);
SBUF=RomDat[0];
}
else
{ RdFromROM(RomDat,RecBuf[1],1);
SBUF=RomDat[0];
}
}
}
}

热心网友 时间:2022-06-23 02:57

如果你的电脑有eeprom,那么就可以可以将这些数据存在这里。如果没有,你可以外接EEPROM,如AT24CX系列,其中X对应的容量

热心网友 时间:2022-06-23 02:57

有些单片机内部提供ROM和RAM,ROM是只读存储器,RAM是随机存储器,一般在程序code代码(用于烧写bin或者hex文件)存储于ROM(ROM、PROM、EPROM但是都是需要专门的烧写软件进行烧写擦除)而在程序运行过程中出现的data 数据(如C代码运行的堆栈),局部变量,全局变量等放入RAM中执行,一旦掉电RAM中的数据将遗失,那么要想存储你在程序运行时动态产生的数据,必须外扩一个可读可写的存储,使用EEPROM(如I2C通信方式AT24CXXX),可实现动态保存你的数据。

热心网友 时间:2022-06-23 02:58

可以使用24cXX 或93CXX 等 FLASH 存储器如24C16,93C46。很便宜1-2元一片。
呵呵,不知道你说的永久是多久,FLASH只能保存几十到一百来年(厂家说的,谁知道呢)。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
火影忍者手游怎么都有蛤蟆仙人了 我只是忘了忘记你图书目录 我只是忘了忘记你作者简介 我只是忘了忘记你内容简介 对《我只是忘了忘记你》进行评价! 多肉有什么作用和功效 多肉的好处 多肉植物的好处和坏处没毒的多肉植物有哪些 大学生创业哪些要素最关键优秀团队和心理素质 大学生创业的关键要素 沈阳市于洪区沙岭镇去道义开发区做什么车 喝酸奶是减肥还是增肥??? 哪些酸奶的含糖量很高? 用单片机怎么读取摄像头信号然后存储于单片机外扩U盘里面,谢谢!高分哦! 酸奶的含糖量是多少 哪些酸奶含糖量均衡? 怎么利用51单片机将声音信号存储到pc机 我用单片机计数,或者采集温湿度信号,怎么存储 酸奶含糖量怎么看 模拟单片机的输入信号 酸奶里面糖含量是什么意思?是白砂糖还是包括牛奶本身的含糖在内? 51单片机的怎么保存一些状态数据? 如何用电脑通过串行口把单片机的数据保存起来,以便下一步处理?代码如何写? 酸奶糖分高吗 单片机怎样才能保存设置的参数,初学者请教各位!!! 简爱高蛋白酸奶含糖量 如何用单片机将数字信号采集并保存,同时采集70位。 酸奶都含白砂糖么 酸奶有糖份吗 酸奶含糖量高吗? 金蝉花有哪些功效,哪里有买 周公解梦,我梦见我考试不合格 单片机收到的信号如何自动存入Oracle数据库中 51单片机,采用4路AD采集数据,AD采集完成后,这4个数据如何保存? 怎么才能将单片机测到的数据存到txt文件中,以及怎么实现将txt文件中的数据读出 梦见考试不合格名单 梦见考试被取消资格 单片机怎么输入信号? 用C8051单片机自带的A&#47;D转换,转换之后的数字信号怎么表示?存放在单片机的哪?求程序+解说 怎么把单片机采集到的数据存入电脑中,以及怎么将电脑中的数据传入单片机还原信号 我总是梦到学校我查过说学生梦到学校会被取消考试资格结果我考试没考好 梦见考试没及格? 梦见考试是什么意思一口两点? 在12123给考试差评有影响吗? ...踏青发现野外遍地的蒲公英,吃蒲公英有哪些好处? 请问:有谁知道蒲公英野菜能治什么病? 蒲公英虽是一种很普通的植物,但有入药功能,有哪些治疗效果? 蒲公英菜吃对人身体有哪些好处 吃野菜蒲公英对上火有好处吗 核酸检测要准备什么 做核酸检测是什么科