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

📄 repeater.asm

📁 本程序为集中抄表系统中低压电力线载波数据采集器程序源代码
💻 ASM
字号:
;---------------------------------------
;中继器程序
;载波收发用同一缓冲区
REPEATER_FRM_PROCESS:
                CPL     WATCH_DOG
                LCALL   SAVE_JZQ_SEND_FRM_BUF                 ;将集中器发送的中继抄表帧存入存储器
                LCALL   SEND_TO_METER_FRM                     ;将接收到的中继抄表命令转发给电表
                LCALL   ZJQFRM_PROCESS_OVER                   ;清接收缓冲
CLR_1S_WAIT_TIME:
                CLR     INIT_ST7536_FLAG                     ;清等待30S标志
                CLR     ZJQ_SEND_WAIT                         ;清发送等待1秒标志位
IF_TIME_OVER:
                JNB     ZJQ_SEND_WAIT,JUDGE_REC_FRM           ;没超时,判断接收到电表回应帧否?
                CLR     INIT_ST7536_FLAG                     ;清等待30S标志
                CLR     ZJQ_SEND_WAIT                         ;超时,清该标识
                LJMP    THROW_ZJQ_ACK                         ;转通过中继器抄
JUDGE_REC_FRM:
                CPL     WATCH_DOG
                JNB     FRM_PROCESS,IF_TIME_OVER              ;是否有来自电表的回应帧
                CLR     FRM_PROCESS                           ;清接收帧标识
                MOV	DPH,#C04_ADDR_H                       ;FM24C04高位地址
                MOV     DPL,#ZJQ_REC_FRM_BUF+6                ;存储器中接收帧长度存储地址
                LCALL	RD_C04_1BYTE
                MOV     A,REC_ADDR                            ;接收到的地址低位
                CJNE    A,B,CLR_1S_WAIT_TIME                  ;接受到的表地址低位与目标表地址相同否?
                INC     DPL
                LCALL	RD_C04_1BYTE                          ;读出高位
                MOV     A,REC_ADDR+1                          ;接收到的地址高位
                CJNE    A,B,CLR_1S_WAIT_TIME                  ;高位相同否
                LJMP    ACK_TO_JZQ_FRM                        ;抄到目标表,回应回应集中器命令帧
;--------------------------------------
;通过下级中继器抄当前表
THROW_ZJQ_ACK:
                LCALL   READ_JZQ_SEND_FRM                     ;从存储器读出集中器发送的帧并转发给电表
                LCALL   ZJQFRM_PROCESS_OVER                   ;清接收缓冲
CLR_WAIT_1S_TIME:
                CLR     INIT_ST7536_FLAG                      ;清等待30S标志
                MOV     COUNTER_1S,#00H                       ;清1秒计数器
                CLR     ZJQ_SEND_WAIT                         ;清发送等待1秒标志位
ZJQ_WAIT_TIME:
                JNB     ZJQ_SEND_WAIT,JUDGE_ZJQ_REC_FRM1      ;没超时,判断接收到电表回应帧否?
                CLR     ZJQ_SEND_WAIT                         ;超时,清该标识
                CLR     INIT_ST7536_FLAG                      ;清等待30S标志
                MOV     COUNTER_1S,#00H                       ;清1秒计数器
                AJMP    WAIT_CLOUD
JUDGE_ZJQ_REC_FRM1:
                CPL     WATCH_DOG
                JNB     FRM_PROCESS,ZJQ_WAIT_TIME             ;是否有来中继器的回应帧
                AJMP    REC_ZJQ_SEND_FRM                      ;收到正确帧,转处理
WAIT_CLOUD:
                JNB     ZJQ_SEND_WAIT,JUDGE_ZJQ_REC_FRM2      ;没超时,判断接收到电表回应帧否?
                CLR     ZJQ_SEND_WAIT                         ;超时,清该标识
                CLR     INIT_ST7536_FLAG                     ;清等待30S标志
                MOV     COUNTER_1S,#00H                       ;清1秒计数器
                LJMP    ZJQFRM_PROCESS_OVER                   ;没收到回应帧退出
JUDGE_ZJQ_REC_FRM2:
                CPL     WATCH_DOG
                JNB     FRM_PROCESS,WAIT_CLOUD                ;是否有来中继器的回应帧
REC_ZJQ_SEND_FRM:
                CLR     FRM_PROCESS                           ;
                MOV     DPL,#REPEATER_ADDR                    ;2级中继器地址首位地址
                MOV	DPH,#C04_ADDR_H                       ;FM24C04高位地址
                LCALL	RD_C04_1BYTE
                MOV     A,REC_ADDR                            ;接收到的地址低位
                CJNE    A,B,WAIT_CLR_REC_BUF                  ;接受到的表地址低位与中继器地址相同否?
                INC     DPL
                LCALL	RD_C04_1BYTE                          ;读出高位
                MOV     A,REC_ADDR+1                          ;接收到的地址高位
                CJNE    A,B,WAIT_CLR_REC_BUF                  ;高位相同否

                MOV   SEND_ADDR,REC_DATA_METER                ;发送的地址号变为目标表号
                MOV   SEND_ADDR+1,REC_DATA_METER+1            ;高地址
                MOV   REC_DATA_METER,#00H                     ;中继地址变为00
                MOV   REC_DATA_METER+1,#00H
                AJMP    ACK_TO_JZQ_FRM                        ;回应集中器
WAIT_CLR_REC_BUF:
                LCALL   ZJQFRM_PROCESS_OVER                   ;清接收缓冲
                CLR     ZJQ_SEND_WAIT                         ;超时,清该标识
                CLR     INIT_ST7536_FLAG                     ;清等待30S标志
                MOV     COUNTER_1S,#00H                       ;清1秒计数器
                AJMP    WAIT_CLOUD
ACK_TO_JZQ_FRM:
                LCALL    METER_DATA_REC_PROCESS               ;向集中器回应电表回应的数据
ZJQFRM_PROCESS_OVER:
                MOV     REC_CUR_LEN,#00H                       ;当前帧长度清0
                MOV     R0,#REC_BUF                            ;清接收缓冲
                MOV     B,#REC_BUF_LEN
CLR_ZJREC_FRM1: MOV     @R0,#00H
                INC     R0
                DJNZ    B,CLR_ZJREC_FRM1
                SETB    RX_TX                                    ;ST7536接收状态
                CLR     FRM_PROCESS
                RET                                            ;返回等待处理下一轮中继抄表
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;集中器命令帧处理程序转发给电表
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SEND_TO_METER_FRM:
            ;    MOV     R0,#REC_BUF
            ;    MOV     R1,#SEND_BUF
            ;    MOV     B,#REC_BUF_LEN
UP_FRM1:    ;    MOV     A,@R0
            ;    MOV     @R1,A
            ;    INC     R0
            ;    INC     R1
            ;    DJNZ    B,UP_FRM1
                MOV     SEND_ADDR,REC_DATA_METER               ;接收到的中继帧中的表号变为地址号向下发送给电表
                MOV     SEND_ADDR+1,REC_DATA_METER+1
                MOV     SEND_DATA_METER,#00H                   ;向下发送的中继表号为0
                MOV     SEND_DATA_METER+1,#00H

                LCALL   PRODUCE_SUM_END                        ;产生发送帧和校验和帧尾
                CLR     TXD_READY_FLAG                         ;清发送准备好标志
                SETB    R_LEDC                                 ;接收灯灭
                CLR     S_LEDC			               ;发送指示亮
                LCALL   SEND_FRM                               ;发送写应答帧
                SETB    S_LEDC			               ;发送指示灭
                RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;电表数据帧转发给集中器处理程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
METER_DATA_REC_PROCESS:
             ;   MOV   R0,#REC_BUF                              ;将接收到的电表回应帧,放至发送缓冲区,向集中器发送
             ;   MOV   R1,#SEND_BUF
             ;   MOV   B,#REC_BUF_LEN
DOWN_FRM1:   ;   MOV   A,@R0
             ;   MOV   @R1,A
             ;   INC   R0
             ;   INC   R1
             ;   DJNZ  B,DOWN_FRM1

                MOV   SEND_DATA_METER,REC_ADDR                  ;中继地址变为目标表号
                MOV   SEND_DATA_METER+1,REC_ADDR+1

                MOV   SEND_ADDR,#LOW(TERMINAL_ID)               ;发送的地址号为本采集器号(1级中继)
                MOV   SEND_ADDR+1,#HIGH(TERMINAL_ID)

                LCALL PRODUCE_SUM_END                           ;产生发送帧和校验和帧尾

                CLR   TXD_READY_FLAG
                SETB    R_LEDC                                  ;接收灯灭
                CLR     S_LEDC			                ;发送指示亮
                LCALL   SEND_FRM                                ;发送写应答帧
                RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLR_SEND_BUF:
                MOV     R0,#SEND_BUF                           ;清发送缓冲区
                MOV     B,#SEND_BUF_LEN
 CLR_SEND_FRM1: MOV     @R0,#00H
                INC     R0
                DJNZ    B,CLR_SEND_FRM1
                RET
;-----------------------------------------
;将集中器发送的中继抄表帧存入存储器
SAVE_JZQ_SEND_FRM_BUF:
                MOV     R0,#REC_BUF                           ;接收到的首个数据
                MOV     A,REC_DATA_FEILD_LEN                  ;接收数据域长度
                ADD     A,#07H                                ;加固定字节长度7字节
                MOV     R5,A                                  ;接收帧长度
                MOV	DPH,#C04_ADDR_H                       ;FM24C04高位地址
                MOV     DPL,#ZJQ_REC_FRM_BUF                  ;存储器首地址低位
SAVE_REC_FRM_LOOP:
                MOV	B,@R0                                 ;接收缓冲区内容存到存储器
		LCALL	WR_C04_1BYTE
                INC     R0
		INC     DPL
                DJNZ    R5,SAVE_REC_FRM_LOOP                  ;存储完毕否?
                RET
;---------------------------------------------
;从存储器读出集中器发送的帧并发送
READ_JZQ_SEND_FRM:
                MOV	DPH,#C04_ADDR_H                       ;FM24C04高位地址
                MOV     DPL,#ZJQ_REC_FRM_BUF+4                ;存储器中接收帧长度存储地址
                LCALL	RD_C04_1BYTE
                MOV     A,B                                   ;接收数据域长度送A
                ADD     A,#07H                                ;加固定字节长度7字节
                MOV     R5,A                                  ;接收帧长度
                MOV     R0,#REC_BUF                           ;接收到的首个数据
                MOV	DPH,#C04_ADDR_H                       ;FM24C04高位地址
                MOV     DPL,#ZJQ_REC_FRM_BUF                  ;存储器首地址低位
READ_REC_FRM_LOOP:
		LCALL	RD_C04_1BYTE
                MOV	@R0,B                                 ;存到接收缓冲区内容
                INC     R0
		INC     DPL
                DJNZ    R5,READ_REC_FRM_LOOP                  ;读完否?

                MOV     DPL,#REPEATER_ADDR                    ;2级中继器地址首位地址
                MOV	DPH,#C04_ADDR_H                       ;FM24C04高位地址
                LCALL	RD_C04_1BYTE
                MOV     SEND_ADDR,B                           ;采集器地址变为2级中继地址低位
                INC     DPL                                   ;高位
                MOV	DPH,#C04_ADDR_H                       ;FM24C04高位地址
                LCALL	RD_C04_1BYTE
                MOV     SEND_ADDR+1,B                         ;2级中继地址低位

                LCALL   PRODUCE_SUM_END                        ;产生发送帧和校验和帧尾
                CLR     TXD_READY_FLAG                         ;清发送准备好标志
                SETB    R_LEDC                                 ;接收灯灭
                CLR     S_LEDC			               ;发送指示亮
                LCALL   SEND_FRM                               ;发送写应答帧
              ;  SETB    R_LEDC                                 ;接收灯灭
                RET

⌨️ 快捷键说明

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