51单片机串口通信中断的问题
疑问:为什么串口中断服务程序会一直响应?
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(int z);
char a,flag;
void main()
{
EA=1;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
ET1=0;
TR1=1;
ES=1;
REN=1;
SM0=0;
SM1=1;
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=a;
while(TI==0);
TI=0;
ES=1;
}
}
}
void ser_interrupt()interrupt 4
{
RI=0;
P1=SBUF; //P1口接的发光二极管,以此查看接收到的数据
a=SBUF;
flag=1;
}
当flag==1后,先将ES清0,原因是接下来要发送数据,若不关闭串口中断,当发送完数据后,单片机同样会申请串口中断,便再次进入中断服务程序,flag又被置1,如此重复下去,程序成了死循环...
谢谢 大神解答啊
谢谢您的回复,我还是有疑问,没有完全明白。
问题1:
在ES=0,关闭串口中断的情况下,我们也可以接收串口数据,可以利用查询RI的方式来处理接收到的数据,例如:
if(RI==1)
{
P1=SBUF; //用二极管显示接收到的数据
}
为什么中断关闭了,还能接收数据?在中断关闭的情况下,为什么不可以发送数据?
if(flag==1)
{
ES=0;
flag=0;
SBUF=a;
while(TI==0);
TI=0;
ES=1;
}
这段代码:SBUF=a表示数据送到发送缓冲器中,当ES=1的时候,缓冲器的数据会自动发送出去吗?
a的数据在哪里的时候,TI=1,如果数据a从SBUF发送出去后,才会置1,那上面这个程序就有一个问题,因为ES=0,数据是发送不出去的。难道这表明,数据存在于SBUF中,TI就可以置1吗?
不好意思,疑问有点多
ES=1时缓冲器的数据不会自动发出去,只有单片机接收数据触发中断时才会发送。
flag==1时已经触发了中断,只有当串行发送第8位数据结束时,才由单片机内部硬件使TI=1,while(TI!==0)的目的是检测TI是否为1,即串行发送停止位。
串口通信我理解的也不是很透彻。
我又调试了一下程序,这次有意思了。
#include<reg52.h>
char a;
void main()
{
EA=1;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
ET1=0;
TR1=1;
ES=0;//stop the serial interrupt
REN=1;
SM0=0;
SM1=1;
while(1)
{
if(RI==1)
{
RI=0;
a=SBUF;
P1=a;
SBUF=a;
}
else if(TI==1)
TI=0;
}
}
我把串口中断ES=0了,中断都被关闭了。我还是可以发送和接收数据。所以我认为,ES只是作用于“中断服务程序,也就是 void Serial_interrupt_function() interrupt 4 ”只有在void Serial_interrupt_function() interrupt 4,ES才有绝对控制权。
中断的目的是获得CPU的响应。既然我们可以不用中断就可以获得CPU的响应,那用中断的意义就没了,就像上面的程序一样,while(1)可以一直占用CPU,CPU就可以直接处理While(1)中的代码指令。CPU直接响应发送和接收数据了。
串行通信有TXD和RXD,这两根线是物理连接P3.0和P3.1口的。所以物理上是通路。只要REN=1,就允许接收和发送。
ES是用于获得CPU响应的,串行通信的硬件电路和ES应该没关系?