日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機電之家資源網(wǎng)
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
AT24C02在IC煤氣表中的應用
AT24C02在IC煤氣表中的應用
 更新時間:2009-7-9 16:55:51  點擊數(shù):0
【字體: 字體顏色
                                 器件固有地址編碼                                                器件引腳地址                                    /                           圖(2I2C總線器件SLA4.軟件設計   IC卡煤氣表中,購氣量和用氣量、IC卡卡型等數(shù)據(jù) (10個單元)等數(shù)據(jù)共22個字節(jié)單元的數(shù)據(jù)需要實時保存。IC卡煤氣表具有記憶功能無論是電池欠壓還是因更換電池,系統(tǒng)都會記著失電前一刻的數(shù)據(jù)待電壓恢復正常后系統(tǒng)會自動恢復正常工作,無須人工干預。并且要求準確無誤,萬無一失。    以下為用匯編語言編寫的有關AT24C02的一段程序模塊,每次讀或?qū)?8個字節(jié)單元的數(shù)據(jù)。你可改變一下寄存器“B”的值,就可讀寫整個器件的數(shù)據(jù)。

---------------------------------------------------------------------------------------------

;說明: 現(xiàn)行地址讀/寫即專指無子地址的器件,不給定子地址的讀/寫操作

;軟件占用內(nèi)部資源  R0,R1,R2,R3,ACC,Cy

;使用前須定義變量 SLA器件從地址,SUBA器件子地址,NUMBYTE讀寫的字節(jié)數(shù)

;位變量ACK

;使用前須定義SDA,SCL總線位,MTD發(fā)送數(shù)據(jù)緩沖區(qū)首址,MRD接收數(shù)據(jù)緩沖區(qū)首址

;此軟件是在標準的8051模式,12 Clock下,對主頻要求是不高于12MHz(1個機 器周期1us);若Fosc>12MHz,則相應要增加NOP指令數(shù)

;*****************************************************

;定義變量

 ACK      BIT      10H       ;應得標志位

;(定義緩沖區(qū)的單元)
SLA      DATA     50H       ;器件從地址(從器件的選通地址:如0A0H)
SUBA     DATA     51H      ;器件子地址 (從器件的內(nèi)部存儲器地址)
NUMBYTE  DATA     52H    ;讀/寫的字節(jié)數(shù)(的緩存器)
SDA      EQU      P3.0     ;I2總線定義  
SCL      EQU      P3.1
MTD      EQU      22H     ;發(fā)送數(shù)據(jù)緩沖區(qū)首址(22H~33H共18個字節(jié))
MRD      EQU      22H     ;接收數(shù)據(jù)緩沖區(qū)首址(22H~33H)

;定義器件地址
CSI24WCXX  EQU     0A0H  ;從器件固定地址

;**************************************** 
      ORG   0000H
      AJMP  MAIN
      ORG   0080H
MAIN: 
      MOV   R0,#55H 
      CLR   A
DEL1: MOV   @R0,A        ;預使用單元清0 
      DJNZ  R0,DEL1 
      MOV   SP,#60H 
 ;測試 
      LCALL  WR24C02       ;調(diào)寫N個字節(jié)的數(shù)據(jù) 
      CALL   RD24C02       ;調(diào)讀N個字節(jié)的數(shù)據(jù)

      SJMP   $

;****************************************
;對2402指定單元進行寫操作,指定的子地址放入SUBA,
;數(shù)據(jù)依次放入MTD緩沖區(qū)

WR24C02: 
      MOV   B,#2             ;寫入的頁數(shù) 
      CALL  MTDX           ;調(diào)寫入的數(shù)據(jù) (測試) 
      MOV   SUBA,#00H      ;指定存儲器地址 
      MOV   R1,#MTD        ;發(fā)送數(shù)據(jù)緩沖區(qū)送A
WR00: 
      MOV   SLA,#CSI24WCXX 
      MOV   NUMBYTE,#8     ;寫入8個字節(jié)數(shù)據(jù) 
      LCALL IWRNBYTE 
      CALL  a5ms             ;寫入一頁后延時5ms后再寫另一頁 
      MOV   SUBA,#08H      ;指定存儲器地址 
      MOV   R1,#MTD+8 
      DJNZ   B,WR00        ;2頁數(shù)據(jù)(16位)寫完否?未完繼續(xù) 
      MOV   SUBA,#16       ;指定存儲器地址 
      MOV   R1,#MTD+16 
      MOV   SLA,#CSI24WCXX 
      MOV   NUMBYTE,#2      ;寫入2個字節(jié)數(shù)據(jù) 
      LCALL  IWRNBYTE 
      CALL   a5ms 
      RET
;***** 向器件指定子地址寫N個數(shù)據(jù) ************

IWRNBYTE: 
      MOV   A,NUMBYTE    ;發(fā)送的字節(jié)數(shù)送A 
      MOV   R3,A 
      LCALL START        ;起動總線 
      MOV   A,SLA        ;器件從地址送A 
      LCALL WRBYTE       ;發(fā)送器件從地址 
      LCALL CACK         ;檢查應得位子程序 
      JNB   ACK,RETWRN   ;無應得則退出 
      MOV   A,SUBA       ;指定子地址 
      LCALL WRBYTE 
      LCALL CACK         ;檢查應得位子程序(返回值ACK=1時表示有應得) 
     ; MOV   R1,#MTD      ;發(fā)送數(shù)據(jù)緩沖區(qū)送A
WRDA: 
      MOV   A,@R1 
      LCALL WRBYTE       ;開始寫入數(shù)據(jù) 
      LCALL CACK 
      JNB   ACK,IWRNBYTE 
      INC   R1 
      DJNZ  R3,WRDA      ;判斷寫完沒有
RETWRN: 
      LCALL STOP         ;結(jié)束總線子程序
      RET

;---------------------------------------------------------------------------------------------
; 向器件指定地址讀取數(shù)據(jù)
RD24C02: 
      MOV  B,#2               ;讀出的頁數(shù) 
      MOV  R1,#MRD 
      MOV  SUBA,#00H         ;器件子地址
RD00: 
      MOV  SLA,#CSI24WCXX  ;器件從地址(0A0H)送入緩沖區(qū)SLA(50H) 
      MOV  NUMBYTE,#8      ;讀取的字節(jié)數(shù) 
      CALL IRDNBYTE         ;向器件指定的地址讀取數(shù)據(jù) 
      MOV   SUBA,#08H      ;指定存儲器地址 
      MOV   R1,#MRD+8 
      DJNZ  B,RD00           ;數(shù)據(jù)讀完否?未完繼續(xù) 
      MOV  SLA,#CSI24WCXX  ;器件從地址(0A0H)送入緩沖區(qū)SLA(50H) 
      MOV  NUMBYTE,#2      ;讀取的字節(jié)數(shù) 
      MOV   SUBA,#16         ;指定存儲器地址 
      MOV   R1,#MRD+16 
      CALL IRDNBYTE          ;向器件指定的地址讀取數(shù)據(jù) 
      RET

;******** 向器件指定地址讀取N個數(shù)據(jù) ***********

IRDNBYTE: 
      MOV   R3,NUMBYTE     ;接收字節(jié)數(shù)送R3 
      LCALL START 
      MOV   A,SLA          ;器件從地址送A 
      LCALL WRBYTE         ;發(fā)送器件從地址 
      LCALL CACK 
      JNB   ACK,RETRDN 
      MOV   A,SUBA         ;指定子地址 
      LCALL WRBYTE 
      LCALL CACK 
      LCALL START          ;重新啟動總線 
      MOV   A,SLA 
      INC   A              ;器件從地址加1,準備進行讀操作 
      LCALL WRBYTE 
      LCALL CACK 
      JNB   ACK,IRDNBYTE   ;無應重新開始 
     ; MOV   R1,#MRD        ;接收數(shù)據(jù)緩沖區(qū)送A
RDN1: 
      LCALL RDBYTE         ;讀操作開始 
      MOV   @R1,A 
      DJNZ  R3,SACK 
      LCALL MNACK          ;最后一字節(jié)發(fā)NO應得信號
RETRDN: 
      LCALL STOP 
      RET
SACK: 
      LCALL MACK 
      INC   R1
rdn2: 
      SJMP  RDN1

;****** 啟動I2C總線子程序 *******

