新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)驅(qū)動(dòng)I2C(24C02)匯編語言程序

        51單片機(jī)驅(qū)動(dòng)I2C(24C02)匯編語言程序

        作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
        ;程序說明:將MPU內(nèi)部的55h~~~58h中的內(nèi)容由外部中斷0經(jīng)I2C總線寫到24c02中,然后由外部中斷1將所寫的內(nèi)容讀到
        ;MPU內(nèi)部數(shù)據(jù)存儲(chǔ)器60H~~63H
        SCL EQU P1.1
        SDA EQU P1.0
        org 0000h
        jmp begin
        org 0003H
        ljmp write
        org 0013H
        ljmp read
        ;主程序
        begin:
        mov 55H,#41H
        mov 56h,#42h
        MOV 57h,#43H
        MOV 58H,#44H
        mov tcon,#0
        setb ex0
        setb ex1
        setb ea
        main:
        nop
        jmp main
        ;**********************************************************
        ;讀24C02的數(shù)據(jù)的程序
        read:
        ACALL START ;開始信號
        MOV A,#0A0H ;發(fā)從機(jī)的地址
        ACALL SEND ;發(fā)送控制字
        ACALL ACKI;接收應(yīng)答
        JC OUTEND ;不響應(yīng),轉(zhuǎn)結(jié)束
        MOV A,#00H;設(shè)置要讀取從器件的片內(nèi)地址
        ACALL SEND
        ACALL ACKI
        JC OUTEND
        ACALL START ;開始信號
        ORL A,#0A1H;設(shè)置控制字,準(zhǔn)備接收
        ACALL SEND ;發(fā)送控制字
        ACALL ACKI
        JC OUTEND
        MOV R2,#4 ;準(zhǔn)備接收數(shù)據(jù)的字節(jié)數(shù)
        MOV R1,#60H ;接收字節(jié)存放在主器件中的地址60H
        IN0:
        ACALL REV ;接收一個(gè)字節(jié)
        ACALL ACKO;主機(jī)向24C02發(fā)送應(yīng)答信號
        MOV @R1,A ;把接收到數(shù)據(jù)存放到存儲(chǔ)單元中
        INC R1
        DEC R2
        CJNE R2,#1,IN0 ;判斷是否為最后一個(gè)接收字節(jié)
        ACALL REV ;接收最后一個(gè)字節(jié)
        ACALL ACKN;
        MOV @R1,A ;把接收到數(shù)據(jù)存放到存儲(chǔ)單元中
        OUTEND:
        ACALL STOP ;停止信號
        jnb p3.3,$
        reti
        ;**********************************************************
        ;寫24C02的數(shù)據(jù)的程序
        write:
        LCALL START ;開始信號
        MOV A,#0A0H ;定控制字,準(zhǔn)備發(fā)送
        ACALL SEND ;發(fā)送控制字
        ACALL ACKI ;接收應(yīng)答
        JC WRITEEND ;從器件不響應(yīng),轉(zhuǎn)結(jié)束
        MOV A,#00H ;設(shè)置從器件片內(nèi)地址
        ACALL SEND ;發(fā)送片內(nèi)地址
        ACALL ACKI
        JC WRITEEND
        MOV R2,#4;設(shè)置發(fā)送字節(jié)數(shù)
        MOV R1,#55H ;主器件中要發(fā)送數(shù)據(jù)的頭地址
        OUT1:
        MOV A,@R1
        ACALL SEND;發(fā)送數(shù)據(jù)
        ACALL ACKI;
        JC WRITEEND
        INC R1
        DJNZ R2,OUT1 ;發(fā)送未結(jié)束,繼續(xù)發(fā)送
        WRITEEND:
        ACALL STOP ;停止信號
        jnb p3.2,$;防止再次中斷
        reti
        ;********************************************************
        ;********************
        ;I2C模擬程序
        ;開始信號
        START:
        CLR SCL
        SETB SDA
        ACALL DELAY
        SETB SCL
        ACALL DELAY
        CLR SDA
        ACALL DELAY
        CLR SCL
        RET
        ; 停止信號:
        STOP:CLR SCL
        CLR SDA
        ACALL DELAY
        SETB SCL
        ACALL DELAY
        SETB SDA
        ACALL DELAY
        RET
        ; 接收一個(gè)字節(jié)
        REV: MOV R0,#08H
        REV0: SETB SCL
        LCALL DELAY
        MOV C,SDA
        RLC A
        CLR SCL
        LCALL DELAY
        DJNZ R0,REV0
        RET
        ;發(fā)送一個(gè)字節(jié)
        SEND:
        MOV R0,#08H
        CLR SCL
        SEND0:
        RLC A
        MOV SDA,C
        SETB SCL
        ACALL DELAY
        CLR SCL
        DJNZ R0,SEND0
        SETB SDA
        RET
        ;接收一個(gè)應(yīng)答位:
        ACKI:
        SETB SCL
        ACALL DELAY
        MOV C,SDA
        CLR SCL
        RET
        ; 發(fā)送一個(gè)接收應(yīng)答位
        ACKO:
        CLR SDA
        ACALL DELAY
        SETB SCL
        ACALL DELAY
        CLR SCL
        ACALL DELAY
        SETB SDA
        ACALL DELAY
        RET
        ;發(fā)送一個(gè)非接收接收應(yīng)答位
        ACKN:
        SETB SDA
        ACALL DELAY
        SETB SCL
        ACALL DELAY
        CLR SCL
        ACALL DELAY
        DELAY:
        NOP
        NOP
        NOP
        RET
        END


        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 渝中区| 讷河市| 太白县| 龙州县| 洪洞县| 平和县| 徐州市| 曲水县| 陈巴尔虎旗| 桑植县| 南靖县| 孟津县| 万山特区| 城口县| 大渡口区| 沈丘县| 定南县| 运城市| 乌拉特前旗| 文成县| 大城县| 甘德县| 诏安县| 吉安县| 滦南县| 楚雄市| 南宁市| 娄烦县| 织金县| 太原市| 钦州市| 黑龙江省| 渭源县| 本溪市| 禄丰县| 图木舒克市| 怀安县| 西昌市| 陇川县| 同仁县| 大厂|