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

📄 从控测试程序.asm

📁 一卡通源码程序是我公司的一卡通源码程序,绝对难得
💻 ASM
📖 第 1 页 / 共 5 页
字号:
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                    ; 电表号是否合理

	MOV	A,#RD_OK
	LCALL	SendData                  ; 应答

	MOV	A,CURR_SRY00
	CJNE	A,CURR_SRY10,CMD8_1
	MOV	A,CURR_SRY01
	CJNE	A,CURR_SRY11,CMD8_1
	SJMP	CMD8_2
CMD8_0:
        lJMP    CMD8_EX

CMD8_1: LCALL	ReadCurrRelay

CMD8_2:
        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
	ANL	A,#07H
	MOV	R7,A
	INC	R7
	MOV	A,#0FFH
	CLR	C
CMD8_3:
	RLC	A
	DJNZ	R7,CMD8_3
	MOV	B,A

        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
	JB	ACC.3,CMD8_4              ; 判断是前8路,还是后8路
        ;-------前8路
	MOV	A,CURR_SRY00
	ANL	A,B
	MOV	CURR_SRY00,A
	MOV	CURR_SRY10,A

	SJMP	CMD8_5

        ;-------后8路
CMD8_4: MOV	A,CURR_SRY01
	ANL	A,B
	MOV	CURR_SRY01,A
	MOV	CURR_SRY11,A

CMD8_5:	LCALL	WriteCurrRelay

        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
	LCALL	CloseSlaveRelay           ; 更新从继电器开关操作队列

        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
        CLR      ACC.6                   ;D6=0表示从继电器关
        MOVX     @DPTR,A

CMD8_EX:
        RET

;********************************************************
;       写限制值
;	BYTE0=命令长度
;	BYTE1=命令字
;	BYTE2=电表号
;	BYTE3=限制电流
;	BYTE4=校验和
;********************************************************
CMD_9:	CJNE	A,#RF_LTA,CMD9_02
        MOV	DPTR,#RD_BUF
        MOVX    A,@DPTR
	CJNE	A,#5,CMD9_EX              ; 数据长度是否正确

        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
	ANL	A,#0F0H
	JZ	CMD9_10

        MOVX   A,@DPTR
        XRL    A,#0FFH
        JNZ    CMD9_EX                    ; 电表号是否合理

        ;------统一设置过流值
CMD9_00:
	MOV	A,#RD_OK
	LCALL	SendData                  ; 应答

        MOV	DPTR,#RD_BUF+3
        MOVX    A,@DPTR
	MOV	B,#LMT_VAL
	MUL	AB

	MOV	DPTR,#LIMIT_PP
        MOV     R7,#16
CMD9_01:
        MOVX    @DPTR,A
        INC     DPTR
        DJNZ    R7,CMD9_01

	LCALL	WriteLimitPP

CMD9_EX:
        RET

CMD9_02:
        LJMP    CMD_A                        ;
        ;-------设置某一个电表的过流值
CMD9_10:
	MOV	A,#RD_OK
	LCALL	SendData

        MOV	DPTR,#RD_BUF+3
        MOVX    A,@DPTR
	MOV	B,#LMT_VAL
	MUL	AB
        MOV     B,A

        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
	MOV	DPTR,#LIMIT_PP
        ADD     A,DPL
        MOV     DPL,A

        MOV     A,B
        MOVX    @DPTR,A                 ; 将过流值保存到RAM中

        MOV     DPTR,#RD_BUF+2
        MOVX    A,@DPTR
        MOV     DPTR,#EE_LPP
        ADD     A,DPL
        MOV     DPL,A
        CLR     A
        ADDC    A,DPH
        MOV     DPH,A
        MOV     A,B
        LCALL   WriteByte               ; 将过流值到EEPROM中 0

CMD9_EX1:
        RET

;********************************************************
;       写恶意负载识别功率
;	BYTE0=命令长度
;	BYTE1=命令字
;	BYTE2=电表号
;	BYTE3=恶意负载识别功率
;	BYTE4=校验和
;********************************************************
CMD_A:	CJNE	A,#RF_BAD,CMD_B
        MOV	DPTR,#RD_BUF
        MOVX    A,@DPTR
	CJNE	A,#5,CMDA_EX              ; 数据长度是否正确

        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
	ANL	A,#0F0H
	JZ	CMDA_10

        MOVX   A,@DPTR
        XRL    A,#0FFH
        JNZ    CMDA_EX                    ; 电表号是否合理

        ;------统一设置恶意负载识别功率
