新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機匯編實驗六:I2C串行總線存儲器讀寫實驗

        單片機匯編實驗六:I2C串行總線存儲器讀寫實驗

        作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
        實驗要求:由AT89S52內(nèi)部定時器1,按方式1工作,每1秒鐘24C02的0001H單元內(nèi)容加2,以鍵盤作為外部中斷輸入信號,有鍵按下時,讀取0001H單元內(nèi)容并由LED顯示。

        //This is the sixthprogramof the homework;
        //Name :Wang Qi Date:2013/3/11 北京化工大學(xué) 自實1001
        SDA EQU P2.0
        SCL EQU P2.1
        ORG 0000H //主函數(shù)入口
        SJMP MAIN
        ORG 0013H //外部中斷1入口
        LJMP WZD0
        ORG 001BH //計時器1入口
        LJMP WT1
        ORG 0050H
        MAIN: MOV SP,#60H
        MOV TMOD,#10H //設(shè)置T1工作方式
        MOV TH1,#4CH //設(shè)初值
        MOV TL1,#00H
        MOV R7,#10 //計數(shù)器
        SETB EA //全局中斷
        SETB ET1 //允許定時器1
        SETB TR1 //啟動定時器1
        SETB IT1 //外部中斷跳變觸發(fā)方式
        SETB EX1 //允許外部中斷1
        OK: MOV C,P3.4 //掃描鍵盤
        JNC OK1
        MOV C,P3.5
        JNC OK1
        MOV C,P3.6
        JNC OK1
        MOV C,P3.7
        JNC OK1
        SJMP OK
        OK1: CLR P3.3 //中斷信號
        SETB P3.3
        SJMP OK
        WZD0:
        SETB P3.3 //中斷程序
        PUSH TH1 //保護現(xiàn)場
        PUSH TL1
        CLR TR1 //停止T1計數(shù)
        MOV R2,#01H
        CALL DU
        MOV P1,R3
        POP TL1
        POP TH1
        SETB TR1
        RETI
        WT1: MOV TH1,#4CH //定時函數(shù)
        MOV TL1,#00H
        DJNZ R7,RET0
        MOV R7,#10 //1秒到來了
        INC 30H
        INC 30H
        mov R2,#01H
        MOV R3,30H
        CALL XIE
        RET0: RETI

        //////////////I2C協(xié)議摘自網(wǎng)絡(luò) Thanks to the author
        XIE: //寫數(shù)據(jù)子程序,R2是要寫入的24c02的字節(jié)位置地址,R3是要寫入的內(nèi)容
        LCALL STAR;起始條件
        MOV A,#10100000B //尋址24C02的總線硬件地址并使用寫入命令
        LCALL SDATA //傳輸數(shù)據(jù)A給24C02
        MOV A,R2 //確定要寫入的字節(jié)位置地址
        LCALL SDATA //傳輸數(shù)據(jù)A給24C02
        MOV A,R3 //把數(shù)據(jù)R3寫入剛指定的字節(jié)地址
        LCALL SDATA //傳輸數(shù)據(jù)A給24C02
        LCALL STOP //寫入結(jié)束
        LCALL CHULI //提供2ms給24C02內(nèi)部處理剛寫入的數(shù)據(jù)
        RET
        DU: ;讀數(shù)據(jù)子程序,R2是要讀的24c02的字節(jié)位置地址,讀完后A傳給R3
        LCALL STAR;起始條件
        MOV A,#10100000B//尋址24C02的總線硬件地址并使用寫入命令
        LCALL SDATA //傳輸數(shù)據(jù)A給24C02
        MOV A,R2 //注意,這里是使24C02的字節(jié)地址指針變成R2的值,也就是確定要讀取的字節(jié)位置地址
        LCALL SDATA //傳輸數(shù)據(jù)A給24C02
        LCALL STAR //重復(fù)起始條件
        MOV A,#10100001B//尋址24C02的總線硬件地址并使用讀出命令(這里正式發(fā)起讀命令)
        LCALL SDATA//傳輸數(shù)據(jù)A給24C02
        LCALL RDATA//從之前指定的字節(jié)地址中讀出字節(jié)內(nèi)容到A
        LCALL STOP //讀取完畢(這里并沒有連續(xù)讀取,只能讀一個字節(jié),要多個字節(jié)連續(xù)讀取,請自己在R2上做變址讀取循環(huán))


        上一頁 1 2 下一頁

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 古交市| 个旧市| 东光县| 西丰县| 宣武区| 大化| 镇平县| 萝北县| 启东市| 郓城县| 潢川县| 神农架林区| 慈溪市| 胶南市| 汪清县| 桂平市| 南城县| 乌拉特后旗| 衡阳县| 阳城县| 邯郸市| 东源县| 辽宁省| 治多县| 云龙县| 台州市| 鄂托克旗| 班戈县| 宁安市| 周至县| 句容市| 达州市| 遵化市| 朝阳市| 资溪县| 阳山县| 宁陕县| 安西县| 湾仔区| 微博| 新营市|