START: 
      SETB  SDA 
      NOP 
      SETB  SCL       ;起始條件建立時間大于4.7us 
      NOP 
      NOP 
      NOP 
      NOP 
      NOP 
      CLR   SDA 
      NOP            ;起始條件鎖定時間大于4us 
      NOP 
      NOP 
      NOP 
      NOP 
      CLR   SCL     ;鉗著總線準備發(fā)數(shù)據(jù) 
      NOP 
      RET

;****** 結(jié)束總線子程序 ************

STOP: 
      CLR   SDA 
      NOP 
      SETB  SCL     ;發(fā)送結(jié)束條件的時鐘信號 
      NOP           ;結(jié)束總線時間大于4us 
      NOP 
      NOP 
      NOP 
      NOP 
      SETB  SDA    ;結(jié)束總線 
      NOP          ;保證一個終止信號和起始信號的空閑時間大于4.7US 
      NOP 
      NOP 
      NOP 
      RET

;******** 發(fā)送應得信號子程序 *************

MACK: 
      CLR   SDA      ;將SDA清0 
      NOP 
      NOP 
      SETB  SCL 
      NOP            ;保持數(shù)據(jù)時間,即高時間大于4.7us 
      NOP 
      NOP 
      NOP 
      NOP 
      CLR   SCL 
      NOP 
      NOP 
      RET

;******* 發(fā)送非應得信號子程序 **************

MNACK: 
      SETB  SDA     ;將SDA置1 
      NOP 
      NOP 
      SETB  SCL 
      NOP           ;保持數(shù)據(jù)時間,即SCL為高時間大于4.7us 
      NOP 
      NOP 
      NOP 
      NOP 
      CLR   SCL 
      NOP 
      NOP 
      RET

;******* 檢查應得位子程序 **********
;返回值 ACK=1時表示有應答

CACK: 
      SETB  SDA 
      NOP 
      NOP 
      SETB  SCL 
      CLR   ACK        ;ACK標志位定義為10H 
      NOP 
      NOP 
      MOV   C,SDA 
      JC    CEND 
      SETB  ACK        ;判斷應答位
CEND: 
      NOP 
      CLR   SCL 
      NOP 
      RET

;******** 發(fā)送字節(jié)子程序 ************
;字節(jié)數(shù)據(jù)放入ACC
;每發(fā)送一字節(jié)要調(diào)用一次CACK子程序,取應得位

WRBYTE: 
      MOV   R0,#08H
WLP: 
      RLC   A         ;取數(shù)據(jù) 
      JC    WR1       ;若CY=1則跳轉(zhuǎn),CY=0向下 
      SJMP  WR0       ;判斷數(shù)據(jù)位
WLP1: 
      DJNZ  R0,WLP 
      NOP 
      RET
WR1: 
      SETB   SDA       ;發(fā)送1 
      NOP 
      SETB   SCL 
      NOP 
      NOP 
      NOP 
      NOP 
      NOP 
      CLR   SCL 
      SJMP  WLP1
WR0: 
      CLR   SDA      ;發(fā)送0 
      NOP 
      SETB  SCL 
      NOP 
      NOP 
      NOP 
      NOP 
      NOP 
      CLR    SCL 
      SJMP   WLP1

;****** 讀取字節(jié)子程序 ************
;讀出的值在ACC中
;每取一字節(jié)要發(fā)送一個應答/非應答信號

RDBYTE: 
      MOV   R0,#08H
RLP: 
      SETB  SDA 
      NOP 
      SETB  SCL       ;時鐘線為高,接收數(shù)據(jù)位 
      NOP 
      NOP 
      MOV   C,SDA     ;讀取數(shù)據(jù)位 
      MOV   A,R2 
      CLR   SCL       ;將SCL拉低,時間大于4.7us 
      RLC   A         ;進行數(shù)據(jù)位的處理 
      MOV   R2,A 
      NOP 
      NOP 
      NOP 
      DJNZ  R0,RLP    ;未夠8位,再來一次 
      RET
A5MS: 
      PUSH  ACC        ;延時5ms子程序 
      PUSH  B 
      MOV   10H,#10
DY1:  MOV   11H,#0FFH 
      DJNZ  11H,$ 
      DJNZ  10H,DY1 
      POP   B 
      POP   ACC 
      RET

 ;************* 測試數(shù)據(jù) ****************

MTDX: 
       MOV  MTD,#01H 
       MOV  MTD+1,#02H 
       MOV  MTD+2,#03H 
       MOV  MTD+3,#04H 
       MOV  MTD+4,#5 
       MOV  MTD+5,#6 
       MOV  MTD+6,#7 
       MOV  MTD+7,#8 
      ; RET
MTDX1: 
       MOV  MTD+8,#9 
       MOV  MTD+9,#10 
       MOV  MTD+10,#11 
       MOV  MTD+11,#12 
       MOV  MTD+12,#13 
       MOV  MTD+13,#14 
       MOV  MTD+14,#15 
       MOV  MTD+15,#16 
       MOV  MTD+16,#17 
       MOV  MTD+17,#18 
       RET
END

關鍵詞:AT24C02設計應用   帶I2C總線接口的E2PROM有許多型號系列,有多家生產(chǎn)廠商生產(chǎn),其中應用比較廣泛的是AT24CXX系列,AT24CXX系列E2PROM有AT24C01/02/04/08/16等其容量分別為128×8/256×8/512×8/1024×8/2048×8bit,關于AT24CXX的原理,很多書上都有介紹。這里主要闡述一下AT24C02在IC卡煤氣表中的具體應用。也算是個應用實例吧。   IC卡式煤氣表具有下列功能:預付費用氣,用氣量自動計算,低氣量提示、報警,電池欠壓提示,記憶,顯示剩余氣量,防竊氣,防磁,一表一卡及數(shù)據(jù)采集和恢復,漢字提示等功能。原理見圖(1)所示。                  圖(1)AT89C2051與AT24C02的連接 1.引腳功能 AT24C02芯片DIP封裝,其中:
   SDA、SCL:I2C總線接口;A2~A0:地址引腳;WP:寫保護引腳,WP接VSS時,禁止寫入高位地址,WP接VDD時,允許寫入任何地址;VDD、VSS電源端、接地端。 2.電路設計   圖(1)為應用電路原理,AT24C02的SDA和SCL分別接在AT89C2051的P3.0和P3.1上。時鐘線上接了一只47pf的電容器,目的是提高器件的抗干擾能力。 3.AT24C02工作原理   由于80C51芯片內(nèi)部無I2C總線接口,因此只能采用虛擬I2C總線方式,并且只能用于單主系統(tǒng)。即80C51作為I2C總線主器件,擴展器件作為從器件,從器件必須具有I2C總線接口。主器件80C51的虛擬I2C總線接口可用通用I/O口中任一口線充任。這里的主器件為AT89C2051,從器件為AT24C02。   AT24C02具有256×8(2K)bit的存儲容量,頁寫入字節(jié)數(shù)為8。通常EEPROM器件寫入時總需要一定的時間(5ms~10ms),因此在寫入程序中無法連續(xù)寫入多個數(shù)據(jù)字節(jié)。一次寫入EEPROM的字節(jié)數(shù)不大于器件的頁寫入字節(jié)數(shù)時,可按通常RAM的寫入速度將數(shù)據(jù)裝入EEPROM的數(shù)據(jù)寄存器中,隨后啟動自動寫入定時控制邏輯,經(jīng)過5ms~10mS的時間,自動將數(shù)據(jù)寄存器中的數(shù)據(jù)同步寫入EEPROM的指定單元。這樣只要一次寫入的字節(jié)數(shù)不多于頁寫入容量,總線對EEPROM的操作可視為對靜態(tài)RAM的操作,但要求下次數(shù)據(jù)寫入操作在5ms~10ms之后進行。   AT24C02器件地址格式如圖(2)所示。其中DA3~DA0位為器件固有地址編碼,由工廠給定,為1010,不能更改。A2~A0 3位引腳地址用于相同地址器件的識別。本電路為000。R/W為數(shù)據(jù)傳送方向。R/W=1時,主機接(讀);R/W=0時,主機發(fā)送(寫)。    
D7D6D5D4D3D2D1D0
DA3DA2DA1DA0A2A1A0R/W
  • 上一篇: 單片機控制的智能化節(jié)能路燈
  • 下一篇: AT89C2051在點鈔機外接顯示屏中的應用
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網(wǎng)友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1