标题: 关于单片机外部中断的问题 [打印本页]

作者: 水划过    时间: 2017-7-19 18:03
标题: 关于单片机外部中断的问题
下面的51单片机程序中,外部中触发后,延时一段时间之后(delayms(50)),让标志位flag=0;这个时候为什么单片机还在处于中断当中呀????
按理来说,标志位为0,此时if(flag==1)的程序应该不执行呀,但是,操作中是在继续执行。
请问各位大神,这是什么原因。
下面为代码:
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit D1 = P1^0;
sbit D2 = P1^1;
sbit FM = P2^3;

uint flag  = 0;
uint count = 0;

void delayms(uint xms)          //延时函数
{
   uint i,j;
     for(i=xms;i--;i>0)
           for(j=110;j--;j>0);
}


void main()
{
/********关闭电磁阀**********/
  D1 = 0;

/********关闭指示灯**********/
  D2 = 1;

/********外部中断触发********/
  EA  = 1;
  EX0 = 1;
  IT0 = 0;// 中断为低电平触发

  while(1)
    {
           if(flag==1)
             {                  
                   D1=1;
                   D2=0;
                   delayms(50);
                   flag=0;           
                 }
        }
}

/********中断函数***********/
void time_0() interrupt 0           //中断函数0
{
  flag = 1;
}




作者: qwe123!@#    时间: 2017-7-19 22:53
中断触发引脚和地断开了吧,要是没有一直处在中断中
作者: HC6800-ES-V2.0    时间: 2017-7-20 08:41
你的理解不对啊。
第一:我不知道你的外部中断是什么触发的,如果是按键触发,就要消抖,从你的程序中没有看到。
第二:标志位置1,是在中断中。而其它的语句执行,就已经跳出了中断,不在中断中了。
作者: djx0    时间: 2017-7-20 09:19
没有看到外部中断设置, 估计是处在电平中断模式, 设置成下降沿中断就不会有这个问题了
作者: wxy2000    时间: 2017-7-20 11:21
中断处理函数写在中断函数里面,触发方式设置为下降沿触发
作者: 水划过    时间: 2017-7-20 12:50
HC6800-ES-V2.0 发表于 2017-7-20 08:41
你的理解不对啊。
第一:我不知道你的外部中断是什么触发的,如果是按键触发,就要消抖,从你的程序中没有 ...

你好:1.我的中断的触发是将P3.2接到GND上的,在此之前设置的是IT0=0低电平触发
        2.我理解是在此之前定义的标志位为0,中断触发之后标志位为1,然后去执行标志位里面的程序,在执行程序之后,对标志位清零,结束本次中断
作者: 水划过    时间: 2017-7-20 12:53
qwe123!@# 发表于 2017-7-19 22:53
中断触发引脚和地断开了吧,要是没有一直处在中断中

你好:我将P3.2接到GND上,一直接着,和接上就就断开的结果都一样,出发之后一直处于工作状态
作者: 水划过    时间: 2017-7-20 12:54
djx0 发表于 2017-7-20 09:19
没有看到外部中断设置, 估计是处在电平中断模式, 设置成下降沿中断就不会有这个问题了

你好:我设置的外部中断的触发方式为:IT0=0;低电平触发,这样错了吗?
作者: 水划过    时间: 2017-7-20 13:03
wxy2000 发表于 2017-7-20 11:21
中断处理函数写在中断函数里面,触发方式设置为下降沿触发

你好:我这样设置之后
IT0=1;
void time_0() interrupt 0           //中断函数0
{
  flag1 = 1;
   if(flag1 == 1)
            {
                  flag1 = 0;
                  D1    = 1;
                  delayms(100);
                  D2    = 0;
                  delayms(100);
                  FM    = 0;
                  delayms(100);
                }
}
还是出现了同样的问题
作者: HC6800-ES-V2.0    时间: 2017-7-20 13:26
水划过 发表于 2017-7-20 12:50
你好:1.我的中断的触发是将P3.2接到GND上的,在此之前设置的是IT0=0低电平触发
        2.我理解是在此 ...

P3.2接在GND上?天啊,那么永远都在触发中断,只要一出中断服务程序,就会再次发生中断,停不下来。
原来是你的硬件有问题,不是软件问题。
作者: 水划过    时间: 2017-7-20 16:12
HC6800-ES-V2.0 发表于 2017-7-20 13:26
P3.2接在GND上?天啊,那么永远都在触发中断,只要一出中断服务程序,就会再次发生中断,停不下来。
原 ...

你好:听了你的建议,问题已经解决了。但是产生了一个问题,对于P3.2端口外部中断触发是不是都是一直处于中断中?有没有好的解决办法?望指教。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1