两机串行通讯单片机汇编语言编程举例
2017-10-14 来源:eefocus
A、B两机之间串行通讯(方式1),用‘检验和’校验波特率为2400,发送缓冲区和接收缓冲区都为片内30H开始的16个字节单元。已知:fosc=11.0592MHz。
设计A发送,B接收的双方协议如下:
1、首先A发送‘AA’信号,B接收到后发送‘BB’应答;
2、A方最多只发送20次‘AA’,若无应答,置错误标志,退出。
3、A收到‘BB’后,开始发送缓冲区的数据,同时求检验和,共16个字节。
4、B接收数据,存入缓冲区,并同时求检验和。
5、当一个数据块发送完后,A再发送检验和(一个字节)。
6、B接收到A的检验和后,再与本身的检验和比较。
7、若接收正确,B方发送‘00’,否则发送‘EE‘,请求重发。
8、若A方接收到‘00’,结束发送,接收到‘EE’则重发。
A机的通讯程序:
ASTA: MOV TMOD,#20H ;设T1方式2
MOV TH1,#0F4H ;计数初值,波特率=2400
MOV PCON,#0 ;SMOD=0
SETB TR1 ;启动T1
MOV SCON,#50H ;串口方式1,REN=1
ATT0: MOV R6,#200
MOV R7,#20
CLR F0 ;线路故障标志=0
ATT1:MOV SBUF,#0AAH ;发‘AA’联络
AWA1:JBC TI,ARR1 ;查询发送中断标志位
SJMP AWA1
ARR1:JBC RI,ARR2 ;等待接收
DJNZ R6,ARR1
DJNZ R7,ATT1 ;
SETB F0 ;线路故障
QUIT: AJMP EXIT ;退出
ARR2:MOV A,SBUF ;接收对方回应‘BB’
XRL A,#0BBH ;比较应答信号是否正确?
JNZ QUIT ;不正确,退出
ATT2:MOV R0,#30H ;准备发送数据
MOV R7,#16
MOV R6,#0 ;检验和单元
ATT3:MOV SBUF,@R0 ;发送一个字节
MOV A,R6
ADD A,@R0 ;求检验和
MOV R6,A
INC R0
AWA2:JBC TI,ATT4
SJMP AWA2 ;查询发送中断标志
ATT4:DJNZ R7,ATT3 ;计数循环
MOV SBUF,R6 ;数据块发送完,发送检验和
AWA3:JBC TI,ARR3
SJMP AWA3
ARR3:JBC RI,ARR4 ;等待接收对方回应
SJMP ARR3
ARR4:MOV A,SBUF ;接收到对方回应
JNZ ATT2 ;若是‘00’则成功,否则重发。
EXIT: RET
B机通讯程序:(用中断方式开始)
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP BRR1 ;串行中断入口
ORG 0030H
MAIN: 。。。。。 ;主程序
BSTA: MOV TMOD,#20H ;设T2方式2
MOV TH1,#0F4H ;计数初值,波特率=2400
MOV PCON,#0 ;SMOD=0
SETB TR1 ;启动T1
MOV SCON,#50H ;串口方式1,REN=1
SETB ES
SETB EA ;允许中断
。。。。。。。。
BRR1: CLR ES ;串行口中断服务程序
JBC RI,BRR2 ;
SJMP BRR1
BRR2: MOV A,SBUF ;接收A机联络信号
XRL A,#0AAH
JZ BTT1 ;正确
AJMP EXIT ;错误,退出
BTT1: MOV SBUF,#0BBH ;发送应答
BWA1:JBC TI,BRR3
SJMP BWA1
BRR3: MOV R0,#30H ;准备接收数据
MOV R7,#10H
MOV R6,#0
BRR4:JBC RI,BRR5
SJMP BRR4
BRR5:MOV A,SBUF ;接收一个字节
MOV @R0,A ;存入缓冲区
INC R0
ADD A,R6 ;
MOV R6,A ;求检验和
DJNZ R7,BRR4 ;数据块计数
BWA2:JBC RI,BRR6
SJMP BWA2
BRR6:MOV A,SBUF ;接收对方检验和
XRL A,R6 ;与本机的比较
JZ BTT2
MOV SBUF,#0FFH ;不同,发送‘FF’
BWA3:JBC TI,BRR3 ;准备接收重发
SJMP BWA3
BTT2:MOV SBUF,#0 ;正确,发送‘00’
EXIT: SETB ES
RETI
例3、 两机通讯在方式2或3,用第9位作奇偶校验。
发送方:
,,,,,,
TTT: MOV SCON,#80H ;方式2
MOV A,#data ;data为一字节数据
MOV C,PSW.0 ;取奇偶位
MOV TB8,C ;奇偶位送到TB8位
MOV SBUF,A ;发送一个字节
LOOP:JBC TI,NEXT 内容来自单片机之家www.dpj100.com
SJMP LOOP
NEXT: ,,,,
接收方:
,,,,,,
RRR: MOV SCON,#90H ;方式2,允许接收
LOOP: JBC RI,RECE
SJMP LOOP
RECE: MOV A,SBUF ;取出接收到的字节
JB PSW。0,ONE ;判断接收方的奇偶值
JB RB8,ERR ;判断发送方的奇偶值
SJMP RIGHT
ONE : JNB RB8,ERR
RIGHT: ,,,,,, ;接收正确
ERR: ,,,,,,, ;接收有错