一、绪言
因工作需要,设计一单线双向双机通讯协议。要求主机通过其所带的键盘能控制主机和从机的显示,从机也能通过所带的键盘控制主机和从机的显示,主机和从机键盘所起的控制作用完全一致,显示也完全一致。
另外,从机可以随时脱离主机。当从机从脱机状态连上主机时,要求从机能立即显示主机的键盘信息,即双机显示一致。
二、设计概况
1.整体时序:
2.主机接收数据从机发送数据的时序:
3.主机发送数据从机接收数据的时序:
4.符号说明:
S :开始位
A :响应位
E :结束位
R :读端口
W :写端口
Dx:数据
5.主从机同步原理:
由图可知,主从机的读写是互不冲突的,任意时刻只允许一个写,但允许两个都处于读状态。从整体上讲,数据是按帧传输的,但从定时器中断方面来说,数据是按位传输的,因为一次定时器中断只传送一个位,而不是完整的一帧数据。在数据未开始传输前,从机IO口处于边沿中断接收状态,其定时器中断是关闭的。主机永远处于定时中断状态。当主机发出开始位之后,若存在从机,则从机会发出一个低电平响应;否则表示通讯失败,几个时钟周期之后,主机会接着发起下一次数据传输的开始位。在通讯过程中,任意一个响应位不成立均宣告通讯失败,同时此次通讯结束。
综上所述,在数据传输开始时,靠“外部边沿中断”同步,在数据传输开始之后,靠“定时器中断”同步。
6.协议的稳健性
(1)速度问题:
以单放机、CD机等的现控为例,由于处理器的主要任务为信号处理,所以要求通讯占用的时间越少越好,而且通讯数据量也不大,该协议正是基于该类设计的。由于每次只发送一位数据,故占用的MCU时间非常少.
(2)可靠性问题:
在该协议中,存在两个响应位、一个结束位,还有标志位,这些为数据的合法性的检测提供了依据。另外,由于主从通讯只需传输单放机、CD机等的“按键”或“工作状态”数据,故数据量根本用不着8位,多余的位可用于校验,例如采用奇偶校验、汉明码等。
(3)效果检测
通过由两块AT89C51组成的单片机系统试验,该协议工作完全正常,并具备即插即用功能,即在主机工作时,从机可以随时拔下插上而不会影响主从机工作状态及其显示。该协议已于国内某知名企业的单放机的大批量生产中采用。
1.主机源程序
;主机程序
KBUF0 EQU 24H ;键值临时缓冲
KBUF1 EQU 25H ;键值缓冲
KCNTEQU 26H ;键盘重复计数
DLYD0 EQU 27H ;延迟变量
DLYD1 EQU 28H ;延迟变量
DLYD2 EQU 29H ;延迟变量
RSCNT EQU 2AH
RSI BIT 00H ;收发开始标志
RSF BIT 01H ;收/发标志
RSF0BIT 02H ;收发标志0
RSF1BIT 03H ;收发标志1
;SDFBIT 04H ;有数据发送标志
RDF BIT 05H ;有接收数据标志
STATE EQU 2BH
SDATX EQU 22H
RDATX EQU 23H
CTPIO BIT 0B2H
TSIOBIT 0B3H
ORG 00H
AJMPMAIN
ORG 0BH
AJMPINT_T0
ORG 100H
MAIN:
MOV SP,#50H
MOV KBUF0,#00H
MOV KBUF1,#00H
MOV KCNT,#00H
MOV STATE,#00H
MOV SDATX,#00H
MOV RDATX,#00H
MOV RSCNT,#00H
MOV 20H,#00H
MOV P0,#00H
CLR RSF
MOV TH0,#00H
MOV TL0,#00H
MOV TMOD,#02H ;工作模式为定时方式2
MOV TCON,#10H ;允许定时器0工作
MOV IE,#82H
LOOPX:
CALLKEYREAD ;读键盘
CALLDLY2MS;延迟2ms
JMP LOOPX
;按键功能入口
FUNCTION:
MOV A,KBUF1
CJNEA,#07FH,FUN1;+1
;MOVA,STATE
;ADDA,#01H
MOV A,#01H
MOV STATE,A
CPL A
MOV P0,A
;SETB SDF
JMP LOOPX
FUN1:
CJNEA,#0F7H,FUN2;+2
;MOVA,STATE
;ADDA,#02H
MOV A,#02H
MOV STATE,A
CPL A
MOV P0,A
;SETB SDF
JMP LOOPX
FUN2:
CJNEA,#0BFH,FUN3;+4
;MOVA,STATE
;ADDA,#04H
MOV A,#03H
MOV STATE,A
CPL A
MOV P0,A
;SETB SDF
JMP LOOPX
FUN3:
CJNEA,#0FBH,FUN4;+8
;MOVA,STATE
;ADDA,#08H
MOV A,#04H
MOV STATE,A
CPL A
MOV P0,A
;SETB SDF
JMP LOOPX
FUN4:
CJNEA,#0DFH,FUN5;+16
;MOVA,STATE
;ADDA,#10H
MOV A,#05H
MOV STATE,A
CPL A
MOV P0,A
;SETB SDF
JMP LOOPX
FUN5:
CJNEA,#0FDH,FUN6;+32
MOV A,STATE
;ADDA,#20H
XRL A,#08H
MOV STATE,A
CPL A
MOV P0,A
;SETB SDF
JMP LOOPX
FUN6:
CJNEA,#0EFH,FUN7;+64
MOV A,STATE
ADD A,#40H
MOV STATE,A
CPL A
MOV P0,A
;SETB SDF
JMP LOOPX
FUN7:
CJNEA,#0FEH,FUN8;+128
MOV A,STATE
ADD A,#80H
MOV STATE,A
CPL A
MOV P0,A
;SETB SDF
JMP LOOPX
FUN8:
JMP LOOPX
;==================================================================
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,KEYRD4
MOV A,KCNT
CJNEA,#03H,KEYRD1
RET
KEYRD1:
INC A
INC KCNT
CJNEA,#03H,KEYRD5
MOV A,KBUF1
CJNEA,#0FFH,KEYRD2
RET
KEYRD2:
POP A
POP A
;MOVP0,A
KEYRD3:
JMP FUNCTION
KEYRD4:
MOV KBUF1,A
MOV KCNT,#00H
KEYRD5:
RET
;===============================================================
INT_T0:
PUSHPSW
PUSHA
JBRSI,INT_T01
SETBRSI
MOV RSCNT,#00H
POP A
POP PSW
RETI
INT_T01 :
MOV DPTR,#T0_ENTRY
MOV A,RSCNT
INC RSCNT
RLA
JMP @A+DPTR
T0_ENTRY:
AJMPINT_T010;设置开始位
AJMPINT_T0N0
AJMPINT_T020;终止开始位
AJMPINT_T030;读响应
AJMPINT_T0N0
AJMPINT_T040;读标志0
AJMPINT_T0N0
AJMPINT_T050;读标志1
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
POP PSW
RETI
;==============================================================
INT_T010: ;发送开始位
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
POP A
POP PSW
RETI
;==============================================================
INT_T020: ;终止开始位
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
;==============================================================
INT_T030: ;读响应
JNB CTPIO,INT_T031
JMP ERROR1
INT_T031:
POP A
POP PSW
RETI
;==============================================================
INT_T040: ;读标志0
JBCTPIO,INT_T041
CLR RSF0;RSF0=0
POP A
POP PSW
RETI
INT_T041:
SETBRSF0;RSF0=1
POP A
POP PSW
RETI
;==============================================================
INT_T050: ;读标志1
JBCTPIO,INT_051
CLR RSF1;RSF1=0
JBRSF0,INT_052
JMP ERROR2;RSF:00错
INT_052 :
SETBRSF ;RSF:10主发从收
MOV SDATX,STATE
POP A
POP PSW
RETI
INT_051 :
SETBRSF1;RSF1=1
JNB RSF0,INT_053
JMP ERROR3;RSF:11错
INT_053 :
CLR RSF ;RSF:01主收从发
POP A
POP PSW
RETI
;==============================================================
INT_T0W0:
JNB RSF,T0W02
JNB SDATX.0,T0W01
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W01 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W02 :
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
;==============================================================
INT_T0W2:
JNB RSF,T0W22
JNB SDATX.2,T0W21
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W21 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W22 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R2:
JBRSF,T0R22
JNB CTPIO,T0R21
SETBRDATX.2
POP A
POP PSW
RETI
T0R21 :
CLR RDATX.2
T0R22 :
POP A
POP PSW
RETI
;==============================================================
INT_T0W3:
JNB RSF,T0W32
JNB SDATX.3,T0W31
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W31 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W32 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R3:
JBRSF,T0R32
JNB CTPIO,T0R31
SETBRDATX.3
POP A
POP PSW
RETI
T0R31 :
CLR RDATX.3
T0R32 :
POP A
POP PSW
RETI
;==============================================================
INT_T0W4:
JNB RSF,T0W42
JNB SDATX.4,T0W41
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W41 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W42 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R4:
JBRSF,T0R42
JNB CTPIO,T0R41
SETBRDATX.4
POP A
POP PSW
RETI
T0R41 :
CLR RDATX.4
T0R42 :
POP A
POP PSW
RETI
;==============================================================
INT_T0W5:
JNB RSF,T0W52
JNB SDATX.5,T0W51
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W51 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W52 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R5:
JBRSF,T0R52
JNB CTPIO,T0R51
SETBRDATX.5
POP A
POP PSW
RETI
T0R51 :
CLR RDATX.5
T0R52 :
POP A
POP PSW
RETI
;==============================================================
INT_T0W6:
JNB RSF,T0W62
JNB SDATX.6,T0W61
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W61 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W62 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R6:
JBRSF,T0R62
JNB CTPIO,T0R61
SETBRDATX.6
POP A
POP PSW
RETI
T0R61 :
CLR RDATX.6
T0R62 :
POP A
POP PSW
RETI
;==============================================================
INT_T0W7:
JNB RSF,T0W72
JNB SDATX.7,T0W71
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W71 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W72 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R7:
JBRSF,T0R72
JNB CTPIO,T0R71
SETBRDATX.7
POP A
POP PSW
RETI
T0R71 :
CLR RDATX.7
T0R72 :
POP A
POP PSW
RETI
;==============================================================
INT_T0WE: ;写结束位(写数据)
JNB RSF,T0WE1
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0WE1 :
POP A
POP PSW
RETI
;==============================================================
INT_T0RE: ;读结束位(读数据)
JBRSF,T0RE1
JNB CTPIO,T0RE1
JMP ERROR4
T0RE1 :
POP A
POP PSW
RETI
;==============================================================
INT_T0WAL:;写响应位(读数据)/终止结束位(写数据)
JNB RSF,T0WAL1
;SETB CTPIO ;终止结束位(写数据)
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0WAL1:
;CLRCTPIO ;写响应位(读数据)
;CLRTSIO
MOV P3,#00H
POP A
POP PSW
RETI
;==============================================================
INT_T0RA: ;读响应位(写数据)写结束
JNB RSF,T0RA2
JNB CTPIO,T0RA1
JMP ERROR5
T0RA1 :
CLR RSI ;设置收发结束标志
;CLRSDF ;设置数据已发送标志
MOV SDATX,STATE
;MOVSDATX,#00H
T0RA2 :
POP A
POP PSW
RETI
;==============================================================
INT_T0WAH:;终止响应(读数据)读结束
JNB RSF,T0WAH1
JMP ERROR6
T0WAH1:
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
SETBRDF ;设置有新接收数据标志
CLR RSI ;设置收发结束标志
MOV A,RDATX ;处理数据
MOV STATE,A
CPL A
MOV P0,A
CLR RDF ;数据已处理,清标志
POP A
POP PSW
RETI
;==============================================================
ERROR1:
CLR RSI
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
;MOVP0,#0FEH
POP A
POP PSW
RETI
;==============================================================
ERROR2:
CLR RSI
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
;MOVP0,#0FCH
POP A
POP PSW
RETI
;==============================================================
ERROR3:
CLR RSI
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
;MOVP0,#0F8H
POP A
POP PSW
RETI
;==============================================================
ERROR4:
CLR RSI
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
;MOVP0,#0F0H
POP A
POP PSW
RETI
;==============================================================
ERROR5:
CLR RSI
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
;MOVP0,#0E0H
POP A
POP PSW
RETI
;==============================================================
ERROR6:
CLR RSI
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
;MOVP0,#0C0H
POP A
POP PSW
RETI
;================================================================
DLY2MS:
MOV DLYD0,#02H
DLY2MS1:
MOV DLYD1,#0FFH
DLY2MS2:
DJNZDLYD1,DLY2MS2
DJNZDLYD0,DLY2MS1
RET
;================================================================
2.从机源程序
;子机程序
KBUF0 EQU 24H ;键值临时缓冲
KBUF1 EQU 25H ;键值缓冲
KCNTEQU 26H ;键盘重复计数
DLYD0 EQU 27H ;延迟变量
DLYD1 EQU 28H ;延迟变量
DLYD2 EQU 29H ;延迟变量
RDATX EQU 22H
SDATX EQU 23H
STATE EQU 2AH
RSCNT EQU 29H
CTPIO BIT 0B2H
TSIOBIT 0B3H
SDF BIT 00H ;有数据发送标志
RDF BIT 01H ;有接收数据标志
RSF BIT 02H ;数据收发选择位
ORG 00H
AJMPMAIN
ORG 03H
AJMPINT_X0
ORG 0BH
AJMPINT_T0
ORG 100H
MAIN:
MOV SP,#50H
MOV SDATX,#00H
MOV RDATX,#00H
MOV KBUF0,#00H
MOV KBUF1,#00H
MOV KCNT,#00H
MOV RSCNT,#00H
MOV 20H,#00H
MOV TCON,#01H ;下降沿中断
MOV P0,#00H
MOV IE,#81H ;开外部中断0
LOOPX:
CALLKEYREAD ;读键盘
CALLDLY2MS;延迟2ms
JMP LOOPX
;按键功能入口
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
POP PSW
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
;==============================================================
INT_T0W2:
JNB RSF,T0W22
JNB SDATX.2,T0W21
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W21 :
CLR CTPIO
CLR TSIO
MOV P3,#00H
T0W22 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R2:
JBRSF,T0R22
JNB CTPIO,T0R21
SETBRDATX.2
POP A
POP PSW
RETI
T0R21 :
CLR RDATX.2
T0R22 :
POP A
POP PSW
RETI
;==============================================================
INT_T0W3:
JNB RSF,T0W32
JNB SDATX.3,T0W31
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W31 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W32 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R3:
JBRSF,T0R32
JNB CTPIO,T0R31
SETBRDATX.3
POP A
POP PSW
RETI
T0R31 :
CLR RDATX.3
T0R32 :
POP A
POP PSW
RETI
;==============================================================
INT_T0W4:
JNB RSF,T0W42
JNB SDATX.4,T0W41
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W41 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W42 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R4:
JBRSF,T0R42
JNB CTPIO,T0R41
SETBRDATX.4
POP A
POP PSW
RETI
T0R41 :
CLR RDATX.4
T0R42 :
POP A
POP PSW
RETI
;==============================================================
INT_T0W5:
JNB RSF,T0W52
JNB SDATX.5,T0W51
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W51 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W52 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R5:
JBRSF,T0R52
JNB CTPIO,T0R51
SETBRDATX.5
POP A
POP PSW
RETI
T0R51 :
CLR RDATX.5
T0R52 :
POP A
POP PSW
RETI
;==============================================================
INT_T0W6:
JNB RSF,T0W62
JNB SDATX.6,T0W61
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W61 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W62 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R6:
JBRSF,T0R62
JNB CTPIO,T0R61
SETBRDATX.6
POP A
POP PSW
RETI
T0R61 :
CLR RDATX.6
T0R62 :
POP A
POP PSW
RETI
;==============================================================
INT_T0W7:
JNB RSF,T0W72
JNB SDATX.7,T0W71
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0W71 :
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0W72 :
POP A
POP PSW
RETI
;==============================================================
INT_T0R7:
JBRSF,T0R72
JNB CTPIO,T0R71
SETBRDATX.7
POP A
POP PSW
RETI
T0R71 :
CLR RDATX.7
T0R72 :
POP A
POP PSW
RETI
;==============================================================
INT_T0WE: ;写结束位(写数据)
JNB RSF,T0WE1
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
T0WE1 :
POP A
POP PSW
RETI
;==============================================================
INT_T0RE: ;读结束位(读数据)
JBRSF,T0RE1
JNB CTPIO,T0RE1
JMP ERROR1
T0RE1 :
POP A
POP PSW
RETI
;==============================================================
INT_T0WAL:;写响应位(读数据)/终止结束位(写数据)
JNB RSF,T0WAL1
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
T0WAL1:
;CLRCTPIO
;CLRTSIO
MOV P3,#00H
POP A
POP PSW
RETI
;==============================================================
INT_T0RA: ;读响应位(写数据)写结束
JNB RSF,T0RA2
JNB CTPIO,T0RA1
JMP ERROR2
T0RA1 :
CLR SDF
;MOVSDATX,#00H
MOV TCON,#01H ;下降沿中断
MOV IE,#81H ;开外部中断0
T0RA2 :
POP A
POP PSW
RETI
;==============================================================
INT_T0WAH:;终止响应位(读数据)读结束
JNB RSF,T0WAH1
JMP ERROR3
T0WAH1:
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
SETBRDF ;设置有新接收数据标志
MOV A,RDATX ;处理数据
MOV STATE,A
JZT0WAH2
CPL A
MOV P0,A
CLR RDF ;数据已处理,清标志
MOV TCON,#01H ;下降沿中断
MOV IE,#81H ;开外部中断0
POP A
POP PSW
RETI
T0WAH2:
CLR RDF ;数据无须处理,清标志
MOV TCON,#01H ;下降沿中断
MOV IE,#81H ;开外部中断0
POP A
POP PSW
RETI
;==============================================================
ERROR1: ;无结束位
MOV TCON,#01H ;下降沿中断
MOV IE,#81H ;开外部中断0
MOV P0,#0FEH
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
;==============================================================
ERROR2: ;无响应位
MOV TCON,#01H ;下降沿中断
MOV IE,#81H ;开外部中断0
MOV P0,#0FCH
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
;==============================================================
ERROR3: ;RSCNT错
MOV TCON,#01H ;下降沿中断
MOV IE,#81H ;开外部中断0
MOV P0,#0F8H
;SETB CTPIO
;SETB TSIO
MOV P3,#0FFH
POP A
POP PSW
RETI
;================================================================
DLY2MS:
MOV DLYD0,#02H
DLY2MS1:
MOV DLYD1,#0FFH
DLY2MS2:
DJNZDLYD1,DLY2MS2
DJNZDLYD0,DLY2MS1
RET
;================================================================
上一篇:楼宇对讲系统中音频电路的设计
下一篇:基于单片机与Lonworks的可视对讲系统设计
推荐阅读最新更新时间:2024-03-30 23:59