📄 uart.asm
字号:
;串口通信测试
;晶振6.0MHz,通信波特率7500,采用T2作为串行口波特率发生器
;文件名:UART.ASM
;于2006年9月22日至2006年9月24日编程 作者:唐元广
;
;主程序段
ORG 0000H
LJMP MAIN ;转主程序段
ORG 0023H
LJMP COMINT ;转串行口中断服务程序
ORG 0040H
MAIN: MOV SP,#80H ;堆栈空间128个字节
MOV A,#0FFH
MOV P0,A
MOV P3,A
MOV P2,A
MOV TMOD,#11H ;T0,T1为方式1(16位)
CLR A
MOV PSW,A ;通用寄存器R0-R7选择0区
;面板指示灯及磁场量程的初使化程序段
MAINLB1:MOV IP,#10H ;设定,PS为高优先级(鄢定明书P107)
MOV PCON,#00H
MOV SCON,#070H ;选择串行口方式1
MOV T2CON,#34H ;发送和接收波特率
MOV TH2,#0FFH ;设定时初值(波特率为:7500)
MOV TL2,#0E7H
MOV RCAP2H,#0FFH
MOV RCAP2L,#0E7H
CLR TR0 ;禁止定时器0工作
CLR ET0 ;禁止定时器0中断
MOV 30H,#80H ;串行口接收数据缓冲区首单元置空
CLR ET1 ;禁止定时器1中断
SETB EA ;允许CPU中断
;主循环程序段
MAINLOP:SETB ES ;允许串行口中断
MOV A,30H ;接收的控制数据送A
CLR C
PUSH A
SUBB A,#0BH
POP A
JNC MAINLOP ;为空转回
CLR ES ;禁止串行口中断
MOV B,#03H ;通讯功能程序入口地址表间隔
MUL AB
MOV 30H,#80H ;接收数据缓冲区置空
MOV DPTR,#KPRG1 ;指向通讯功能程序入口地址表首址
JMP @A+DPTR ;键功能程序散转
;通讯功能程序入口地址表
KPRG1: LJMP MAGNCHG ;转微机改变磁场量程转换程序段
MAGNCHG:MOV A,#01H
LCALL TXDSUB
MOV A,#80H
LCALL TXDSUB
MOV A,#20H
LCALL TXDSUB
MOV A,#30H
LCALL TXDSUB
MOV A,#0DH ;给微机发送回车符
LCALL TXDSUB
LJMP MAINLOP
;串行口中断服务程序段
;接收数据说明:一接收到0DH则中断返回
;出口参数:接收的数据在缓冲区30H~37H中
COMINT: CLR ES ;关串行口中断
JNB RI,COMINT0 ;不是接收数据中断标志转
CLR RI
PUSH 00H ;R0入栈
PUSH A
PUSH B
PUSH PSW
MOV A,SBUF
MOV 30H,A ;接收的控制数据送30H单元
MOV R0,#31H ;指向接收数据缓冲区首址
COMINT1:LCALL RXDSUB ;调用接收一字节子程序
MOV @R0,A
INC R0
CLR C
SUBB A,#0DH
JNZ COMINT1 ;没有接收到0DH则继续接收
POP PSW
POP B
POP A
POP 00H
COMINT0:CLR TI
SETB ES ;允许串行口中断
RETI
;接收一字节子程序
;出口参数:接收到的ASCII码在A中
RXDSUB: PUSH DPL
PUSH DPH
PUSH B
MOV B,#0AH
RXDLOP4:MOV DPH,#0FFH
RXDLOP3:MOV DPL,#0FFH
RXDLOP2:JNB RI,RXDLOP0 ;等待接收标志置位
SJMP RXDLOP1
RXDLOP0:DJNZ DPL,RXDLOP2
DJNZ DPH,RXDLOP3
DJNZ B,RXDLOP4 ;等待2.6S后未接收到则退出
MOV A,#0DH
SJMP RXDLOP5
RXDLOP1:CLR RI
MOV A,SBUF
RXDLOP5:POP B
POP DPH
POP DPL
RET
;发送一字节子程序段
;入口参数:要发送的数据送A中
TXDSUB: MOV SBUF,A
TDWAIT0:JNB TI,TDWAIT0
CLR TI
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -