欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3938|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)向24C02芯片中寫入浮點(diǎn)數(shù)的方法

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:346927 發(fā)表于 2021-5-27 15:01 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
向24C02芯片中寫入浮點(diǎn)數(shù)的方法,測試可用!


方法:用共用體

(1)共用體類型定義

#define FLOAT_BYTE_NUM 4 //float類型占用字節(jié)數(shù)

//浮點(diǎn)數(shù)存儲共用體
typedef union
{
    float value;
    uint8_t byte[FLOAT_BYTE_NUM];
} storFloatData;

(2)函數(shù)定義

/********************************************************************************************************
函數(shù)名稱:
函數(shù)功能:向指定地址寫入1個浮點(diǎn)數(shù)
詳    述:
輸    入:
*********************************************************************************************************/

void Storage_WriteFloatNum( uint16_t addr, storFloatData data )
{
    uint8_t i = 0;
    uint8_t a = 0;

    for( i = 0; i <= FLOAT_BYTE_NUM - 1; i++ )
    {
      AT24CXX_WriteOneByte( addr + i, data.byte[ i] );
    }
return;
}

/********************************************************************************************************
函數(shù)名稱:
函數(shù)功能:從指定地址讀出1個浮點(diǎn)數(shù)
詳    述:
輸    入:
*********************************************************************************************************/
storFloatData Storage_ReadFloatNum( uint16_t addr )
{
    uint8_t i = 0;
    storFloatData read_data;

    for( i = 0; i <= FLOAT_BYTE_NUM - 1; i++ )
    {
        read_data.byte[ i] = AT24CXX_ReadOneByte( addr + i );
    }

    return read_data;
}

(3)使用例程

storFloatData data0={12.34};
storFloatData data1;
Storage_WriteFloatNum(0,data0);
delay_ms(20);
data1 = Storage_ReadFloatNum(0);

關(guān)于存儲float浮點(diǎn)數(shù)到flash或eeprom中的方法
float 單精度浮點(diǎn)數(shù)占用32bit空間,不像存儲整型或char型數(shù)據(jù)那么便捷,我們在存儲float數(shù)據(jù)時就需要先將float數(shù)變換一下,變換成數(shù)組的格式,這樣就方便存儲和讀取了,具體實(shí)現(xiàn)有以下方法:
第一種存儲方式(取地址法):     
uint8_t datatmp[4];    //定義數(shù)組  因?yàn)閒loat數(shù)據(jù) 占4個字節(jié)   
float s;              //這是要存儲的浮點(diǎn)數(shù)   
uint8_t *p;           //定義一個u8指針變量   
p=(uint8_t*)&s;      //取浮點(diǎn)數(shù)的地址      
memcpy(datatmp,p,4);   //拷貝浮點(diǎn)數(shù)地址4個字節(jié)到數(shù)組
這種方式就是用取地址的方式,然后又知道浮點(diǎn)數(shù)占用的空間,這樣就可以通過拷貝即可將浮點(diǎn)數(shù)轉(zhuǎn)移到數(shù)組中。第二種存儲方式(利用共用體):
Union
{  
float x;  
uchar s[4];
}F32_Sep;
然后把a(bǔ)的值賦給F32_Sep.x,這樣一來其實(shí)s[0]對應(yīng)了浮點(diǎn)數(shù)的最高位,s[3]對應(yīng)其最低位,因此,保存到EEPROM中只需將s[0]~s[3]即可。
這就是利用了共用體共用一段內(nèi)存的原理,即 float x 和 uchar s[4],使用的是一個空間大小的內(nèi)存。

將單個字節(jié)數(shù)據(jù)讀取到一個float類型的數(shù)據(jù)中---的幾種方法
從串口讀取傳感器值的時候總是一個一個字節(jié),高八位低八位,需要拼接成一個float或者int的時候,這些方法有用處

1、聯(lián)合體方式
union
{
  float f;
unsigned char x[4];
} data;
data.x[0] = 0xA2;
data.x[1] = 0xA1;
data.x[2] = 0xB2;
data.x[3] = 0xB1;
return data.f;
2、移位
float result;   
result=(0xA2<<24)|(0xA1<<16)|(0xB2<<8)|0xB1;

3、不知道怎么命名
float result;
*(char*)&result = 0xA2;
*((char*)&result + 1) = 0xA1;
*((char*)&result + 2) = 0xB2;
*((char*)&result + 3) = 0xB1;

4、數(shù)組強(qiáng)制轉(zhuǎn)換
unsigned char b[4]={0xA2,0xA1,0xB2,0xB1};
float result;
result=*((float *)b);

評分

參與人數(shù) 1黑幣 +12 收起 理由
AAA_MCU + 12 絕世好帖!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表