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

📄 install.a51

📁 单片机C语言参考程序
💻 A51
📖 第 1 页 / 共 3 页
字号:
$ELSEIF (SERIAL = 11)
;********************************************************************
;*  Using Timer 2 to generate Baud Rates                            *
;*  for Dallas 80C320/520/530 with multiple data pointer support    *
;*  Oscillator frequency = don't care                               *
;*  Automatic Baudrate Adjustment                                   *
;********************************************************************
T2CON   DATA    0C8H
T2MOD   DATA    0C9H
RC2L    DATA    0CAH
RC2H    DATA    0CBH
TL2     DATA    0CCH
TH2     DATA    0CDH
TR2     BIT     0C8H.2
TF2     BIT     0C8H.7
  
InitSerial:     PROMCHECK               ; Check if PROM in System
                CLR     A
                MOV     RC2H,A
                MOV     RC2L,A
                MOV     TL2,A
                MOV     TH2,A
                MOV     T2MOD,A
                MOV     T2CON,A
L4:             JB      RXD,L4
L6:             JNB     RXD,L6
L7:             SETB    TR2
L8:             JNB     RXD,L10
                JNB     TF2,L8
L10:            JNB     RXD,L10
L12:            JNB     RXD,L14
                JNB     TF2,L12
L14:            JNB     RXD,L14
L15:            CLR     TR2
                JB      TF2,InitSerial
                MOV     R7,TL2
                MOV     R6,TH2

                MOV     A,R6
                CLR     C
                RRC     A
                MOV     R4,A
                MOV     A,R7
                RRC     A
                ADD     A,R7
                MOV     R7,A
                MOV     A,R4
                ADDC    A,R6
                MOV     R6,A

                MOV     A,R7
                ADD     A,#010H
                MOV     R7,A
                CLR     A
                ADDC    A,R6
                MOV     R6,A

                MOV     A,R7
                MOV     R0,#05H
L22:            XCH     A,R6
                CLR     C
                RRC     A
                XCH     A,R6
                RRC     A
                DJNZ    R0,L22
                MOV     R7,A
                CLR     C
                CLR     A
                SUBB    A,R7
                MOV     RC2L,A
                MOV     TL2,A
                CLR     A
                SUBB    A,R6
                MOV     RC2H,A
                MOV     TH2,A

                MOV     T2CON,#034H
                MOV     SCON,#05AH
L16:            CLR     RI
                JNB     RI,$
                MOV     A,SBUF
                CJNE    A,#011H,L16
                JMP     Mon51


$ELSEIF (SERIAL = 12)
;********************************************************************
;*  Using second serial interface of Dallas 80C320/520/530 with     *
;*  Timer 1 and multiple data pointer support                       *
;*  Oscillator frequency = don't care                               *
;*  Automatic Baudrate Adjustment                                   *
;********************************************************************
DPS     DATA    086H
CKCON   DATA    08EH
SCON1   DATA    0C0H
SBUF1   DATA    0C1H
WDCON   DATA    0D8H
RI1     BIT     0C0H.0
RXD1    BIT     P1.2

InitSerial:     PROMCHECK               ; Check if PROM in System
                MOV     DPS,#00H
                ORL     CKCON,#010H     ; Timer 1 uses a divide by 4 clock
                CLR     TR1
                CLR     TF1
                CLR     A
                MOV     TL1,A
                MOV     TH1,A
                MOV     TMOD,#010H
L4:             JB      RXD1,L4
L6:             JNB     RXD1,L6
L7:             SETB    TR1
L8:             JNB     RXD1,L10
                JNB     TF1,L8
L10:            JNB     RXD1,L10
L12:            JNB     RXD1,L14
                JNB     TF1,L12
L14:            JNB     RXD1,L14
L15:            CLR     TR1
                JB      TF1,InitSerial
                MOV     R7,TL1
                MOV     R6,TH1

                MOV     A,R7
                ADD     A,#040H
                MOV     R7,A
                CLR     A
                ADDC    A,R6
                MOV     R6,A

                MOV     A,R7
                RLC     A
                MOV     A,R6
                RLC     A
                MOV     R7,A
                CLR     C
                CLR     A
                SUBB    A,R7
                MOV     TH1,A
                CLR     A
                MOV     TL1,A
                MOV     TMOD,#00100000B ;C/T = 0, Mode = 2
                SETB    TR1
                ORL     WDCON,#080H
                MOV     SCON1,#05AH

