找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2517|回复: 10
打印 上一主题 下一主题
收起左侧

关于单片机外部中断的问题

[复制链接]
跳转到指定楼层
楼主
ID:220896 发表于 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;
}



评分

参与人数 1黑币 +1 收起 理由
gudu + 1 淡定

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:192117 发表于 2017-7-19 22:53 | 只看该作者
中断触发引脚和地断开了吧,要是没有一直处在中断中
回复

使用道具 举报

板凳
ID:164602 发表于 2017-7-20 08:41 | 只看该作者
你的理解不对啊。
第一:我不知道你的外部中断是什么触发的,如果是按键触发,就要消抖,从你的程序中没有看到。
第二:标志位置1,是在中断中。而其它的语句执行,就已经跳出了中断,不在中断中了。
回复

使用道具 举报

地板
ID:220770 发表于 2017-7-20 09:19 | 只看该作者
没有看到外部中断设置, 估计是处在电平中断模式, 设置成下降沿中断就不会有这个问题了
回复

使用道具 举报

5#
ID:220355 发表于 2017-7-20 11:21 | 只看该作者
中断处理函数写在中断函数里面,触发方式设置为下降沿触发
回复

使用道具 举报

6#
ID:220896 发表于 2017-7-20 12:50 | 只看该作者
HC6800-ES-V2.0 发表于 2017-7-20 08:41
你的理解不对啊。
第一:我不知道你的外部中断是什么触发的,如果是按键触发,就要消抖,从你的程序中没有 ...

你好:1.我的中断的触发是将P3.2接到GND上的,在此之前设置的是IT0=0低电平触发
        2.我理解是在此之前定义的标志位为0,中断触发之后标志位为1,然后去执行标志位里面的程序,在执行程序之后,对标志位清零,结束本次中断
回复

使用道具 举报

7#
ID:220896 发表于 2017-7-20 12:53 | 只看该作者
qwe123!@# 发表于 2017-7-19 22:53
中断触发引脚和地断开了吧,要是没有一直处在中断中

你好:我将P3.2接到GND上,一直接着,和接上就就断开的结果都一样,出发之后一直处于工作状态
回复

使用道具 举报

8#
ID:220896 发表于 2017-7-20 12:54 | 只看该作者
djx0 发表于 2017-7-20 09:19
没有看到外部中断设置, 估计是处在电平中断模式, 设置成下降沿中断就不会有这个问题了

你好:我设置的外部中断的触发方式为:IT0=0;低电平触发,这样错了吗?
回复

使用道具 举报

9#
ID:220896 发表于 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);
                }
}
还是出现了同样的问题
回复

使用道具 举报

10#
ID:164602 发表于 2017-7-20 13:26 | 只看该作者
水划过 发表于 2017-7-20 12:50
你好:1.我的中断的触发是将P3.2接到GND上的,在此之前设置的是IT0=0低电平触发
        2.我理解是在此 ...

P3.2接在GND上?天啊,那么永远都在触发中断,只要一出中断服务程序,就会再次发生中断,停不下来。
原来是你的硬件有问题,不是软件问题。
回复

使用道具 举报

11#
ID:220896 发表于 2017-7-20 16:12 | 只看该作者
HC6800-ES-V2.0 发表于 2017-7-20 13:26
P3.2接在GND上?天啊,那么永远都在触发中断,只要一出中断服务程序,就会再次发生中断,停不下来。
原 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表