当前位置:首页 » 网络资讯 » 怎样让单片机保存数据
扩展阅读
图片可以用什么软件扫描 2025-09-19 13:28:07

怎样让单片机保存数据

发布时间: 2022-03-01 23:05:25

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

可以外接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];
}
}
}
}

Ⅱ 单片机保存设置数据

你可以在www.IC37.COM上下载它的PDF看。它带有8K(8位)的程序储存器,没有EEPROM,所以不能保存的。
如果要储存设置数据得用外部的EEPROM,比如24LC系列,有很多产品都是这样搭配用的,这个网站上也有这个系列的PDF,自己下载来看看就好了。

Ⅲ 51单片机怎么实现数据的存储,通过51单片机可以把数据存到哪,没学过usb协议

不用 usb协议 可以把数据存到EEPROM中去如W25Q16
也可以存到SD卡中(spi接口),不用文件系统,只不过查找不方便
当然也可以发送到上位机中,处理就比较灵活了
数据量小的话,直接存单片机片上的EEPROM或FLASH ROM中
如STC12C5608片上有4KB的FLASH ROM(FLASH EEPROM和程序空间不冲突)

Ⅳ 51单片机的怎么保存一些状态数据

程序存储区不能存储数据,可以用EEPRAM来存储数据。不外加存储器也可以实现,就用STC单片机它内部有EEPRAM。

Ⅳ c51单片机怎样存储大量数据

如果你的数据是静态的不用变的就可以存在code,否则当上电后code的内容只能读,不能改.数据多了只能加外存,可以用I2C总线的E2PROM(2是平方的意思),前几天买了几块AT24C256(32K),5元/块

例如:int code point[]={-1,-2,-3};就可以了。你说的不行不知道是什么意思,具体点吧

你这样赋初值是不行的,因为这种赋值语句是在RAM里面进行,point[]只可能是变量,不可能是常量,也就是它不能被定义在CODE内。所以你只能一个一个来了。一但point[]被定义为CODE就不能在main()里面再对它赋值了。:)

Ⅵ 你好 STC单片机的数据如何存储

keil的下载调试和你使用的调试脚本有关系,#define num1 0x仅仅是一句普通语句。在编译的时候编译器把num1全部替换成0x??,并不会寻址。
在eeprom里存数据的话需要遵循一定的时序,具体要看芯片的说明书并不是一句define语句就能实现的。

Ⅶ 51单片机怎么存储数据

掉电存储需要用到EEPROM存储器的,普通的51单片机内部没有,可以使用外围EEPROM元件如24Cxx系列的存储器,也可以选用stc90系列的单片机,内部有EEPROM,程序兼容。

Ⅷ 如何让单片机某一临时数据永久保存

存到EEPROM ,开机的时候再从EEPROM读取

Ⅸ 单片机怎样才能保存设置的参数,初学者请教各位!!!

先看你用的什么单片机,现在流行的单片机如C8051F等都有Flash存储器,可掉电保存数据,这样就不需要外扩存储器。经典的MCS-51很古老,没有Flash,所以一般单片机教材上的都没讲怎样保存数据。具体有没有Flash可以查看单片机的数据手册。
往单片机的Flash里存数据一般有特殊的编程步骤,各种单片机都不一样,也要查看数据手册。
单片机没有Flash的话,就需要扩展存储器了。EPROM是紫外线擦除的,不能用。EEPROM是电擦除的。看你需要多大空间、什么接口,再去查型号,AT24C01,AT29C020等。下面的网址可以参考:
http://www.zymcu.com/device/memory/eeprom_01.htm
http://www.zymcu.com/device/memory/flash_01.htm