📄 serial_80c552.asm
字号:
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP SERVE ;串行口中断服务程序入口
ORG 500H
MAIN: MOV TMOD,#20H ;定时器T1为方式2
MOV TL1,#0FDH
MOV TH1,#0FDH ;波特率为9600
SETB TR1 ;启动T1
MOV S0CON,#50H ;串行口工作在方式1 ,并启动接收
SETB EA ;开CPU总中断
WAIT: SETB ES0 ;开串口中断
NOP
NOP
CLR P1.0
SETB P1.0
LCALL DELAY1
CLR P1.0
CLR P1.1
SETB P1.1
LCALL DELAY1
CLR P1.1
NOP
NOP
AJMP WAIT ;等待中断
GO: NOP
AJMP GO
;******串口中断服务程序
SERVE:CLR ES0 ;关串口中断
PUSH ACC
PUSH DPH
PUSH DPL
MOV R1,#58H ;接收字符存放始址
MOV R7,#02H ;接收字符的字节数
RXD: JNB RI,RXD ;等待接收字符
CLR RI
MOV A,S0BUF
; MOV R2,ACC.7 ;将偶校验位送至60H保存
; MOV 60H,R2
; ANL A,#7FH ;去偶校验位
MOV @R1, A
; MOV R3,P ;取奇偶标志送至61H保存
; MOV B,R3
; ANL 60H,#01H ;屏蔽他们的高7位
; ANL B,#01H
; MOV A,60H
; XRL A,B
; JNZ ERR1 ;偶校验正确否?
INC R1
DJNZ R7,RXD
;AJMP $
;----判断接收的指令
PD: MOV R1,#58H ;接收字符存放始址
MOV R2,#02H ;字节数
LOOP: CJNE @R1,#2FH,PD1
INC R1
DJNZ R2,LOOP
AJMP PD2
PD1: MOV TMOD,#20H
MOV TL1,#0FDH
MOV TH1,#0FDH
MOV S0CON,#40H
MOV R0,#48H ;发送字符的始址
MOV R7,#02H ;发送字符的字节数
MOV 48H, #33H
MOV 49H, #44H
SETB TR1
AJMP TXD
PD2: MOV TMOD,#20H
MOV TL1,#0FDH
MOV TH1,#0FDH
MOV S0CON,#40H
MOV R0,#48H ;发送字符的始址
MOV R7,#02H ;发送字符的字节数
MOV 48H, #55H
MOV 49H, #66H
SETB TR1
TXD:MOV A,@R0
MOV S0BUF,A
WAIT1:JNB TI,WAIT1
CLR TI
INC R0
DJNZ R7,TXD
POP DPL
POP DPH
POP ACC
MOV S0CON,#50H
SETB ES0
RETI
DELAY1: MOV R1,#0AH
DEL11: MOV R2,#0FFH
DEL12: MOV R3,#080H
DEL13: DJNZ R3,DEL13 ; 1+[1+(1+2*255+ 2)*255+2]*10+2=0.66S
DJNZ R2,DEL12
DJNZ R1,DEL11
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -