📄 从机.asm
字号:
;*************************************************************
; 1.完成从机从主机并口接收报文信息然后转发给K口设备
; 2.完成接收K口设备送来的报文信息然后转发给PC机
;*************************************************************
DATA2051 EQU P1
CFS BIT P3.2 ;CFS作为从机向主机发数据的通知线
HFS BIT P3.3 ;HFS作为主机向从机发数据的通知线
MANG BIT P3.4 ;MANG作为主、从机忙标志线
MS1 BIT P3.7 ;K口设备主从机状态设置位
REQUEST EQU "?" ;发送请求信号
TONG EQU "=" ;通道建立信号
ENDSIGN EQU 02H ;控制命令结束符
REQCOME BIT 20H.0 ;请求到达标志
ISYES BIT 20H.1 ;通路建立标志标志
ISMINE BIT 20H.2 ;本机地址标志位
ISNOTMINE BIT 20H.3 ;本机地址标志位
;*************************************************************
ORG 0000H
AJMP START
ORG 0013H
AJMP BINGKOU
ORG 0023H
AJMP PCTOMCU
ORG 100H
;*************************************************************
START: MOV SP,#60H
;初始化
MOV TMOD,#20H ;设置定时器1为方式2(做波特率发生器,晶振11.0592M)
MOV TH1,#0F4H ;T1初始值设置(BAUD RATE=2400 BIT/S)
MOV TL1,#0F4H
SETB EA ;CPU允许中断
SETB ES ;允许串口中断
SETB EX1 ;允许外部1中断
SETB IT1 ;外部中断1为边沿触发
SETB PX1 ;外部中断1为高优先级
MOV SCON,#50H ;设置串口为方式1(8个数据位)
SETB TR1 ;启动定时器1
SETB MS1 ;设置K口设备为从机状态
MOV P1,#0FFH
SETB CFS ;预设主机闲
SETB HFS ;预设从机闲
SETB MANG ;预设未准备好或未完成
CLR ISMINE ;预设非本机地址
CLR ISNOTMINE
CLR REQCOME ;预设未收到请求
CLR ISYES ;预设通道未建立
mov R3,#3 ;连续收到R3个“?” 后 REQCOME=1
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MOV 4FH,#"A" ;从机号
;****************************************************
HERE: JNB REQCOME,$ ;等待请求信号
HERE0: JNB MANG,$
MOV R7,#1
DJNZ R7,$
JNB MANG,HERE0
CLR MANG
SETB ISYES ;允许接收数据
HERE1: MOV SBUF,#TONG ;回"="给PC机
MOV A,4FH ;发送从机地址给主机
MOV P1,A
CLR CFS ;延时等待并口接收
MOV R7,#1
DJNZ R7,$
SETB CFS
JNB TI,$
CLR TI
CLR REQCOME
AJMP HERE
;*************************************************************
; 串口接收K口设备报文数据中断服务程序
;*************************************************************
PCTOMCU: PUSH PSW
PUSH A
JNB RI,NEXT ;TI=1,为发送中断
CLR RI ;清接收中断标志
MOV A,SBUF ;读出串口接收的数据
JB ISYES,DOREC
cjne a,#REQUEST,PCTOMCU1 ;判断是否有请求?到来
djnz r3,NEXT
SETB REQCOME ;收到"?个数满足条件标志REQCOME=1
AJMP NEXT
PCTOMCU1:mov r3,#3 ;只要不是连续的?就将R3赋初值
ajmp NEXT
DOREC: MOV P1,A ;转发数据
CLR CFS ;延时等待并口接收
MOV R7,#15
DJNZ R7,$
SETB CFS
;MOV P1,#0FFH
CJNE A,#ENDSIGN,NEXT ;判断报文发送是否完毕
MOV P1,#0FFH
SETB MANG
CLR ISYES
mov r3,#3
NEXT: POP A
POP PSW ;中断返回
RETI
;*************************************************************
; 并口接收主机发来报文数据中断服务程序
;*************************************************************
BINGKOU: PUSH PSW
PUSH A
MOV A,P1
PINREC: JB ISMINE,PINREC0 ;判断是否本地标志位
JB ISNOTMINE,NOTME1
CJNE A,4FH,NOTME ;判断是否是本地地址
SETB ISMINE ;接收地址是本地地址
AJMP NEXTB
PINREC0: MOV SBUF,A ;发送报文
JNB TI,$
CLR TI
CJNE A,#ENDSIGN,NEXTB ;判断控制命令结束符到达否
MOV P1,#0FFH
CLR ISMINE
SJMP NEXTB
NOTME1: CJNE A,#ENDSIGN,NEXTB
MOV P1,#0FFH
CLR ISNOTMINE
SJMP NEXTB
NOTME: SETB ISNOTMINE
NEXTB: POP A
POP PSW
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -