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

📄 pcm16c550.asm

📁 《单片机应用系统设计与产品开发》配套源码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;位寻址区:20h-->25h即(00-->2fh)用语一些数制转换计算,25H(28H-->2FH)用于标志
;26h-->2Ah(即30H-->57H):用于上位机通信
;2Bh-->2Fh(即58h-->7fh)用于与设备通信标志
;RAM 10H-->1FH用于上位机(即两组寄存器)
;RAM 30H-->3FH及浮点数运算
;RAM 40H-->4FH用于设备
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



       RECE_PC_OK_FLAG     BIT         30H
       T1M_FLAG            BIT         31H

       communicate_state   EQU        11H
       REG_H_BYTE          EQU        12H
       FIFO_LEN            EQU        REG_H_BYTE
       LENGTH              EQU        13H
       CMD_STATE           EQU        14H
       POINTL              EQU        15H
       POINTH              EQU        16H
       REG_CHK2L           EQU        17H
       REG_CHK2H           EQU        18H
       T1M                 EQU        1AH
       _3S_                EQU        1BH

       STATE_SOI       EQU        1
       STATE_VERH      EQU        2
       STATE_VERL      EQU        3
       STATE_ADRH      EQU        4
       STATE_ADRL      EQU        5
       STATE_CMD1H     EQU        6
       STATE_CMD1L     EQU        7
       STATE_CMD2H     EQU        8
       STATE_CMD2L     EQU        9
       STATE_LENCHK    EQU        10
       STATE_LENH      EQU        11
       STATE_LENM      EQU        12
       STATE_LENL      EQU        13
       STATE_DATAH     EQU        14
       STATE_DATAL     EQU        15
       STATE_CHKSUM1H  EQU        16
       STATE_CHKSUM1L  EQU        17
       STATE_CHKSUM2H  EQU        18
       STATE_CHKSUM2L  EQU        19
       STATE_EOI       EQU        20
       STATE_OTHER     EQU        21
       STATE_SEND      EQU        22
       STATE_SEND_OVER EQU        23

       CMD2_REAL    EQU     41H
       CMD2_PARA    EQU     46H
       CMD2_SETUP   EQU     45H
       CMD2_OTHER   EQU     47H




      BUFFER2       EQU      0010H         ;暂存接收上位机的COMMANDINFO数据,设置时接收到的浮点数
      DATA_BUFFER   EQU      0600H         ;接收下位机信息缓存
      BCD_BUFFER    EQU      0700H
      DATA_BUFFER0  EQU      0300H
      ADDR_PARA     EQU      2000H-150
      ADDR_REAL     EQU      2000H
      HEAD_REAL     EQU      3000H
      HEAD_PARA     EQU      5000H
      HEAD_SETUP    EQU      6000H


      reset_ace    equ      p1.2
      ctrl_485     equ      p1.1
      ACE_PORT     EQU      8000H
      IER          EQU      8001H
      IIR          EQU      8002H
      FCR          EQU      8002H
      LCR          EQU      8003H
      LSR          EQU      8005H
      lsb          equ      8000h
      msb          equ      8001h

 ;******************************************
 ;单片机工作寄存器初始化,
 ;*****************************************

 INIT_COOL: MOV      PCON,#80H    ;SMOD=0
            MOV      SCON,#50H   ;串口以方式2工作
            MOV      TMOD,#21H   ;定时器0、1分别为方式4.8
            MOV      TH1,#0f4H   ;定时器1溢出率
            MOV      TL1,#0f4H   ;设置定时器、使串口波特率为2.4/S
            MOV      TCON,#40H   ;定时器1启动、定时器0为电平触发方式
            MOV      TH0,#04CH
            MOV      TL0,#00H
            MOV      IP,#04H     ;外中断优先机高,其次串口,再次定时器0
            CLR      RS0                 ;选工作寄存器组
            CLR      RS1


;************************************************
;一些寄存器,标志的初始化的初始化
;**************************************************

           CLR      SETUP_FLAG          ;设置标志
           CLR      ALLOW_SEND_FLAG
           CLR      ALLOW_TRANS_FLAG
           CLR      ALLOW_MOVE_FLAG
           CLR      RECE_PC_OK_FLAG
           MOV      T3S,#60
           MOV      _3S_,#60
           MOV      T1M,#20
           MOV      SMRECE_STATE,#RSTATE_STX_10H
           MOV      communicate_state,#STATE_SOI
;*****************************************
;16C550初始化
;*****************************************
 ACE_INIT: setb      reset_ace            ;SETB      P1.2
           NOP
           NOP
           NOP
           CLR      RESET_ACE
           MOV      DPTR,#lcr         ;线控制寄存器地址
           MOV      A,#80H            ;置除数锁存器位
           MOVX     @DPTR,A           ;除数锁寸器DLAB置1,以下设置波特率
           MOV      DPTR,#lsb         ;除数低位
           MOV      A,#06H            ;
           MOVX     @DPTR,A           ;
           MOV      A,#00H            ;
           MOV      DPTR,#msb         ;除数高位
           MOVX     @DPTR,A           ;
           MOV      DPTR,#lcr         ;线控制寄存器地址
           MOV      A,#03H            ;串行字符长8位,1位停止位
           MOVX     @DPTR,A           ;设置通信数据格式,8位数据位,1位停止位
           nop
           MOV      DPTR,#fcr         ;FIFO控制寄存器地址
           MOV      A,#07H            ;FIFO允许,接收,发送FIFO复位,1字节的触发电平
           MOVX     @DPTR,A
           MOV      DPTR,#ier         ;中断允许寄存器地址
           MOV      A,#01H            ;开放接收中断,暂时关发送
           MOVX     @DPTR,A           ;
           RET
;========================================================================================
;读取地址,地址为1字节,高半字节为1,低半字节有拨码开关设定
;========================================================================================
READ_PCMADDR:  MOV    A,P1
               SWAP   A
               ANL    A,#0FH
               ADD    A,#0F0H           ; 地址以高位为F
               MOV    PCM_ADDR,A
               RET
;**************************************************************************************
;通信服务程序,看门狗信号清零,与主程序看门狗信号高电平形成变化电平而喂狗
;程序产生允许发送信号,使发送程序每过3S发送一帧命令给智能设备,
;程序中中产生的分钟标志用来判断协议转换器是否与上位机是否失去联系,而判断485总线是否断开
;*******************************************************************************************
EVENT:          PUSH    ACC
                PUSH    PSW
                CLR     P1.3
                MOV     TL0,#01
                MOV     TH0,#4CH

TIM3S:          DJNZ    T3S,TIME             ;3S到
                MOV     T3S,#60
                SETB    ALLOW_SEND_FLAG

TIME:           DJNZ    _3S_,ABCD
                MOV     _3S_,#60

                DJNZ    T1M,ABCD             ;1分到
                MOV     T1M,#20
                CLR     EA
                SETB    RESET_ACE
                CLR     CTRL_485
                MOV     P0,#0FFH
                MOV     P1,#11111101B
                MOV     P2,#0FFH
                MOV     P3,#0FFH
                PUSH    00
                PUSH    00
                RETI

ABCD:           POP     PSW
                POP     ACC
                RETI

   ;*******************************
   ;将发送的A解释为ASCII码
   ;A入口  A出口
   ;*******************************
   ASCII:  CLR   C
           CJNE  A,#0AH,ASC1
           ADD   A,#37H
           RET
   ASC1:   JC    ASC2
           ADD   A,#37H
           RET
   ASC2:   ADD   A,#30H
           RET
;*******************************
   ;将ASCII码还原为16进制数字
   ;A入口  A出口
   ;*******************************
HEX:    CLR   C
        CJNE  A,#41H,HE1
        SUBB  A,#37H
        RET
HE1:    JC    HE2
        SUBB  A,#37H
        RET
HE2:    CLR   C
        SUBB  A,#30H
        RET
;====================================================
;16c550中断程序
;=================================================
INT:         PUSH     A    ;保护现场
             PUSH     B
             PUSH     DPL
             PUSH     DPH

             PUSH     PSW
             SETB     RS1               ;选工作寄存器
             CLR      RS0
             nop
             MOV     DPTR,#LSR
             MOVX    A,@DPTR
             JB      ACC.7,INT_LSR_ERROR
             MOV     DPTR,#iir             ;读中断识别寄存器
             MOVX    A,@DPTR
             ANL     A,#0FH
             XRL     A,#2                   ;与零异或为零是发送中断
             JNZ     INT_RECE
             LJMP    INT_SEND               ;跳转到发送程序

INT_LSR_ERROR:SETB   RESET_ACE
              CLR    CTRL_485               ;
              LCALL  ACE_INIT
              LJMP   INT_RETURN

INT_RECE:    MOV     DPTR,#LSR
             MOVX    A,@DPTR
             JB      ACC.0,INT_R0
             LJMP    INT_LSR_ERROR

INT_R0:      MOV     DPTR,#ace_port               ;读数
             MOVX    A,@DPTR
             MOV     B,A                         ;暂存保护
             MOV     A,communicate_state

RECE_SOI:    CJNE    A,#STATE_SOI,RECE_VERH   ;接收其始位
             MOV     A,B
             CJNE    A,#7EH,RS
             MOV     REG_CHK2L,#0
             MOV     REG_CHK2H,#0
             MOV     POINTL,#LOW(BUFFER2)
             MOV     POINTH,#HIGH(BUFFER2)
             CLR     RECE_PC_OK_FLAG
             MOV     communicate_state,#STATE_VERH
RS:          LJMP    INT_RETURN

RECE_VERH:   CJNE    A,#STATE_VERH,RECE_VERL ;接收版本号高字节
             MOV     A,B
             CJNE    A,#32H,RV_ERROR
             MOV     A,B
             LCALL   INT_CHKSUM
             MOV     communicate_state,#STATE_VERL
             LJMP    INT_RETURN
RV_ERROR:    MOV     COMMUNICATE_STATE,#STATE_SOI
             LJMP    INT_RETURN

RECE_VERL:   CJNE    A,#STATE_VERL,RECE_ADRH ;接收版本号低字节
             MOV     A,B
             CJNE    A,#30H,RV_ERROR
             MOV     A,B
             LCALL   INT_CHKSUM
             MOV     communicate_state,#STATE_ADRH
             LJMP    INT_RETURN


RECE_ADRH:   CJNE    A,#STATE_ADRH,RECE_ADRL ;接收地址号高字节

             MOV     A,B
             LCALL   INT_CHKSUM
             MOV     A,B
             LCALL   HEX
             SWAP    A
             MOV     REG_H_BYTE,A
             MOV     communicate_state,#STATE_ADRL
             LJMP    INT_RETURN

RECE_ADRL:  CJNE     A,#STATE_ADRL,RECE_CMD1H ;接收版本号低字节

            MOV      A,B
            LCALL    INT_CHKSUM
            MOV      A,B
            LCALL    HEX
            ADD      A,REG_H_BYTE
            XRL      A,PCM_ADDR
            JZ       RA_RIGHT
            MOV      communicate_state,#STATE_SOI
            LJMP     INT_RETURN

RA_RIGHT:   MOV      communicate_state,#STATE_CMD1H
            LJMP     INT_RETURN

RECE_CMD1H: CJNE    A,#STATE_CMD1H,RECE_CMD1L ;接收命令1高字节

            MOV     A,B
            CJNE    A,#44H,RCH_ERROR
            MOV     A,B
            LCALL   INT_CHKSUM
            MOV     communicate_state,#STATE_CMD1L
            LJMP    INT_RETURN

RCH_ERROR:  MOV     COMMUNICATE_STATE,#STATE_SOI
            LJMP    INT_RETURN

RECE_CMD1L: CJNE     A,#STATE_CMD1L,RECE_CMD2H ;接收命令1低字节

            MOV      A,B
            LCALL    INT_CHKSUM
            MOV      A,B
            CJNE     A,#30H,RCH_ERROR
            MOV      communicate_state,#STATE_CMD2H
            LJMP     INT_RETURN


RECE_CMD2H: CJNE    A,#STATE_CMD2H,RECE_CMD2L ;接收命令2高字节

            MOV     A,B

⌨️ 快捷键说明

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