📄 zbframe.bak
字号:
;--入口:R7(通道号1-16)
;--------------------------------------
WR_FRM_PROC: MOV A,REC_DATA_ID
WR_ID_1: CJNE A,#02H,WR_ID_2 ;写电表常数
MOV DPH,#C04_ADDR_H
MOV A,R7
DEC A
MOV B,#2
MUL AB
ADD A,#C04_CONSTANT_0
MOV DPL,A
MOV B,REC_DATA_ITEM
LCALL WR_C04_1BYTE
MOV B,REC_DATA_ITEM+1
MOV DPH,#C04_ADDR_H
INC DPL
LCALL WR_C04_1BYTE
MOV R5,REC_DATA_ITEM
MOV R4,REC_DATA_ITEM+1
MOV DPH,R7
LCALL COMPUTE_RESOLUTION ;写入电表分辨率
LJMP WR_ID_EXIT
WR_ID_2: CJNE A,#03H,WR_ID_20 ;写电表底数
SJMP WR_ID_21
WR_ID_20: LJMP WR_ID_3
WR_ID_21:
MOV DPH,#C04_ADDR_H
MOV A,R7
DEC A
MOV B,#4
MUL AB
ADD A,#C04_INIT_VAL_0 ;表底小数位地址
MOV DPL,A
MOV B,REC_DATA_ITEM ;表底小数
LCALL WR_C04_1BYTE
MOV B,REC_DATA_ITEM+1 ;表底整数第一字节
MOV DPH,#C04_ADDR_H
INC DPL
LCALL WR_C04_1BYTE
MOV B,REC_DATA_ITEM+2
MOV DPH,#C04_ADDR_H
INC DPL
LCALL WR_C04_1BYTE
MOV B,REC_DATA_ITEM+3
MOV DPH,#C04_ADDR_H
INC DPL
LCALL WR_C04_1BYTE
;改变当前表的当前电量//04-03-24
MOV A,R7
DEC A
ADD A,#RAM_COUNTER_DECIMAL_0 ;当前电量小数寄存器地址
MOV R0,A
MOV @R0,REC_DATA_ITEM
MOV B,REC_DATA_ITEM
MOV DPH,#C04_ADDR_L
MOV A,R7
DEC A
ADD A,#C04_COUNTER_DECIMAL_0 ;当前电量小数存储器地址
MOV DPL,A
LCALL WR_C04_1BYTE
;存储器中当前电量更新
MOV A,R7
DEC A
MOV B,#3
MUL AB
ADD A,#C04_COUNTER_INTEGER_0
MOV DPL,A
MOV DPH,#C04_ADDR_L
MOV B,REC_DATA_ITEM+1
LCALL WR_C04_1BYTE
MOV B,REC_DATA_ITEM+2
MOV DPH,#C04_ADDR_L
INC DPL
LCALL WR_C04_1BYTE
MOV B,REC_DATA_ITEM+3
MOV DPH,#C04_ADDR_L
INC DPL
LCALL WR_C04_1BYTE
LCALL CLR_PULSE_AND_OTHER ;当前脉冲数,存0.1度电到标志,0.1度电计数器清零
LJMP WR_ID_EXIT
WR_ID_3:
CJNE A,#07H,WR_FRM_OVER
MOV A,REC_DATA_ITEM ;存当前表的继电器状态字
CJNE A,#00H,JUDGE_JDQ01
AJMP WRITE_JDQSTATE
JUDGE_JDQ01:
CJNE A,#01H,WR_FRM_OVER
WRITE_JDQSTATE:
LCALL JUDGE_JDQ_STATE_BYTE ;发送当前所有继电器状态字
MOV DPH,#C04_ADDR_H ;状态合法,存储当前状态字
MOV A,R7
DEC A
ADD A,#C04_RELAY_STATE_0 ;得出当前表的继电器状态字的地址
MOV DPL,A
MOV B,REC_DATA_ITEM ;存当前表的继电器状态字
LCALL WR_C04_1BYTE
WR_ID_EXIT:
MOV SEND_CTRL_CODE,#02H
MOV SEND_DATA_FEILD_LEN,#03H
MOV SEND_DATA_METER,#00H
MOV SEND_DATA_METER+1,#00H
LCALL PRODUCE_SUM_END
SETB R_LEDC ;接收灯灭
CLR S_LEDC ;发送指示亮
LCALL SEND_FRM ;发送写应答帧
WR_FRM_OVER: RET
;------------------------------------------------
;当前脉冲数,存0.1度电到标志,0.1度电计数器清零
CLR_PULSE_AND_OTHER:
MOV A,R7
DEC A
ADD A,#RAM_PULSES1_0
MOV R0,A
MOV @R0,#00H
MOV B,#0
MOV DPH,#C04_ADDR_L
MOV A,R7
DEC A
ADD A,#C04_PULSES1_0 ;脉冲数清零
MOV DPL,A
LCALL WR_C04_1BYTE
MOV A,R7
DEC A
ADD A,#RAM_0DOT01_COUNTER_0
MOV R0,A
MOV @R0,#00H
MOV B,#0
MOV DPH,#C04_ADDR_L
MOV A,R7
DEC A
ADD A,#C04_0DOT01_COUNTER_0 ;存0.1度电到标志清零
MOV DPL,A
LCALL WR_C04_1BYTE
MOV A,R7
DEC A
ADD A,#RAM_TO_0DOT1_FLAG_0
MOV R0,A
MOV @R0,#00H
MOV B,#0
MOV DPH,#C04_ADDR_L
MOV A,R7
DEC A
ADD A,#C04_TO_0DOT1_FLAG_0 ;0.1度电计数器清零
MOV DPL,A
LCALL WR_C04_1BYTE
RET
;--------------------------------------
;产生和校验和帧尾
;-------------------------------------
PRODUCE_SUM_END:MOV R0,#SEND_DATA_FEILD_LEN
MOV A,@R0
ADD A,#05H
MOV B,A
MOV R0,#SEND_BUF
MOV A,#00
PRODUCE_SUM_END1:ADD A,@R0
INC R0
DJNZ B,PRODUCE_SUM_END1
MOV @R0,A ;存和校验
INC R0
MOV @R0,#16H
RET
;--------------------------------------
;发送帧
;------------------------------------
SEND_FRM:
CPL WATCH_DOG ;清看门狗
CLR ZB_HW ;串行口置载波收发状态
SETB RX_TX ;转换为发送状态前至少要保持高电平3微秒
NOP
NOP
NOP
NOP
CLR RX_TX ;ST7536为发送状态
LCALL WAIT_5ms ;等待5ms
MOV COUNTER_SEND_DELAY,#30H ;ST7536置为发送态后,必须等待几个同步信号后,才能发送
JNB TXD_READY_FLAG,$ ;等待发送准备好标志
MOV SEND_WHOLE_BYTE,#0AAH ;发送唤醒帧系统地址低位0AAH
LCALL SEND_ONE_BYTE
MOV SEND_WHOLE_BYTE,#0AAH ;发送唤醒帧系统地址高位字节0AAH
LCALL SEND_ONE_BYTE
;ajmp aaaa
MOV A,SEND_DATA_FEILD_LEN ;发送帧
ADD A,#07H ;待发送帧的总长度
MOV B,A
MOV R0,#SEND_BUF
SEND_FRM1: MOV SEND_WHOLE_BYTE,@R0 ;当前字节连续发送3次
LCALL SEND_ONE_BYTE
MOV SEND_WHOLE_BYTE,@R0 ;第2次
LCALL SEND_ONE_BYTE
MOV SEND_WHOLE_BYTE,@R0 ;第3次
LCALL SEND_ONE_BYTE
; LCALL WAIT_FOR_1ms ;发送两个数据间隔1毫秒以便接收方进行数据处理
INC R0 ;下一字节
DJNZ B,SEND_FRM1
MOV SEND_WHOLE_BYTE,#16H ;发完全帧后,必须随便发一个字节,否则帧的最后一个字节可能接收不对
LCALL SEND_ONE_BYTE
LCALL WAIT_5ms ;等待5ms
aaaa:
SETB S_LEDC ;发送指示灭
SETB RX_TX ;ST7536为接收状态
CLR TXD_READY_FLAG ;清发送准备好标志
CLR SEND_BYTE_OVER ;清发送完整字节标志
; SETB ZB_HW ;串行口置红外收发状态
RET
;;;;;;;;;;;;;;;;;;;;;
;发送一个字节 ;
;入口A:待发送的字节 ;
SEND_ONE_BYTE:
CLR SEND_BYTE_OVER ;清字节发送完成标志
CPL WATCH_DOG
SEND_ONE_BYTE1:
NOP
NOP
JNB SEND_BYTE_OVER,SEND_ONE_BYTE1 ;等待发送字节8位发送完
CPL WATCH_DOG
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -