刚学单片机,在中断这块我总是遇见问题,下面这段程序我想现实的效果是:开机时两端的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()函数
[此贴子已经被作者于2008-11-23 11:02:05编辑过]
|