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

📄 err3.asm

📁 电力仪器仪表智能独立误差计算设备系统程序!
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	 AJMP   CHANNEL_SEAVE
SET_7:
	 CJNE   A,#07H,SET_8
	 CLR	PULSE_SELECT
	 AJMP   CHANNEL_SEAVE
SET_8:
	 CJNE   A,#08H,CHANNEL_SEAVE
	 SETB   PULSE_SELECT
	 CLR	JDQ_X485OFF
	 AJMP   CHANNEL_SEAVE
CHANNEL_CANCEL:
     MOV    @R0,#01H   
     SETB   JDQ_X485OFF
     SETB	PULSE_A	
	 CLR	PULSE_B                          ;101
	 SETB	PULSE_C	
CHANNEL_SEAVE:  
	 MOV    R0,#CHANNEL_BUFFER
	 CJNE   @R0,#00H,CHANNEL_DIRECT			;如果通道缓存内的值为0,要改为1,因为通道号是1--8	,在直接按台体键盘时会出现值为0的情况
	 MOV    @R0,#01H
CHANNEL_DIRECT:
	 MOV    DISP_BUFFER,@R0 
         	  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.)	
	 MOV	WC_T_C,#00H			; 回传“次数”清0	
	 SETB 	EC_MODE_EE			; 
	 CLR    FLAG_ERR			; 超差处理标志位
	 LJMP	UART_COMMAND_VOID
ZZ_BEGIN:					; 走字开始
	 JNB	FLAG_ZZ,QD_BEGIN
	;------------------------				
	 MOV	R0,#TEMP_BUFFER
	 MOV	R1,#EC_COUNTER
	 MOV	R7,#4H
ZZFC_SAVE:
	 MOV	A,@R1				; 读取"被检表脉冲走字计数"值
	 CPL	A
	 INC	A
	 MOV	@R0,A
	 INC	R0
	 INC	R1
	 DJNZ	R7,ZZFC_SAVE
	 MOV	R0,#TEMP_BUFFER
	 MOV	R1,#ZZMC_BUF
	 MOV	R2,#4
	 LCALL	PBCD_FBIN			; n字节BIN转换成PBCD码
	;-------------------------
	CLR	ET0				; 关闭计数器/定时器中断0  标频
	MOV	TEMP_BUFFER,TL0			; 转存标频计数结果
	MOV	R0,#TEMP_BUFFER+1
	MOV	R1,#FH_COUNTER
	MOV	R7,#7H
