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

问题描述 投票:1回答:1

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

我写了代码使LED闪烁。当我使用计时器和中断之一时,LED会闪烁当我同时使用它们时,LED的两个端口不起作用。

是否有不能同时使用两个中断或计时器的规则?还是只是我的MCU坏了?

btw我正在使用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;
}
c interrupt 8051
1个回答
0
投票

在blink2()中,您测试了全局变量i,但是您从未对其进行更改。

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

没有并发使用多个中断的限制,但是当它们执行时,其他中断将被暂时阻止。这不是您的问题,您的代码很好;但是,如果希望中断能够依次中断,那么为了降低延迟,您必须在(相对)“慢”处理程序中重新启用中断。

最后建议:如果您将“ y(y == 100)”和“ y = 0”的位置移到“ if(y == 100)”的下方,则将提高“ y = 0”的可读性。

其余的一切看起来还不错,但是我会仔细检查计时器的设置;我手头没有数据表,可能在中断处理程序中有一个需要清除的标志(我不记得了)。假设您说一个计时器有效,那么我想您知道该怎么做,两个计时器应该可以正常运行。

© www.soinside.com 2019 - 2024. All rights reserved.