怎么才能让串口发送停下来啊???我是用汇编的
想在发送完数据后,再发送三个固定值
在你的代码里控制MOV SBUF,#XXX
指令的执行个数,那它就停了
呵呵
org 0000h
ajmp start
org 0023h
ljmp serial ;串行口中断入口
org 0030h
start: mov p0,#0
mov p1,#0fh
mov p2,#0
mov p3,#0ffh
mov sp,#70h ;堆栈地址
mov r0,#0feh ;Clear the ram
mov r1,#2
clr a
main_clear0: mov @r1,a
inc r1
djnz r0,main_clear0
setb es ;允许串行口中断
setb ea ;中断总允许
mov tmod,#20h ;T0@mode1&T1@mode2
;mov pcon,#80h ;波特率加倍
mov tl1,#0fdh ;2400bps @ 12MHz
mov th1,#0fdh
mov scon,#50h ;uart mode1
setb tr1 ;Start timer1
;*****************************************************
mov 60h,#4bh
mov 61h,#45h
mov 62h,#59h
mov r4,#3
mov r1,#60h
;*****************************************************
sjmp $ ;循环等待中断
;*****************************************************
;串行通讯程序
;此程序为标准MCS-51系列串行通讯口的处理程序
;此程序为中断服务程序
;*****************************************************
serial:
jb ti,writedata ;判断是哪个中断
jb ri,readdata
reti
writedata: clr ti ;发送中断处理
cjne r2,#0,writedata_0
mov sbuf,@r1
;*****************************************************
inc r1
djnz r4,jump
mov r4,#3
;*****************************************************
jump: reti
writedata_0: mov sbuf,@r0
inc r0
dec r2
reti
readdata: clr ri ;接收中断处理
mov a,serial_state
cjne a,#0,readdata_0
mov r2,sbuf
mov r3,02h ;02h相当于r2,将r2暂时
;存放在r3中
; 书p20 工作寄存器之间
; 不可直接传送指令
mov r0,#data_temp
mov serial_state,#0ffh
reti
readdata_0: mov @r0,sbuf
inc r0
dec r2
cjne r2,#0,readdata_1
mov serial_state,#0
mov r0,#data_temp
mov r2,03h ;03h相当于r3,将
;存放在r3中
;的数值调出来使用
dec r2
mov sbuf,@r0
inc r0
readdata_1: reti
数据发送正常,后面固定值也发送了
就是停不下来~~
最后发送完了TI要置0,接完了RI也要置0,不然会一直中断。
我知道原因了
是在最后一个数据发送完后,中断来了,却没有停下来。
现在我想让发送完最后一个数据后,不执行中断,怎么做啊????????
问题在这里:
你的r4判断停止不了串口中断的,因为你写过sbuf(mov sbuf,@r1) 了,中断会继续发生
writedata: clr ti ;发送中断处理
cjne r2,#0,writedata_0
mov sbuf,@r1
;*****************************************************
inc r1
djnz r4,jump
mov r4,#3
;*****************************************************
你应该改成这样:
writedata: clr ti ;发送中断处理
cjne r2,#0,writedata_0
cjne r4,#0, moredata
reti
;*****************************************************
moredata:
mov sbuf,@r1
inc r1
dec r4
;*****************************************************
writedata_0: mov sbuf,@r0
inc r0
djnz r2,jump
mov r4,#3
jump: reti
你仔细分析下逻辑吧
为什么不能修改呢?少写了一条语句,reti
你应该改成这样:
writedata: clr ti ;发送中断处理
cjne r2,#0,writedata_0
cjne r4,#0, moredata
reti
;*****************************************************
moredata:
mov sbuf,@r1
inc r1
dec r4
reti
;*****************************************************
writedata_0: mov sbuf,@r0
inc r0
djnz r2,jump
mov r4,#3
jump: reti
这一版块,太没人气了,是不是大家都成大侠了
如果成大侠了,也常回家看看嘛,家里太冷清了
据说努力顶帖也是一种美德,但我只想大家常回家看看
毕竟每天都有新手需要帮忙,而我能帮的只能是把帖子顶起来