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

2019-07-16 02:29发布

这是郭天翔《新概念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发送一次数据,接受区就输出一次,并没有出现死循环....
       哪位高手能告诉我??谢谢




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
1378107154
1楼-- · 2019-07-16 03:32
上电时 flag没有清0, flag里的数据不确定。去掉ES=0,不会进入死循环,但a里的数据就不是电脑发下来的数据了,因为每次TI=1时都会触发中断。如果flag=0;这句摆在前面就会进入死循环。
dongyumin
2楼-- · 2019-07-16 09:12
 精彩回答 2  元偷偷看……
366268726
3楼-- · 2019-07-16 11:38
{:9:}{:9:}{:9:}{:9:}{:9:}{:9:}{:9:}{:9:}{:9:}{:9:}
草木皆兵
4楼-- · 2019-07-16 12:32

我也学习学习
dgxiewei
5楼-- · 2019-07-16 15:38
你往下看到例6.6.1中有解释这问题;
1,将REN=1;
      SM0=0;
      SM1=1;
    改成:SM0=0;
             SM1=1;
             REN=1;
或者
2,不要对SCON寄存器进位操作,而是直接对整个寄存器进行设置,如SCON=0x50;
tancw_f
6楼-- · 2019-07-16 18:29
dgxiewei 发表于 2013-3-4 19:29
你往下看到例6.6.1中有解释这问题;
1,将REN=1;
      SM0=0;

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

一周热门 更多>