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)" 下方,可读性会提高。
其他的似乎没问题,但我会仔细检查定时器的设置;我手边没有数据表,中断处理程序中可能有一个要清除的标志(我不记得了)。鉴于您说单个计时器可以工作,我想您知道该怎么做,两个计时器应该 运行 没有任何问题。
我想让两个计时器同时工作,但似乎根本不工作
我写了使 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)" 下方,可读性会提高。
其他的似乎没问题,但我会仔细检查定时器的设置;我手边没有数据表,中断处理程序中可能有一个要清除的标志(我不记得了)。鉴于您说单个计时器可以工作,我想您知道该怎么做,两个计时器应该 运行 没有任何问题。