?? repeater.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 + -