📄 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 + -