问题是外部中断触发以后就永远定格了,不是理想的3s。 外部中断0和定时器1的实现不太清楚该怎么写;各位前辈不吝赐教!
/*
STC89C52单片机用定时器0点亮流水灯1s右移一位,外部中断0触发以后,流水灯1用定时器暂停3s
*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
uchar count_t0 = 20; //定时器0中断20次是1s
uchar count_int0 = 60; //3s
void init()
{
TMOD = 0x11;
EA = 1; //允许总中断
EX0 = 1;
IT0 = 0; //下跳沿触发
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
ET0 = 1; //允许定时器0中断
ET1 = 1; //允许定时器1
TR0 = 1; //开定时器0
}
void main()
{
init();
P2 = 0x7f;
while(1);
}
void Int0() interrupt 0
{
EX0 = 0; //关外部中断
TR0 = 0; //关定时器0
TR1 = 1; //开定时器1
TH1 = (65536 - 50000)/256;
TL1 = (65536 - 50000)%256;
while(count_int0 > 0);
{
if((TH1==0)&&(TL1==0))
{
count_int0--;
}
}
count_int0 = 60;
EX0 = 1;
TR0 = 1;
TR1 = 0;
}
void Time0() interrupt 1
{
count_t0--;
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
if(count_t0 <= 0)
{
P2 = _cror_(P2,1);
count_t0 = 20;
}
}
void Time1() interrupt 3
{
TH1 = (65536 - 50000)/256;
TL1 = (65536 - 50000)%256;
}
------解决方案--------------------
只用一个定时器就可以了啊。
进入定时器后关中断、装初值、count_t0++ 加到60后清零、循环移位。。。
------解决方案--------------------
定时器中断可以的啊
------解决方案--------------------
外部中断函数有一句代码
while(count_int0 > 0);
错了,把分号去掉,不然就死循环了。
还有在中断里面做延时本身是不对的,建议用标志位
------解决方案--------------------
/*
STC89C52单片机用定时器0点亮流水灯1s右移一位,外部中断0触发以后,流水灯1用定时器暂停3s
*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
uchar count_t0 = 20; //定时器0中断20次是1s
uchar count_int0 = 60; //3s
void init()
{
TMOD = 0x11;
EA = 1; //允许总中断
EX0 = 1;
IT0 = 0; //下跳沿触发
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
ET0 = 1; //允许定时器0中断
ET1 = 1; //允许定时器1
TR0 = 1; //开定时器0
}
void main()
{
init();
P1 = 0x7f;
while(1);
}
void Int0() interrupt 0
{
EX0 = 0; //关外部中断
TR0 = 0; //关定时器0
TR1 = 1; //开定时器1
TH1 = (65536 - 50000)/256;
TL1 = (65536 - 50000)%256;
}
void Time0() interrupt 1
{
count_t0--;
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
if(count_t0 <= 0)
{
P1 = _cror_(P1,1);
count_t0 = 20;
}
}
void Time1() interrupt 3
{
TH1 = (65536 - 50000)/256;
TL1 = (65536 - 50000)%256;
count_int0--;
if(count_int0==0)
{
EX0 = 1;
TR0 = 1;
TR1 = 0;
}
}
改成这样就行了,要把关闭外部中断和关闭第二个定时器,放在第二个定时器中,因为你进入外部中断后,就会一直在第二个定时器中,所以只能在定时器中关闭才有效。 还想说一句,你没必要用那么多的定时器,算法也不简便,单片机的资源有限,再用时应该节约使用呀!
------解决方案--------------------
我提个思路,没搞过51,所以没有程序
1 只用一个定时器
2 装定计数1S,归零时流水
3 外部中断只设置一个标志位即退出
4 计数归零时,如检查到标志位,则不流水且重新装定2S计数,同时清标志
如果外部中断持续发生,灯会停住,如果这是问题,那么还要再加一个标志位来处理
------解决方案--------------------