📄 zhuyin从控测试程序1.asm
字号:
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 + -