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

📄 zhuyin从控测试程序1.asm

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