L16:            CLR     RI1
                JNB     RI1,$
                MOV     A,SBUF1
                CJNE    A,#011H,L16
                JMP     Mon51

$ENDIF


$IF ((SERIAL = 3) OR (SERIAL = 10))
;********************************************************************
;*  Interface via additional 80517 UART                             *
;********************************************************************
SER_INT_ADR     EQU     83H             ; ADDRESS OF SERIAL INTERRUPT VECTOR
SER_INT_ADR_OFF EQU (INT_ADR_OFF + SER_INT_ADR)

INSTAT:         PUSH    B               ; INPUT STATUS OF SERIAL INTERFACE
                MOV     B,S1CON
                MOV     C,B.0
                POP     B
                RET

OUTSTAT:        PUSH    B               ; OUTPUT STATUS OF SERIAL INTERFACE
                MOV     B,S1CON
                MOV     C,B.1
                POP     B
                RET

INCHAR:         MOV     A,S1BUF         ; CHARACTER INPUT-ROUTINE 
                RET

OUTCHAR:        MOV     S1BUF,A         ; CHARACTER OUTPUT-ROUTINE 
                RET

CLR_TI:         ANL     S1CON,#11111101B ; CLEAR SERIAL TRANSMIT INTERRUPT FLAG
                RET

SET_TI:         ORL     S1CON,#00000010B ; SET SERIAL TRANSMIT INTERRUPT FLAG
                RET

CLR_RI:         ANL     S1CON,#11111110B ; CLEAR SERIAL RECEIVE INTERRUPT FLAG
                RET

CLR_SER_IE:     ANL     IEN2,#11111110B  ; CLEAR SERIAL INTERRUPT ENABLE FLAG
                RET

SET_SER_IE:     ORL     IEN2,#00000001B  ; SET SERIAL INTERRUPT ENABLE FLAG
                RET

BEFORE_GO:                               ; this code is executed before a
                RET                      ; a go or proc step is executed

AFTER_GO:                                ; this code is executed after a go
                RET                      ; command (when a breakpoint was set)

WR_CODE:        MOVX    @DPTR,A          ; insert different code here, but
                RET                      ; do not change any other register
                                         ; without saving it


$ELSEIF ((SERIAL = 5) OR (SERIAL = 12))
;********************************************************************
;*  Interface via additional 80C320 UART                            *
;********************************************************************
SER_INT_ADR     EQU     03BH            ; ADDRESS OF SERIAL INTERRUPT VECTOR
SER_INT_ADR_OFF EQU (INT_ADR_OFF + SER_INT_ADR)
TI1     BIT     0C1H
ES1     BIT     0AEH

INSTAT:         MOV     C,RI1           ; INPUT STATUS OF SERIAL INTERFACE
                RET

OUTSTAT:        MOV     C,TI1           ; OUTPUT STATUS OF SERIAL INTERFACE
                RET

INCHAR:         MOV     A,SBUF1         ; CHARACTER INPUT-ROUTINE
                RET

OUTCHAR:        MOV     SBUF1,A         ; CHARACTER OUTPUT-ROUTINE
                RET

CLR_TI:         CLR     TI1             ; CLEAR SERIAL TRANSMIT INTERRUPT FLAG
                RET

SET_TI:         SETB    TI1             ; SET SERIAL TRANSMIT INTERRUPT FLAG
                RET

CLR_RI:         CLR     RI1             ; CLEAR SERIAL RECEIVE INTERRUPT FLAG
                RET

CLR_SER_IE:     CLR     ES1             ; CLEAR SERIAL INTERRUPT ENABLE FLAG
                RET

SET_SER_IE:     SETB    ES1             ; SET SERIAL INTERRUPT ENABLE FLAG
                RET

BEFORE_GO:                              ; this code is executed before a
                RET                     ; a go or proc step is executed

AFTER_GO:                               ; this code is executed after a go
                RET                     ; command (when a breakpoint was set)

WR_CODE:        MOVX    @DPTR,A         ; insert different code here, but
                RET                     ; do not change any other register
                                        ; without saving it


$ELSEIF (SERIAL = 6)
;********************************************************************
;*  Interface via external UART 16450/16550                         *
;********************************************************************
SER_INT_ADR     EQU     023H            ; ADDRESS OF SERIAL INTERRUPT VECTOR
SER_INT_ADR_OFF EQU (INT_ADR_OFF + SER_INT_ADR)

INSTAT:         PUSH    DPL             ; INPUT STATUS OF SERIAL INTERFACE
                PUSH    DPH
                PUSH    ACC
                MOV     DPTR,#SIOADDR+5 ; LSR
                MOVX    A,@DPTR         ; Check if Ready
                MOV     C,ACC.0
                POP     ACC        
                POP     DPH        
                POP     DPL        
                RET

OUTSTAT:        PUSH    DPL             ; OUTPUT STATUS OF SERIAL INTERFACE
                PUSH    DPH
                PUSH    ACC
                MOV     DPTR,#SIOADDR+5 ; LSR
                MOVX    A,@DPTR         ; Check if Ready
                MOV     C,ACC.5
                POP     ACC
                POP     DPH
                POP     DPL
                RET

INCHAR:         PUSH    DPL             ; CHARACTER INPUT-ROUTINE
                PUSH    DPH
                MOV     DPTR,#SIOADDR
                MOVX    A,@DPTR
                POP     DPH        
                POP     DPL        
                RET

OUTCHAR:        PUSH    DPL             ; CHARACTER OUTPUT-ROUTINE
                PUSH    DPH
                MOV     DPTR,#SIOADDR
                MOVX    @DPTR,A
                POP     DPH
                POP     DPL
                RET

CLR_TI:                                 ; CLEAR SERIAL TRANSMIT INTERRUPT FLAG
                RET

SET_TI:                                 ; SET SERIAL TRANSMIT INTERRUPT FLAG
                RET

CLR_RI:                                 ; CLEAR SERIAL RECEIVE INTERRUPT FLAG
                RET

CLR_SER_IE:                             ; CLEAR SERIAL INTERRUPT ENABLE FLAG
                RET

SET_SER_IE:                             ; SET SERIAL INTERRUPT ENABLE FLAG
                RET

BEFORE_GO:                              ; this code is executed before a
                RET                     ; a go or proc step is executed

AFTER_GO:                               ; this code is executed after a go
                RET                     ; command (when a breakpoint was set)

WR_CODE:        MOVX    @DPTR,A         ; insert different code here, but
                RET                     ; do not change any other register
                                        ; without saving it


$ELSE 

;********************************************************************
;*  Interface via standard 8051 UART                                *
;********************************************************************
SER_INT_ADR     EQU     23H             ; ADDRESS OF SERIAL INTERRUPT VECTOR
SER_INT_ADR_OFF EQU (INT_ADR_OFF + SER_INT_ADR)

INSTAT:         MOV     C,RI            ; INPUT STATUS OF SERIAL INTERFACE
                RET

OUTSTAT:        MOV     C,TI            ; OUTPUT STATUS OF SERIAL INTERFACE
                RET

INCHAR:         MOV     A,SBUF          ; CHARACTER INPUT-ROUTINE
                RET

OUTCHAR:        MOV     SBUF,A          ; CHARACTER OUTPUT-ROUTINE
                RET

CLR_TI:         CLR     TI              ; CLEAR SERIAL TRANSMIT INTERRUPT FLAG
                RET

SET_TI:         SETB    TI              ; SET SERIAL TRANSMIT INTERRUPT FLAG
                RET

CLR_RI:         CLR     RI              ; CLEAR SERIAL RECEIVE INTERRUPT FLAG
                RET

CLR_SER_IE:     CLR     ES              ; CLEAR SERIAL INTERRUPT ENABLE FLAG
                RET

SET_SER_IE:     SETB    ES              ; SET SERIAL INTERRUPT ENABLE FLAG
                RET

BEFORE_GO:                              ; this code is executed before a
                RET                     ; a go or proc step is executed

AFTER_GO:                               ; this code is executed after a go
                RET                     ; command (when a breakpoint was set)

WR_CODE:        MOVX    @DPTR,A         ; insert different code here, but
                RET                     ; do not change any other register
                                        ; without saving it


$ENDIF


                END

⌨️ 快捷键说明

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