📄 zhuyin从控测试程序1.asm
字号:
DJNZ R7,CMD2_6
CMD2_7:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
LCALL MakeJYH
;-------保存电表读数到内存中----------------
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0FH
LCALL WritePoint
RET
;********************************************************
; 主继电器绝对开
; BYTE0=命令长度
; BYTE1=命令字
; BYTE2=电表号
; BYTE3=校验和
;********************************************************
CMD_3: CJNE A,#RF_MSO,CMD_4
MOV DPTR,#RD_BUF
MOVX A,@DPTR
CJNE A,#4,CMD3_EX ; 命令长度是否正确
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0F0H
JNZ CMD3_EX ; 电表号是否合理
MOV A,#RD_OK
LCALL SendData ; 应答
MOV A,CTRL_MRY00
CJNE A,CTRL_MRY10,CMD3_11
MOV A,CTRL_MRY01
CJNE A,CTRL_MRY11,CMD3_11
SJMP CMD3_2
CMD3_11:
LCALL ReadCurrRelay
CMD3_2:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#07H
MOV R7,A
INC R7
CLR A
SETB C
CMD32_00:
RLC A
DJNZ R7,CMD32_00
MOV B,A
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
JB ACC.3,CMD31_1 ; 判断是前8块表还是后8块表
;---前8块
MOV A,CTRL_MRY00
ORL A,B
MOV CTRL_MRY00,A
MOV CTRL_MRY10,A
MOV CURR_MRY00,A
MOV CURR_MRY10,A
SJMP CMD3_3
CMD31_1:;后8块
MOV A,CTRL_MRY01
ORL A,B
MOV CTRL_MRY01,A
MOV CTRL_MRY11,A
MOV CURR_MRY01,A
MOV CURR_MRY11,A
CMD3_3: LCALL WriteCurrRelay ; 更新EEPROM电表状态标志位
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
LCALL OpenMasterRelay ; 更新电表操作队列
MOV DPTR,#METER_INF ; 电表信息区首地址,主继电器状态-从继电器状态-功率-电流
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,#10000000B
MOVX @DPTR,A
CMD3_EX:
RET
;********************************************************
; 主继电器绝对关
; BYTE0=命令长度
; BYTE1=命令字
; BYTE2=电表号
; BYTE3=校验和
;********************************************************
CMD_4: CJNE A,#RF_MSC,CMD_5
MOV DPTR,#RD_BUF
MOVX A,@DPTR
CJNE A,#4,CMD4_EX ; 命令长度是否正确
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0F0H
JNZ CMD4_EX ; 电表号是否合理
MOV A,#RD_OK
LCALL SendData ; 应答
MOV A,CTRL_MRY00
CJNE A,CTRL_MRY10,CMD4_1
MOV A,CTRL_MRY01
CJNE A,CTRL_MRY11,CMD4_1
SJMP CMD4_2
CMD4_1: LCALL ReadCurrRelay
CMD4_2:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#07H
MOV R7,A
INC R7
MOV A,#0FFH
CLR C
CMD4_3:
RLC A
DJNZ R7,CMD4_3
MOV B,A
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
JB ACC.3,CMD4_4 ; 是前8块表,还是后8块表
;----前8
MOV A,CTRL_MRY00
ANL A,B
MOV CTRL_MRY00,A
MOV CTRL_MRY10,A
MOV CURR_MRY00,A
MOV CURR_MRY10,A
SJMP CMD4_5
;-----后8
CMD4_4: MOV A,CTRL_MRY01
ANL A,B
MOV CTRL_MRY01,A
MOV CTRL_MRY11,A
MOV CURR_MRY01,A
MOV CURR_MRY11,A
CMD4_5: LCALL WriteCurrRelay ; 更新EEPROM中电表状态标志位
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
LCALL CloseMasterRelay ; 更新操作队列
MOV DPTR,#METER_INF ; 电表信息区首地址,主继电器状态-从继电器状态-功率-电流
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,#10000011B ;表示永久关断
MOVX @DPTR,A
CMD4_EX:RET
;********************************************************
; 主继电器开
; BYTE0=命令长度
; BYTE1=命令字
; BYTE2=电表号
; BYTE3=校验和
;********************************************************
CMD_5: CJNE A,#RF_MSOT,CMD_6
MOV DPTR,#RD_BUF
MOVX A,@DPTR
CJNE A,#4,CMD5_EX ; 数据长度是否正确
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0F0H
JNZ CMD4_EX ; 电表号是否合理
MOV A,#RD_OK
LCALL SendData ; 应答
MOV A,CTRL_MRY00
CJNE A,CTRL_MRY10,CMD5_1
MOV A,CTRL_MRY01
CJNE A,CTRL_MRY11,CMD5_1
SJMP CMD5_2
CMD5_1: LCALL ReadCurrRelay
CMD5_2:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#07H
MOV R7,A
INC R7
CLR A
SETB C
CMD5_3:
RLC A
DJNZ R7,CMD5_3
MOV B,A
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
JB ACC.3,CMD5_4 ; 是前8块表,还是后8块表
;----前8
MOV A,B
MOV A,CTRL_MRY00
ANL A,B
JZ CMD5_EX
ORL CURR_MRY00,A
ORL CURR_MRY10,A
SJMP CMD5_5
;-----后8
CMD5_4:
MOV A,B
MOV A,CTRL_MRY01
ANL A,B
JZ CMD5_EX
ORL CURR_MRY01,A
ORL CURR_MRY11,A
CMD5_5:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
LCALL OpenMasterRelay ; 更新操作队列
MOV DPTR,#METER_INF ; 电表信息区首地址,主继电器状态-从继电器状态-功率-电流
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,#10000000B
MOVX @DPTR,A
CMD5_EX:
RET
;*******************************************************
; 主继电器关
; BYTE0=命令长度
; BYTE1=命令字
; BYTE2=电表号
; BYTE3=校验和
;*******************************************************
CMD_6:
CJNE A,#RF_MSCT,CMD_7
MOV DPTR,#RD_BUF
MOVX A,@DPTR
CJNE A,#4,CMD6_EX ; 数据长度是否正确
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0F0H
JNZ CMD6_EX ; 电表号是否合理
MOV A,#RD_OK
LCALL SendData ; 应答
MOV A,CTRL_MRY00
CJNE A,CTRL_MRY10,CMD6_1
MOV A,CTRL_MRY01
CJNE A,CTRL_MRY11,CMD6_1
SJMP CMD6_2
CMD6_1:
LCALL ReadCurrRelay
CMD6_2:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#07H
MOV R7,A
INC R7
MOV A,#0FFH
CLR C
CMD6_3:
RLC A
DJNZ R7,CMD6_3
MOV B,A
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
JB ACC.3,CMD6_4 ; 是前8块表,还是后8块表
;----前8
MOV A,CURR_MRY00
ANL A,B
MOV CURR_MRY00,A
MOV CURR_MRY10,A
SJMP CMD6_5
;-----后8
CMD6_4:
MOV A,CURR_MRY01
ANL A,B
MOV CURR_MRY01,A
MOV CURR_MRY11,A
CMD6_5:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
LCALL CloseMasterRelay ; 更新操作队列
MOV DPTR,#METER_INF ; 电表信息区首地址,主继电器状态-从继电器状态-功率-电流
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,#10000100B ;表示暂时关断
MOVX @DPTR,A
CMD6_EX:
RET
;********************************************************
; 从继电器开
; BYTE0=命令长度
; BYTE1=命令字
; BYTE2=电表号
; BYTE3=校验和
;********************************************************
CMD_7: CJNE A,#RF_SSO,CMD_8
MOV DPTR,#RD_BUF
MOVX A,@DPTR
CJNE A,#4,CMD7_EX ; 数据长度是否正确
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0F0H
JNZ CMD7_EX ; 电表号是否合理
MOV A,#RD_OK
LCALL SendData ; 应答
MOV A,CURR_SRY00
CJNE A,CURR_SRY10,CMD7_1
MOV A,CURR_SRY01
CJNE A,CURR_SRY11,CMD7_1
SJMP CMD7_2
CMD7_1:
LCALL ReadCurrRelay
CMD7_2:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#07H
MOV R7,A
INC R7
CLR A
SETB C
CMD7_3:
RLC A
DJNZ R7,CMD7_3
MOV B,A
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
JB ACC.3,CMD7_4 ; 判断是前8路,还是后8路
;-------前8路
MOV A,CURR_SRY00
ORL A,B
MOV CURR_SRY00,A
MOV CURR_SRY10,A
SJMP CMD7_5
;-------后8路
CMD7_4: MOV A,CURR_SRY01
ORL A,B
MOV CURR_SRY01,A
MOV CURR_SRY11,A
CMD7_5: LCALL WriteCurrRelay ; 写EEPROM中的开关标志
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
LCALL OpenSlaveRelay ; 更新从继电器的开关操作队列
MOV DPTR,#METER_INF ; 电表信息区首地址,主继电器状态-从继电器状态-功率-电流
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
INC DPTR
MOVX A,@DPTR
SETB ACC.6 ;D6=1表示从继电器开 =0关
MOVX @DPTR,A
CMD7_EX:
RET
;********************************************************
; 从继电器关
; BYTE0=命令长度
; BYTE1=命令字
; BYTE2=电表号
; BYTE3=校验和
;********************************************************
CMD_8: CJNE A,#RF_SSC,CMD_9
MOV DPTR,#RD_BUF
MOVX A,@DPTR
CJNE A,#4,CMD8_0 ; 数据长度是否正确
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0F0H
JNZ CMD8_0 ; 电表号是否合理
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -