• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

請教一個串口中斷程序

初學單片机,请教一下这两个串口收发程序那里出了问题,两机通讯不能收发.
中断发送程序:
ORG 00H
AJMP START
ORG 0023H
AJMP SER
ORG 30H
START:
MOV SP,#5FH ;设置堆栈
MOV TMOD,#20H ;T1工作模式2
MOV PCON,#80H ;SMOD=1,双倍波波特率
MOV TH1,#0FDH ;设波特率为19200
MOV TL1,#0FDH
MOV SCON,#50H ;设定串口方式2,REN=1,允许接收
MOV R0,#0AAH ;设定缓冲数据
SETB TR1 ;开T1定时器
SETB EA ;开总允许中断
SETB ES ;开串行中断
SJMP $ ;等待中断

SER: ;中断发送程序
MOV A,R0
MOV SBUF,A ;发送数据
CLR TI
CPL A
MOV R0,A
CALL DELAY
RETI

DELAY: ;延時子程序
MOV R7,#0FFH
DJNZ R7,$
RET
END
===========================================================
中断接收程序:

ORG 00H
AJMP START
ORG 23H
AJMP SER
ORG 30H
START:
MOV SP,#5FH ;设置堆栈
MOV TMOD,#20H ;T1工作模式2
MOV PCON,#80H ;SMOD=1,双倍波特率
MOV TH1,#0FDH ;设置波特率为19200
MOV TL1,#0FDH
MOV SCON,#50H ;设定串口方式2,REN=1,允许接收
SETB TR1 ;开T1定时器
SETB EA ;开总允许中断
SETB ES ;开串行中断
SJMP $

SER: ;中断接收程序
MOV A,SBUF ;取数据,并输出P1口
MOV P1,A
CLR RI ;清RI标志位
CALL DELAY
RETI

DELAY: ;延時子程序
MOV R7,#0FFH
DJNZ R7,$
RET
END
全部回复(6)
正序查看
倒序查看
ppeter
LV.2
2
2009-11-04 08:12
您好! 建议你用串口助手来调试 这样很容易发现是发送还是接收的问题 预祝你成功!
0
回复
2009-11-04 15:59
楼上的!你的程序结构都有问题.
不是个完整的程序.你试着捋一下,看程序怎么走.
没发送哪来的中断?你无故关TI标记干嘛?
还有程序你暂停它干嘛?
0
回复
ppeter
LV.2
4
2009-11-04 23:45
@初哥菜鸟
楼上的!你的程序结构都有问题.不是个完整的程序.你试着捋一下,看程序怎么走.没发送哪来的中断?你无故关TI标记干嘛?还有程序你暂停它干嘛?
SER: ;中断发送程序
MOV A,R0
MOV SBUF,A ;发送数据
JNB TI,$ ;<-------( 这里加上这语句 行吗? )
CLR TI
CPL A
MOV R0,A
CALL DELAY
RETI

请指教 谢谢!
0
回复
2009-11-05 00:49
@ppeter
SER:;中断发送程序MOVA,R0MOVSBUF,A;发送数据JNBTI,$;
用$ 这干吗?做软件没人用这玩意的.
上电——初始化串口——主程序入口——调用发送——处理接受数据——其它要处理的程序——返回主程序入口(循环).

串口中断——将接受数据放入待处理内存缓冲里.
0
回复
2009-11-10 10:51
看你的程序你只发一个字节的数据???R0=#0AAH,你这里定义的是数据暂存地址,还是数据的值???如果是地址,那么你在发送的时候,是不是要MOV A, @R0;然后发送完以后地址加1???
0
回复
2009-11-10 10:54
你把TI关了,中断返回是回到中断保护现场保存的PC那里的,SJMP $,这里是你返回的地方,TI就不会再被打开了~~~
0
回复