想用51单片机的外部中断0设置单片机的空闲或者掉电模式,同时再用该中断唤醒单片机,请问程序该如何写?

想用51单片机的外部中断0设置单片机的空闲或者掉电模式,同时再用该中断唤醒单片机,请问程序该如何写?写了好几遍没调试出来(触发元件我用的是红外避障,手碰下电平由高变低)

单片机进入空闲模式的方法:
PCON |= (1<<0);
单片机进入掉电模式的方法:
PCON |= (1<<1);
单片机允许外部中断0的程序:
EX0 = 1;
IT0 = 1;//----IT0 = 0也可以,前者是下降沿触发,后者是低电平触发,随便你.
EA = 1;

如果你允许了外部断0中断,那么,即使单片机进入空闲模式,一旺有中断,单片机就可以被唤醒继续执行.

如果你的单片机进入了掉电模式,则单片机不会响应外部中断的,或者说单片机就等于是彻底关机了.
,所以,即使你有外部中断,单片机也醒不了.

因为空闲模式,其实是让单片机的CPU睡着了,而掉电模式,则是让整个单片机睡觉,而外部中断属于单片机的一部分,因此,掉电模式使得整个单片机睡着了,那么外部中断0自然也睡着了,既然睡着了,就不会响应中断.追问

书上说掉电模式唤醒的方法有外部中断和硬件复位,外部中断应该是工作的吧

追答

是这样的,我不知道你具体用的是哪个51单片机,所谓51单片机是指,以51系列的CPU为内核,加上外围设备组成的单片机.
如果你用的是AT89C51,或者SH88F516,这个我可以保证的告诉你,掉电只有硬件复位能唤醒,外部中断是无法唤醒的,因为外部中断也是需要系统的时钟的支持才工作的,掉电模式是把整个系统的时钟全部关闭了,那么,外部中断也不例外.

如果是其他的,我就不一定保证了,但是空闲模式则是任何中断都可以使之退出的.

这样,你可以写个程序验证一下:

追问

由于打字内容太多我截图追问下您

追答

是这样的,我不知道你到底用的是边沿方式还是低电平方式,不过你的程序不太合理,按照我说的方法写一个:

unsigned int count = 0;

void READEx0(void)
{
if((count & 0x01) == 0x01)
{
PCON = 0x01; //----如果你把这句屏掉,只保留 PCON = 0x02,那么 P1^0应该不会变化了
PCON = 0x02; //----如果你把这句屏掉,只保留 PCON = 0x01,那么 P1^0应该会变化
}
}

void EX0(void) interrupt 0
{
count ++;
if(count >= 100) //----这里不一定非得是100,你根据需要自己修改
{
P1_0 = ~P1_0; //----这里不一定非得是 P1^0,最好是个连接了LED的引脚
}

}

你所说的进入不了掉电模式,恐怕不是,恐怕是已经掉电了,你不知道罢了

追问

我用的下降沿中断,我单独写了个掉电模式代码可以运行,我估计是上面的代码里哪里冲突了

追答

哦,那可能STC89C52的外部中断可以唤醒掉电吧,这个我没尝试过,已经许久没有用过51系列的单片机了.

温馨提示:答案为网友推荐,仅供参考