CMDA_00:
	MOV	A,#RD_OK
	LCALL	SendData                  ; 应答

        MOV	DPTR,#RD_BUF+3
        MOVX    A,@DPTR                   ; 取出恶意负载识别功率
 	MOV	R0,#SBLC_LIMIT
        MOV     R7,#16
CMDA_01:
        MOV     @R0,A
        INC     R0
        DJNZ    R7,CMDA_01                ; 将识别功率保存到RAM中

        MOV     DPTR,#RD_BUF+3
        MOVX    A,@DPTR                   ; 取出恶意负载的识别功率
        MOV     DPTR,#EE_BADCODE
        MOV     R7,#16
CMDA_02:
        LCALL   WriteByte
        INC     DPTR
        NOP
        NOP
        DJNZ    R7,CMDA_02                ; 将识别功率保存到EEPROM中

CMDA_EX:
        RET

        ;-------设置某一个电表的恶意负载识别功率
CMDA_10:
	MOV	A,#RD_OK
	LCALL	SendData

        MOV     DPTR,#RD_BUF+2
        MOVX    A,@DPTR
        ADD     A,#SBLC_LIMIT
        MOV     R0,A
        MOV     DPTR,#RD_BUF+3
        MOVX    A,@DPTR
        MOV     @R0,A                   ; 将恶意负载识别功率保存到内存中

        MOV     B,A
        MOV     DPTR,#RD_BUF+2
        MOVX    A,@DPTR
        MOV     DPTR,#EE_BADCODE
        ANL     A,#0FH
        ORL     DPL,A
        MOV     A,B
        LCALL   WriteByte               ; 将恶意负载识别功率保存到EEPROM中 0

CMDA_EX1:
        RET


;********************************************************
;       写跳电后的来电时间
;       BYTE0=命令长度
;       BYTE1=命令字
;       BYTE2=电表号
;       BYTE3=恢复时间
;       BYTE4=校验和
;********************************************************
CMD_B:	CJNE	A,#RF_TIM,CMD_C
        MOV	DPTR,#RD_BUF
        MOVX    A,@DPTR
	CJNE	A,#5,CMDB_EX              ; 数据长度是否正确

        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
	ANL	A,#0F0H
	JZ	CMDB_10

        MOVX   A,@DPTR
        XRL    A,#0FFH
        JNZ    CMDB_EX                    ; 电表号是否合理

        ;------统一设置跳电后的来电时间
CMDB_00:
	MOV	A,#RD_OK
	LCALL	SendData                  ; 应答

        MOV	DPTR,#RD_BUF+3
        MOVX    A,@DPTR                   ; 取出关断时间
 	MOV	DPTR,#CLOSE_TIME
        MOV     R7,#16
CMDB_01:
        MOVX    @DPTR,A
        INC     DPTR
        DJNZ    R7,CMDB_01                ; 将关断时间保存到RAM中

        LCALL   WriteCloseTime            ; 将关断时间保存到EEPROM中

CMDB_EX:
        RET

        ;-------设置某一个电表的跳电来电时间
CMDB_10:
	MOV	A,#RD_OK
	LCALL	SendData

        MOV     DPTR,#RD_BUF+3
        MOVX    A,@DPTR
        MOV     B,A

        MOV     DPTR,#RD_BUF+2
        MOVX    A,@DPTR
        MOV     DPTR,#CLOSE_TIME
        ANL     A,#0FH
        ORL     DPL,A
        MOV     A,B
        MOVX    @DPTR,A                 ; 将关断时间保存到RAM中

        MOV     DPTR,#RD_BUF+2
        MOVX    A,@DPTR
        MOV     DPTR,#EE_CT
        ANL     A,#0FH
        ORL     DPL,A
        MOV     A,B
        LCALL   WriteByte               ; 将关断时间保存到EEPROM中 0

CMDB_EX1:
        RET

;***************************************

⌨️ 快捷键说明

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