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

📄 main.asm

📁 《单片机应用系统设计与产品开发》配套源码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;===================================================================
;此程序在实际监控工程中正常运行,智能设备是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 + -