?? err3.asm
字號:
FRAME_A2:
JB FLAG_ADDR,A2_ADDR ; 判斷地址標志:1接收過地址,0沒接收過地址
CJNE A,#99H,A2_END ; 判斷是否廣播地址
SETB FLAG_ADDR ; 置地址標志
AJMP SYS_UART_REND
A2_ADDR:
JB FLAG_LEN,A2_LEN ; 判斷長度標志:1接收過長度,0沒接收過長度
MOV B,A ; 數據暫存到B中
JZ A2_CHECK_END ; 檢查命令長度是否為零
CLR C
SUBB A,#98H ; 檢查命令長度
JNC A2_CHECK_END ; 命令長度無效
MOV A,B
MOV UART_LEN,A ; 存儲長度值
MOV UART_CHECK_DATA,A ; 長度判斷
SETB FLAG_LEN ; 置長度標志
AJMP SYS_UART_REND
A2_LEN:
CJNE A,SYS_SN,UART_CHECK_COUNT ; 判斷是否有本板地址在其中
SETB FLAG_ADDR_DATA ; 置有本板地址標志
UART_CHECK_COUNT: ;
MOV B,A ; 數據暫存到B中
MOV A,UART_LEN
ADD A,#99H
DA A
MOV UART_LEN,A
JZ UART_A2_CHECK ; 判斷數據是否接收完
MOV A,B
ADD A,UART_CHECK_DATA ; 數據沒接收完
DA A
MOV UART_CHECK_DATA,A
AJMP SET_FRAME_A0
UART_A2_CHECK: ; 數據接收完
MOV A,B
CJNE A,UART_CHECK_DATA,A2_CHECK_END ; 判斷校驗和是否正確
JNB FLAG_ADDR_DATA,A2_CHECK ;
SETB FLAG_GATHER ; 置集合標志 什么時候清除??
A2_CHECK_END:
CLR FLAG_ADDR ; 清地址標志
CLR FLAG_LEN ; 清長度標志
CLR FLAG_ADDR_DATA
A2_END:
CLR FLAG_FRAME_A2 ; 清幀標志
AJMP SET_FRAME_A0
A2_CHECK:
CLR FLAG_GATHER
SJMP A2_CHECK_END
;********幀A3處理*****************
FRAME_A3:
JB FLAG_ADDR,A3_ADDR ; 判斷地址標志:1接收過地址,0沒接收過地址
CJNE A,SYS_SN,A3_FULL_ADDR ; 判斷是否本板地址
SETB FLAG_ADDR ; 置地址標志
SETB FLAG_SYS_SN ; 置是本板地址標志,用于確認命令回傳
AJMP SYS_UART_REND
A3_FULL_ADDR: ; 廣播地址檢測
CJNE A,#99H,A3_GATHER_ADDR
SETB FLAG_ADDR ; 置地址標志
AJMP SYS_UART_REND
A3_GATHER_ADDR: ; 集合地址檢測
JNB FLAG_GATHER,A3_END
CJNE A,#0H,A3_END
SETB FLAG_ADDR ; 置地址標志
AJMP SYS_UART_REND
A3_ADDR:
JB FLAG_LEN,A3_LEN ; 判斷長度標志:1接收過長度,0沒接收過長度
MOV B,A ; 數據暫存到B中
JZ A3_CHECK_END ; 檢查命令長度是否為零
CLR C
SUBB A,#CONST_CMLEN ; 檢查命令長度
JNC A3_CHECK_END ; 命令長度無效
MOV A,B
MOV UART_LEN,A ; 存儲長度值
MOV UART_CHECK_DATA,A
MOV RECV_BPW,#RECV_BUF ; 置接收緩沖地址
SETB FLAG_LEN ; 置長度標志
AJMP SYS_UART_REND
A3_LEN:
MOV B,A ; 數據暫存到B中
MOV A,UART_LEN ; 取長度值
ADD A,#99H
DA A
MOV UART_LEN,A
JZ UART_A3_CHECK ; 判斷數據是否接收完
MOV A,B
MOV R0,RECV_BPW
MOV @R0,A ; 數據保存到接收緩沖中
INC R0 ; 接收緩沖地址加1
MOV RECV_BPW,R0 ; 保存接收緩沖地址
ADD A,UART_CHECK_DATA ;
DA A
MOV UART_CHECK_DATA,A
AJMP SET_FRAME_A0
UART_A3_CHECK: ; 數據接收完
MOV A,B
CJNE A,UART_CHECK_DATA,A3_CHECK_END ; 判斷校驗和是否正確
SETB FLAG_COMMAND ; 置命令處理標志
JNB FLAG_SYS_SN,A3_CHECK_END
SETB FLAG_COMMAND_ANSWER ; 置確認命令回傳標志
A3_CHECK_END:
CLR FLAG_SYS_SN
CLR FLAG_LEN ; 清長度標志
CLR FLAG_ADDR ; 清地址標志
A3_END:
CLR FLAG_FRAME_A3 ; 清幀標志
LJMP SET_FRAME_A0
;****************************************
SYS_UART_REND:
POP 00H
POP B
POP ACC
POP PSW
RETI
;==================B0通訊回傳處理=====================查詢設備
UART_TRAN_B0: ; 發送處理
CLR C485_TRSEL ; 轉換為發送狀態
MOV A,#0B0H
ACALL UART_TRAN_BYTE ; 回發命令引頭"B0"
MOV A,SYS_SN
ACALL UART_TRAN_BYTE ; 回發本板地址
;-------------------------------
ANSWER_LINK:
JB FLAG_UART,ANSWER_CT_ERR
SETB FLAG_UART
MOV A,#02H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回發長度:2
MOV A,#99H
ACALL UART_TRAN_BYTE ; 回發數據引頭“99”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_CT_ERR:
JNB FLAG_CT_CHECK,ANSWER_AUTO_SHORT
MOV A,#02H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回發長度:2
MOV A,#98H
ACALL UART_TRAN_BYTE ; 回發數據引頭“98”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_AUTO_SHORT:
JNB FLAG_AUTO_SHORT,ANSWER_DL
MOV A,#02H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回發長度:2
MOV A,#97H
ACALL UART_TRAN_BYTE ; 回發數據引頭“97”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_DL:
JNB FLAG_DL,ANSWER_RJ ; 電能誤差試驗回傳
MOV A,#06H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回發長度:6
MOV A,#00H
ACALL UART_TRAN_BYTE ; 回發數據引頭“00”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R7,#03H
MOV R0,#WC_BUFFER+2
ANSWER_DL0:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_DL0
MOV A,WC_T_C
ACALL UART_TRAN_BYTE ; 回發校驗次數
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_RJ:
JNB FLAG_RJ,ANSWER_XL ; 日計時誤差試驗回傳
MOV A,#06H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回發長度:6
MOV A,#01H
ACALL UART_TRAN_BYTE ; 回發數據引頭“01”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R0,#WC_BUFFER+2
MOV R7,#03H
ANSWER_RJ0:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_RJ0
MOV A,WC_T_C
ACALL UART_TRAN_BYTE ; 回發校驗次數
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_XL:
JNB FLAG_XL,ANSWER_ZZ ; 需量周期誤差試驗回傳
MOV A,#06H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回發長度:6
MOV A,#02H
ACALL UART_TRAN_BYTE ; 回發數據引頭“02”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R7,#03H
MOV R0,#WC_BUFFER+2
ANSWER_XL0:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_XL0
MOV A,WC_T_C
ACALL UART_TRAN_BYTE ; 回發校驗次數
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_ZZ:
JNB FLAG_ZZ,ANSWER_QD ; 電能走字試驗回傳
MOV A,#13H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回發長度:13
MOV A,#03H
ACALL UART_TRAN_BYTE ; 回發數據引頭“03”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R7,#03H
MOV R0,#WC_BUFFER+2
ANSWER_ZZ0:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_ZZ0
MOV R7,#08H
MOV R0,#WC_BUFFER+10
ANSWER_ZZ1:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_ZZ1
AJMP TRAN_B0_END
;-------------------------------
ANSWER_QD:
JNB FLAG_QD,ANSWER_QID ; 電表潛動試驗回傳
MOV A,#03H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回發長度:3
MOV A,#04H
ACALL UART_TRAN_BYTE ; 回發數據引頭“04”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R0,#WC_BUFFER
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_QID:
JNB FLAG_QID,ANSWER_BH ; 電表啟動試驗回傳
MOV A,#03H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回發長度:3
MOV A,#05H
ACALL UART_TRAN_BYTE ; 回發數據引頭“05”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R0,#WC_BUFFER
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_BH:
JNB FLAG_BH,ANSWER_MK ; 電表捕黑試驗回傳
MOV A,#03H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回發長度:3
MOV A,#06H
ACALL UART_TRAN_BYTE ; 回發數據引頭“06”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R0,#WC_BUFFER
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
ANSWER_MK:
JNB FLAG_MK,TRAN_END ; 脈寬測試試驗回傳
MOV A,#06H
MOV UART_CHECK_DATA,A
ACALL UART_TRAN_BYTE ; 回發長度:6
MOV A,#08H
ACALL UART_TRAN_BYTE ; 回發數據引頭“08”
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
MOV R7,#06H
MOV R0,#WC_BUFFER+5
ANSWER_MK0:
MOV A,@R0
ACALL UART_TRAN_BYTE
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
DEC R0
DJNZ R7,ANSWER_MK0
MOV A,WC_T_C
ACALL UART_TRAN_BYTE ; 回發校驗次數
ADD A,UART_CHECK_DATA
DA A
MOV UART_CHECK_DATA,A
AJMP TRAN_B0_END
;-------------------------------
TRAN_B0_END:
ACALL UART_TRAN_BYTE ; 回發校驗和
JB UART_TBUSY,$ ; 等待發送完畢
TRAN_END:
SETB C485_TRSEL ; 恢復為接收狀態
CLR FLAG_ANSWER ; 清除查詢設備回傳標志
LJMP MAIN_FLOW_WAIT
;==================B2通訊回傳處理=====================確認命令
UART_TRAN:
LJMP UART_TRAN_B0
UART_TRAN_B2: ; 發送處理
CLR FLAG_COMMAND_ANSWER ; 清除確認命令回傳標志
JNB FLAG_UART,UART_TRAN
JB FLAG_CT_CHECK,UART_TRAN
CLR C485_TRSEL ; 轉換為發送狀態
MOV A,#0B2H
ACALL UART_TRAN_BYTE ; 回發引頭"B2"
MOV A,SYS_SN
ACALL UART_TRAN_BYTE ; 回發本板地址
JB UART_TBUSY,$ ; 等待發送完畢
SETB C485_TRSEL ; 恢復為接收狀態
LJMP MAIN_FLOW_WAIT
;-------------------------------
UART_TRAN_BYTE:
JB UART_TBUSY,$ ; 等待發送器空閑
MOV SBUF,A ; 開始發送
SETB UART_TBUSY
RET
;==================通訊命令接收處理=====================
UART_RECV: ;
MOV R0,RECV_BPR
LCALL UART_RECV_BYTE ; 取首字節:引導字節
;----------------------標準常數設置---------------------------------
UART_COMMAND_00:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -