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

8051 two timers and Interrupts problem in c

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

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

有没有规定不能同时使用两个中断或定时器?
或者只是我的单片机坏了?

顺便说一句,我正在使用 AT89S52
由 keil uVision5
编码 并使用 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。

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

最后的建议:在 "if (y==100)" 和最近 "y=0" 的位置,如果将 "y=0" 移动到 "if (y==100)" 下方,可读性会提高。

其他的似乎没问题,但我会仔细检查定时器的设置;我手边没有数据表,中断处理程序中可能有一个要清除的标志(我不记得了)。鉴于您说单个计时器可以工作,我想您知道该怎么做,两个计时器应该 运行 没有任何问题。