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

📄 urat control.asm

📁 本程序使用STC单片机的通用串口程序
💻 ASM
字号:
;--------------------------------------------------------------------------
;
;                         单片机程序
;                           V2.0
;软件说明:
;此软件是V2.0版本2007-8-20
;--------------------------------------------------------------------------
;------------------------变量定义表----------------------------------------

;--------------------------------------------------------------------------
;------------------------寄存器定义----------------------------------------

;--------------------------------------------------------------------------
;------------------------标志位定义----------------------------------------

;---------------------------------------------------------------------------
;------------------------地址常量定义---------------------------------------

;---------------------------------------------------------------------------
;------------------------常量定义-------------------------------------------
;本机使用9600波特率,SMOD=0
BD_RATE    EQU  0FDH                ;9600 BOAD_RATE VALUE 11.0592M
;---------------------------------------------------------------------------
;------------------------信号引脚定义----------------------------------------
DOG       EQU   P3.5
;---------------------------------------------------------------------------
STACK     EQU   50H

;------------------------以下为程序清单-------------------------------------
         ORG 0000H
         AJMP START                      ;主程序
         ORG     0023H
	 LJMP    S_PORT                  ;INTERRUPT OF SERIES PORT

         ORG 0030H                 ;首先对89C51初始化
START:   NOP
         ;MOV  8EH,#02H            ;应用STC89C53RC时,禁止内部扩屏RAM
         MOV  SP,#STACK            ;设堆栈首地址
         MOV     PCON,#00000000B ;SMOD=0
	 MOV     SCON,#11010000B ;不使用奇偶校验位需要修改模式,改为10位
         MOV     TMOD,#00100000B ;0010 0000 (T1 MODE 2_TIME)
         MOV     TCON,#01000000B ;0100 0000 (TR1=1 )
         MOV     TL1,#BD_RATE    ;T1 IS TIMER ,MAKE BARD_RATE
	 MOV     TH1,#BD_RATE
	 MOV     IP,#00010000B   ;0001 0000 (S-PORT HIGH interrupt)
	 MOV     IE,#10010000B   ;1001 0000 (S_PORT ENABLE INT)\\开串口中断不会触发中断服务
         ;关中断也可以发送数据,但不能接收数据
         ;关串口中断TI、RI也可以继续工作,也会硬件置1,但关中断后中断服务程序就不能再执行。
         ;TI、RI置1后会去执行中断服务程序。
         CPL DOG
         MOV 20H,#00H             ;   ;初始化各变量寄存器,清位寻址区
         MOV 21H,#00H              ;
         MOV 22H,#00H              ;
         MOV 23H,#00H              ;
         CPL DOG
         MOV A,#01H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#02H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#03H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#04H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#05H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#06H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#07H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#08H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#09H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#0AH
         LCALL SENDBYTE
LOOP:         CPL DOG
         JMP LOOP
;----------------------------------------------------------------------;
S_PORT: PUSH    DPH
	PUSH    DPL
	PUSH    ACC
	PUSH    B
	PUSH    PSW
	SETB    RS1   ;以免影响主程序中寄存器值
	SETB    RS0
        CPL     DOG
        JBC     TI,EXITSP
	LCALL   SPIN
        JC      EXITSP  ;无校验不要这句
	CJNE    A,#55H,EXITSP
	LCALL   SPIN
        JC      EXITSP
	CJNE    A,#0AAH,EXITSP
	LCALL   SPIN
        JC      EXITSP
	CJNE    A,#0FFH,EXITSP
        LCALL   SPIN
        JC      EXITSP
        LCALL   SENDBYTE
        MOV A,#02H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#03H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#04H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#05H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#06H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#07H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#08H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#09H
         LCALL SENDBYTE
         CPL DOG
         MOV A,#0AH
         LCALL SENDBYTE
        CPL     DOG
EXITSP: NOP
        CLR    RS1   ;以免影响主程序中寄存器值
	CLR    RS0
	POP     PSW
	POP     B
	POP     ACC
	POP     DPL
	POP     DPH
       	RETI
;-----------------------无校验发送-----------------------------------------------;
;SENDBYTE:CLR  ES        ;在中断程序外调用需要先关中断
;        MOV  SBUF,A     ;会触发中断服务
;WAIT:   JBC  TI,OUTS
;        AJMP WAIT
;OUTS:   SETB ES
;        RET
;-----------------------偶校验发送-----------------------------------------------;
;SENDBYTE:CLR  ES        ;在中断程序外调用需要先关中断
;        MOV  C,P
;        MOV  TB8,C
;        MOV  SBUF,A     ;会触发中断服务
;WAIT:   JBC  TI,OUTS
;        AJMP WAIT
;OUTS:   SETB ES
;        RET
;-----------------------奇校验发送-----------------------------------------------;
SENDBYTE:CLR  ES        ;在中断程序外调用需要先关中断
        MOV  C,P
        CPL  C
        MOV  TB8,C
        MOV  SBUF,A      ;会触发中断服务
WAIT:   JBC  TI,OUTS
        AJMP WAIT
OUTS:   SETB ES
        RET
;-----------------------偶校验接收-----------------------------------------------;
;SPIN:   MOV     R6,#80H
;SPIN2:  MOV     R7,#0FFH
;SPIN1:  JB      RI,SPIN0                ;WAITING RECEIVER
;	CLR     C
;	DJNZ    R7,SPIN1
;	DJNZ    R6,SPIN2
;	SETB    C
;	RET
;SPIN0:  MOV     A,SBUF
;	CLR     RI
;	MOV     C,RB8           ;ODD/EVEN TEST
;	JC      SPINTS
;	ORL     C,P
;	RET
;SPINTS: ANL     C,P
;	CPL     C               ;IF C=0,THEN EVEN,CORRECT
;	RET                     ;   c=1, error
;-----------------------奇校验接收-----------------------------------------------;
SPIN:   MOV     R6,#80H
SPIN2:  MOV     R7,#0FFH
SPIN1:  JB      RI,SPIN0                ;WAITING RECEIVER
	CLR     C
	DJNZ    R7,SPIN1
	DJNZ    R6,SPIN2
	SETB    C
	RET
SPIN0:  MOV     A,SBUF
	CLR     RI
	MOV     C,RB8           ;ODD/EVEN TEST
	JC      SPINTS
	ORL     C,P
        CPL     C
        RET
SPINTS: ANL     C,P
        RET                     ;   c=1, error
;-----------------------无校验接收-----------------------------------------------;
;SPIN:   MOV     R6,#80H
;SPIN2:  MOV     R7,#0FFH
;SPIN1:  JB      RI,SPIN0                ;WAITING RECEIVER
;	DJNZ    R7,SPIN1
;	DJNZ    R6,SPIN2
;	RET
;SPIN0:  MOV     A,SBUF
;	CLR     RI
;	RET
;----------------------------------------------------------------------;
                END

⌨️ 快捷键说明

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