新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機與24C02的通訊

        單片機與24C02的通訊

        作者: 時間:2016-11-23 來源:網絡 收藏
        I2C的起源:

        I2C(Inter-Integrated Circuit)總線是一種由PHILIPS公司開發的兩線式串行總線,用于連接微控制器及其外圍設備

        本文引用地址:http://www.104case.com/article/201611/320195.htm

        I2C的特點:

        I2C總線的長度可高達25英尺,并且能夠以10Kbps的最大傳輸速率支持40個組件;支持多主控(multimastering),其中任何能夠進行發送和接收的設備都可以成為主總線。一個主控能夠控制信號的傳輸和時鐘頻率。當然,在任何時間點上只能有一個主控。

        I2C總線工作原理:

        I2C總線是由數據線SDA和時鐘SCL構成的串行總線,可發送和接收數據。在CPU與被控IC之間、IC與IC之間進行雙向傳送,最高傳送速率100kbps。各種被控制電路均并聯在這條總線上,但就像電話機一樣只有撥通各自的號碼才能工作,所以每個電路和模塊都有唯一的地址,在信息的傳輸過程中,I2C總線上并接的每一模塊電路既是主控器(或被控器),又是發送器(或接收器),這取決于它所要完成的功能。CPU發出的控制信號分為地址碼和控制量兩部分,地址碼用來選址,即接通需要控制的電路,確定控制的種類;控制量決定該調整的類別(如對比度、亮度等)及需要調整的量。這樣,各控制電路雖然掛在同一條總線上,卻彼此獨立,互不相關。

        I2C總線在傳送數據過程中共有三種類型信號,它們分別是:開始信號、結束信號和應答信號。
        開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據。
        結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數據。
        應答信號:接收數據的IC在接收到8bit數據后,向發送數據的IC發出特定的低電平脈沖,表示已收到數據。CPU向受控單元發出一個信號后,等待受控單元發出一個應答信號,CPU接收到應答信號后,根據實際情況作出是否繼續傳遞信號的判斷。若未收到應答信號,由判斷為受控單元出現故障。

        AT24C02的工作原理:

        1.AT24C02的地址

        2.AT24C02的開始和結束信號

        3.AT24C02的應答信號:無論主從,每接收1個字節都要給出1個應答信號

        4.AT24C02的容量:8個字節為一頁,共32頁,地址范圍為00H~FFH,即00H~07H為第一頁,08H~0FH為第二頁,以此類推。在連續讀寫時,若讀取地址超過單頁的第八個地址,則又從該頁的第一個地址循環開始。

        5.AT24C02的讀寫:只有在SCL置低時,方可改變SDA的值,在SCL高電平期間,SDA需保持不變

        A.寫入單個字節

        B.連續寫入字節,當寫入到該頁最后一個地址單元時,再從該頁的起始單元寫入,如此反復。

        C.AT24C02當前指針地址讀一個字節

        D.指定AT24C02的內存地址讀取一個字節

        E.在當前AT24C02的地址指針位置開始,順序讀取多個字節,讀取到該頁最后一個字節時,再從該頁的第一個字節循環讀取

        單片機與AT24C02通訊范例:

        SCL EQU P3.6 ;定義SCL引腳
        SDA EQU P3.7 ;定義SDA引腳

        ORG 0000H
        AJMP MAIN
        ORG 0030H

        START: SETB SDA ;開始信號
        SETB SCL
        CLR SDA
        CLR SCL
        RET

        STOP: CLR SDA ;結束信號
        SETB SCL
        SETB SDA
        RET

        SEND: MOV R0,#08H ; 單片機向24C02寫入單字節子程序,1個bit1個bit地寫,連續寫8個
        SEND0: RLC A
        MOV SDA,C
        SETB SCL
        CLR SCL
        DJNZ R0,SEND0
        RET

        REV: MOV R0,#08H ; 單片機從24C02讀取單字節子程序,1個bit接1個bit地讀,連續8個
        REV0: MOV C,SDA
        RLC A
        SETB SCL
        CLR SCL
        DJNZ R0,REV0
        RET

        DELAY:MOV R6,#40 ; 用于結束信號的延時,在我的系統上少于1600us還不行,怪事
        D1: MOV R7,#40
        D2: DJNZ R7,D2
        DJNZ R6,D1
        RET

        ACK : SETB SCL ; 24C02的應答信號
        ;CLR SDA ; 接收1個字節后自動產生,無需給出
        CLR SCL
        RET

        ACK0: CLR SDA ; 單片機的應答信號,需要單片機主動給出
        SETB SCL
        CLR SCL
        SETB SDA ; 這一步不可省略,請仔細看時序圖
        RET

        MAIN: MOV DPTR,#TABLE

        ACALL START ; 開始信號
        MOV A,#0A0H ; 輸入24C02地址及寫入信號,因為I2C總線上只有24C02這個器件,所以A0,A1,A2接地
        ACALL SEND ; 發送到24C02
        ACALL ACK ; 等待24C02的應答

        MOV A,#00H ; 輸入24C02的地址指針,即寫入24C02的32頁地址段中的起始位置
        ACALL SEND ; 發送到24C02
        ACALL ACK ; 等待24C02的應答

        MOV R4,#00H ;此程序段功能為連續寫入8個字節
        MOV R5,#08H
        WRITE: MOV A,R4
        MOVC A,@A+DPTR
        ACALL SEND
        ACALL ACK
        INC R4
        DJNZ R5,WRITE
        ACALL STOP ;寫完后發出結束信號
        ACALL DELAY

        ACALL START ; 送出開始信號,進入指定24C02地址中讀取單個字節模式
        MOV A,#0A0H ; 輸入24C02地址及寫入信號
        ACALL SEND ; 發送到24C02
        ACALL ACK ; 等待24C02應答

        MOV A,#00H ; 輸入要在24C02中讀取的數據的指定地址
        ACALL SEND ; 發送到24C02
        ACALL ACK ; 等待24C02應答

        ACALL START ; 再次送出開始信號,準備讀取上面指定的24C02內存單元
        MOV A,#0A1H ; 輸入24C02地址及讀取信號
        ACALL SEND ; 發送到24C02
        ACALL ACK ; 等待24C02應答

        ACALL REV ; 調用讀取單個字節子程序
        ;ACALL ACK ; NO ACK ,指定地址讀取單個字節模式不需要ACK
        ACALL STOP ; 結束信號
        ACALL DELAY
        MOV 50H,A ; 將讀取到數據存入單片機50H地址中

        ACALL START ; 發送開始信號,進入連續讀取數據模式
        MOV A,#0A1H ; 輸入24C02地址及讀取信號
        ACALL SEND ; 發送到24C02
        ACALL ACK ; 等待24C02應答

        MOV R2,#07 ; 緊接上面的地址后連續讀取7個字節
        MOV R1,#51H ; 放入單片機的51H~57H地址單元
        READ: ACALL REV
        ACALL ACK0
        MOV @R1,A
        INC R1
        DJNZ R2,READ
        ACALL STOP
        ACALL DELAY

        LIGHT: MOV R1,#50H ; 從單片機的50H~57H單元中提取剛才存入的數據,顯示在數碼管上
        MOV R2,#08H
        MOV A,#0FEH
        LOOP: MOV P1,A
        MOV P0,@R1
        INC R1
        RL A
        ACALL DEL
        MOV P1,#0FFH
        DJNZ R2,LOOP
        AJMP LIGHT

        DEL :MOV R4,#20 ;數碼管顯示的延時
        D3: MOV R5,#20
        D4: DJNZ R5,D4
        DJNZ R4,D3
        RET

        TABLE: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
        END

        ;uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,;0,1,2,3,4,
        ;0x92,0x82,0xf8,0x80,0x90,;5,6,7,8,9,
        ;0x88,0x83,0xc6,0xa1,0x86,;A,B,C,D,E,
        ;0x8e,0x8c,0xc1,0xce,0x91,
        ;0x00,0xff}; //0-f,p,u,t,y,8.,滅共陽極數碼管顯示段碼



        關鍵詞: 單片機24C02通

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 集安市| 宁强县| 西昌市| 塔城市| 郁南县| 临安市| 绿春县| 柘城县| 澳门| 吉木乃县| 奈曼旗| 连州市| 南澳县| 防城港市| 郸城县| 济阳县| 望江县| 花莲县| 绥阳县| 防城港市| 东兰县| 长乐市| 皋兰县| 平果县| 徐汇区| 都匀市| 文安县| 洪江市| 荃湾区| 佳木斯市| 天柱县| 泾源县| 邹城市| 丹棱县| 晋州市| 秀山| 南汇区| 安陆市| 河西区| 麻阳| 元氏县|