IEEE754數(shù)據(jù)轉換程序_第1頁
IEEE754數(shù)據(jù)轉換程序_第2頁
IEEE754數(shù)據(jù)轉換程序_第3頁
IEEE754數(shù)據(jù)轉換程序_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、1/ 51問題的提出筆者在系統(tǒng)開發(fā)中采用 RS485 實現(xiàn)單片機與外圍設備的通信,通信采用通用串行 接口 協(xié)議(USS ),按照串行 總線的主從通訊原理來確定訪問的方法。USS 規(guī)定了一套嚴格的通信規(guī)則,關于浮點數(shù)參數(shù)值,USS 規(guī)定采用 IEEE-754 格式進行傳送。例如,浮點數(shù) 50.0, 在通信中傳送的是它的 IEEE-754 格式,即 4 字節(jié)的十六進制 424800H.因此,單片機的 C 程序,在發(fā)送或接收外圍設各的參數(shù)值時,需要解決如何實現(xiàn)浮點數(shù)與IEEE 格式轉換的問題。2.IEEE浮點數(shù)的格式在計算機中,浮點數(shù)的存儲均采用4 字節(jié)的 IEEE-754 格式。例如,浮點數(shù) 50

2、.0 的IEEE 表示形式如下:二進制:符號S階碼n尾數(shù)m0 1000010 0 1001000 00000000 00000000十六進制:42 480000其中,最高位表示符號,1表示負,0表示正;第 2330 位表示階碼。注意:階碼 是以 2 為底的指數(shù)再加上偏移量 127.第 022 位是尾數(shù)部分。尾數(shù)的整數(shù)部分永遠為1,因此不予保存,但它是隱含存在的。一個浮點數(shù)計算式為:|(-1)吹2嘆(1莎|例如,前面繪出的浮點數(shù)的表示形式中,s=0 ,n=132,m=(1/2+0/4+0/8+1/16+0/32+),則計算結果為 50.0.3.浮點數(shù)與IEEE格式轉換在最初的 C 語言編程中,筆

3、者根據(jù)上面介紹的 IEEE 表示形式,采用移位計算的方法實 現(xiàn)浮點數(shù)和 IEEE格式轉換。當接收到外圍設備傳來的4 字節(jié) IEEE 格式參數(shù)值時,依次將符號、階碼、尾數(shù)通過移位取出,然后按照IEEE 計算規(guī)則計算出對應的浮點數(shù)。當需要發(fā)送給外圍設備的浮點數(shù)時,按相反的方法將其轉化為IEEE 格式后再發(fā)送出去。筆者一直感覺上述方法太麻煩,而且效率太低。后來筆者想到,既然在C 語言中浮點數(shù)本身就是采用 IEEE 格式來存儲的,能否利用 C 語言本身的機制來實現(xiàn)浮點數(shù)和IEEE 格 式的轉2/ 5換?經(jīng)過嘗試,發(fā)現(xiàn)利用 union 數(shù)據(jù)類型可以很好地完成這工作,即只需定義下面這個 union 類型:

4、union類型:unionpacket;floata;char b4;;注意:類型定義的后面別忘了還有個符號 ”;”,u nion 類型雖然有兩個內(nèi)部變量,但兩個 內(nèi)部變量占用同-地址空間,它只占用 4 個字節(jié)。內(nèi)部 float 變量 a (占用 4 個字節(jié))和 char 數(shù)組 b (同樣占用 4 個字節(jié))從同一個地址開始存放,并共享同一塊內(nèi)存空間。C 語言中,對于單精度浮點數(shù) a,采用四個字節(jié)(IEEE 格式)來存儲,依次存儲在四個連續(xù)的存儲單元 內(nèi),低字節(jié)存儲在低地址存儲單元,高字節(jié)存在高地址存儲單元;字符數(shù)組b 也采用和 a同樣的存儲方式。利用 union 數(shù)據(jù)類型,可以直接訪問浮點數(shù)以

5、 IEEE 格式存放在存儲單 元中的十六進制字節(jié),通過直接讀取或修改這些十六進制字節(jié),便可以巧妙地實現(xiàn)浮點數(shù)與IEEE 格式的轉換。(1)IEEE 格式轉換浮點數(shù)當單片機接收來自 USS 總線的數(shù)據(jù)時,只需將 4 個字節(jié)的數(shù)據(jù)放到內(nèi)部變量 b 中,再 訪問內(nèi)部變量 a,即可實現(xiàn)轉換。下面給出示意程序,供參考。3/ 5char i;float datum; union packet p;/注意imion數(shù)據(jù)類型禹定義方式for (i= 0; i 4; i+) p.bi = SBUF;/此處的SBUF為 單片機的輸入寄存器datium = p.a;/通過此語句可實 現(xiàn)IEEE格式向float的轉換

6、(2 )浮點數(shù)轉換 IEEE 格式當單片機處理好數(shù)據(jù)后,需要把浮點型的數(shù)據(jù)轉換成 IEEE 格式,輸出給 USS 總線。只需把數(shù)據(jù)賦予內(nèi)部變量 a,再從內(nèi)部變量 b 中取出對應的 4 個字節(jié)即可。p.a = datum;/注意union類型內(nèi)部變量的訪問方式for (i = 0; i 4; i+) SBUF = p.bi;/此處的SBUF為單片機的輸出寄存器2.1 定義 union 數(shù)據(jù)typedef unionfloat ul_Temp;4/ 5uint8 uc_Buf4;un _DtformC onver;2.2 應用un _DtformC on ver DtformC on ver;uint8 i;in t32 il_Temp32;float f_Temp;/十進制 float 型數(shù)據(jù)轉換成 IEEE754 標準DtformCo nver.ul_Temp = 220.1;il_Temp32=0;for(i=0;i4;i+)il_Temp32 |= (in t32)(DtformCo nver.uc_Bufi(i*8);/IEEE754 標準轉換成十進制 floatil_Temp32 = 0 x435C0000;/實際十進制值是memset(uint8 *)&DtformConver.uc_Buf

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論