微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于串口中断的一个问题。求教

关于串口中断的一个问题。求教

时间:10-02 整理:3721RD 点击:
这是郭天翔《新概念51单片机C语言教程》里的一个例子6.5.1,
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar flag,a,i;
uchar code table[]="i get ";
void init()
{
    TMOD=0x20;
        TH1=0xfd;
        TL1=0Xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        ES=1;
}

void main()
{
    init();
        while(1)
        {
            if(flag==1)
                {
                       ES=0;                                 //关闭串口中断
                        for(i=0;i<6;i++)
                        {
                            SBUF=table[i];
                                while(!TI);
                                TI=0;
                        }
                        SBUF=a;
                        while(!TI);
                        TI=0;
                        ES=1;
                        flag=0;
                }
        }
}

void  ser()interrupt 4
{
    RI=0;
          a=SBUF;
          flag=1;
}
       教程里的这个例子下载运行是,为什么在电复位时,在串口调试软件的接受发送缓冲区会自动输出table的“i get  ”?
       如果把if语句里的ES=0去掉,就不会这样。但是教程里说,如果在if语句里不把串口中断关掉,在接下来的发送数据完成后,会触发中断。flag又会值1,再次发送数据,这样会进入死循环。
       可是我去掉ES=0这句后,结果是我给一次SBUF发送一次数据,接受区就输出一次,并没有出现死循环....
       哪位高手能告诉我?谢谢


上电时 flag没有清0, flag里的数据不确定。去掉ES=0,不会进入死循环,但a里的数据就不是电脑发下来的数据了,因为每次TI=1时都会触发中断。如果flag=0;这句摆在前面就会进入死循环。

你还是先看看单片机关于这块的工作原理吧。


我也学习学习

你往下看到例6.6.1中有解释这问题;
1,将REN=1;
      SM0=0;
      SM1=1;
    改成:SM0=0;
             SM1=1;
             REN=1;
或者
2,不要对SCON寄存器进位操作,而是直接对整个寄存器进行设置,如SCON=0x50;

恩,看到后面才知道,他在前面没说到所以我郁闷,虽然很久了,但还是谢谢你呀

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

网站地图

Top