📄 urat control.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 + -