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

📄 从控测试程序.asm

📁 一卡通源码程序是我公司的一卡通源码程序,绝对难得
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;	BYTE17=POINT 2/RATE 3
;	BYTE18=POINT 3/RATE 3
;       BYTE19=POINT JYH
;       BYTE20=间隔符
;	BYTE21=JYH
;***************************
CMD_2:
        CJNE	A,#RF_WP,CMD2_00
        MOV	DPTR,#RD_BUF
        MOVX    A,@DPTR
        CJNE	A,#22,CMD2_EX              ; 命令长度是否正确

        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
	ANL	A,#0F0H
	JZ	CMD2_0                     ; 电表号是否合理
CMD2_EX:
        RET

CMD2_00:
        AJMP    CMD_3                      ;
CMD2_0:
        MOV     DPTR,#RD_BUF+3
        MOV     R5,#17
        MOV     R4,#0
CMD2_1:
        MOVX    A,@DPTR
        ADD     A,R4
        MOV     R4,A
        INC     DPTR
        DJNZ    R5,CMD2_1

        JNZ     CMD2_EX                    ; 校验电表读数校验和

CMD2_2:
        MOV	A,#RD_OK
	LCALL	SendData                   ; 回送应答信号

;-------保存电表读数到内存中----------------
        MOV	DPTR,#RD_BUF+3
        MOV     R4,DPL
        MOV     R5,DPH

        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
	MOV	B,#17
	MUL	AB
        MOV     DPTR,#POINT_BUF
	ADD	A,DPL
        MOV     DPL,A
        MOV     R2,A
        MOV     A,B
        ADDC    A,DPH
        MOV     DPH,A
        MOV     R3,A

	INC	DPTR
        INC     DPTR
	MOVX	A,@DPTR
	CJNE	A,#0AAH,CMD2_5

        MOV     R6,#4
CMD2_3:
	MOV     DPL,R4
        MOV     DPH,R5
	MOVX	A,@DPTR
        MOV     B,A
        INC     DPTR
        MOV     R4,DPL
        MOV     R5,DPH

	MOV     DPL,R2
        MOV     DPH,R3
	MOVX	A,@DPTR
	ADD	A,B
	DA	A
	MOVX	@DPTR,A
        INC     DPTR
        MOV     R2,DPL
        MOV     R3,DPH          ;LSB

	MOV     DPL,R4
        MOV     DPH,R5
	MOVX	A,@DPTR
        MOV     B,A
        INC     DPTR
        MOV     R4,DPL
        MOV     R5,DPH

	MOV     DPL,R2
        MOV     DPH,R3
	MOVX	A,@DPTR
	ADDC	A,B
	DA	A
	MOVX	@DPTR,A
        INC     DPTR
        MOV     R2,DPL
        MOV     R3,DPH          ;MSB

	MOV	R7,#2
CMD2_4:
	MOV     DPL,R4
        MOV     DPH,R5
	MOVX	A,@DPTR
	ADDC	A,#0
	DA	A
        INC     DPTR
        MOV     R4,DPL
        MOV     R5,DPH

	MOV     DPL,R2
        MOV     DPH,R3
	MOVX	@DPTR,A
        INC     DPTR
        MOV     R2,DPL
        MOV     R3,DPH          ;HSB

	DJNZ	R7,CMD2_4
        DJNZ    R6,CMD2_3
	SJMP	CMD2_7

CMD2_5:
	MOV     DPL,R2
        MOV     DPH,R3
	MOV	R7,#16
CMD2_6:
	MOV     DPL,R4
        MOV     DPH,R5
	MOVX	A,@DPTR
        INC     DPTR
        MOV     R4,DPL
        MOV     R5,DPH

	MOV     DPL,R2
        MOV     DPH,R3
	MOVX	@DPTR,A
        INC     DPTR
        MOV     R2,DPL
        MOV     R3,DPH

	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

⌨️ 快捷键说明

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