ZZFH_SAVE:
	MOV	A,@R1				; 读取"被检表脉冲走字计数"值
	CPL	A
	INC	A
	MOV	@R0,A
	INC	R0
	INC	R1
	DJNZ	R7,ZZFH_SAVE
	SETB	ET0				; 打开计数器/定时器中断0  标频
	MOV	R0,#TEMP_BUFFER
	MOV	R1,#FH_CAPTURE
	MOV	R2,#8
	LCALL	PBCD_FBIN			; n字节BIN转换成PBCD码
	;------------------------------
	MOV	DPTR,#TABLE_BEGIN			; 
	LCALL	DISP_STRING			; 校验开始,显示“BE”
	;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>{
	MOV     R0,#CHANNEL_BUFFER
	MOV     DISP_BUFFER,@R0     
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
	SETB	ZZ_FLAG
	CLR	FLAG_ERR
	CLR	EC_ZZUP
	LJMP	UART_COMMAND_VOID
	
QD_BEGIN:					; 潜动开始
	JNB	FLAG_QD,QID_BEGIN
	MOV	DPTR,#TABLE_QD			; 
	LCALL	DISP_STRING			; 校验开始,显示“QD”
	MOV	R0,#ZZMC_BUF
	MOV	A,EC_COUNTER			; 读取"被检表脉冲走字计数"值
	CPL	A
	INC	A
	MOV	@R0,A
	SETB	QD_FLAG
	CLR	EC_ZZUP
	CLR	FLAG_ERR
	LJMP	UART_COMMAND_VOID
	
QID_BEGIN:					; 起动开始
	JNB	FLAG_QID,PULSE_WIDTH_BEGIN
	MOV	DPTR,#TABLE_Q			;
	LCALL	DISP_STRING			; 校验开始,显示“Q”
	MOV	R0,#ZZMC_BUF
	MOV	A,EC_COUNTER			; 读取"被检表脉冲走字计数"值
	CPL	A
	INC	A
	MOV	@R0,A
	SETB	QID_FLAG
	CLR	EC_ZZUP
	CLR	FLAG_ERR
	LJMP	UART_COMMAND_VOID
	
PULSE_WIDTH_BEGIN:				; 脉宽测试开始	
	JNB	FLAG_MK,PULSE_CATCH_BEGIN
	MOV	DPTR,#TABLE_BEGIN		;
	LCALL	DISP_STRING			; 校验开始,显示“BE”
	;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>{
	MOV     R0,#CHANNEL_BUFFER
	MOV     DISP_BUFFER,@R0     
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
    MOV 	WC_T_C,#00H
	SETB	EC_MODE_EE
	SETB	PULSE_WIDTH_FLAG
	CLR	    EC_ZZUP
	CLR	    FLAG_ERR
	LJMP	UART_COMMAND_VOID
	
PULSE_CATCH_BEGIN:				; 捕黑测试开始	
	JNB	FLAG_BH,BEGIN_END
	MOV	DPTR,#TABLE_BH			;
	LCALL	DISP_STRING			; 校验开始,显示“BH”
	LCALL	CLR_BUFFER
	SETB	PULSE_CATCH_FLAG
	CLR	EC_ZZUP
	CLR	FLAG_ERR
;-----------------------------------------------				
BEGIN_END:	
	LJMP	UART_COMMAND_VOID
	
;-----------------校验结束命令----------------------------
END_END1:
	LJMP	UART_COMMAND_VOID
	
UART_CT_CHECK:
	JNB	FLAG_UART,END_END1
	JNB	FLAG_CT_CHECK,END_END1	; 判断表位CT是否出错
	CLR	FLAG_CT_CHECK
	MOV	DPTR,#TABLE_AUTO		; 
	LCALL	DISP_STRING			; 校验结束,显示“AUTO”
	LJMP	UART_COMMAND_VOID
UART_COMMAND_16:	
	CJNE	A,#16H,UART_COMMAND_17		; 判断是否校验结束命令
	JB	FLAG_AUTO_SHORT,UART_CT_CHECK	; 判断表位是否自动短接
	CLR	FLAG_ERR
	CLR	FLAG_CT_CHECK
	MOV	DPTR,#TABLE_HELLO		; 
	LCALL	DISP_STRING			; 校验结束,显示“HELLO”
DL_END:						; 电能校验结束
	JNB	FLAG_DL,RJ_END
	SJMP	WC_END
RJ_END:						; 日计时校验结束
	JNB	FLAG_RJ,XL_END
	SJMP	WC_END
XL_END:						; 需量周期校验结束
	JNB	FLAG_XL,ZZ_END
WC_END:	
	MOV	EC_FLAGS,#0			; 停止误差计算器工作
	LJMP	UART_COMMAND_VOID	
ZZ_END:						; 走字校验结束
	JNB	FLAG_ZZ,QD_END
	CLR	ZZ_FLAG
	LJMP	UART_COMMAND_VOID
QD_END:						; 潜动校验结束
	JNB	FLAG_QD,QID_END		
	CLR	QD_FLAG
	LJMP	UART_COMMAND_VOID
QID_END:					; 起动校验结束
	JNB	FLAG_QID,PULSE_WIDTH_END		
	CLR	QID_FLAG
	LJMP	UART_COMMAND_VOID
PULSE_WIDTH_END:				; 脉宽测试校验结束
	JNB	FLAG_MK,PULSE_CATCH_END		
	CLR	PULSE_WIDTH_FLAG
	MOV	EC_FLAGS,#0
	LJMP	UART_COMMAND_VOID
	
PULSE_CATCH_END:				; 捕黑校验结束
	JNB	FLAG_BH,END_END	
	CLR	PULSE_CATCH_FLAG	
;-----------------------------------------------接通电表电流	
	SETB	BH_C1	
	CLR	BH_C2 
	SETB	JDQ_BH				; 
	NOP
	NOP
	NOP	
	CLR	JDQ_AUTO			;
	LCALL	YS20 
	CLR	JDQ_BSNAP			; 接通24V电源		给一个电源脉冲
	LCALL	YS100
	SETB	JDQ_BSNAP			; 断开24V电源
;--------------------清除复位狗-------------------	
	CLR	X5043_CS
	SETB	X5043_CS	
;-----------------------------------------------再断开表位
	LCALL	YS20
	SETB	BH_C1	
	SETB	BH_C2 
	SETB	JDQ_BH				; 
	NOP
	NOP
	NOP	
	SETB	JDQ_AUTO			; 
	LCALL	YS20
	CLR	JDQ_BSNAP			; 接通24V电源		给一个电源脉冲
	LCALL	YS100
	SETB	JDQ_BSNAP			; 断开24V电源	
;-----------------------------------------------
END_END:	
	LJMP	UART_COMMAND_VOID
;-------------------自动短接设置命令-----------------------	
UART_COMMAND_17:	
	CJNE	A,#17H,UART_COMMAND_18		; 判断是否自动短接设置命令	
	JNB	FLAG_UART,COMMAND_17_END
	JB	FLAG_CT_CHECK,COMMAND_17_END	; 判断表位CT是否出错
	CLR	EC_MODE_EE
	CLR	ZZ_FLAG
	CLR	QD_FLAG
	CLR	QID_FLAG
	CLR	FLAG_ERR
	CLR	PULSE_WIDTH_FLAG
	CLR	PULSE_CATCH_FLAG
	ACALL	UART_RECV_BYTE			; 读取数据	
SET_AUTO_CUT:					; 断开表位	
	CJNE	A,#00H,SET_AUTO_SHORT
	CLR	FLAG_AUTO_SHORT			; 清除“自动短接标志”	
	MOV	DPTR,#TABLE_HELLO		; 
	LCALL	DISP_STRING			; 显示“HELLO”
	SETB	JDQ_BH				; 	
	SETB	JDQ_AUTO			; 
	SETB	BH_C1	
	SETB	BH_C2
	LCALL	YS20 
	CLR	JDQ_BSNAP			; 接通24V电源		给一个电源脉冲
	LCALL	YS100
	SETB	JDQ_BSNAP			; 断开24V电源
	AJMP	UART_COMMAND_VOID
SET_AUTO_SHORT:					; 短接表位
	CJNE	A,#01H,COMMAND_17_END
	SETB	FLAG_AUTO_SHORT			; 置“自动短接标志”	
	MOV	DPTR,#TABLE_AUTO		; 
	LCALL	DISP_STRING			; 显示“AUTO”
	SETB	JDQ_BH				; 	
	CLR	JDQ_AUTO			;
	SETB	BH_C1	
	CLR	BH_C2
	LCALL	YS20  
	CLR	JDQ_BSNAP			; 接通24V电源		给一个电源脉冲
	LCALL	YS100
	SETB	JDQ_BSNAP			; 断开24V电源
COMMAND_17_END:	
	AJMP	UART_COMMAND_VOID
;--------------------被检表RS485控制命令----------------		
UART_COMMAND_18:	
	CJNE	A,#18H,UART_COMMAND_19		; 判断是否被检表RS485控制命令
	JNB	FLAG_UART,COMMAND_18_END
	JB	FLAG_CT_CHECK,COMMAND_18_END	; 判断表位CT是否出错
	JB	FLAG_AUTO_SHORT,COMMAND_18_END	; 判断表位是否自动短接
	ACALL	UART_RECV_BYTE			    ; 读取数据
	MOV	C,ACC.0
	MOV	JDQ_X485OFF,C
COMMAND_18_END:	
	AJMP	UART_COMMAND_VOID
;-------------------捕黑试验百分比设置命令--------------
UART_COMMAND_19:	
	CJNE	A,#19H,UART_COMMAND_20		; 捕黑试验百分比设置命令		
	JNB	FLAG_UART,COMMAND_19_END
	JB	FLAG_CT_CHECK,COMMAND_19_END	; 判断表位CT是否出错
	JB	FLAG_AUTO_SHORT,COMMAND_19_END	; 判断表位是否自动短接
	ACALL	UART_RECV_BYTE			; 读取数据
	MOV	CATCH_SCALE,A
	MOV	EC_FLAGS,#0H			; 停止误差计算器工作
	CLR	FLAG_ERR
COMMAND_19_END:	
	AJMP	UART_COMMAND_VOID
;------------------复位误差系统命令---------------------
UART_COMMAND_20:
	CJNE	A,#20H,UART_COMMAND_21		; 判断是否复位误差系统命令
	JNB	FLAG_UART,COMMAND_19_END
	LJMP	MAIN_INIT
;------------------倍频设置命令-------------------------
UART_COMMAND_21:	
	CJNE	A,#21H,UART_COMMAND_22		; 判断是否倍频设置命令
	JNB	FLAG_UART,COMMAND_21_END
	JB	FLAG_CT_CHECK,COMMAND_21_END	; 判断表位CT是否出错
	JB	FLAG_AUTO_SHORT,COMMAND_21_END	; 判断表位是否自动短接
	ACALL	UART_RECV_BYTE			; 
	MOV	RJ_BF,A
COMMAND_21_END:	
	AJMP	UART_COMMAND_VOID
;-----------------脉宽测试试验命令----------------------
UART_COMMAND_22:	
	CJNE	A,#22H,UART_COMMAND_23		; 判断是否脉宽测试试验命令
	JNB	FLAG_UART,COMMAND_22_END
	JB	FLAG_CT_CHECK,COMMAND_22_END	; 判断表位CT是否出错
	JB	FLAG_AUTO_SHORT,COMMAND_22_END	; 判断表位是否自动短接
	CLR	ZZ_FLAG
	CLR	QD_FLAG
	CLR	QID_FLAG
	CLR	FLAG_ERR
	MOV	STATE_FLAG,#0			; 
	SETB	FLAG_MK				; 置"脉宽测试试验"标志
	MOV	EC_NUMLOOP,#1			; 检验圈数默认1圈
	MOV	WC_T_C,#0H
COMMAND_22_END:	
	AJMP	UART_COMMAND_VOID
;-----------------显示程序版本命令-----------------------
UART_COMMAND_23:	
	CJNE	A,#23H,UART_COMMAND_99		; 判断是否显示程序版本命令
	JNB	FLAG_UART,COMMAND_23_END
	JB	FLAG_CT_CHECK,COMMAND_23_END	; 判断表位CT是否出错
	JB	FLAG_AUTO_SHORT,COMMAND_23_END	; 判断表位是否自动短接
	MOV	DPTR,#TABLE_VER			; 
	LCALL	DISP_STRING			; 显示“V 1.00”
	ORL	DISP_BUFFER+2,#80H		; 
	MOV	EC_FLAGS,#0			; 停止误差计算器工作
	CLR	ZZ_FLAG
	CLR	QD_FLAG
	CLR	QID_FLAG
	CLR	FLAG_ERR
COMMAND_23_END:	
	AJMP	UART_COMMAND_VOID
;--------------------通讯联机命令-----------------------
UART_COMMAND_99:	
	CJNE	A,#99H,UART_COMMAND_VOID	; 判断是否显示程序版本命令
;	MOV	DPTR,#TABLE_HELLO		; 
;	LCALL	DISP_STRING			; 显示“HELLO”
	MOV	EC_FLAGS,#0			; 停止误差计算器工作
	CLR	ZZ_FLAG
	CLR	QD_FLAG
	CLR	QID_FLAG
	CLR	PULSE_WIDTH_FLAG
	CLR	PULSE_CATCH_FLAG
	CLR	FLAG_ERR
	SETB	FLAG_UART			; 置“通讯联机标志”
COMMAND_99_END:	
	AJMP	UART_COMMAND_VOID
;-------------------------------------------------------					
UART_COMMAND_VOID:				; 命令无效处理	
	MOV	RECV_BPR,#RECV_BUF
	CLR	FLAG_COMMAND			; 清除命令处理标志
	LJMP	MAIN_FLOW_WAIT
;-------------------------------------------------------
;-------------------------------读取1个字节
UART_RECV_BYTE:
	MOV	A,R0
	CJNE	A,RECV_BPW,UART_RECV_BYTE_BEG
UART_RECV_BYTE_QUIT:				; 缓冲已无数据可取
	POP	ACC
	POP	ACC
	LJMP	MAIN_CONTINUE			; 直接退出接收流程
UART_RECV_BYTE_BEG:
	MOV	A,@R0
	INC	R0
	CJNE	R0,#RECV_BUF+CONST_RBLEN,UART_RECV_BYTE_END
	MOV	R0,#RECV_BUF
UART_RECV_BYTE_END:
	RET	
;;;;;;;;;;;;;;;;;;;;;;;主循环;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	ORG	1000H
MAIN_GETSN:
;**********************误差板板号读取并显示**************************	
	MOV	SYS_SN,#CONST_SNDEF		; 默认编号置入
	MOV	X5043_BYTE_ADDR,#55H
	LCALL	X5043_READ_BYTE			; 读取本板编号
	MOV	A,X5043_BYTE_DATA
	MOV	R1,A				; 读到的本板编号放入R1中
	ADD	A,#6				; BCD码,低4位应<=9
	JB	AC,MAIN_GETSN_SHOW
	SUBB	A,#CONST_SNMAX+6
	JZ	MAIN_GETSN_CHK			; 累加器为零转移
	JNC	MAIN_GETSN_SHOW			; 有效编号值1-96
MAIN_GETSN_CHK:					; 进行数据校验
	MOV	X5043_BYTE_ADDR,#0AAH
	LCALL	X5043_READ_BYTE			; 读取编号校验码
	MOV	A,X5043_BYTE_DATA
	XRL	A,#CONST_SNVER			; 5A
	XRL	A,R1				; 进行“异或”校验
	JNZ	MAIN_GETSN_SHOW
	MOV	SYS_SN,R1			; 校验正确后置入编号
MAIN_GETSN_SHOW:				; 显示本板编号"NO. XX"
;	MOV	SYS_SN,#09H
	MOV	DPTR,#TABLE_SNUM
	ACALL	DISP_STRING			; 显示“NO.”
	ORL	DISP_BUFFER+4,#80H		; 显示“.”
	MOV	A,SYS_SN
	LCALL	DISP_ADIR			; 显示本板编号"NO. XX"
;----------------初始化继电器-------------------
	CLR	JDQ_BSNAP			; 接通24V电源		给一个电源脉冲
	LCALL	YS100
	SETB	JDQ_BSNAP			; 断开24V电源	
;-----------------------------------------------
MAIN_FL

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -