找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15w408as单片机开机进入停机模式,设置两个外部中断唤醒,为什么外部中断0可以唤醒

[复制链接]
跳转到指定楼层
楼主
ID:921325 发表于 2021-8-1 19:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5黑币
单片机源程序如下:

#include "reg51.h"   
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;

sbit k1=P3^2;
sbit k2=P3^3;         
sbit led1=P1^4;        
sbit led2=P1^3;
bit ledflag1,ledflag2;
void delay(u16 i)
{
        while (i--);
}
void keyscan()
{
    if(k1==0)
        {
            delay(1000);
                if(k1==0)
                {
                    ledflag1=~ledflag1;
                }
                while(!k1);
        }
        if(k2==0)
        {
            delay(1000);
                if(k2==0)
                {
                        ledflag2=~ledflag2;
                }
                while(!k2);
        }
}
void main()
{
        EA=1;
        while(1)
        {
           if(ledflag1==0&&ledflag2==0)
           {
               IT1=1;                                                         //外部中断0触发控制位,IT0=1下降沿触发
           EX1=1;
               IT0=1;                                                         //外部中断0触发控制位,IT0=1下降沿触发
           EX0=1;                                                                 //外部中断0中断允许位                           
           PCON|=0x02;
               _nop_();
               _nop_();
               _nop_();
               _nop_();  
           }
           keyscan();
           if(ledflag1==1)
           {
               led1=0;
           }
           else
           {
               led1=1;
           }
           if(ledflag2==1)
           {
               led2=0;
           }
           else
           {
               led2=1;
           }
        }
}
void Int0()           interrupt 0
{
          IT0=1;                                                         //外部中断0触发控制位,IT0=1下降沿触发
      EX0=0;
          IT1=1;                                                         //外部中断0触发控制位,IT0=1下降沿触发
      EX1=0;
          if(k1 == 0)
          {
                    delay(1000);
                  if(k1==0)
                  {
                            ledflag1=1;
                  }
                  while(!k1);
          }
}
void Int1()           interrupt 2
{
          IT0=1;                                                         //外部中断0触发控制位,IT0=1下降沿触发
      EX0=0;
          IT1=1;                                                         //外部中断0触发控制位,IT0=1下降沿触发
      EX1=0;
          if(k2 == 0)
          {
              delay(1000);
                  if(k2==0)
                  {
                            ledflag2=1;
                  }
                  while(!k2);
          }
}

最佳答案

查看完整内容

1,不要在中断函数里面更改中断选项,也不要在中断0的中断函数关闭中断1,这样你按一了下中断0之后,两个中断就都关闭了 2,退出中断之前,最好先清除中断标志位.就是IE0和IE1
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2021-8-1 19:59 | 只看该作者
1,不要在中断函数里面更改中断选项,也不要在中断0的中断函数关闭中断1,这样你按一了下中断0之后,两个中断就都关闭了
2,退出中断之前,最好先清除中断标志位.就是IE0和IE1
回复

使用道具 举报

板凳
ID:584814 发表于 2021-8-2 08:45 | 只看该作者
为什么外部中断0可以唤醒可以向厂家索要底层电路图或代码,一般观众只依照说明书用。
另外,中断里面应慎用延时
回复

使用道具 举报

地板
ID:921325 发表于 2021-8-2 09:51 | 只看该作者
man1234567 发表于 2021-8-2 08:45
为什么外部中断0可以唤醒可以向厂家索要底层电路图或代码,一般观众只依照说明书用。
另外,中断里面应慎 ...

怪我的问题没说清楚,我的问题是为什么外部中断0可以唤醒,而外部中断1不行
回复

使用道具 举报

5#
ID:451718 发表于 2021-8-2 14:55 | 只看该作者
中断0的优先级应该是高于中断1的。你进入中断0后,不是关掉中断了么? 如何再进中断1?
回复

使用道具 举报

6#
ID:921325 发表于 2021-8-2 20:52 | 只看该作者
Y_G_G 发表于 2021-8-2 14:36
1,不要在中断函数里面更改中断选项,也不要在中断0的中断函数关闭中断1,这样你按一了下中断0之后,两个中断就 ...

按照您的建议改了一下,目前可以了,谢谢!!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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