📄 main.asm
字号:
;*************************************************************************
; main.c
; 串行口通信方式1例程
;*************************************************************************
;*************************************************************************
;定义全局变量
;*************************************************************************
SIZE EQU 40 ;定义接收缓冲区大小
UartBuf DATA 0x30 ;定时接收缓冲区
BufP1 DATA 0x30+SIZE ;定义接收缓冲区下标变量
BufP2 DATA 0x30+SIZE+1
_TI_ BIT 0x20.0 ;定义发送辅助标志
;*************************************************************************
;复位入口
;*************************************************************************
ORG 0x0000
LJMP PreMain
;*************************************************************************
;串行口中断入口
;*************************************************************************
ORG 0x0023
LJMP UartINTSVC
;*************************************************************************
;进入主程序之前的初始化
;*************************************************************************
PreMain:
MOV SP, #(0x2F+SIZE+2) ;设置堆栈起始位置
LJMP main
;*************************************************************************
;函数:void UartInit()
;功能:串行口初始化
;*************************************************************************
UartInit:
PUSH 0x02
CLR EA
CLR A
MOV BufP1, A
MOV BufP2, A
MOV R2, A
MOV R0, #UartBuf
UartInit_for:
MOV @R0, A
INC R0
INC R2
CJNE R2, #SIZE, UartInit_for
CLR TR1
SETB RXD
SETB TXD
SETB _TI_
MOV SCON, #0x50 ;串行口方式1(8位Uart),允许接收
ORL PCON, #0x80 ;波特率加倍
ANL TMOD, #0x0F
ORL TMOD, #0x20 ;设置T1为8位自动重装定时器
MOV A, #0xFA
MOV TH1, A
MOV TL1, A ;设置波特率为9600
SETB TR1 ;启动定时器T1
SETB ES ;使能串行口中断
SETB EA
POP 0x02
RET
;*************************************************************************
;函数:void UartINTSVC() interrupt 4
;功能:串行口中断服务函数
;*************************************************************************
UartINTSVC:
;保护寄存器
PUSH ACC
PUSH PSW
PUSH 0x00
PUSH 0x02
;处理接收中断
JNB RI, UartINTSVC_TI
MOV R2, SBUF
CLR RI
MOV A, #UartBuf
ADD A, BufP1
INC BufP1
MOV R0, A
MOV A, R2
MOV @R0, A
MOV A, BufP1
CLR C
SUBB A, #SIZE
JC UartINTSVC_TI
MOV BufP1, #0
;处理发送中断
UartINTSVC_TI:
JNB TI, UartINTSVC_end
CLR TI
SETB _TI_
;恢复寄存器
UartINTSVC_end:
POP 0x02
POP 0x00
POP PSW
POP ACC
;中断返回
RETI
;*************************************************************************
;函数:void UartSendChar(unsigned char c)
;功能:通过串行口发送单个字节
;参数:
; c:被发送的字节数据,取值0x00~0xFF
;*************************************************************************
;c = R7
UartSendChar:
JNB _TI_, $
CLR _TI_
MOV SBUF, R7
RET
;*************************************************************************
;函数:void main()
;功能:主函数
;*************************************************************************
main:
; UartInit();
LCALL UartInit
; for (;;)
main_for:
; {
; if ( BufP2 != BufP1 )
MOV A, BufP2
XRL A, BufP1
JZ main_endif
; {
; UartSendChar(UartBuf[BufP2++]);
MOV A, #UartBuf
ADD A, BufP2
INC BufP2
MOV R0, A
MOV A, @R0
MOV R7, A
LCALL UartSendChar
; if ( BufP2 >= SIZE )
MOV A, BufP2
CLR C
SUBB A, #SIZE
JC main_endif
; {
; BufP2 = 0;
MOV BufP2, #0
; }
; }
main_endif:
; }
SJMP main_for
;*************************************************************************
;程序结束
;*************************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -