关于中断返回的问题,新手求教

2019-07-15 11:06发布

# include<REG51.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;
//= = = = = = = = = = = =
void DelayMS(uint x) //延时
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
//= = = = = = = = =  = = =
int1() interrupt 2  //K1中断程序
{char k;
for(k=0;k<=2;k++)
    {P0=0x00;   //发光二极管全亮
     DelayMS(150);
     P0=0xFF;  //发光二极管全灭
     DelayMS(150);
   }
}

//= = = = = = = = = = = = = =
void main()
  {
   IT1=0;
   EX1=1;
   EA=1;
   P0=0xfe;
    while(1)
  {DelayMS(150);
     P0=_crol_(P0,1); //P0 的值向左循环移动
     DelayMS(150);
  }  }

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
before929
1楼-- · 2019-07-16 22:57
电路小白123 发表于 2017-4-28 18:42
中断的返回值类型必须为void,中断函数不向主函数返回任何值
你的中断函数没有声明void返回类型,你声明一下试试

void int1() interrupt 2  //K1中断程序
{
  uchar k;
for(k=0;k<=2;k++)
    {P0=0x00;   //发光二极管全亮
     DelayMS(150);
     P0=0xFF;  //发光二极管全灭
     DelayMS(150);
   }
}
         改成这样了,仿真起来还是和原来一样。
人中狼
2楼-- · 2019-07-17 02:42
正常啊,中断要改成边沿触发,你的中断里只闪了灯3次,但你现在是闪了5次,也就是多进了中断,而且中断退出后是灯全灭,而回到主程序后有没有给P0重新赋值,这时候P0就按着全灭的状态循环,就算循环了,灯不亮,你也看不到
before929
3楼-- · 2019-07-17 06:46
人中狼 发表于 2017-4-28 18:52
正常啊,中断要改成边沿触发,你的中断里只闪了灯3次,但你现在是闪了5次,也就是多进了中断,而且中断退出后是灯全灭,而回到主程序后有没有给P0重新赋值,这时候P0就按着全灭的状态循环,就算循环了,灯不亮,你也看不到 ...

我说错了。。不是5次是3次。。你说的应该是有道理的。。可是如果我在下面也加个初值。
void main(void)
  {
   IT1=0;
   EX1=1;
   EA=1;
   P0=0xfe;
    while(1)
  {     P0=0xfe;
    DelayMS(1500);
     P0=_crol_(P0,1); //P0 的值向左循环移动
     DelayMS(1500);
  }
}


就会最初不是8个灯循环走,是2个灯了。虽然中断后能回来了。
before929
4楼-- · 2019-07-17 06:49
 精彩回答 2  元偷偷看……

一周热门 更多>