📄 com.asm
字号:
;----------------------------------
; 单片机与PC通信实例
;功能:从PC机串口端接收13个字节的数据,然后将接收到的数据加上
; "Serial Port OK!"的后缀后,发送给PC作为应答
;-----------------------------------
ORG 0000H
JMP START ; 程序开始
ORG 0023H
JMP Serial_RX_ISR ; 串口中断向量
START:
MOV SP,#60H ; 将堆栈位置设为60H
CALL Init ; 进行串口及相关寄存器的初始化
MOV 2FH,#30H ; 将收发缓存区的首地址写入20h
MOV R1,#3DH
MOV @R1,#53H ; 'S'的ASCII码写入发送缓存的对应空间(下同)
INC R1
MOV @R1,#65H ; 'e'
INC R1
MOV @R1,#72H ; 'r'
INC R1
MOV @R1,#69H ; 'i'
INC R1
MOV @R1,#61H ; 'a'
INC R1
MOV @R1,#6CH ; 'l'
INC R1
MOV @R1,#20 ; 空格的ASCII码
INC R1
MOV @R1,#50H ; 'P'
INC R1
MOV @R1,#6FH ; 'o'
INC R1
MOV @R1,#72H ; 'r'
INC R1
MOV @R1,#74H ; 't'
INC R1
MOV @R1,#20H ; 空格的ASCII码
INC R1
MOV @R1,#4FH ; 'O'
INC R1
MOV @R1,#4BH ; 'K'
INC R1
MOV @R1,#21H ; '!'
NOP
NOP
NOP
MainLoop:
;-----------------------
; 主循环:查询接收是否完成,并进行发送
;-----------------------
MOV A,2FH ; 读入当前的缓存地址
CJNE A,#3DH,MainLoop ; 当前缓存地址为3DH说明串口已完成13个字节数据的接收
MOV R3,#0FFH
Delay:
DJNZ R3,Delay ; 延时
CALL Serial_TX ; 调用串口发送函数
MOV 2FH,#30H ; 将缓存地址重新设为初始地址,准备下一个循环的接收
JMP MainLoop
Init:
;---------------------------------
; 程序初始化,包括串口、定时器T1、中断的初始化
;---------------------------------
MOV SCON,#10010000B ; 串口控制寄存器初始化
ORL PCON,#10000000B ; 把SMOD位置1
SETB EA ; 中断允许总控制位使能
SETB ES ; 串口中断使能
SETB PS ; 把串口中断设为高优先级
CALL Timer1_Init ; 进行定时器T1的初始化
RET
Timer1_Init:
;-------------------------
; 定时器T1作为串口的波特率发生器
; (2^SMOD)*fosc/32*12*(256-th1)=57600
;-------------------------
MOV TMOD,#00100000B ; 定时器T1工作在方式2
MOV TCON,#01000000B ; 定时器T1使能
MOV TH1,#0FFH ; 设定定时器T1的初始值
RET
Serial_TX:
;-----------------------
; 串口发送,采用查询的方式
;-----------------------
MOV R1,#30H ; 发送数据的缓存区起始位置为30h
MOV R2,#1CH ; 一次发送28字节数据
Serial_TX_LOOP:
MOV A,@R1 ; 将要发送的数据写入A
MOV SBUF,a ; 将一个字节写入串口缓存中
Serial_TX_WAIT:
JNB TI,Serial_TX_WAIT ; 等待该字节数据发送完成
NOP
CLR TI ; 软件清除串口发送中断标志位
INC R1 ; 缓存区地址加1
DJNZ R2,Serial_TX ; 判断是否所有数据均已发送
RET
Serial_RX_ISR:
;-----------------------------------
; 串口接收中断服务程序,需要在程序开始时在2FH处写入缓存区首地址
;-----------------------------------
PUSH PSW ; 程序状态字压栈
PUSH 1 ; R1压栈
MOV C,TI ; 判断是否为接收中断
CLR TI
JC ISR_OUT
MOV R1,2FH ; 缓存区地址存于2FH
MOV @R1,SBUF ; 将接收数据写入缓存区
CLR RI ; 软件清除串口接收中断标志
INC R1
MOV 2FH,R1 ; 缓存区地址加1
ISR_OUT:
POP 1 ; R1 出栈
POP PSW ; 程序状态字出栈
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -