久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

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

作者:韓冰   來源:本站原創   點擊數:  更新時間:2013年11月30日   【字體:

實驗要求:由AT89S52內部定時器1,按方式1工作,每1秒鐘24C02的0001H單元內容加2,以鍵盤作為外部中斷輸入信號,有鍵按下時,讀取0001H單元內容并由LED顯示。

//This is the sixth program of the homework;
//Name :Wang Qi     Date:2013/3/11  北京化工大學   自實1001
     SDA EQU P2.0
    SCL EQU P2.1
    ORG 0000H     //主函數入口
    SJMP MAIN
   ORG 0013H     //外部中斷1入口
   LJMP WZD0
   ORG 001BH     //計時器1入口
   LJMP WT1
   ORG 0050H  
MAIN:        MOV SP,#60H
                   MOV TMOD,#10H  //設置T1工作方式
                  MOV TH1,#4CH   //設初值
   MOV TL1,#00H
   MOV R7,#10  //計數器
   SETB EA                 //全局中斷
   SETB ET1  //允許定時器1
   SETB TR1 //啟動定時器1
                   SETB IT1 //外部中斷跳變觸發方式
   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                //保護現場
 PUSH TL1    
 CLR  TR1                 //停止T1計數
  MOV  R2,#01H 
                 CALL DU
                 MOV P1,R3    
 POP TL1
 POP TH1
 SETB TR1 
 RETI
WT1:        MOV TH1,#4CH      //定時函數
                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協議摘自網絡  Thanks to the author
XIE: //寫數據子程序,R2是要寫入的24c02的字節位置地址,R3是要寫入的內容
LCALL STAR;起始條件
MOV A,#10100000B //尋址24C02的總線硬件地址并使用寫入命令
LCALL SDATA        //傳輸數據A給24C02
MOV A,R2                //確定要寫入的字節位置地址
LCALL SDATA        //傳輸數據A給24C02
MOV A,R3               //把數據R3寫入剛指定的字節地址
LCALL SDATA       //傳輸數據A給24C02
LCALL STOP          //寫入結束
LCALL CHULI //提供2ms給24C02內部處理剛寫入的數據
RET
DU:   ;讀數據子程序,R2是要讀的24c02的字節位置地址,讀完后A傳給R3
LCALL STAR;起始條件
MOV A,#10100000B//尋址24C02的總線硬件地址并使用寫入命令
LCALL SDATA      //傳輸數據A給24C02
MOV A,R2   //注意,這里是使24C02的字節地址指針變成R2的值,也就是確定要讀取的字節位置地址
LCALL SDATA     //傳輸數據A給24C02
LCALL STAR        //重復起始條件
MOV A,#10100001B//尋址24C02的總線硬件地址并使用讀出命令(這里正式發起讀命令)
LCALL SDATA//傳輸數據A給24C02
LCALL RDATA//從之前指定的字節地址中讀出字節內容到A
LCALL STOP //讀取完畢(這里并沒有連續讀取,只能讀一個字節,要多個字節連續讀取,請自己在R2上做變址讀取循環)
MOV R3,A     //讀出的字節傳給R3
RET
STAR:SETB SDA //起始條件子程序
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
RET
SDATA:MOV R0,#08H //向24C02傳輸數據子程序
LOOP0:CLR SCL
RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
DJNZ R0,LOOP0
CLR SCL
NOP
SETB SDA
NOP
NOP
SETB SCL
REP:MOV C,SDA
JC REP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
RDATA:MOV R0,#08H  //從24C02讀取數據子程序(讀取一個字節以后不做應答)
LOOP1:SETB SCL
NOP
NOP
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
NOP
NOP
NOP
NOP
DJNZ R0,LOOP1
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
RET
STOP:CLR SDA   ;結束條件
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
CHULI:  //1999uS ;這里是用于寫完數據以后留給24C02的內部數據處理時間,2ms是一個非常保險的時間,最短需要1ms
    MOV R6,#04H
    WR0:
    MOV R5,#0F8H
    DJNZ R5,$
    DJNZ R6,WR0
    RET
END
 

關閉窗口

相關文章

主站蜘蛛池模板: 国产在线观看一区二区三区 | 国产精品揄拍一区二区 | 欧美日韩国产精品一区二区 | 日韩精品视频中文字幕 | 日韩精品一区二区三区第95 | 亚洲aⅴ| 欧美啪啪 | 国产一区二区影院 | 国产精品99久久久久久宅男 | 91精品久久久久久久久久 | 日韩精品成人av | 亚洲国产一区二区三区 | 国产欧美一区二区三区久久手机版 | 中文字幕三区 | 国产日韩免费视频 | 黄色免费在线观看 | 欧美成ee人免费视频 | 亚洲一区二区三区免费观看 | 91av视频在线 | 欧美网站一区二区 | 欧美一级网站 | 国产免费一区二区三区 | japan25hdxxxx日本| 亚洲自拍一区在线观看 | av一二三区 | 蜜臀久久99精品久久久久野外 | 四虎永久在线精品免费一区二 | 狠狠干网站 | 蜜桃av人人夜夜澡人人爽 | 国产视频中文字幕 | 国产精品高潮呻吟久久av野狼 | 久色激情| 日韩和的一区二区 | 欧美一区二区三区一在线观看 | 91亚洲国产亚洲国产 | 国产精品久久久久久久久久 | 成人免费黄视频 | 免费一区二区 | 伊人春色在线观看 | 欧美日韩在线免费观看 | 日韩av美女电影 |