微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机串口通信中断的问题

51单片机串口通信中断的问题

时间:10-02 整理:3721RD 点击:
程序在下面。利用上位机发送数据给51,然后51把数据返回给上位机。但现在有一个问题,就是当上位机没有发数据给51的时候,为什么一直进入中断服务程序呢?上位机一打开,就会持续的接收数据,只有把if(flag==1)中加入ES=0,ES=1,while(TI==0).程序才可以正常运行。
疑问:为什么串口中断服务程序会一直响应?

#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应该没关系?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top