新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機驅動I2C(24C02)匯編語言程序

51單片機驅動I2C(24C02)匯編語言程序

作者: 時間:2016-11-28 來源:網(wǎng)絡 收藏
;程序說明:將MPU內部的55h~~~58h中的內容由外部中斷0經I2C總線寫到24c02中,然后由外部中斷1將所寫的內容讀到
;MPU內部數(shù)據(jù)存儲器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ā)從機的地址
ACALL SEND ;發(fā)送控制字
ACALL ACKI;接收應答
JC OUTEND ;不響應,轉結束
MOV A,#00H;設置要讀取從器件的片內地址
ACALL SEND
ACALL ACKI
JC OUTEND
ACALL START ;開始信號
ORL A,#0A1H;設置控制字,準備接收
ACALL SEND ;發(fā)送控制字
ACALL ACKI
JC OUTEND
MOV R2,#4 ;準備接收數(shù)據(jù)的字節(jié)數(shù)
MOV R1,#60H ;接收字節(jié)存放在主器件中的地址60H
IN0:
ACALL REV ;接收一個字節(jié)
ACALL ACKO;主機向24C02發(fā)送應答信號
MOV @R1,A ;把接收到數(shù)據(jù)存放到存儲單元中
INC R1
DEC R2
CJNE R2,#1,IN0 ;判斷是否為最后一個接收字節(jié)
ACALL REV ;接收最后一個字節(jié)
ACALL ACKN;
MOV @R1,A ;把接收到數(shù)據(jù)存放到存儲單元中
OUTEND:
ACALL STOP ;停止信號
jnb p3.3,$
reti
;**********************************************************
;寫24C02的數(shù)據(jù)的程序
write:
LCALL START ;開始信號
MOV A,#0A0H ;定控制字,準備發(fā)送
ACALL SEND ;發(fā)送控制字
ACALL ACKI ;接收應答
JC WRITEEND ;從器件不響應,轉結束
MOV A,#00H ;設置從器件片內地址
ACALL SEND ;發(fā)送片內地址
ACALL ACKI
JC WRITEEND
MOV R2,#4;設置發(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ā)送未結束,繼續(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
; 接收一個字節(jié)
REV: MOV R0,#08H
REV0: SETB SCL
LCALL DELAY
MOV C,SDA
RLC A
CLR SCL
LCALL DELAY
DJNZ R0,REV0
RET
;發(fā)送一個字節(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
;接收一個應答位:
ACKI:
SETB SCL
ACALL DELAY
MOV C,SDA
CLR SCL
RET
; 發(fā)送一個接收應答位
ACKO:
CLR SDA
ACALL DELAY
SETB SCL
ACALL DELAY
CLR SCL
ACALL DELAY
SETB SDA
ACALL DELAY
RET
;發(fā)送一個非接收接收應答位
ACKN:
SETB SDA
ACALL DELAY
SETB SCL
ACALL DELAY
CLR SCL
ACALL DELAY
DELAY:
NOP
NOP
NOP
RET
END


評論


技術專區(qū)

關閉