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

📄 hldmsapp.asm

📁 645规约集中抄表源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
                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 + -