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

📄 ch13_s11.asm

📁 51单片机基础篇 对于有一定基础的人看看 包含书中所以的源代码
💻 ASM
字号:
;PROGRAM NAME S11.ASM
;SERIAL RECEIVE/TRANSMITE DEMO PROGRAM 1
;DEFINE
BUFFER  EQU     30H           ;RECEIVE BUFFER
BUF_CNT EQU     40H           ;BUFFER COUNT
CR      EQU     0DH           ;CARRIAGE RETURN CODE
LF      EQU     0AH           ;LINE FEED CODE
;
BUZZER  REG     P3.4
LED     REG     P3.7
;
        ORG     0000H
RESET   MOV     R0,#00H
        DJNZ    R0,$
        CLR     LED
        CLR     BUZZER
;
        MOV     SP,#60H
START   LCALL   INIT_SIO        ;SIO,TIMER INIT
        LCALL   CLR_BUF         ;CLEAR RECEIVE BUFFER
        MOV     20H,#00H
        CLR     20H.0           ;TEST FLAG=0
        MOV     P1,#00H
        SETB    REN
        SETB    PS
        SETB    ES
        CLR     RI
        CLR     TI
        LCALL   DELAY
        MOV     DPTR,#MSG_SRT
        LCALL   MESSAGE         ;SEND OUT MESSAGE
;
        SETB    EA              ;ENABLE INTERRUPT
;
MAIN    LCALL   DELAY           ;MAIN ROUTINE
        JB      20H.0,STOP      ;IF F0=1 THEN EXIT
        SJMP    MAIN
;
STOP    CLR     EA              ;DISABLE INTERRUPT
        SJMP    START           ;RESTART
;
SYNTAX  CLR     EA
        LCALL   CHK_CMD1
        JC      SYN_END
        LCALL   CHK_CMD2
        JC      SYN_END
        LCALL   CHK_CMD3
        JC      SYN_END
ERROR   MOV     DPTR,#MSG_ERR
        LCALL   MESSAGE
SYN_END LCALL   CLR_BUF         ;CLEAR BUFFER MEMORY
        SETB    EA
        RET
;
;COMMAND LIST
CMD1    DB      'HI'
CMD2    DB      'HOW ARE YOU'
CMD3    DB      'END'
;MESSAGE LIST
MSG_SRT DB      'PRESS <ESC> TO START',0DH,0AH,'$'
MS1     DB      'HELLO !!',0DH,0AH,'$'
MS2     DB      'I AM FINE',0DH,0AH,'$'
MS3     DB      'DEMO TEST END,PRESS <ESC> BACK TO MONITOR',0DH,0AH,'$'
MSG_ERR DB      'INPUT ERROR !',0DH,0AH,'$'
;
CHK_CMD1
        MOV     DPTR,#BUF_CNT
        MOVX    A,@DPTR
        NOP
        MOV     R7,A            ;R7=BUF_CNT-1
        MOV     R6,#00H
        MOV     R5,#00H
CMD1_NXT:
        MOV     DPTR,#BUFFER
        MOV     A,R6
        ADD     A,DPL
        MOV     DPL,A
        MOV     A,DPH
        ADDC    A,#00H
        MOV     DPH,A           ;BUFFER+BUF_CNT
        MOVX    A,@DPTR         ;GET RECEIVE BYTE
        PUSH    A
        MOV     DPTR,#CMD1
        LCALL   GETCODE         ;CODE IN B
        POP     A
        CJNE    A,B,NO_CMD1
        INC     R5
        INC     R6
        DJNZ    R7,CMD1_NXT
        LCALL   DELAY
        MOV     DPTR,#MS1
        LCALL   MESSAGE         ;ECHO MESSAGE 1
        SETB    C               ;COMMAND 1 TRUE
        SJMP    CMD1_E          ;END
NO_CMD1 CLR     C
CMD1_E  RET
;
CHK_CMD2
        MOV     DPTR,#BUF_CNT
        MOVX    A,@DPTR
        MOV     R7,A            ;R7=BUF_CNT
        MOV     R6,#00H
        MOV     R5,#00H
CMD2_NXT:
        MOV     DPTR,#BUFFER
        MOV     A,R6
        ADD     A,DPL
        MOV     DPL,A
        MOV     A,DPH
        ADDC    A,#00H
        MOV     DPH,A           ;BUFFER+BUF_CNT
        MOVX    A,@DPTR         ;GET RECEIVE BYTE
        PUSH    A
        MOV     DPTR,#CMD2
        LCALL   GETCODE         ;CODE IN B
        POP     A
        CJNE    A,B,NO_CMD2
        INC     R5
        INC     R6
        DJNZ    R7,CMD2_NXT
        LCALL   DELAY
        MOV     DPTR,#MS2
        LCALL   MESSAGE         ;ECHO MESSAGE 2
        SETB    C               ;COMMAND 2 TRUE
        SJMP    CMD2_E          ;END
NO_CMD2 CLR     C
CMD2_E  RET
;
CHK_CMD3
        MOV     DPTR,#BUF_CNT
        MOVX    A,@DPTR
        MOV     R7,A            ;R7=BUF_CNT
        MOV     R6,#00H
        MOV     R5,#00H
CMD3_NXT:
        MOV     DPTR,#BUFFER
        MOV     A,R6
        ADD     A,DPL
        MOV     DPL,A
        MOV     A,DPH
        ADDC    A,#00H
        MOV     DPH,A           ;BUFFER+BUF_CNT
        MOVX    A,@DPTR         ;GET RECEIVE BYTE
        PUSH    A
        MOV     DPTR,#CMD3
        LCALL   GETCODE         ;CODE IN B
        POP     A
        CJNE    A,B,NO_CMD3
        INC     R5
        INC     R6
        DJNZ    R7,CMD3_NXT
        LCALL   DELAY
        MOV     DPTR,#MS3
        LCALL   MESSAGE         ;ECHO MESSAGE 3
        SETB    C               ;COMMAND 3 TRUE
        SETB    20H.0           ;TEST FLAG
        SJMP    CMD3_E          ;END
NO_CMD3 CLR     C
CMD3_E  RET
;
MESSAGE MOVX    A,@DPTR
        CJNE    A,#'$',S_OUT
        SJMP    S_END
S_OUT   CLR     TI              ;CLEAR TRANSMIT INTERRUPT
        MOV     SBUF,A
WAIT    JNB     TI,WAIT
        INC     DPTR
        LCALL   SIO_DELAY
        SJMP    MESSAGE
S_END   RET
;
GETCODE MOV     A,R5
        ADD     A,DPL
        MOV     DPL,A
        MOV     A,DPH
        ADDC    A,#00H
        MOV     DPH,A
        MOVX    A,@DPTR
        MOV     B,A             ;SAVE IN B
        RET
;
SIOISR  CLR     EA
        PUSH    A
        PUSH    B
        PUSH    PSW
        PUSH    DPH
        PUSH    DPL
        PUSH    00H
        PUSH    01H
        PUSH    02H
        PUSH    03H
        PUSH    04H
        PUSH    05H
        PUSH    06H
        PUSH    07H
        JNB     RI,ISREND
        MOV     A,SBUF          ;READ 1 BYTE
        MOV     P1,A            ;OUTPUT TO P1 PORT
        PUSH    A
        MOV     DPTR,#BUF_CNT
        MOVX    A,@DPTR         ;GET BUFFER CNT
        MOV     DPTR,#BUFFER
        ADD     A,DPL           ;A=A+DPL
        MOV     DPL,A           ;DPL=A
        POP     A
        MOVX    @DPTR,A         ;(DPTR)=SBUF
        CJNE    A,#CR,NO_TERM
        LCALL   SYNTAX
        MOV     DPTR,#BUF_CNT
        MOV     A,#00H
        MOVX    @DPTR,A         ;CLEAR BUFFER
        SJMP    ISREND
NO_TERM MOV     DPTR,#BUF_CNT
        MOVX    A,@DPTR         ;GET BUFFER CNT
        INC     A
        MOVX    @DPTR,A         ;SAVE BUFFER CNT
ISREND  CLR     RI
        CLR     TI
        POP     07H
        POP     06H
        POP     05H
        POP     04H
        POP     03H
        POP     02H
        POP     01H
        POP     00H
        POP     DPL
        POP     DPH
        POP     PSW
        POP     B
        POP     A
        SETB    EA
        RETI
;
CLR_BUF MOV     R0,#BUFFER+10H
CLR_NXT MOV     A,#00H
        MOV     @R0,A
        DJNZ    R0,CLR_NXT
        MOV     R0,#BUF_CNT
        MOV     A,#00H
        MOVX    @R0,A           ;CLEAR BUFFER COUNT
        RET
;
INIT_SIO
        MOV     TMOD,#00100000B
        MOV     TH1,#FDH        ;BAUD RATE=9600b/s
        SETB    TR1             ;START TIMER 1
        MOV     SCON,#01010000B ;T/R,1 START BIT,8 DATA BIT,1 STOP BIT
        LCALL   INIT_PIO
        RET
;
SIO_DELAY
        MOV     R0,#00H
        DJNZ    R0,$
        RET
;
DELAY   MOV     R0,#00H         ;WAIT A WHILE
        MOV     R1,#00H
DLY1    DJNZ    R0,$
        DJNZ    R1,DLY1
        RET

⌨️ 快捷键说明

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