?? main.asm
字號:
;===================================================================
;此程序在實際監控工程中正常運行,智能設備是ISOVELL空調
;用WAVE仿真器調試
;===================================================================
LEN_REAL EQU 64H ;共100字節;12*4=48字節浮點數,16字節開關量,36字節告警
LCHK_REALL EQU 0D0H ;ASCII字節數為208即d0,
LCHK_REALH EQU 30H ;d取反加1=3
LEN_PARA EQU 5CH ;共92字節;4*8=32字節浮點數,3字節整數,36+19字節開關量
LCHK_PARAL EQU 0C0H ;ASCII字節數96*2=192=
LCHK_PARAH EQU 40H
LEN_SETUP EQU 5
LCHK_SETUPL EQU 12H
LCHK_SETUPH EQU 0d0H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;位尋址區:20h-->25h即(00-->2fh)用語一些數制轉換計算,25H(28H-->2FH)用于標志
;26h-->2Ah(即30H-->57H):用于上位機通信
;2Bh-->2Fh(即58h-->7fh)用于與設備通信標志
;RAM 10H-->1FH用于上位機(即兩組寄存器)
;RAM 30H-->3FH及浮點數運算
;RAM 40H-->4FH用于設備
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PCM_STATE EQU 2FH ;PCM狀態
BREAK_FLAG BIT 78H ;協議轉換器與設備短線
STATUS_1BIT BIT 79H ;設備數據是否準備好
STATUS_7BIT BIT 7FH ;設置參數變化
SETUP_FLAG BIT 58H ;有命令要發送
ALLOW_MOVE_FLAG BIT 59H
ALLOW_SEND_FLAG BIT 5AH
ALLOW_TRANS_FLAG BIT 5BH
PCM_ADDR EQU 40H
TRANSID EQU 41H
SENDID EQU 42H
SMRECE_STATE EQU 43H
SM_CHKH EQU 44H
SM_CHKL EQU 45H
T3S EQU 46H
RSTATE_STX EQU 3
RSTATE_STX_10H EQU 4
RSTATE_DATABLOCK EQU 6
CHARACTER_WORDL EQU 55H
CHARACTER_WORDH EQU 0AAH
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
LJMP EVENT
ORG 0013H
LJMP INT
ORG 001BH
RETI
ORG 0023H
LJMP INT_SM_RECE
ORG 002BH
RETI
ORG 00A0H
;==============================================
;程序包含3個文件,通過INCLUDE包含,方便調試,修改
;==============================================
INCLUDE"PCM16C550.ASM"
INCLUDE"SETUP1.ASM"
INCLUDE"ISO_MATHS.ASM"
START: CLR CTRL_485
MOV SP,#50H ;設置指針
LCALL SYS_DELAY ;上電延時10MS,
LCALL READ_PCMADDR
LCALL INIT_COOL ;寄存器初始化
LCALL INIT_HEAD ;初始化協議頭部格式
;LCALL CLR_RAM
LCALL INITSEND
MOV IE,#10010110B ;開總中斷,開放定時器2,開放串口中斷,開放中斷0
SETB TR0
;================================================================================
;主程序由4個子程序和2個中斷程序組成,發送子程序完成對智能設備發送命令,讀取設備的數據放在指定
;地址的RAM空間,復制子程序將讀取的數據轉移到另外空間的RAM,轉化程序將設備的數據轉化成電總協議
;的數據塊,即DATAINFO部分,MAINLOOPPCDATA程序將轉化成DATAINFO部分的數據加上SOI,ADR,CID,; CHUKSUM,等,形成發送給上位機的符合電總協議的數據包
;======================================================================================
MAIN: LCALL MainLoopSend ; 發送程序,只管發送
LCALL MainLoopCopy ; 復制校驗程序
LCALL MainLoopTrans ; 數據格式轉化整理程序
LCALL MainLoopPcData ; 將整理好的數據加形成完整的電總協議
SETB P1.3
AJMP MAIN
;======================================================================
;這里看門狗沒有采取取反的形式喂狗,而是給固定高電平SETB P1.3,在定時器里采用了
;CLR P1.3 兩者結合喂狗,所以如果只有主程序循環,而不能進入中斷,或者進入中斷,
;不能退出,多將引起復位
;=======================================================================
;==========================================================================
;發送一個字節給智能設備,包括發送填充字
;==============================================================================
SEND_BYTE: CJNE A,#10H,SB10
JNB TI,$
CLR TI
MOV SBUF,A
JNB TI,$
CLR TI
MOV SBUF,A
RET
SB10: JNB TI,$
CLR TI
MOV SBUF,A
RET
;============================================
;根據智能設備協議,形成和校驗,
;============================================
SM_CHKSUM: CLR C
ADD A,SM_CHKL ;形成和校驗
MOV SM_CHKL,A
MOV A,SM_CHKH
ADDC A,#0
MOV SM_CHKH,A
RET
;======================================================================================
;發送命令給智能設備,ALLOW_SEND_FLAG在正常情況下是由定時器沒3S鐘產生一次,
;=====================================================================================
MAINLOOPSEND:JBC ALLOW_SEND_FLAG,S2SETUP
RET
S2SETUP: JNB SETUP_FLAG,S2SET
LJMP SETUP
RET
INITSEND: MOV SENDID,#0
S2SET: MOV A,SENDID ;根據SENDID發送第幾條命令
MOV DPTR,#ADDR_TABLE
MOVC A,@A+DPTR
MOV DPTR,#REALTIM01
CLR C
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,#0
MOV DPH,A
LCALL SEND2SM
RET
;============================================
;發送完整的一包命令
;============================================
SEND2SM: CLR ES ;關中斷,
MOV R6,DPL
MOV R7,DPH
LCALL SEND_FRAM_HEAD
MOV SM_CHKL,#0
MOV SM_CHKH,#0
MOV DPL,R6
MOV DPH,R7
CLR A
MOVC A,@A+DPTR
MOV R2,A ;循環次數
S2SM: INC DPTR
CLR A
MOVC A,@A+DPTR
CJNE A,#CHARACTER_WORDH,SCW
MOV A,R4
AJMP S2S
SCW: CJNE A,#CHARACTER_WORDL,S2S
MOV A,R3
S2S: LCALL SEND_BYTE
LCALL SM_CHKSUM
DJNZ R2,S2SM
CLR C
MOV A,SM_CHKL
CPL A
ADD A,#1
MOV SM_CHKL,A
MOV A,SM_CHKH
CPL A
ADDC A,#0
LCALL SEND_BYTE
MOV A,SM_CHKL
LCALL SEND_BYTE
MOV A,#10H
JNB TI,$
CLR TI
MOV SBUF,A
MOV A,#03H
LCALL SEND_BYTE
JNB TI,$
CLR TI
CLR RI
SETB ES
MOV SMRECE_STATE,#RSTATE_STX_10H
RET
;===========================================================================
;發送每幀多一樣的命令起始部分
;==========================================================================
SEND_FRAM_HEAD:MOV R2,#10
MOV DPTR,#FRAM_HEAD
SETB TI
SFH: CLR A
MOVC A,@A+DPTR
JNB TI,$
CLR TI
MOV SBUF,A
INC DPTR
DJNZ R2,SFH
RET
;==============================================================================
;發送給ISOVELL空調的所有命令表格
;==============================================================================
ADDR_TABLE: DB 0 1*8 2*8 3*8 4*8 5*8 6*8 7*8 8*8 9*8 10*8 11*8 12*8 13*8 14*8 15*8 16*8 17*8 18*8 19*8 20*8 21*8 22*8 23*8 24*8 25*8 26*8 27*8 28*8
FRAM_HEAD: DB 10H 02H 01H 01H 01H 0FFH 00H 00H 00H 0FFH
REALTIM01: DB 07H 01H 85H 82H 81H 25H 82H 82H
REALTIM02: DB 07H 01H 84H 82H 81H 24H 82H 82H
REALTIM05: DB 07H 01H 88H 80H 81H 28H 80H 8AH
REALTIM06: DB 07H 01H 82H 41H 01H 22H 41H 10H
REALTIM07: DB 07H 01H 82H 41H 8BH 22H 41H 8EH
REALTIM08: DB 07H 01H 82H 41H 95H 22H 41H 98H
REALTIM09: DB 07H 01H 82H 41H 9FH 22H 41H 0A5H
REALTIM10: DB 07H 01H 82H 41H 0A9h 22H 41H 0ABH
REALTIM11: DB 07H 01H 82H 41H 0B2H 22H 41H 0B5H
REALTIM12: DB 07H 01H 82H 41H 0BCH 22H 41H 0BEH
REALTIM13: DB 07H 01H 82H 41H 0D1H 22H 41H 0D4H
REALTIM14: DB 07H 01H 82H 41H 0DAH 22H 41H 0DCH
REALTIM15: DB 07H 01H 82H 41H 0DEH 22H 41H 0E1H
REALTIM16: DB 07H 01H 83H 0C0H 81H 23H 0C0H 82H
PARADATA1: DB 07H 01H 84H 00H 81H 24H 00H 82H
PARADATA2: DB 07H 01H 85H 00H 81H 25H 00H 82H
PARADATA3: DB 07H 01H 85H 00H 8AH 25H 00H 8CH
PARADATA4: DB 07H 01H 84H 00H 8AH 24H 00H 8BH
PARADATA6: DB 07H 01H 82H 00H 81H 22H 00H 83H
PARADATA7: DB 07H 01H 82H 01H 8BH 22H 01H 8EH
PARADATA8: DB 07H 01H 82H 01H 95H 22H 01H 98H
PARADATA9: DB 07H 01H 82H 01H 9FH 22H 01H 0A5H
PARADATA10: DB 07H 01H 82H 01H 0A9H 22H 01H 0ABH
PARADATA11: DB 07H 01H 82H 01H 0B2H 22H 01H 0B5H
PARADATA12: DB 07H 01H 82H 01H 0BCH 22H 01H 0BEH
PARADATA13: DB 07H 01H 82H 01H 0D1H 22H 01H 0D4H
PARADATA14: DB 07H 01H 82H 01H 0DAH 22H 01H 0DCH
PARADATA15: DB 07H 01H 82H 01H 0DEH 22H 01H 0E1H
PARADATA16: DB 07H 01H 82H 01H 01H 22H 01H 13H
SETUPPARA0: DB 06H 01H 64H 00H 81H CHARACTER_WORDH CHARACTER_WORDL 00H
SETUPPARA1: DB 06H 01H 65H 00H 81H CHARACTER_WORDH CHARACTER_WORDL 00H
SETUPPARA2: DB 06H 01H 65H 00H 82H CHARACTER_WORDH CHARACTER_WORDL 00H
SETUPPARA3: DB 06H 01H 65H 00H 8AH CHARACTER_WORDH CHARACTER_WORDL 00H
SETUPPARA4: DB 06H 01H 65H 00H 8BH CHARACTER_WORDH CHARACTER_WORDL 00H
SETUPPARA5: DB 06H 01H 65H 00H 8CH CHARACTER_WORDH CHARACTER_WORDL 00H
SETUPPARA6: DB 06H 01H 64H 00H 8AH CHARACTER_WORDH CHARACTER_WORDL 00H
SETUPPARA7: DB 06H 01H 64H 00H 8BH CHARACTER_WORDH CHARACTER_WORDL 00H
SETUPPARA8: DB 05H 01H 62H 00H 81H CHARACTER_WORDL 00H 00H
SETUPPARA9: DB 05H 01H 62H 00H 82H CHARACTER_WORDL 00H 00H
SETUPPARAA: DB 05H 01H 62H 00H 83H CHARACTER_WORDL 00H 00H
SETUPPARAB: DB 05H 01H 62H 00H 9BH CHARACTER_WORDL 00H 00H
SETUPPARAC: DB 05H 01H 63H 0C0H 81H CHARACTER_WORDL 00H 00H
;===============================================================
; 單片機自身UART中斷,只接收,將接收的數據放在R6,R7所指的程序空間
;利用SWITCH CASE的語句形式,每次接收協議中相應的一個字節,接收完成后
;置可以復制的標志ALLOW_MOVE_FLAG
;================================================================
INT_SM_RECE: PUSH A
PUSH B
PUSH DPL
PUSH DPH
PUSH PSW
SETB RS0
CLR RS1
JBC RI,SMRECE_RESPONSE
INT_SM_RETURN:POP PSW
POP DPH
POP DPL
POP B
POP A
RETI
SMRECE_RESPONSE:
MOV A,SBUF
MOV B,A
CLR BREAK_FLAG
MOV T3S,#60
SETB P3.5
MOV A,SMRECE_STATE
R_STX_10H: CJNE A,#RSTATE_STX_10H,R_STX
MOV A,B
CJNE A,#10H,INT_SM_RETURN
MOV SMRECE_STATE,#RSTATE_STX
MOV SM_CHKL,#0
MOV SM_CHKH,#0
AJMP INT_SM_RETURN
R_STX: CJNE A,#RSTATE_STX,R_DATABLOCK
MOV A,B
CJNE A,#02H,R_STX_ERROR
MOV SMRECE_STATE,#RSTATE_DATABLOCK
MOV R6,#LOW(DATA_BUFFER0-15)
MOV R7,#HIGH(DATA_BUFFER0-15)
LJMP INT_SM_RETURN
R_STX_ERROR: MOV SMRECE_STATE,#RSTATE_STX_10H
LJMP INT_SM_RETURN
R_DATABLOCK: CJNE A,#RSTATE_DATABLOCK,R_STX_ERROR
MOV A,B
CJNE A,#10H,R_DATAB
JNB RI,$
CLR RI
MOV A,SBUF
CJNE A,#03H,R_DATAB
MOV SMRECE_STATE,RSTATE_STX_10H
SETB ALLOW_MOVE_FLAG
CLR P3.5
LJMP INT_SM_RETURN
R_DATAB: MOV DPL,R6
MOV DPH,R7
MOVX @DPTR,A
INC DPTR
MOV R6,DPL
MOV R7,DPH
LJMP INT_SM_RETURN
;======================================================================
復制子程序,將智能設備的數據移走,因為接收程序讀取的數據放在指定的地方,為了防止被覆蓋
;所以要盡快移走
;======================================================================
MAINLOOPCOPY:JBC ALLOW_MOVE_FLAG,MD
RET
MD_RETURN: SETB ALLOW_SEND_FLAG ;設置的應答簡單處理
RET
MD: MOV DPTR,#DATA_BUFFER0-6
MOVX A,@DPTR
MOV R2,A
ANL A,#0F0H
SWAP A
CJNE A,#8,MD_RETURN ;=E是設置,不做處理
MOV DPTR,#DATA_BUFFER0-4
MOVX A,@DPTR
MOV B,A
MOV DPTR,#DATA_BUFFER0-1
MOVX A,@DPTR
CLR C
SUBB A,B
INC A
XCH A,R2
JB ACC.3,ACCOUNT4
JB ACC.2,ACCOUNT2
JB ACC.1,ACCOUNT1
RET
ACCOUNT4: MOV A,R2
RL A
RL A
AJMP BYTE_LENTH
ACCOUNT2: MOV A,R2
RL A
AJMP BYTE_LENTH
ACCOUNT1: MOV A,R2
BYTE_LENTH:ADD A,#7
MOV R2,A ;R2:LENGTH
MOV R3,#0
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -