📄 err3.asm
字号:
FRAME_A2:
JB FLAG_ADDR,A2_ADDR ; 判断地址标志:1接收过地址,0没接收过地址
CJNE A,#99H,A2_END ; 判断是否广播地址
SETB FLAG_ADDR ; 置地址标志
AJMP SYS_UART_REND
A2_ADDR:
JB FLAG_LEN,A2_LEN ; 判断长度标志:1接收过长度,0没接收过长度
MOV B,A ; 数据暂存到B中
JZ A2_CHECK_END ; 检查命令长度是否为零
CLR C
SUBB A,#98H ; 检查命令长度
JNC A2_CHECK_END ; 命令长度无效
MOV A,B
MOV UART_LEN,A ; 存储长度值
MOV UART_CHECK_DATA,A ; 长度判断
SETB FLAG_LEN ; 置长度标志
AJMP SYS_UART_REND
A2_LEN:
CJNE A,SYS_SN,UART_CHECK_COUNT ; 判断是否有本板地址在其中
SETB FLAG_ADDR_DATA ; 置有本板地址标志
UART_CHECK_COUNT: ;
MOV B,A ; 数据暂存到B中
MOV A,UART_LEN
ADD A,#99H
DA A
MOV UART_LEN,A
JZ UART_A2_CHECK ; 判断数据是否接收完
MOV A,B
ADD A,UART_CHECK_DATA ; 数据没接收完
DA A
MOV UART_CHECK_DATA,A
AJMP SET_FRAME_A0
UART_A2_CHECK: ; 数据接收完
MOV A,B
CJNE A,UART_CHECK_DATA,A2_CHECK_END ; 判断校验和是否正确
JNB FLAG_ADDR_DATA,A2_CHECK ;
SETB FLAG_GATHER ; 置集合标志 什么时候清除??
A2_CHECK_END:
CLR FLAG_ADDR ; 清地址标志
CLR FLAG_LEN ; 清长度标志
CLR FLAG_ADDR_DATA
A2_END:
CLR FLAG_FRAME_A2 ; 清帧标志
AJMP SET_FRAME_A0
A2_CHECK:
CLR FLAG_GATHER
SJMP A2_CHECK_END
;********帧A3处理*****************
FRAME_A3:
JB FLAG_ADDR,A3_ADDR ; 判断地址标志:1接收过地址,0没接收过地址
CJNE A,SYS_SN,A3_FULL_ADDR ; 判断是否本板地址
SETB FLAG_ADDR ; 置地址标志
SETB FLAG_SYS_SN ; 置是本板地址标志,用于确认命令回传
AJMP SYS_UART_REND
A3_FULL_ADDR: ; 广播地址检测
CJNE A,#99H,A3_GATHER_ADDR
SETB FLAG_ADDR ; 置地址标志
AJMP SYS_UART_REND
A3_GATHER_ADDR: ; 集合地址检测
JNB FLAG_GATHER,A3_END
CJNE A,#0H,A3_END
SETB FLAG_ADDR ; 置地址标志
AJMP SYS_UART_REND
A3_ADDR:
JB FLAG_LEN,A3_LEN ; 判断长度标志:1接收过长度,0没接收过长度
MOV B,A ; 数据暂存到B中
JZ A3_CHECK_END ; 检查命令长度是否为零
CLR C
SUBB A,#CONST_CMLEN ; 检查命令长度
JNC A3_CHECK_END ; 命令长度无效
MOV A,B
MOV UART_LEN,A ; 存储长度值
MOV UART_CHECK_DATA,A
MOV RECV_BPW,#RECV_BUF ; 置接收缓冲地址
SETB FLAG_LEN ; 置长度标志
AJMP SYS_UART_REND
A3_LEN:
MOV B,A ; 数据暂存到B中
MOV A,UART_LEN ; 取长度值
ADD A,#99H
DA A
MOV UART_LEN,A
JZ UART_A3_CHECK ; 判断数据是否接收完
MOV A,B
MOV R0,RECV_BPW
MOV @R0,A ; 数据保存到接收缓冲中
INC R0 ; 接收缓冲地址加1
MOV RECV_BPW,R0 ; 保存接收缓冲地址
ADD A,UART_CHECK_DATA ;
DA A
MOV UART_CHECK_DATA,A
AJMP SET_FRAME_A0
UART_A3_CHECK: ; 数据接收完
MOV A,B
CJNE A,UART_CHECK_DATA,A3_CHECK_END ; 判断校验和是否正确
SETB FLAG_COMMAND ; 置命令处理标志
JNB FLAG_SYS_SN,A3_CHECK_END
SETB FLAG_COMMAND_ANSWER ; 置确认命令回传标志
A3_CHECK_END:
CLR FLAG_SYS_SN
CLR FLAG_LEN ; 清长度标志
CLR FLAG_ADDR ; 清地址标志
A3_END:
CLR FLAG_FRAME_A3 ; 清帧标志
LJMP SET_FRAME_A0
;****************************************
SYS_UART_REND:
POP 00H
POP B
POP ACC
POP PSW
RETI
;==================B0通讯回传处理=====================查询设备
UART_TRAN_B0: ; 发送处理
CLR C485_TRSEL ; 转换为发送状态
MOV A,#0B0H
ACALL UART_TRAN_BYTE ; 回发命令引头"B0"
MOV A,SYS_SN
ACALL UART_TRAN_BYTE ; 回发本板地址
;-------------------------------
ANSWER_LINK:
JB FLAG_UART,ANSWER_CT_ERR
SETB FLAG_UART
MOV A,#02H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回发长度:2
MOV A,#99H
ACALL UART_TRAN_BYTE ; 回发数据引头“99”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_CT_ERR:
JNB FLAG_CT_CHECK,ANSWER_AUTO_SHORT
MOV A,#02H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回发长度:2
MOV A,#98H
ACALL UART_TRAN_BYTE ; 回发数据引头“98”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_AUTO_SHORT:
JNB FLAG_AUTO_SHORT,ANSWER_DL
MOV A,#02H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回发长度:2
MOV A,#97H
ACALL UART_TRAN_BYTE ; 回发数据引头“97”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_DL:
JNB FLAG_DL,ANSWER_RJ ; 电能误差试验回传
MOV A,#06H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回发长度:6
MOV A,#00H
ACALL UART_TRAN_BYTE ; 回发数据引头“00”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R7,#03H
MOV R0,#WC_BUFFER+2
ANSWER_DL0:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_DL0
MOV A,WC_T_C
ACALL UART_TRAN_BYTE ; 回发校验次数
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_RJ:
JNB FLAG_RJ,ANSWER_XL ; 日计时误差试验回传
MOV A,#06H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回发长度:6
MOV A,#01H
ACALL UART_TRAN_BYTE ; 回发数据引头“01”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R0,#WC_BUFFER+2
MOV R7,#03H
ANSWER_RJ0:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_RJ0
MOV A,WC_T_C
ACALL UART_TRAN_BYTE ; 回发校验次数
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_XL:
JNB FLAG_XL,ANSWER_ZZ ; 需量周期误差试验回传
MOV A,#06H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回发长度:6
MOV A,#02H
ACALL UART_TRAN_BYTE ; 回发数据引头“02”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R7,#03H
MOV R0,#WC_BUFFER+2
ANSWER_XL0:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_XL0
MOV A,WC_T_C
ACALL UART_TRAN_BYTE ; 回发校验次数
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_ZZ:
JNB FLAG_ZZ,ANSWER_QD ; 电能走字试验回传
MOV A,#13H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回发长度:13
MOV A,#03H
ACALL UART_TRAN_BYTE ; 回发数据引头“03”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R7,#03H
MOV R0,#WC_BUFFER+2
ANSWER_ZZ0:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_ZZ0
MOV R7,#08H
MOV R0,#WC_BUFFER+10
ANSWER_ZZ1:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_ZZ1
AJMP TRAN_B0_END
;-------------------------------
ANSWER_QD:
JNB FLAG_QD,ANSWER_QID ; 电表潜动试验回传
MOV A,#03H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回发长度:3
MOV A,#04H
ACALL UART_TRAN_BYTE ; 回发数据引头“04”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R0,#WC_BUFFER
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_QID:
JNB FLAG_QID,ANSWER_BH ; 电表启动试验回传
MOV A,#03H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回发长度:3
MOV A,#05H
ACALL UART_TRAN_BYTE ; 回发数据引头“05”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R0,#WC_BUFFER
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_BH:
JNB FLAG_BH,ANSWER_MK ; 电表捕黑试验回传
MOV A,#03H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回发长度:3
MOV A,#06H
ACALL UART_TRAN_BYTE ; 回发数据引头“06”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R0,#WC_BUFFER
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_MK:
JNB FLAG_MK,TRAN_END ; 脉宽测试试验回传
MOV A,#06H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回发长度:6
MOV A,#08H
ACALL UART_TRAN_BYTE ; 回发数据引头“08”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R7,#06H
MOV R0,#WC_BUFFER+5
ANSWER_MK0:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_MK0
MOV A,WC_T_C
ACALL UART_TRAN_BYTE ; 回发校验次数
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
TRAN_B0_END:
ACALL UART_TRAN_BYTE ; 回发校验和
JB UART_TBUSY,$ ; 等待发送完毕
TRAN_END:
SETB C485_TRSEL ; 恢复为接收状态
CLR FLAG_ANSWER ; 清除查询设备回传标志
LJMP MAIN_FLOW_WAIT
;==================B2通讯回传处理=====================确认命令
UART_TRAN:
LJMP UART_TRAN_B0
UART_TRAN_B2: ; 发送处理
CLR FLAG_COMMAND_ANSWER ; 清除确认命令回传标志
JNB FLAG_UART,UART_TRAN
JB FLAG_CT_CHECK,UART_TRAN
CLR C485_TRSEL ; 转换为发送状态
MOV A,#0B2H
ACALL UART_TRAN_BYTE ; 回发引头"B2"
MOV A,SYS_SN
ACALL UART_TRAN_BYTE ; 回发本板地址
JB UART_TBUSY,$ ; 等待发送完毕
SETB C485_TRSEL ; 恢复为接收状态
LJMP MAIN_FLOW_WAIT
;-------------------------------
UART_TRAN_BYTE:
JB UART_TBUSY,$ ; 等待发送器空闲
MOV SBUF,A ; 开始发送
SETB UART_TBUSY
RET
;==================通讯命令接收处理=====================
UART_RECV: ;
MOV R0,RECV_BPR
LCALL UART_RECV_BYTE ; 取首字节:引导字节
;----------------------标准常数设置---------------------------------
UART_COMMAND_00:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -