基于AT89C51的单线双机通信协议

发布者:星尘散落最新更新时间:2008-03-07 来源: 互联网关键字:MOV  POP  外部中断  PSW  空操作  符号说明  单片机系统  通信协议  双机 手机看文章 扫描二维码
随时随地手机看文章

  一、绪言

  因工作需要,设计一单线双向双机通讯协议。要求主机通过其所带的键盘能控制主机和从机的显示,从机也能通过所带的键盘控制主机和从机的显示,主机和从机键盘所起的控制作用完全一致,显示也完全一致。

  另外,从机可以随时脱离主机。当从机从脱机状态连上主机时,要求从机能立即显示主机的键盘信息,即双机显示一致。

  二、设计概况

  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 ;键值缓冲

  KCNTEQU 26H ;键盘重复计数

  DLYD0 EQU 27H ;延迟变量

  DLYD1 EQU 28H ;延迟变量

  DLYD2 EQU 29H ;延迟变量

  

  RSCNT EQU 2AH

  

  RSI BIT 00H ;收发开始标志

  RSF BIT 01H ;收/发标志

  RSF0BIT 02H ;收发标志0

  RSF1BIT 03H ;收发标志1

  ;SDFBIT 04H ;有数据发送标志

  RDF BIT 05H ;有接收数据标志

  

  STATE EQU 2BH

  SDATX EQU 22H

  RDATX EQU 23H

  

  

  CTPIO BIT 0B2H

  TSIOBIT 0B3H

  

  ORG 00H

  AJMPMAIN

  

  ORG 0BH

  AJMPINT_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:

  CALLKEYREAD ;读键盘

  CALLDLY2MS;延迟2ms

  JMP LOOPX

  ;按键功能入口

  FUNCTION:

  MOV A,KBUF1

  CJNEA,#07FH,FUN1;+1

  ;MOVA,STATE

  ;ADDA,#01H

  MOV A,#01H

  MOV STATE,A

  CPL A

  MOV P0,A

  ;SETB SDF

  JMP LOOPX

  FUN1:

  CJNEA,#0F7H,FUN2;+2

  ;MOVA,STATE

  ;ADDA,#02H

  MOV A,#02H

  MOV STATE,A

  CPL A

  MOV P0,A

  ;SETB SDF

  JMP LOOPX

  FUN2:

  CJNEA,#0BFH,FUN3;+4

  ;MOVA,STATE

  ;ADDA,#04H

  MOV A,#03H

  MOV STATE,A

  CPL A

  MOV P0,A

  ;SETB SDF

  JMP LOOPX

  FUN3:

  CJNEA,#0FBH,FUN4;+8

  ;MOVA,STATE

  ;ADDA,#08H

  MOV A,#04H

  MOV STATE,A

  CPL A

  MOV P0,A

  ;SETB SDF

  JMP LOOPX

  FUN4:

  CJNEA,#0DFH,FUN5;+16

  ;MOVA,STATE

  ;ADDA,#10H

  MOV A,#05H

  MOV STATE,A

  CPL A

  MOV P0,A

  ;SETB SDF

  JMP LOOPX

  FUN5:

  CJNEA,#0FDH,FUN6;+32

  MOV A,STATE

  ;ADDA,#20H

  XRL A,#08H

  MOV STATE,A

  CPL A

  MOV P0,A

  ;SETB SDF

  JMP LOOPX

  FUN6:

  CJNEA,#0EFH,FUN7;+64

  MOV A,STATE

  ADD A,#40H

  MOV STATE,A

  CPL A

  MOV P0,A

  ;SETB SDF

  JMP LOOPX

  FUN7:

  CJNEA,#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

  SETBP2.6

  MOV A,P2

  ANL A,#0FH

  MOV KBUF0,A

  SETBP2.7

  CLR P2.6

  MOV A,P2

  ANL A,#0FH

  SWAPA

  ORL A,KBUF0

  MOV KBUF0,A

  CJNEA,KBUF1,KEYRD4

  MOV A,KCNT

  CJNEA,#03H,KEYRD1

  RET

  KEYRD1:

  INC A

  INC KCNT

  CJNEA,#03H,KEYRD5

  MOV A,KBUF1

  CJNEA,#0FFH,KEYRD2

  RET

  KEYRD2:

  POP A

  POP A

  ;MOVP0,A

  KEYRD3:

  JMP FUNCTION

  KEYRD4:

  MOV KBUF1,A

  MOV KCNT,#00H

  KEYRD5:

  RET

  ;===============================================================

  INT_T0:

  PUSHPSW

  PUSHA

  JBRSI,INT_T01

  SETBRSI

  MOV RSCNT,#00H

  POP A

  POP PSW

  RETI

  INT_T01 :

  MOV DPTR,#T0_ENTRY

  MOV A,RSCNT

  INC RSCNT

  RLA

  JMP @A+DPTR

  T0_ENTRY:

  AJMPINT_T010;设置开始位

  AJMPINT_T0N0

  AJMPINT_T020;终止开始位

  AJMPINT_T030;读响应

  AJMPINT_T0N0

  AJMPINT_T040;读标志0

  AJMPINT_T0N0

  AJMPINT_T050;读标志1

  AJMPINT_T0W0

  AJMPINT_T0R0

  AJMPINT_T0W1

  AJMPINT_T0R1

  AJMPINT_T0W2

  AJMPINT_T0R2

  AJMPINT_T0W3

  AJMPINT_T0R3

  AJMPINT_T0W4

  AJMPINT_T0R4

  AJMPINT_T0W5

  AJMPINT_T0R5

  AJMPINT_T0W6

  AJMPINT_T0R6

  AJMPINT_T0W7

  AJMPINT_T0R7

  ;AJMP INT_T0W8

  ;AJMP INT_T0R8

  ;AJMP INT_T0W9

  ;AJMP INT_T0R9

  AJMPINT_T0WE;写结束位(写数据)

  AJMPINT_T0RE;读结束位(读数据)

  AJMPINT_T0WAL ;写响应位(读数据)/终止结束位(写数据)

  AJMPINT_T0RA;读响应位(写数据)写结束

  AJMPINT_T0WAH ;终止响应位(读数据)读结束

  ;==============================================================

  INT_T0N0: ;空操作

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T010: ;发送开始位

  ;CLRCTPIO

  ;CLRTSIO

  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

  JBCTPIO,INT_T041

  CLR RSF0;RSF0=0

  POP A

  POP PSW

  RETI

  INT_T041:

  SETBRSF0;RSF0=1

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T050: ;读标志1

  JBCTPIO,INT_051

  CLR RSF1;RSF1=0

  JBRSF0,INT_052

  JMP ERROR2;RSF:00错

  INT_052 :

  SETBRSF ;RSF:10主发从收

  MOV SDATX,STATE

  POP A

  POP PSW

  RETI

  INT_051 :

  SETBRSF1;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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W02 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R0:

  JBRSF,T0R02

  JNB CTPIO,T0R01

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W12 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R1:

  JBRSF,T0R12

  JNB CTPIO,T0R11

  SETBRDATX.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:

  JBRSF,T0R22

  JNB CTPIO,T0R21

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W32 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R3:

  JBRSF,T0R32

  JNB CTPIO,T0R31

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W42 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R4:

  JBRSF,T0R42

  JNB CTPIO,T0R41

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W52 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R5:

  JBRSF,T0R52

  JNB CTPIO,T0R51

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W62 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R6:

  JBRSF,T0R62

  JNB CTPIO,T0R61

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W72 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R7:

  JBRSF,T0R72

  JNB CTPIO,T0R71

  SETBRDATX.7

  POP A

  POP PSW

  RETI

  T0R71 :

  CLR RDATX.7

  T0R72 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0WE: ;写结束位(写数据)

  JNB RSF,T0WE1

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0WE1 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0RE: ;读结束位(读数据)

  JBRSF,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:

  ;CLRCTPIO ;写响应位(读数据)

  ;CLRTSIO

  MOV P3,#00H

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0RA: ;读响应位(写数据)写结束

  JNB RSF,T0RA2

  JNB CTPIO,T0RA1

  JMP ERROR5

  T0RA1 :

  CLR RSI ;设置收发结束标志

  ;CLRSDF ;设置数据已发送标志

  MOV SDATX,STATE

  ;MOVSDATX,#00H

  T0RA2 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0WAH:;终止响应(读数据)读结束

  JNB RSF,T0WAH1

  JMP ERROR6

  T0WAH1:

  ;SETB CTPIO

  ;SETB TSIO

  MOV P3,#0FFH

  SETBRDF ;设置有新接收数据标志

  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

  ;MOVP0,#0FEH

  POP A

  POP PSW

  RETI

  ;==============================================================

  ERROR2:

  CLR RSI

  ;SETB CTPIO

  ;SETB TSIO

  MOV P3,#0FFH

  ;MOVP0,#0FCH

  POP A

  POP PSW

  RETI

  ;==============================================================

  ERROR3:

  CLR RSI

  ;SETB CTPIO

  ;SETB TSIO

  MOV P3,#0FFH

  ;MOVP0,#0F8H

  POP A

  POP PSW

  RETI

  ;==============================================================

  ERROR4:

  CLR RSI

  ;SETB CTPIO

  ;SETB TSIO

  MOV P3,#0FFH

  ;MOVP0,#0F0H

  POP A

  POP PSW

  RETI

  ;==============================================================

  ERROR5:

  CLR RSI

  ;SETB CTPIO

  ;SETB TSIO

  MOV P3,#0FFH

  ;MOVP0,#0E0H

  POP A

  POP PSW

  RETI

  ;==============================================================

  ERROR6:

  CLR RSI

  ;SETB CTPIO

  ;SETB TSIO

  MOV P3,#0FFH

  ;MOVP0,#0C0H

  POP A

  POP PSW

  RETI

  ;================================================================

  DLY2MS:

  MOV DLYD0,#02H

  DLY2MS1:

  MOV DLYD1,#0FFH

  DLY2MS2:

  DJNZDLYD1,DLY2MS2

  DJNZDLYD0,DLY2MS1

  RET

  ;================================================================

  2.从机源程序

  ;子机程序

  KBUF0 EQU 24H ;键值临时缓冲

  KBUF1 EQU 25H ;键值缓冲

  KCNTEQU 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

  TSIOBIT 0B3H

  SDF BIT 00H ;有数据发送标志

  RDF BIT 01H ;有接收数据标志

  RSF BIT 02H ;数据收发选择位

  

  ORG 00H

  AJMPMAIN

  

  ORG 03H

  AJMPINT_X0

  

  ORG 0BH

  AJMPINT_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:

  CALLKEYREAD ;读键盘

  CALLDLY2MS;延迟2ms

  JMP LOOPX

  

  ;按键功能入口

  FUNCTION:

  MOV A,KBUF1

  CJNEA,#07FH,FUN1;+1

  ;MOVA,STATE

  ;ADDA,#01H

  MOV A,#01H

  MOV STATE,A

  MOV SDATX,A

  SETBSDF

  CPL A

  MOV P0,A

  RET

  FUN1:

  CJNEA,#0F7H,FUN2;+2

  ;MOVA,STATE

  ;ADDA,#02H

  MOV A,#02H

  MOV STATE,A

  MOV SDATX,A

  SETBSDF

  CPL A

  MOV P0,A

  RET

  FUN2:

  CJNEA,#0BFH,FUN3;+4

  ;MOVA,STATE

  ;ADDA,#04H

  MOV A,#03H

  MOV STATE,A

  MOV SDATX,A

  SETBSDF

  CPL A

  MOV P0,A

  RET

  FUN3:

  CJNEA,#0FBH,FUN4;+8

  ;MOVA,STATE

  ;ADDA,#08H

  MOV A,#04H

  MOV STATE,A

  MOV SDATX,A

  SETBSDF

  CPL A

  MOV P0,A

  RET

  FUN4:

  CJNEA,#0DFH,FUN5;+16

  ;MOVA,STATE

  ;ADDA,#10H

  MOV A,#05H

  MOV STATE,A

  MOV SDATX,A

  SETBSDF

  CPL A

  MOV P0,A

  RET

  FUN5:

  CJNEA,#0FDH,FUN6;+32

  MOV A,STATE

  ;ADDA,#20H

  XRL A,#08H

  MOV STATE,A

  MOV SDATX,A

  SETBSDF

  CPL A

  MOV P0,A

  RET

  FUN6:

  CJNEA,#0EFH,FUN7;+64

  MOV A,STATE

  ADD A,#40H

  MOV STATE,A

  MOV SDATX,A

  SETBSDF

  CPL A

  MOV P0,A

  RET

  FUN7:

  CJNEA,#0FEH,FUN8;+128

  MOV A,STATE

  ADD A,#80H

  MOV STATE,A

  MOV SDATX,A

  SETBSDF

  CPL A

  MOV P0,A

  RET

  FUN8:

  RET

  ;=====================================================================

  KEYREAD:

  CLR P2.7

  SETBP2.6

  MOV A,P2

  ANL A,#0FH

  MOV KBUF0,A

  SETBP2.7

  CLR P2.6

  MOV A,P2

  ANL A,#0FH

  SWAPA

  ORL A,KBUF0

  MOV KBUF0,A

  CJNEA,KBUF1,KEYRD3

  MOV A,KCNT

  CJNEA,#03H,KEYRD1

  RET

  KEYRD1:

  INC A

  INC KCNT

  CJNEA,#03H,KEYRD4

  MOV A,KBUF1

  CJNEA,#0FFH,KEYRD2

  RET

  KEYRD2:

  CALLFUNCTION

  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:

  PUSHPSW

  PUSHA

  MOV DPTR,#T0_ENTRY

  MOV A,RSCNT

  INC RSCNT

  RLA

  JMP @A+DPTR

  T0_ENTRY:

  AJMPINT_T0N0;空操作

  AJMPINT_T010;响应

  AJMPINT_T0N0

  AJMPINT_T020;标志0

  AJMPINT_T0N0

  AJMPINT_T030;标志1

  AJMPINT_T0N0

  AJMPINT_T0W0

  AJMPINT_T0R0

  AJMPINT_T0W1

  AJMPINT_T0R1

  AJMPINT_T0W2

  AJMPINT_T0R2

  AJMPINT_T0W3

  AJMPINT_T0R3

  AJMPINT_T0W4

  AJMPINT_T0R4

  AJMPINT_T0W5

  AJMPINT_T0R5

  AJMPINT_T0W6

  AJMPINT_T0R6

  AJMPINT_T0W7

  AJMPINT_T0R7

  ;AJMP INT_T0W8

  ;AJMP INT_T0R8

  ;AJMP INT_T0W9

  ;AJMP INT_T0R9

  AJMPINT_T0WE;写结束位(写数据)

  AJMPINT_T0RE;读结束位(读数据)

  AJMPINT_T0WAL ;写响应位(读数据)/终止结束位(写数据)

  AJMPINT_T0RA;读响应位(写数据)写结束

  AJMPINT_T0WAH ;终止响应位(读数据)读结束

  ;==============================================================

  INT_T0N0: ;空操作

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T010: ;响应

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T020: ;标志0

  JBSDF,INT_T021

  CLR RSF ;无数据发送,设置读标识

  ;SETB CTPIO

  ;SETB TSIO

  MOV P3,#0FFH

  POP A

  POP PSW

  RETI

  INT_T021:

  SETBRSF ;有数据发送,设置写标志

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T030: ;标志1

  JBRSF,INT_031

  ;CLRCTPIO

  ;CLRTSIO

  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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R0:

  JBRSF,T0R02 ;读第一位

  JNB CTPIO,T0R01

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W12 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R1:

  JBRSF,T0R12

  JNB CTPIO,T0R11

  SETBRDATX.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:

  JBRSF,T0R22

  JNB CTPIO,T0R21

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W32 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R3:

  JBRSF,T0R32

  JNB CTPIO,T0R31

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W42 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R4:

  JBRSF,T0R42

  JNB CTPIO,T0R41

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W52 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R5:

  JBRSF,T0R52

  JNB CTPIO,T0R51

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W62 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R6:

  JBRSF,T0R62

  JNB CTPIO,T0R61

  SETBRDATX.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 :

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0W72 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0R7:

  JBRSF,T0R72

  JNB CTPIO,T0R71

  SETBRDATX.7

  POP A

  POP PSW

  RETI

  T0R71 :

  CLR RDATX.7

  T0R72 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0WE: ;写结束位(写数据)

  JNB RSF,T0WE1

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  T0WE1 :

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0RE: ;读结束位(读数据)

  JBRSF,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:

  ;CLRCTPIO

  ;CLRTSIO

  MOV P3,#00H

  POP A

  POP PSW

  RETI

  ;==============================================================

  INT_T0RA: ;读响应位(写数据)写结束

  JNB RSF,T0RA2

  JNB CTPIO,T0RA1

  JMP ERROR2

  T0RA1 :

  CLR SDF

  ;MOVSDATX,#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

  SETBRDF ;设置有新接收数据标志

  MOV A,RDATX ;处理数据

  MOV STATE,A

  JZT0WAH2

  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:

  DJNZDLYD1,DLY2MS2

  DJNZDLYD0,DLY2MS1

  RET

  ;================================================================

 

关键字:MOV  POP  外部中断  PSW  空操作  符号说明  单片机系统  通信协议  双机 引用地址:基于AT89C51的单线双机通信协议

上一篇:楼宇对讲系统中音频电路的设计
下一篇:基于单片机与Lonworks的可视对讲系统设计

推荐阅读最新更新时间:2024-03-30 23:59

SPI总线在51单片机系统中的实现
1 引言 SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOST和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。由于SPI系统总线一共只需3~4位数据线和控制即可实现与具有SPI
[单片机]
SPI总线在51<font color='red'>单片机系统</font>中的实现
STM32入门学习之EXTI外部中断(STM32F030F4P6基于CooCox IDE)
下面的代码,是把PA0当做一个按键口,芯片内部上拉,按键闭合时,IO口被拉低,触发中断。 #include stm32_lib/inc/stm32f0xx_rcc.h #include stm32_lib/inc/stm32f0xx_exti.h #include stm32_lib/inc/stm32f0xx_gpio.h #include stm32_lib/inc/stm32f0xx_syscfg.h #include stm32_lib/inc/stm32f0xx_misc.h int main(void) { //时钟使能 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_G
[单片机]
STM32入门学习之<font color='red'>EXTI</font><font color='red'>外部中断</font>(STM32F030F4P6基于CooCox IDE)
液晶显示模块DMF-50081在单片机系统中的应用
摘要:通过一个小型监控单元的设计实践,详细介绍了一种使用89C51单片机和大屏幕液晶显示模块DMF-50081,进行图形和文本混合显示的软硬件设计思路和编程技巧。给出了DMF-50081与单片机的硬件连接电路和部分程序代码。 关键词:单片机 SED1335控制器 图形汉字 DMF-50081 香港精电公司的DMF-50081点阵图形液晶显示模块是由大屏幕LCD液晶显示器、SED1335控制器、CCFL背光逆变器和DC-DC显示驱动电源四部分组成。它与同类液晶显示模块相比,具有显示信息量大、亮度高、微功耗、体积小、质量轻、超薄等诸多优点,在移动通讯、仪器仪表、电子设备、家用电器等各方面有着十分广泛的用途。 下面以DMF-50
[应用]
改造成品单片机系统的方法
  制作微机监控系统时,若受监控对象本身也是一个微机系统,且又没有电路图、程序等资料时,如何采集对象的内部数据(如CPU状态等),如何修改对象的程序方不至令原系统运行不稳定和崩溃,如何充分利用监控对象的资源,是一个带有普遍性的问题。   笔者研制的“数字实验监控系统”,其主要功能是采集30台学生实验机状态和过程信息,送往中心主机显示。监控对象是一台型号为DLES的数字电路实验机,这是某公司的产品,除简单的用法说明书外别无其它资料。该机的核心是单片机8031,带6位键盘和数码管显示、并行口8155等,可选择CPU工作方式产生各种实验信号。 1用双端口RAM采集数据   监控系统的首要任务是获取受控对象的各种状态信息。用IO线取得的只是
[单片机]
改造成品<font color='red'>单片机系统</font>的方法
一张图秒懂电动汽车充电接口及通信协议新国标
    截至2015年底,全国已建成充换电站3600座,公共充电桩4.9万个,较上年增加1.8万个,同比增速58%。     作为实现电动汽车传导充电的基本要素,电动汽车充电用接口及通信协议技术内容的统一和规范,是保证电动汽车与充电基础设施互联互通的技术基础。     2015年12月底,质检总局、国家标准委、国家能源局、工信部、科技部等部门联合在京发布了新修订的《电动汽车传导充电系统 第1部分:一般要求》、《电动汽车传导充电用连接装置 第1部分: 通用要求》、《电动汽车传导充电用连接装置 第2部分:交流充电接口》、《电动汽车传导充电用连接装置 第3部分: 直流充电接口》、《电动汽车非车载传导式充电机与电池管理系统之间的通
[汽车电子]
[bsp层][nrf52832][nrf52840][nrf52810][nrf52820][bsp_exti] exti/gpioe配置和使用
GPIOTE—GPIO任务和事件 GPIO任务和事件(GPIOTE)模块提供了使用任务和事件访问GPIO管脚的功能。 每个GPIOTE通道可以分配到一个引脚。 GPIOTE块使GPIOs能够在引脚状态变化上生成事件,可以用于通过PPI系统执行任务。 还可以使用ppissystem驱动GPIO更改系统事件的状态。 在系统开启或关闭时,可以对引脚状态变化进行低功耗检测 Table 31: GPIOTE properties 在每个GPIOTE通道中,最多可以使用三个任务来执行对一个引脚的写操作。 两个任务是固定的(SET和CLR),一个(OUT)是可配置的,可以执行以下操作: 设置 清除 翻转 通过以下输入条件之一,可以在
[单片机]
[bsp层][nrf52832][nrf52840][nrf52810][nrf52820][bsp_<font color='red'>exti</font>] <font color='red'>exti</font>/gpioe配置和使用
单片机系统的运算器
  8051片内除具有CPU,即控制器,和运算器外 .   还包括片内数据存储器RAM128字节,用于存放可以读写的数据,如运算中间结果,最终结果以及欲显示的数据等.   片内程序存储器4KB,用于存放表格,一些原始数据和表格.   四个8位并行输入输出接口P0-P3,每个口可以用作输入,也可以用作输出.   两个定时器,每个定时计数器都可以设置成计数方式,用于对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制.   五个中断源的中断控制系统.   一个全双工UART的串行IO口,可实现单片机与单片机或其他微机之间串行通信.   片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接,最高允许振荡频
[单片机]
一种能量感知型无线传感器网络跨层式通信协议
0 引 言 无线传感器网络(Wireless Sensor Networks,WSN)是一种特殊的无线自组织通信网络。其区别于传统无线自组织网络的特点包括:节点数量特别巨大、节点硬件功能简单、应用场境复杂、各种资源受限等。能量资源受限是WSN主要的瓶颈之一。 能量感知型WSN协议重点强调高效利用能量的重要性,其设计思想主要是在WSN各层协议中引入能量优化算法,通过控制整个网络的能耗平稳性和高效性,从而达到在系统层面上改善传感器网络能耗特性、减少传感器网络的热点并延长整个网络的生存周期的目的。为了解决能耗问题,研究者提出了众多的解决途径,文献 提出的SPEED协议采用基于位置的思想,提供拥塞控制和软实时保障,从而降低通信
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
最新安防电子文章
换一换 更多 相关热搜器件

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 视频监控 智能卡 防盗报警 智能管理 处理器 传感器 其他技术 综合资讯 安防论坛

词云: 1 2 3 4 5 6 7 8 9 10

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved