登录|立即注册|使用QQ帐号登录
论坛 > 24小时必答区
发帖|
看2935|回5|收藏
楼主 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);
          }
}

最佳答案

Y_G_G 查看完整内容

1,不要在中断函数里面更改中断选项,也不要在中断0的中断函数关闭中断1,这样你按一了下中断0之后,两个中断就都关闭了 2,退出中断之前,最好先清除中断标志位.就是IE0和IE1
沙发 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黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版