浮點數(shù)在E2PROM中的存取方法_第1頁
浮點數(shù)在E2PROM中的存取方法_第2頁
浮點數(shù)在E2PROM中的存取方法_第3頁
浮點數(shù)在E2PROM中的存取方法_第4頁
浮點數(shù)在E2PROM中的存取方法_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、浮點數(shù)據(jù)在E2PROM中的存取方法摘 要 介紹了C51語言的浮點數(shù)在E2PROM中的存取方法。關(guān)鍵詞 浮點數(shù) 非易失存儲器 存取方法 C51編程1 引言由于C語言的高效性和易維護(hù)性,因而C51語言在工程中得到了廣泛應(yīng)用。以下所討論的問題中的程序舉例就是用C51語言編寫來實現(xiàn)其功能和目的。在我們設(shè)計產(chǎn)品的過程中,通常要將一些儀器參數(shù)保存起來,作為儀器正常工作的保障,這些浮點參數(shù)一般都保存在非易失性存儲器(E2PROM)中,以防丟失。2 浮點數(shù)在E2PROM中的存取21 浮點數(shù)在并行E2PROM中的存取MCS-51單片機在智能化儀器儀表的設(shè)計中得到了廣泛的應(yīng)用,同時C51單片機開發(fā)語言方便靈活的接

2、口編程能力和強大的數(shù)據(jù)處理能力,在單片機的開發(fā)中占有重要地位。其特有的浮點數(shù)處理能力為智能化儀器儀表的非線性矯正、數(shù)字化校準(zhǔn)提供了方便。在C51中,如果浮點數(shù)被分配在RAM存儲空間,如6264、6116、62256、62128等,其數(shù)據(jù)的存取由C51自動編譯完成,不必編寫專門的程序。而非易失性存儲器2817A、2864等雖然硬件接口沒有特殊要求,但寫周期與RAM不同,因此必須為浮點數(shù)存儲編寫專門的存儲程序。一般情況下,用戶定義的浮點數(shù)在RAM中的地址、存儲方式對用戶是未知的。但是用戶可以通過C51的指針實現(xiàn)對C51浮點數(shù)的按字節(jié)訪問,C51語言的指針是它的一大特色,表現(xiàn)出很強的數(shù)據(jù)處理能力和靈

3、活性。使用指針可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),動態(tài)分配存儲器,直接處理內(nèi)存地址等,簡化程序設(shè)計。浮點數(shù)在內(nèi)存中的存儲方式如表1所示。地址0123內(nèi)容MMMMMMMMMMMMMMMMEMMMMMMMSEEEEEEE 表1 浮點數(shù)在內(nèi)存中的存儲其中,S 符號位,1表示負(fù),0表示正;      E 階碼(在兩個字節(jié)中)偏移最大為127;      M 23位尾數(shù),最高位為1。例如浮點數(shù)變量k=12.5的十六進(jìn)制表示為:0xC1 48 00 00,它按如下方式保存于內(nèi)存RAM的連續(xù)4個字節(jié)中。地址 內(nèi)容

4、ADD+00H 0x00ADD+01H 0x00ADD+02H 0x48ADD+03H 0xC1通過以下語句可以直接對變量進(jìn)行讀寫操作。float xdata k, s ;定義浮點數(shù)k,s位于外部RAMk=12.5 ;為變量k賦值為12.5s= k ;為變量s賦值為12.5由于非易失性存儲器2817A、2864等的讀操作與RAM類似,而擦、寫時間周期比隨機存儲器RAM要長得多,一般一個字節(jié)的擦除和寫訪問時間為200S或1 mS,最大的寫入周期(包括擦除和寫入)時間不超過10mS,典型時間為5mS。因此在實際應(yīng)用中要滿足擦、寫周期時間要求,應(yīng)根據(jù)芯片的要求設(shè)置等待或中斷、查詢。每個C51浮點數(shù)占

5、用連續(xù)的4個字節(jié)的存儲單元,浮點數(shù)的存儲也必須是連續(xù)的4個字節(jié)存儲單元。以上語句不能完成浮點數(shù)在2817、2864等E2PROM中的保存,因此必須為浮點數(shù)存儲編寫專門的存儲程序。定義ap是指向非易失性存儲器2817A、2864的指針,非易失性存儲器2817A、2864分配的地址為0x2200。利用指針將RAM中的浮點數(shù)依次取出,按字節(jié)依次連續(xù)存儲在非易失性存儲器2817A、2864中。也可以使用聯(lián)合(共用體)將RAM中的浮點數(shù)依次取出,按字節(jié)依次連續(xù)存儲在非易失性存儲器2817A、2864中。程序執(zhí)行后,浮點數(shù)s的值就自動變?yōu)?2.5,并可以由浮點變量xx直接引用或參與運算。程序流程框圖如圖1

6、所示,程序如下:#include <reg51.h>#include <math.h>#include <absacc.h>#include <defines.h>#define uchar unsigned char#define uint unsigned int#define d2864 XBYTE0x2200 開始市從RAM中按字節(jié)取浮點數(shù) 是否取完按字節(jié)寫入EEPROM是否寫完延 時從EEPROM中讀是否讀完結(jié) 束 N Y N Y N Y 圖1 并行EEPROM2864程序框圖#define s XFLOAT0x0880 /*4*0x8

7、80=0x2200浮點數(shù)占用4個字節(jié)*/float xdata k=12.5;uchar *ap=&d2864;uchar *k_ap=&k;float xdata xx;void delay(uint tt) /* 延遲1mS子程序*/ uint k;while(tt-!=0) for(k=0;k<72;k+)continue; void writef_P2864(uint byte_address,float value) uchar i;union float a; /* 定義一個聯(lián)合 */ uchar b4; y;y.a=value; /* 將要寫入的浮點數(shù)送給聯(lián)

8、合型變量 */ for(i=0;i<4;i+) /* 寫浮點數(shù)的四個字節(jié)數(shù)據(jù)至指定的地址 */ XDATAbyte_address+i=y.bi;delay(10);float readf_XDATA(uint byte_address) union float a; /* 定義一個聯(lián)合 */ uchar b4; y; uchar i; float x_value; for(i=0;i<4;i+) /* 從指定的地址讀四個字節(jié)的浮點數(shù)據(jù) */y.bi = XBYTEbyte_address+i; x_value = y.a; /* 將讀出的浮點數(shù)送給浮點變量x_value */ r

9、eturn(x_value); /* 返回讀出的浮點數(shù)值x_value至原調(diào)用程序 */main() uchar i;for(i=0;i<4;i+) /* 依次從RAM中讀出四個字節(jié)的浮點數(shù) */ while(*ap!=*k_ap) *ap=*k_ap; delay(10); /* 延遲10mS時間,等待單字節(jié)寫入結(jié)束*/ ap+; /* 指向EEPROM的指針變量加1 */k_ap+; /* 指向RAM的指針變量加1 */xx=s; /* 從EEPROM中讀出浮點數(shù) */xx= readf_XDATA(0x2200); 22浮點數(shù)在串行E2PROM中的存取由于串行E2PROM如24C&

10、#180; ´ 系列、93C´ ´ 系列等集成電路具有體積小、功耗低、價格便宜,使用中占用系統(tǒng)的信號線少,接口簡單、通信方便的特點,但相對工作速度慢,讀寫方法要稍許復(fù)雜一些,因此被廣泛應(yīng)用于存儲數(shù)據(jù)量不太大、寫入速度要求不很高的場合。自定時寫周期包括自動擦除時間不超過10mS,典型時間為5mS。同時串行E2PROM還有一個重要的特點是所有的DIP封裝的產(chǎn)品都是8個引腳,而且引腳輸出兼容,這就使性能更新升級變得很簡單而經(jīng)濟(jì)。由于串行E2PROM按字節(jié)或字操作,位串行通信,因此浮點數(shù)也只能以字節(jié)或字方式進(jìn)行寫操作,將浮點數(shù)四個字節(jié)依次分開的方法類似于并行的E2PROM

11、,但必須有專門的寫程序進(jìn)行每個字節(jié)的串行寫入。而其讀操作也與并行的E2PROM截然不同,被程序重新調(diào)用之前,必須將存儲在串行E2PROM中的字節(jié)用專門的讀程序串行的恢復(fù)到相應(yīng)RAM中,不能直接在E2PROM中進(jìn)行讀操作。24C32與8031的接口電路如圖2所示。同樣可定義ap是指向存儲器RAM6264(0x2200)的指針,串行非易失性存儲器24C08、24C32等分配的地址為0xb000。利用指針將在RAM中的浮點數(shù)依次取出(使用聯(lián)合也可以將RAM中的浮點數(shù)依次取出),然后調(diào)用專門的串行字節(jié)寫入子程序按字節(jié)依次連續(xù)存儲在非易失性存儲器24C08、24C32等中。由于其特點,為了調(diào)用存儲的浮點

12、參數(shù),首先要將存儲在E2PROM連續(xù)單元中的字節(jié)數(shù)據(jù),串行的讀出來恢復(fù)到RAM中,進(jìn)行各種操作。程序執(zhí)行后,浮點數(shù)s的值就自動變?yōu)?2.5,并可以由浮點變量xx直接引用或參與運算。A0 VCC A1 WPA2 SCLVSS SDARESET 8031P1.0P1.1 Vcc 9 24C32 1 2VCC圖2 24C32與8031接口電路下面是以圖2所示的電路編寫的24C32存儲浮點數(shù)程序。24C32時序如圖3、圖5所示,程序流程框圖如圖4所示。#include <reg51.h>#include <math.h>#include <absacc.h>圖 3

13、24C32時序圖#include <defines.h>#define d6264 XBYTE0x2200#define s XFLOAT0x880 /* 4*0x880=0x2200浮點數(shù)占用4個字節(jié) */float xdata k=-12.5;uchar *ap=&d6264;uchar *k_ap=&k;uchar i,xbyte;float xdata xx=10;main() Init24C32();for(i=0;i<4;i+) xbyte=*k_ap; /*xbyte=浮點數(shù)的第i個字節(jié)值*/write(0xb000+i,xbyte); /*串行

14、E2PROM字節(jié)寫子程序*/delay(720); /* 延遲數(shù)10mS的時間,等待自定時寫周期結(jié)束*/k_ap+;for(i=0;i<4;i+) 開始從RAM中按字節(jié)取浮點數(shù)按位寫入EEPROM是否8位是否寫完4字節(jié)從EEPROM中按字節(jié)讀浮點數(shù)結(jié) 束是否8位是否讀完4字節(jié) 按位從EEPROM讀 N Y N Y N Y N Y圖4 串行EEPROM24c32程序框圖 xbyte=read(0xb000+i);/*串行E2PROM字節(jié)讀子程序讀浮點數(shù)第i個字節(jié)*/*ap=xbyte; /* 將字節(jié)值放入RAM中 */ap+;xx=s;write(addr,value)、read(addr

15、)分別為單字節(jié)串行E2PROM存儲、讀取子程序。Init24C32() SDA=1; /* SDA設(shè)定為“1”電平 */ SCL=1; /* SCL設(shè)定為“1”電平 */void delay(uchar tt) /* tt=72,延遲1mS */ uchar k; for(k=0;k<tt;k+)continue;void SendAcknowledge(bit ack) SDA=ack; /*設(shè)定SDA為要傳送的確認(rèn)信號*/ SCL=1;delay(1); /*SCL作“1”到“0”的變化(即產(chǎn)生SCL下降沿)*/ SCL=0;void Start() SDA=1; SCL=1;del

16、ay(1); /*SDA和SCL先置為“1”電平,并延遲數(shù)S的時間 */ SDA=0;delay(1); /*SDA必須先清為“0”電平,并延遲數(shù)S的時間*/ SCL=0; /*SCL才可以清為“0”電平*/void Stop() SDA=0;delay(1); /*SDA清為“0”電平,并延遲數(shù)S的時間*/ SCL=1;delay(1); /*SCL必須先置為“1”電平,并延遲數(shù)S的時間*/ 圖 5 串行E2PROM啟動和停止時序 SDA=1; /*SDA才可以置為“1”電平*/void write(uint addr,uchar value) /* 寫字節(jié)數(shù)據(jù)到指定的地址 */ Start

17、(); /* 傳送起始信號 */ SendByte(0xA0); /* 傳送從地址0xA0 */SendByte(addr>>8); /* 先傳送地址高字節(jié),再傳送地址低字節(jié) */SedByte(addr&0xff);SendByte(value); /* 再將數(shù)據(jù)寫入指定的地址內(nèi) */Stop(); /* 傳送停止信號 */uchar read(uint addr) /* 從指定的地址讀字節(jié)數(shù)據(jù) */ uchar temp;start(); /* 傳送起始信號 */SendByte(0xA0); /* 傳送從地址0xA0 */SendByte(addr>>8)

18、; /* 先傳送地址高字節(jié),再傳送地址低字節(jié) */SedByte(addr&0xff);Start(); /* 再一次傳送起始信號 */SendByte(0xA1); /* 傳送從地址0xA1,即“讀出”的從地址 */temp=ReceiveByte(); /* 接收從EEPROM讀出的數(shù)據(jù),并暫存至temp變量*/SendAcknowledge(1); /* 傳送確認(rèn)信號等于“1”電平 */Stop(); /* 傳送停止信號 */return(temp); /* 返回讀出值temp至原調(diào)用程序 */bit SendByte(uchar bytedata)/* 傳送一個字節(jié)數(shù)據(jù)的子程序 */ uchar i;bit ack; /* ack為“確認(rèn)標(biāo)志變量” */SDA=1; /* SDA先置為“1”電平 */for(i=0;i<8;i+) /* 要傳送一個Byte數(shù)據(jù),所以要執(zhí)行8次 */ if(bytedata&0x80)SDA=1; /* 如果最高位為“1”,置SDA=“1”*/else SDA=0; /* 否則清SDA=“0”*/bytedata<<=1;delay(1); /*每傳送1位,則將待傳數(shù)據(jù)左移1位 */SCL=1; delay(1); /*SCL作“1”到“0”的變化

溫馨提示

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

評論

0/150

提交評論