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

📄 ch13_s10.asm

📁 51单片机基础篇 对于有一定基础的人看看 包含书中所以的源代码
💻 ASM
字号:
;PROGRAM NAME S10.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     A,BUF_CNT
        MOV     R7,A            ;R7=BUF_CNT-1
        MOV     R5,#00H
CMD1_NXT:
        MOV     A,#BUFFER
        ADD     A,R5
        MOV     R0,A
        MOV     A,@R0           ;GET RECEIVE BYTE
        PUSH    A
        MOV     DPTR,#CMD1
        LCALL   GETCODE         ;CODE IN B
        POP     A
        CJNE    A,B,NO_CMD1
        INC     R5
        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     A,BUF_CNT
        MOV     R7,A            ;R7=BUF_CNT
        MOV     R5,#00H
CMD2_NXT:
        MOV     A,#BUFFER
        ADD     A,R5
        MOV     R0,A            ;BUFFER+BUF_CNT
        MOV     A,@R0           ;GET RECEIVE BYTE
        PUSH    A
        MOV     DPTR,#CMD2
        LCALL   GETCODE         ;CODE IN B
        POP     A
        CJNE    A,B,NO_CMD2
        INC     R5
        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     A,BUF_CNT
        MOV     R7,A            ;R7=BUF_CNT
        MOV     R5,#00H
CMD3_NXT:
        MOV     A,#BUFFER
        ADD     A,R5
        MOV     R0,A            ;BUFFER+BUF_CNT
        MOV     A,@R0           ;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 CLR     A
        MOVC    A,@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
        MOVC    A,@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
        PUSH    A
        MOV     A,BUF_CNT       ;GET BUFFER CNT
        MOV     R0,#BUFFER
        ADD     A,R0            ;A=A+R0
        MOV     R0,A            ;R0=A
        POP     A
        MOV     @R0,A           ;(BUFFER+BUF_CNT)=SBUF
        CJNE    A,#CR,NO_TERM
        LCALL   SYNTAX
        MOV     BUF_CNT,#00H    ;CLEAR BUFFER
        SJMP    ISREND
NO_TERM INC     BUF_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
        MOV     @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
        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 + -