|
发表于 2021-3-24 20:57:21
|
显示全部楼层
本帖最后由 mov99 于 2021-3-24 21:02 编辑
完整代码,未经验证,仅供参考
MARKCON equ 0x20 ; 自定义标记寄存器
SIGN bit MARKCON.0 ; USART完成发送标记
;--------------------------------------------------------------------
org 0x0 ; 存放代码起地址
ljmp TRANS ; 跳转到主代码
org 0x1B ; 定时器1溢出中断入口
ljmp TINT
org 0x23 ; 串行口中断入口
ljmp SINT
;--------------------------------------------------------------------
; 主代码
org 0x100 ; 存放主代码起地址
TRANS: mov SP,#0x63 ; 堆栈指针(64H起)
call SerialIniti ; 调用初始化子代码
mov IE,#0x90 ; ES=1使能串口中断,EA=1全局中断允许
CHIEFLY: mov R0,#0x30 ; 预发送内容起地址->R0
mov R5,#0x5 ; 共发送5字节
mov SBUF,@R0 ; R0所指单元的内容->SBUF
LOOP: call Dealy50ms ; 其它相关(在此用延时代替)
jbc SIGN,CHIEFLY ; 完成发送?是,清标记并跳转到下一轮发送
ljmp LOOP ; 否,到延时
;--------------------------------------------------------------------
; 服务中断
SINT: push ACC ; 压栈(现场保护)
push PSW
jnb TI,COEMINT ; 串口发送中断?否,到出栈
clr TI ; 是,清标志
djnz R5,UPLOAD ; 计数器减1,已发送5字?否,继续
setb SIGN ; 是,置标记
sjmp COEMINT ; 到出栈
UPLOAD: inc R0 ; 地址指针加1,指向下一单元
mov SBUF,@R0 ; R0所指单元的内容->SBUF
sjmp COEMINT ; 到出栈
;---------------------------------
TINT: push ACC
push PSW
jnb ET1,COEMINT ; 定时器1中断?
clr ET1 ; 是,清标志
; 其它相关
COEMINT: pop PSW ; 出栈(恢复)
pop ACC
reti ; 结束中断,返回断点
;--------------------------------------------------------------------
; 延时50ms
Dealy50ms:
mov R6,#0x61 ; (Fosc=11.0592MHz)
TO_DEL: mov R7,#0xEC
djnz R7,$
djnz R6,TO_DEL
ret
;--------------------------------------------------------------------
; 初始化(含串口)
SerialIniti:
mov SCON,#0x40 ; 串口工作方式1(8位可变USART波特率)
mov PCON,#0x0 ; 波特率不加倍
mov TMOD,#0x20 ; T1为波特率发生器,工作方式2(自动重新装载),T0为16位定时器/计数器
mov TH1,#0xFD ; 波特率9600(Fosc=11.0592MHz)
mov TL1,#0xFD ; 重载寄存器赋值
setb TR1 ; 启动T1
mov 0x30,#0x55 ; 预发送内容 55h.66h.77h.88h.99h
mov 0x31,#0x66
mov 0x32,#0x77
mov 0x33,#0x88
mov 0x34,#0x99
mov MARKCON,#0x0 ; 清标记寄存器
ret
;--------------------------------------------------------------------
end
|
|