⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 err3.asm

📁 电力仪器仪表智能独立误差计算设备系统程序!
💻 ASM
📖 第 1 页 / 共 5 页
字号:
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 + -