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

📄 zhuyin从控测试程序1.asm

📁 一卡通源码程序是我公司的一卡通源码程序,绝对难得
💻 ASM
📖 第 1 页 / 共 5 页
字号:

	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

;********************************************************
;       写多费率时间段
;	BYTE0=命令长度
;	BYTE1=命令字
;	BYTE2~BYTE81=时段数据
;	BYTE82=校验和
;
;       时段数据(16个时段,对应4种费率,每个时段占用5个字节,总计5*16=80个字节)
                        ; Byte0: 开始小时
                        ; Byte1: 开始分
                        ; Byte2: 结束小时
                        ; Byte3: 结束分
                        ; Byte4: 费率
;未使用时段全部填充0AAH
;********************************************************
CMD_C:	CJNE	A,#RF_RATE,CMD_D
        MOV	DPTR,#RD_BUF
        MOVX    A,@DPTR
	CJNE	A,#83,CMDC_EX             ; 判断数据长度是否正确

	MOV	A,#RD_OK
	LCALL	SendData                  ; 应答

        MOV     DPTR,#RATE_BUF
        MOV     R0,DPL
        MOV     R1,DPH
        MOV     DPTR,#RD_BUF+2
        MOV     R2,DPL
        MOV     R3,DPH

        MOV     R7,#80
CMDC_0: MOV     DPL,R2
        MOV     DPH,R3
        MOVX    A,@DPTR
        ANL     A,#0F0H
        SWAP    A
        MOV     B,#10
        MUL     AB
        MOV     B,A
        MOVX    A,@DPTR
        ANL     A,#0FH
        ADD     A,B
        INC     DPTR
        MOV     R2,DPL
        MOV     R3,DPH

        MOV     DPL,R0
        MOV     DPH,R1
        MOVX    @DPTR,A
        INC     DPTR
        MOV     R0,DPL
        MOV     R1,DPH
        DJNZ    R7,CMDC_0

        CLR     ERR_RATE                ; 清除分时计费时间段错误标志

        MOV     A,#0C0H
        LCALL   MakeJYH
        LCALL   WriteRate

CMDC_EX:RET

;********************************************************
;       写系统ID
;	BYTE0=命令长度
;	BYTE1=命令字
;       BYTE2=系统ID0
;       BYTE3=系统ID1
;       BYTE4=主控地址
;       BYTE5=时
;       BYTE6=分
;       BYTE7=秒
;	BYTE8=校验和
;********************************************************
CMD_D:	CJNE	A,#RF_SID,CMD_E

        MOV	DPTR,#RD_BUF
        MOVX    A,@DPTR
	CJNE	A,#9,CMDD_EX              ; 判断数据长度正确否

	MOV	A,#RD_OK
	LCALL	SendData                  ; 应答

        SETB    FLAG_REQUE                ; 设立系统请求到标志

        MOV	DPTR,#RD_BUF+5
        MOVX    A,@DPTR
        MOV     R1,A
        ANL     A,#0F0H
        SWAP    A
        MOV     B,#10
        MUL     AB
        MOV     B,A
        MOV     A,R1
        ANL     A,#0FH
        ADD     A,B
        MOV     HOUR,A
        INC     DPTR
        MOVX    A,@DPTR
        MOV     R1,A
        ANL     A,#0F0H
        SWAP    A
        MOV     B,#10
        MUL     AB
        MOV     B,A
        MOV     A,R1
        ANL     A,#0FH
        ADD     A,B
        MOV     MINUTE,A                ; 保存时间

        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
        MOV     B,SERVER
        CJNE    A,B,CMDD_ERR

        INC     DPTR
        MOVX    A,@DPTR
        MOV     B,SERVER+1
        CJNE    A,B,CMDD_ERR

        INC     DPTR
        MOVX    A,@DPTR
        MOV     B,SERVER+2
        CJNE    A,B,CMDD_ERR

        MOV     A,ADDRESS
        MOV     B,ADDR
        CJNE    A,B,CMDD_ERR

        SETB    FLAG_START

CMDD_EX:
        RET

CMDD_ERR:
        SETB    FLAG_START          ;不过
        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
        MOV     SERVER,A
        INC     DPTR
        MOVX    A,@DPTR
        MOV     SERVER+1,A
        INC     DPTR
        MOVX    A,@DPTR
        MOV     SERVER+2,A
        MOV     ADDR,ADDRESS
        LCALL   WriteServer

        MOV     BEEP_SEC,#5
        SETB    BEEP_EN
        SETB    SYS_ERR                 ; 建立系统信息不一致标志
        RET

;********************************************************
;       电表读数清零
;	BYTE0=数据长度
;	BYTE1=命令字
;     

⌨️ 快捷键说明

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