我想使两个计时器同时工作,但似乎根本不工作
我写了代码使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;
}
在blink2()中,您测试了全局变量i,但是您从未对其进行更改。
注意:blink1()管理LED2,blink2()管理LED。也许更一致的命名会有所帮助,这同样适用于变量i,x,y和count。
没有并发使用多个中断的限制,但是当它们执行时,其他中断将被暂时阻止。这不是您的问题,您的代码很好;但是,如果希望中断能够依次中断,那么为了降低延迟,您必须在(相对)“慢”处理程序中重新启用中断。
最后建议:如果您将“ y(y == 100)”和“ y = 0”的位置移到“ if(y == 100)”的下方,则将提高“ y = 0”的可读性。
其余的一切看起来还不错,但是我会仔细检查计时器的设置;我手头没有数据表,可能在中断处理程序中有一个需要清除的标志(我不记得了)。假设您说一个计时器有效,那么我想您知道该怎么做,两个计时器应该可以正常运行。