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

📄 pcm16c550.asm

📁 《单片机应用系统设计与产品开发》配套源码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
            LCALL   INT_CHKSUM
            MOV     A,B
            LCALL   HEX
            SWAP    A
            MOV     REG_H_BYTE,A
            MOV     communicate_state,#STATE_CMD2L
            LJMP    INT_RETURN

 RECE_CMD2L:CJNE     A,#STATE_CMD2L,RECE_LENCHK ;接收命令2低字节

            MOV      A,B
            LCALL    INT_CHKSUM
            MOV      A,B
            LCALL    HEX
            ADD      A,REG_H_BYTE
RC2_REAL:   CJNE     A,#CMD2_REAL,RC2_PARA  ;判断是否为取实时数据命令
            MOV      CMD_STATE,#CMD2_REAL
            AJMP     RC2_RIGHT
RC2_PARA:   CJNE     A,#CMD2_PARA,RC2_SETUP ;判断是否为取实参数据命令
            MOV      CMD_STATE,#CMD2_PARA
            AJMP     RC2_RIGHT
RC2_SETUP:  CJNE     A,#CMD2_SETUP,RC2_OTHER ;判断是否为取设置命令
            MOV      CMD_STATE,#CMD2_SETUP
            AJMP     RC2_RIGHT

RC2_OTHER:  MOV      CMD_STATE,#CMD2_OTHER
            MOV      communicate_state,#STATE_SOI
            LJMP     INT_RETURN

RC2_RIGHT:  MOV      communicate_state,#STATE_LENCHK
            LJMP     INT_RETURN

RECE_LENCHK:CJNE     A,#STATE_LENCHK,RECE_LENH ;接收长度校验低字节
            MOV      A,B
            LCALL    INT_CHKSUM
            MOV      A,B
            LCALL    HEX
            MOV      REG_H_BYTE,A
            MOV      communicate_state,#STATE_LENH
            LJMP     INT_RETURN

RECE_LENH:  CJNE     A,#STATE_LENH,RECE_LENM  ;接收长度校验高字节
            MOV      A,B
            LCALL    INT_CHKSUM
            MOV      communicate_state,#STATE_LENM             ;命令的长度比较短,最长只有10个字节,这个字节为0
            LJMP     INT_RETURN

RECE_LENM:  CJNE     A,#STATE_LENM,RECE_LENL             ;命令的长度比较短,最长只有10个字节,这个字节为0
            MOV      A,B
            LCALL    INT_CHKSUM
            MOV      communicate_state,#STATE_LENL
            LJMP     INT_RETURN

RECE_LENL:  CJNE     A,#STATE_LENL,RECE_DATAH
            MOV      A,B
            LCALL    INT_CHKSUM
            MOV      A,B
            LCALL    HEX
            mov      b,a
            RR       A
            MOV      LENGTH,A
            MOV      A,B
            CPL      A
            ADD      A,#1
            XRL      A,REG_H_BYTE
            ANL      A,#0FH
            JZ       RL_RIGHT
            MOV      communicate_state,#STATE_SOI
            LJMP     INT_RETURN
RL_RIGHT:   MOV      A,LENGTH
            JNZ       RL_SETUP
            MOV      communicate_state,#STATE_CHKSUM1H
            LJMP     INT_RETURN
RL_SETUP:   MOV      communicate_state,#STATE_DATAH
            LJMP     INT_RETURN

RECE_DATAH: CJNE     A,#STATE_DATAH,RECE_DATAL ;接收数据
            MOV      A,B
            LCALL    INT_CHKSUM
            MOV      A,B
            LCALL    HEX
            SWAP     A
            MOV      REG_H_BYTE,A
            MOV      COMMUNICATE_STATE,#STATE_DATAL
            LJMP     INT_RETURN

RECE_DATAL: CJNE     A,#STATE_DATAL,RECE_CHKSUM1H;接收数据

            MOV      A,B
            LCALL    INT_CHKSUM
            MOV      A,B
            LCALL    HEX
            ADD      A,REG_H_BYTE
            MOV      DPL,POINTL
            MOV      DPH,POINTH
            MOVX     @DPTR,A
            INC      DPTR
            MOV      POINTL,DPL
            MOV      POINTH,DPH
            DJNZ     LENGTH,RD1
            MOV      communicate_state,#STATE_CHKSUM1H
            LJMP     INT_RETURN
RD1:        MOV      communicate_state,#STATE_DATAH
            LJMP     INT_RETURN

RECE_CHKSUM1H: CJNE     A,#STATE_CHKSUM1H,RECE_CHKSUM1L接收和1校验低字节
               MOV      A,B
               LCALL    HEX
               SWAP     A
               MOV      REG_H_BYTE,A
               MOV      communicate_state,#STATE_CHKSUM1L
               LJMP     INT_RETURN

RECE_CHKSUM1L: CJNE     A,#STATE_CHKSUM1L,RECE_CHKSUM2H接收和1校验高字节
               MOV      A,B
               LCALL    HEX
               ADD      A,REG_H_BYTE
               MOV      LENGTH,A
               MOV      communicate_state,#STATE_CHKSUM2H
               LJMP     INT_RETURN

RECE_CHKSUM2H: CJNE     A,#STATE_CHKSUM2H,RECE_CHKSUM2L接收和2校验低字节
               MOV      A,B
               LCALL    HEX
               SWAP     A
               MOV      REG_H_BYTE,A
               MOV      communicate_state,#STATE_CHKSUM2L
               LJMP     INT_RETURN

RECE_CHKSUM2L: CJNE     A,#STATE_CHKSUM2L,RECE_EOI接收和2校验高字节
               MOV      A,B
               LCALL    HEX
               ADD      A,REG_H_BYTE
               MOV      REG_H_BYTE,A
               CLR      C
               MOV      A,REG_CHK2L
               CPL      A
               ADD      A,#1
               MOV      REG_CHK2L,A
               MOV      A,REG_CHK2H
               CPL      A
               ADDC     A,#0
               XRL      A,LENGTH
               JNZ      RC_ERROR
               MOV      A,REG_CHK2L
               XRL      A,REG_H_BYTE
               JNZ      RC_ERROR
               MOV      communicate_state,#STATE_EOI
               LJMP     INT_RETURN
RC_ERROR:      MOV      communicate_state,#STATE_SOI
               LJMP     INT_RETURN

RECE_EOI:      CJNE     A,#STATE_EOI,RECE_OTHER    ;接收结束字符0D
               MOV      A,B
               CJNE     A,#0DH,RECE_OTHER
               SETB     RECE_PC_OK_FLAG
               MOV      DPTR,#fcr         ;FIFO控制寄存器地址   ;清零FIFO
               MOV      A,#07H            ;FIFO允许,接收,发送FIFO复位,1字节的触发电平
               MOVX     @DPTR,A
               MOV      DPTR,#ier                   ;关接收,发送中断
               MOV      A,#0
               MOVX     @DPTR,A
RECE_OTHER:    MOV      communicate_state,#STATE_SOI
               LJMP     INT_RETURN

INT_RETURN:   POP     PSW      ;恢复现场寄存器
              POP     DPH
              POP     DPL
              POP     B
              POP     A
              RETI
;================================================================
;发送给上位机采用查询的方法发送
;=================================================================
INT_SEND:     MOV    DPTR,#LSR
              MOVX   A,@DPTR
              JB     ACC.5,IS0
INT_LSR_ERROR1:SETB   RESET_ACE
              CLR    CTRL_485               ;
              LCALL  ACE_INIT
              LJMP   INT_RETURN

   IS0:        MOV    A,COMMUNICATE_STATE

               CJNE   A,#STATE_SEND,SEND_OVER
               MOV    FIFO_LEN,#16
               LCALL  SEND_PC
               LJMP   INT_RETURN

SEND_OVER:    MOV    communicate_state,#STATE_SOI
              MOV    DPTR,#lsr                  ;线状态控制寄存器地址
              MOVX   A,@DPTR
              JNB    ACC.6,SEND_OVER           ;查询是否为空
              MOV    T1M,#20
              MOV    DPTR,#ier                  ;关发送中断
              MOV    A,#01H
              MOVX   @DPTR,A
              MOV    DPTR,#fcr           ;FIFO控制寄存器地址 ;此处清 FIFO
              MOV    A,#07H              ;FIFO允许,接收,发送FIFO复位,1字节的触发电平
              MOVX   @DPTR,A
              CLR    ctrl_485              ;发完则接收有效,主要用于485总线
              LJMP   INT_RETURN

;=========================================================
SEND_PC:      MOV    DPTR,#FCR
              MOV    A,#7
              MOVX   @DPTR,A
SEND_PC0:     MOV    DPL,POINTL
              MOV    DPH,POINTH
              MOVX   A,@DPTR
              INC    DPTR
              MOV    POINTL,DPL
              MOV    POINTH,DPH
              MOV    DPTR,#ace_port
              nop
              MOVX   @DPTR,A
              CJNE   A,#0DH,S_FIFO
              MOV    COMMUNICATE_state,#state_send_over
              RET
S_FIFO:       DJNZ   FIFO_LEN,SEND_PC0
              RET

INT_CHKSUM: CLR      C
            ADD      A,REG_CHK2L      ;形成和校验
            MOV      REG_CHK2L,A
            MOV      A,REG_CHK2H
            ADDC     A,#0
            MOV      REG_CHK2H,A
            RET

;==========================================================
;将数据处理好,将数据整理成电总协议的格式,
;==========================================================

MAINLOOPPCDATA: JBC    RECE_PC_OK_FLAG,PDP
                 RET
PDP:             MOV    A,CMD_STATE
                 CJNE   A,#CMD2_REAL,PDA_PARA

PDA_REAL:        MOV   COMMUNICATE_STATE,#STATE_SEND
                 MOV    A,PCM_STATE
                 ANL    A,#0FH
                 LCALL  ASCII                         ;设备断线,只用了底字节
                 MOV    DPTR,#HEAD_REAL+16
                 MOVX   @DPTR,A
                 MOV    REG_CHK2L,#0
                 MOV    REG_CHK2H,#0
                 MOV    DPTR,#HEAD_REAL+1
                 MOV    LENGTH,#20
PDAR:            MOVX   A,@DPTR               ;前面的形成校验
                 LCALL  INT_CHKSUM
                 INC    DPTR
                 DJNZ   LENGTH,PDAR

                 MOV    R0,#LOW(ADDR_REAL)
                 MOV    R1,#HIGH(ADDR_REAL)
                 MOV    R6,#LOW(HEAD_REAL+21)
                 MOV    R7,#HIGH(HEAD_REAL+21)
                 MOV    DPTR,#LEN_REAL
                 INC    DPH
                 MOV    R4,DPL
                 MOV    R5,DPH
                 LCALL  WAHAHA
                 MOV    DPTR,#HEAD_REAL
                 MOV    POINTL,DPL
                 MOV    POINTH,DPH
                 setb   ctrl_485
                 nop
                 MOV    DPTR,#ier                   ;关接收,开发送中断
                 MOV    A,#2
                 MOVX   @DPTR,A
                 ;MOV    DPTR,#ACE_PORT
                 ;mov    a,#0aah
                 ;MOVX   @DPTR,A
                 RET


PDA_PARA:        CJNE   A,#CMD2_PARA,PDA_SETUP
                 MOV   COMMUNICATE_STATE,#STATE_SEND
                 MOV    A,PCM_STATE
                 ANL    A,#0FH
                 LCALL  ASCII
                 MOV    DPTR,#HEAD_PARA+16
                 MOVX   @DPTR,A
                 SETB   BREAK_FLAG
                 MOV    REG_CHK2L,#0
                 MOV    REG_CHK2H,#0
                 MOV    DPTR,#HEAD_PARA+1
                 MOV    LENGTH,#20
PDAP:            MOVX   A,@DPTR               ;前面的形成校验
                 LCALL  INT_CHKSUM
                 INC    DPTR
                 DJNZ   LENGTH,PDAP

                 MOV    R0,#LOW(ADDR_PARA)
                 MOV    R1,#HIGH(ADDR_PARA)
                 MOV    R6,#LOW(HEAD_PARA+21)
                 MOV    R7,#HIGH(HEAD_PARA+21)
                 MOV    DPTR,#LEN_PARA
                 INC    DPH
                 MOV    R4,DPL
                 MOV    R5,DPH
                 LCALL  WAHAHA
                 MOV    DPTR,#HEAD_PARA
                 MOV    POINTL,DPL
                 MOV    POINTH,DPH
                 setb   ctrl_485
                 nop
                 MOV    DPTR,#ier                   ;关接收,开发送中断
                 MOV    A,#2
                 MOVX   @DPTR,A
                 ;MOV    DPTR,#ACE_PORT
                 ;clr    a
                 ;MOVX   @DPTR,A
                 RET


PDA_SETUP:       CJNE   A,#CMD2_SETUP,PDA_OTHER
                 MOV   COMMUNICATE_STATE,#STATE_SEND
                 SETB   SETUP_FLAG
                 MOV    A,PCM_STATE
                 ANL    A,#0FH
                 LCALL  ASCII
                 MOV    DPTR,#HEAD_SETUP+16
                 MOVX   @DPTR,A
                 MOV    REG_CHK2L,#0
                 MOV    REG_CHK2H,#0
                 MOV    DPTR,#HEAD_SETUP+1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -