📄 hldmsapp.asm
字号:
SUBB A,#3H
MOV ADDR_DATARE+8,A
MOV R0, #ADDR_DATARE+9
MOV R2, ADDR_DATARE+8
MOVLOP: MOV A, @R0
ADD A, #33H ; D0、D1 等数据 +33H
MOV @R0,A
INC R0
DJNZ R2, MOVLOP
LCALL AD_BS1A ;通过485抄指定表号的表
CLR ES
JNB HWR_FRAM_ALL,ZB_ERROR1AXX ; 没收到 485的应答
CLR HWR_FRAM_ALL
MOV A,ADDR_DATARE+7
CJNE A,#81H,ZB_ERROR1AXX
MOV A, DPL
CLR C
SUBB A, ADDR_DATARE
JNZ ZB_ERROR1AXX ; A0不等 转移
MOV A, DPH
CLR C
SUBB A, ADDR_DATARE+1
JNZ ZB_ERROR1AXX ; A1不等 转移
MOV A, 23H
CLR C
SUBB A, ADDR_DATARE+2
JNZ ZB_ERROR1AXX ; A2不等 转移
MOV ADDR_DATARE+3, ADDR_DATARE+7 ; 移动 命令码 C
MOV A, ADDR_DATARE+8
ADD A, #4 ; 加上集中器地址和继电器状态的长度
MOV ADDR_DATARE+4, A ;; 移动长度 L
MOV A, ADDR_DATARE+8
MOV R0, #ADDR_DATARE+9
MOV R2, A
DATALP: MOV A, @R0
CLR C
SUBB A, #33H ;; 数据项均减去 33H
MOV @R0,A
INC R0
DJNZ R2,DATALP
MOV A, ADDR_DATARE+9 ;; 移动 D0
MOV ADDR_DATARE+5, A
MOV A, ADDR_DATARE+10 ;; 移动 D1
MOV ADDR_DATARE+6,A
MOV ADDR_DATARE+7,ADDR_DATARE-6
MOV ADDR_DATARE+8,ADDR_DATARE-5
MOV ADDR_DATARE+9,ADDR_DATARE-4
MOV ADDR_DATARE ,11H ;; 加上集中器地址BBBBBB
MOV ADDR_DATARE+1 ,13H
MOV ADDR_DATARE+2 ,14H
MOV ADDR_DATARE+10 ,#0FH ;; 继电器状态
MOV A,ADDR_DATARE+6
CJNE A, #90H, DECLOP1
;DECCC: MOV R0, #ADDR_DATARE+15 ;; 数据16个字节,不用移位
; MOV R1, #ADDR_DATARE+19
; MOV R2, #12
;DECLOOP: MOV A, @R1
; MOV @R0,A
; INC R0
; INC R1
; DJNZ R2, DECLOOP
; DEC ADDR_DATARE+4 ; // 长度减 4
; DEC ADDR_DATARE+4
; DEC ADDR_DATARE+4
; DEC ADDR_DATARE+4
LJMP DECLOP2
DECLOP1: CJNE A, #94H, DECLOP2
AJMP DECLOP2
ZB_ERROR1AXX: MOV ADDR_DATARE, 11H
MOV ADDR_DATARE+1, 13H ;DPH
MOV ADDR_DATARE+2, 14H ;23H
MOV ADDR_DATARE+3, #0C1H
MOV ADDR_DATARE+4, #5H
MOV ADDR_DATARE+5, DPL ;;11H ; 集中器地址
MOV ADDR_DATARE+6, DPH ;;13H
MOV ADDR_DATARE+7, 23H ;;14H
MOV ADDR_DATARE+8, #0FH ;; 电表状态
MOV ADDR_DATARE+9, #1 ;; 错误字
DECLOP2:
SETB PSW.4
CLR PSW.3
MOV R0, #ADDR_DATARE ;; R0 赋发送首地址
MOV A, ADDR_DATARE+4 ;; 取长度
ADD A, #5
MOV R2,A ;; 发送串的长度
MOV R5,#40H ;; 起始位 FF 的个数
MOV R7,#'S' ; 'S' and r_t=0:begin send
CLR ZBT_FRAM_ALL;
CLR R_T
CLR PSW.4
CLR PSW.3
MOV ZB_SEND_TIME,#40
setb ex0 ; // 开中断0
;ZBW2:
MOV ADDR_DATARE-3, #0FFH
ADDLOP: DJNZ ADDR_DATARE-3,ADDLOP
LJMP MAIN_LOOP ; ///////////////// 跳转回主程序
AD_BS1A: MOV R0,#50h
MOV A,#0
XHX11: MOV @R0,A
INC R0
cjne R0,#7Ah,XHX11
AD_BS1: CLR R_485
LCALL SENDDATA
MOV R7,#06H
HWR6: MOV R5,#0FFH
HWR7: MOV R6,#0FFH
HWR1: JB HWR_FRAM_ALL,ZZ
DJNZ R6,HWR1
DJNZ R5,HWR7
DJNZ R7,HWR6
ZZ: NOP
NOP
SETB R_485
RET
ZBTRANS: jnb e99_bit,ret7
clr e99_bit
MOV R5,#40H
MOV R7,#'S' ;'S' and r_t=0:begin send
CLR ZBT_FRAM_ALL
CLR R_T
CLR PSW.4
CLR PSW.3
MOV ZB_SEND_TIME,#40
setb ex0
MOV ADDR_DATARE-3, #0FFH
ADDLOP1: DJNZ ADDR_DATARE-3, ADDLOP1
ZBW2: LJMP MAIN_LOOP
ret7: NOP
NOP
SETB WDI
clr ea
ajmp $
ZB_DJ: CJNE A,#39H,ZB_WR_ERROR1 ;广播冻结
MOV ADDR_DATATR+30,ADDR_DATARE-6
MOV ADDR_DATATR+31,ADDR_DATARE-5
MOV ADDR_DATATR+32,ADDR_DATARE-4
MOV Addr_DataTr,#0FFH
MOV Addr_DataTr+1,#0FFH
MOV Addr_DataTr+2,#06H
MOV R0,#Addr_DataTr
MOV R1,#3
LCALL SENDDATA
ZB_WR_ERROR1:
ZB_T_CHE_ALL: CJNE A,#08H,ZB_WR_ERROR1 ;广播校时;;;;;;;;;;;;;;;;
MOV R0, #ADDR_DATARE
MOV R2, #6H
SHJIE: MOV @R0, #99H ; 地址 A0 A1 A2 A3 A4 A5
INC R0
DJNZ R2, SHJIE
MOV ADDR_DATARE+6, #68H ; 帧头
MOV R0, #ADDR_DATARE+9
MOV R2, #6
SHJIE1: MOV A, @R0
ADD A, #33H
MOV @R0, A
INC R0
DJNZ R2, SHJIE1
CLR R_485
LCALL SENDDATA
SETB R_485
ZBT_2: LJMP MAIN_LOOP
ZB_SEND_DOWN: JNB DOWN_BIT,ZB_SEND_DOWN3A ;下行转发后没收到上行转发帧,不再下行转发
LJMP MAIN_LOOP
ZB_SEND_DOWN3A: CLR ZBR_FRAM_ALL
anl a,#30h ; 下行转发处理模块
MOV B,#3
MOV R4,A
MUL AB
SWAP A ; N*3
MOV R2,A
ADD A,#8
MOV B,A
MOV A,ADDR_DATARE+1 ; L-5-(N+1)*3
CLR C
SUBB A,B
MOV R3,A
MOV A,R4
SWAP A
jnz tem
MOV B,#60
ajmp tem1
tem: mov b,#40
tem1: INC A
MUL AB
MOV WAIT_TIME,A ;
MOV R7,02H ; R2中的N*3
MOV R0,#ADDR_DATARE+7
MOV R1,#ADDR_DATATRA+4
MOV A,R2
JZ TXT1
tmp_mem_mv1: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R7,tmp_mem_mv1 ;进行N*3个单元的数据移位,去掉上位表号
MOV ADDR_DATARE+7,R0
TXT1: MOV R0,#ADDR_DATARE-6
MOV B,#3
TXT: MOV A,@R0 ;本表地址为主叫地址
MOV @R1,A
INC R1
INC R0
DJNZ B,TXT
MOV A,ADDR_DATARE+1 ;数据长度为L-3
CLR C
MOV B,#3
SUBB A,B
MOV ADDR_DATATRA+1,A
MOV A,ADDR_DATARE
ANL A,#30H
JNZ NOTLAST
MOV ADDR_DATATRA,#01H
AJMP CONTZF
NOTLAST: CLR C
MOV A,ADDR_DATARE
SUBB A,#10H
MOV ADDR_DATATRA,A ;中继级数减1
CONTZF: mov a,addr_datare+1
add a,#addr_datare+1
mov r0,a
mov a,@r0
MOV r1,#UPPER_ADDR_h
mov @r1,A ;保存上级地址
dec r1
dec R0
MOV A,@R0
MOV @r1,A
dec R0
dec r1
MOV A,@R0
MOV @r1,A
MOV Addr_DataTrA+2,Addr_DataRe+2
MOV Addr_DataTrA+3,Addr_DataRe+3
MOV Addr_DataTrA-3,Addr_DataRe+4
MOV Addr_DataTrA-2,Addr_DataRe+5
MOV Addr_DataTrA-1,Addr_DataRe+6
MOV A,ADDR_DATATRA+1
ADD A,#5
MOV B,A
CLR ES
SETB PSW.4
CLR PSW.3
MOV R0,#Addr_DataTrA-3 ;发送数据地址
MOV R2,B
SETB UP_BIT
SETB DOWN_BIT
lCALL DL1
setb e99_bit
ljmp zbtrans
ZB_SEND_UP: JB UP_BIT,ZB_SEND_UP3A ;上行转发后没收到上行转发帧,不再上行转发
LJMP MAIN_LOOP
ZB_SEND_UP3A: CLR ZBR_FRAM_ALL
mov r0,#UPPER_ADDR_L
mov a,@r0
MOV ADDR_DATATRA-3,a
inc r0
mov a,@r0
MOV ADDR_DATATRA-2,a ;向上位表转发消息
inc r0
mov a,@r0
mov addr_datatrA-1,a
mov r0,#UPPER_ADDR_L
mov a,#0
MOV @r0,a
inc r0
MOV @r0,a
inc r0
MOV @r0,a
MOV A,ADDR_DATARE+1
ADD A,#2
MOV B,A
MOV R7,A
MOV R0,#ADDR_DATARE
MOV R1,#ADDR_DATATRA
ZB_SEND_UP1: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R7,ZB_SEND_UP1
MOV A,B
ADD A,#3
MOV B,A
CLR ES
SETB PSW.4
CLR PSW.3
MOV R0,#Addr_DataTrA-3 ;发送数据地址
MOV R2,B
CLR DOWN_BIT
CLR UP_BIT
setb e99_bit
LJMP ZBTRANS
;***************************************************
;串口中断子程序,使用工作寄存器3区
;***************************************************
NOP
NOP
NOP
SETB WDI
clr ea
ajmp $
HW: CLR ES ;串行中断禁止
CLR R_T_485
CLR RI
PUSH ACC ;保护现场
PUSH PSW
PUSH B
SETB PSW.3 ;使用寄存器3区
SETB PSW.4
MOV A,SBUF ;; 读帧头
JNB P,PNP ; 判断奇偶校验位是否正确
JNB RB8,HWEND1
HWENDB1: AJMP HW1
PNP: JB RB8,HWEND1
HW1: CJNE A,#68H,HW_LOOPA ;; 不是帧头跳转
AJMP HW_LOOPAA
HW_LOOPA: LJMP HWEND
HW_LOOPAA: MOV R2,#68H ;; 累加和
MOV R0,#ADDR_DATARE ;; 接收区首地址 38H
HW_LOOP1: MOV R3,#02H
HW2: MOV R5,#0C3H ; 字节之间最大延时500ms
HW3: MOV R6,#0FFH
HW4: JBC RI,HW5 ; 等待读取一字节地址
DJNZ R6,HW4
DJNZ R5,HW3
DJNZ R3,HW2
HWEND1: LJMP HWEND
HW5: MOV A,SBUF ; 读取一个地址,与对应的地址进行比较
JNB P,PNP1
JNB RB8,HWENDB1
AJMP HW5D
PNP1: JB RB8,HWENDB1
HW5D: MOV R7,A
MOV @R0,A
INC R0
ADD A,r2
MOV R2,A
MOV R3,#02H ; 读取下一个帧标示符
HW6: MOV R5,#0C3H ; 字节之间最大延时500ms
HW7: MOV R6,#0FFH
HW8: JBC RI,HW9 ; 等待读取一字节地址
DJNZ R6,HW8
DJNZ R5,HW7
DJNZ R3,HW6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -