刚学单片机,在中断这块我总是遇见问题,下面这段程序我想现实的效果是:开机时两端的LED灯闪烁,当我给单片机一个外部中断的时候,小灯熄灭一段时间后,第二个LED灯和倒数第二个LED灯闪烁,持续2秒(用定时器中断实现)然后所有的灯熄灭。可是当我给单片机一个外部中断后,小灯确实灭了一段时间,可是过了一段时间后并没有出现第二个LED灯和倒数第二个LED灯闪烁持续2秒,然后熄灭的情况,而是返回了开始两端LED灯闪烁的情况!(好像下面代码红色的部分没执行)我都改了N+1遍了都没有出现我想要的情况,都快绝望了!请大家帮帮忙,解决一下。(LED灯接P0口)
#include<reg52.h>
int n,a;
void delaytime(int ms) //控制小灯的闪烁
{
int x,y;
for(x=ms;x>0;x--)
for(y=200;y>0;y--);
}
void forword() //使p0.0和P0.7口闪烁(两端的小灯闪烁)
{
while(1)
{
P0=0x7e;
delaytime(20);
P0=0xff;
delaytime(20);
}
}
void back() //P0.1和P0.6口灯闪烁(第二个灯和倒数第二个灯闪烁)2秒后熄灭
{
TMOD=0x01; //定时器工作在方式1
TH0=(65536-50000)/256; // 50ms定时
TL0=(65536-50000)%256;
ET0=1; //允许定时器中断
TR0=1; //开启定时器
while(1)
{
if(n==40) //判断是否到了两秒(40*50ms),到了 关闭所有灯
{
P0=0xff; // 灯灭
while(1);
}
P0=0xbd; //P0.1和P0.6口灯亮
delaytime(20);
P0=0xff;
delaytime(20);
}
}
void main()
{
a=0;
IT0=1; //外部0中断,跳沿触发方式
EA=1; // 开总中断
EX0=1; //允许外部0中断
if(a!=0) //判断a==1?,不等于则调用back(),使P0.6和P0.2口灯闪烁2秒后灭掉
back();
else
forword(); //否则调用forward(),使p0.0和P0.7口灯闪烁
}
void extinter() interrupt 0 //外部中断0函数
{
a++;
P0=0xff; //所有的灯灭
delaytime(100); // 延时
}
void timer0() interrupt 1 //定时器0中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
n++;
}
起初我以为是因为中断优先级的问题,可是当我把外部中断0改为外部中断1时还是不行。
当我把 back()函数放在外部中断函数里调用的时候,它的确被调用了,但是出现了 P0.1和P0.6口灯一直在闪烁(第二个灯和倒数第二个灯闪烁)的情况,而并没有出现持续两秒后自动熄灭的效果,好像并没有调用定时器中断;当我在forward()中加入
if(a!=0) back();时出现的情况还是跟我提出的问题一样,并没有调用back()函数
真的是太感谢你了!以前我对当中断程序返回后返回的地址不是很了解,通过这次的这个程序我对这个问题相对以前有了更加深刻的理解!
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |