基于AT89C51的单线双机通信协议
;按键功能入口
FUNCTION:
MOV A,KBUF1
CJNEA,#07FH,FUN1;+1
;MOVA,STATE
;ADDA,#01H
MOV A,#01H
MOV STATE,A
MOV SDATX,A
SETBSDF
CPL A
MOV P0,A
RET
FUN1:
CJNEA,#0F7H,FUN2;+2
;MOVA,STATE
;ADDA,#02H
MOV A,#02H
MOV STATE,A
MOV SDATX,A
SETBSDF
CPL A
MOV P0,A
RET
FUN2:
CJNEA,#0BFH,FUN3;+4
;MOVA,STATE
;ADDA,#04H
MOV A,#03H
MOV STATE,A
MOV SDATX,A
SETBSDF
CPL A
MOV P0,A
RET
FUN3:
CJNEA,#0FBH,FUN4;+8
;MOVA,STATE
;ADDA,#08H
MOV A,#04H
MOV STATE,A
MOV SDATX,A
SETBSDF
CPL A
MOV P0,A
RET
FUN4:
CJNEA,#0DFH,FUN5;+16
;MOVA,STATE
;ADDA,#10H
MOV A,#05H
MOV STATE,A
MOV SDATX,A
SETBSDF
CPL A
MOV P0,A
RET
FUN5:
CJNEA,#0FDH,FUN6;+32
MOV A,STATE
;ADDA,#20H
XRL A,#08H
MOV STATE,A
MOV SDATX,A
SETBSDF
CPL A
MOV P0,A
RET
FUN6:
CJNEA,#0EFH,FUN7;+64
MOV A,STATE
ADD A,#40H
MOV STATE,A
MOV SDATX,A
SETBSDF
CPL A
MOV P0,A
RET
FUN7:
CJNEA,#0FEH,FUN8;+128
MOV A,STATE
ADD A,#80H
MOV STATE,A
MOV SDATX,A
SETBSDF
CPL A
MOV P0,A
RET
FUN8:
RET
;=====================================================================
KEYREAD:
CLR P2.7
SETBP2.6
MOV A,P2
ANL A,#0FH
MOV KBUF0,A
SETBP2.7
CLR P2.6
MOV A,P2
ANL A,#0FH
SWAPA
ORL A,KBUF0
MOV KBUF0,A
CJNEA,KBUF1,KEYRD3
MOV A,KCNT
CJNEA,#03H,KEYRD1
RET
KEYRD1:
INC A
INC KCNT
CJNEA,#03H,KEYRD4
MOV A,KBUF1
CJNEA,#0FFH,KEYRD2
RET
KEYRD2:
CALLFUNCTION
RET
KEYRD3:
MOV KBUF1,A
MOV KCNT,#00H
KEYRD4:
RET
;==============================================================
INT_X0:
MOV RSCNT,#00H
MOV TH0,#00H
MOV TL0,#00H
MOV TMOD,#02H ;工作模式为定时方式2
MOV TCON,#10H ;允许定时器0工作
MOV IE,#82H ;允许定时器0中断
RETI
;===============================================================
INT_T0:
PUSHPSW
PUSHA
MOV DPTR,#T0_ENTRY
MOV A,RSCNT
INC RSCNT
RLA
JMP @A+DPTR
T0_ENTRY:
AJMPINT_T0N0;空操作
AJMPINT_T010;响应
AJMPINT_T0N0
AJMPINT_T020;标志0
AJMPINT_T0N0
AJMPINT_T030;标志1
AJMPINT_T0N0
AJMPINT_T0W0
AJMPINT_T0R0
AJMPINT_T0W1
AJMPINT_T0R1
AJMPINT_T0W2
AJMPINT_T0R2
AJMPINT_T0W3
AJMPINT_T0R3
AJMPINT_T0W4
AJMPINT_T0R4
AJMPINT_T0W5
AJMPINT_T0R5
AJMPINT_T0W6
AJMPINT_T0R6
AJMPINT_T0W7
AJMPINT_T0R7
;AJMP INT_T0W8
;AJMP INT_T0R8
;AJMP INT_T0W9
;AJMP INT_T0R9
AJMPINT_T0WE;写结束位(写数据)
AJMPINT_T0RE;读结束位(读数据)
AJMPINT_T0WAL ;写响应位(读数据)/终止结束位(写数据)
AJMPINT_T0RA;读响应位(写数据)写结束
AJMPINT_T0WAH ;终止响应位(读数据)读结束
;==============================================================
INT_T0N0: ;空操作
POP A
RETI
;==============================================================
INT_T010: ;响应
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
POP A
POP PSW
RETI
;==============================================================
INT_T020: ;标志0
JBSDF,INT_T021
CLR RSF ;无数据发送,设置读标识
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
INT_T021:
SETBRSF ;有数据发送,设置写标志
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
POP A
POP PSW
RETI
;==============================================================
INT_T030: ;标志1
JBRSF,INT_031
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
POP A
POP PSW
RETI
INT_031 :
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
;==============================================================
INT_T0W0:
JNB RSF,T0W01
JNB SDATX.0,T0W02 ;写第一位
T0W01 :
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W02 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
POP A
POP PSW
RETI
;==============================================================
INT_T0R0:
JBRSF,T0R02 ;读第一位
JNB CTPIO,T0R01
SETBRDATX.0
POP A
POP PSW
RETI
T0R01 :
CLR RDATX.0
T0R02 :
POP A
POP PSW
RETI
;==============================================================
INT_T0W1:
JNB RSF,T0W12
JNB SDATX.1,T0W11
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W11 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W12 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R1:
JBRSF,T0R12
JNB CTPIO,T0R11
SETBRDATX.1
POP A
POP PSW
RETI
T0R11 :
CLR RDATX.1
T0R12 :
POP A
POP PSW
RETI
;===============================
评论