📄 err3.asm
字号:
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 + -