将float型数据存储到EEPROM中或者flash中的方法

本文详细介绍了如何使用STC12C5A60S2单片机将float型数据存储到EEPROM中,包括四种方法的实现过程,并提供了实例代码。同时讨论了数据读取和合并的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在忙个项目,要结束,最后一步就是把程序中运行时改变的的一些数据能够存到EERROM中,防止掉电时候的丢失,再次的存储的程序就不写出来了,很简单的,我用的是STC12C5A60S2这款强大的单片机,呵呵,在单片机里面这个性能确实不错了,与一些小ARM能媲美啊,甚至跟好用一些,有机会的话,各位访客自己体会吧。说重点,遇到了怎样把float型数据存储到EEPROM的问题,刚开始还真被蒙住了,后来想想这个不难,只要还是要搞清楚数据的存储结构,在单片机中一个float型一般占四个字节吧,具体存储形式看自己的编译器,只要把这四个字节顺序存储或者读出就可以成功的实现数据的读写了,其实,到此,大家弄懂这些也就很明白了,包括其余的一些数据类型的存储主题思想都是这样的。但是处理的方式还是多样的,这还是有值得研究的。我自己的程序就不贴出了,下面给出几个我在网上找到的,给大家做个思想上的指导吧(特此声明,复制别人的内容只是做交流学习之用)

      ///////////////////方法一////////////////////
flat a;
unsigned char *p;
p=(unsigned char *)&a;

//写入:
for(int i=0;i<sizeof(float);i++)
   eeprom_write_byte(addr+i,p);

//读:
for(int i=0;i<sizeof(float);i++)
  *p++=eeprom_read_byte(addr+i);
///////////////////方法二////////////////////
//来个简单点的。
float data0,data1;
u8 byte0,byte1,byte2,byte3;

data0=12345.1;

byte0=((u8 *)&data0)[0];//拆开
byte1=((u8 *)&data0)[1];
byte2=((u8 *)&data0)[2];
byte3=((u8 *)&data0)[3];

((u8 *)&data1)[0]=byte0;//合并
((u8 *)&data1)[1]=byte1;
((u8 *)&data1)[2]=byte2;
((u8 *)&data1)[3]=byte3;

///////////////////方法三////////////////////
union                                                
{
        uint32  Temp_Cn;
        uchar   Cai[4];
}Ji_shu;
/////////////////方法四////////////////////
#define uchar  unsigned char
#define uint   unsigned int
void ftoc(void)
{ float a;
uchar i,*px;
uchar x[4];
void *pf;
px=x;
pf=&a;
a=34.25;
for(i=0;i<4;i++)
  *(px+i)=*((char *)pf+i);
for(i=0;i<4;i++)
printf("%x\n",x);
}
如果已将数存入eeprom,要将其取出合并,方法也是一样,可参考下面的程序。
void ctof(void)
{ float a;
uchar i,*px;
uchar x[4]={0xa0,0x1a,0xa,0x42};
void *pf;
px=x;             //px指针指向数组x
pf=&a;
for(i=0;i<4;i++)
*((char *)pf+i)=*(px+i);
printf("%f\n",a);
}

uchar x[4]={0xa0,0x1a,0xa,0x42};

 

追加:方法1明显有错误,只是当时马上下班,我没仔细看。相信各位访客看看自己改改就好了,我就不做修改了

以下是Arduino将数据结构体flash的示例代码: ```c++ #include <EEPROM.h> // 定义一个数据结构体 struct DataStruct { int value1; float value2; char value3[20]; }; // 定义一个数据结构体实例 DataStruct myData; // 存储数据到EEPROM中 void storeData() { EEPROM.put(0, myData); } // 从EEPROM中读取数据 void loadData() { EEPROM.get(0, myData); } void setup() { // 初始化串口 Serial.begin(9600); // 将数据存储EEPROM中 myData.value1 = 123; myData.value2 = 3.14; strcpy(myData.value3, "Hello, World!"); storeData(); // 从EEPROM中读取数据并输出 loadData(); Serial.print("Value 1: "); Serial.println(myData.value1); Serial.print("Value 2: "); Serial.println(myData.value2); Serial.print("Value 3: "); Serial.println(myData.value3); } void loop() { // do nothing } ``` 在这个示例代码中,我们首先定义了一个名为`DataStruct`的数据结构体,它包含了一个整变量`value1`、一个浮点变量`value2`以及一个字符数组`value3`。然后我们定义了一个`DataStruct`类的实例`myData`。 在`storeData()`函数中,我们使用了`EEPROM.put()`函数将`myData`存储EEPROM的地址0处。在`loadData()`函数中,我们使用了`EEPROM.get()`函数从EEPROM的地址0处读取数据并将其存储到`myData`中。 在`setup()`函数中,我们首先将串口初始化,并将一些数据存储EEPROM中。然后从EEPROM中读取数据并通过串口输出。在`loop()`函数中,我们什么也不做。 注意,由于Arduino的EEPROM空间有限,因此不能存储过多的数据。如果需要存储大量的数据,建议使用外部存储器,如SD卡或Flash芯片。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值