8051中的两个定时器和中断问题



我想让两个定时器同时工作,但它似乎根本不工作

我写了闪烁led的代码
当我使用定时器和中断中的任何一个时,led都会闪烁当我同时使用它们时,led的两个端口都不工作。

有没有什么规则不能同时使用两个中断或定时器
还是我的mcu坏了?

顺便说一句,我正在使用keil uVision5
的AT89S52
编码,并使用WLpro 进行编程

这是我的代码

#include <reg52.h>
sbit LED = P0 ^ 5;
sbit LED2 = P0 ^ 6;
int i = 0;
int y = 0;
int x = 0;
int count = 0;
void blink2()
interrupt 3
{
TH1=0x7d;
TL1=0xec;
y++;
if(y==100) {
if(i==1) {
LED=0;
x=0;
}
else {
LED=1;
x=1;
}
y=0;
}
}
void blink1() 
interrupt 1
{
TH0=0xd8;
TL0=0xf0;
count++;
if(count==100) {
if(i==1) {
LED2=0;
i=0;
}
else {
LED2=1;
i=1;
}
count=0;
}
}
void main() {
TMOD = 0x11;  // timer mode
TH0 = 0xd8;
TL0 = 0xf0;
TH1 = 0x7d;
TL1 = 0xec;
TR0 = 1;
TR1 = 1;
IE = 0x8a;
}

在blink2((中,您测试全局变量i,但从未更改它。

注意:blink1((管理LED2,而blink2((管理LED。也许更一致的命名会有所帮助,这同样适用于变量i、x、y和count。

同时使用多个中断没有限制,但当其中一个执行时,其他中断会被暂时阻止。这不是你的问题,你的代码很好;但是,如果您希望中断能够依次被中断,为了降低延迟,您必须在(相对("慢速"处理程序中重新启用中断。

最后一个建议:如果你有"if(y==100("和最近的"y=0",如果你把"y=0"移到"if(y=100("下面,可读性就会提高。

其余的似乎都还可以,但我会仔细检查计时器的设置;我手头没有数据表,可能是中断处理程序中有一个标志要清除(我记不清了(。假设你说一个定时器可以工作,我想你知道该怎么做,那么两个定时器应该可以毫无问题地运行。

最新更新