我想让两个计时器同时工作,但它似乎根本不起作用。
我写的代码是眨眼导致的。
当我使用一个计时器时,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;
}发布于 2020-04-22 06:25:44
在blink2()中,您测试全局变量i,但从不更改它。
注意: blink1()管理LED2,blink2()管理LED。也许更一致的命名会有所帮助,同样适用于变量i、x、y和count。
不限制同时使用多个中断,但当其中一个中断执行时,其他中断将被暂时阻塞。这里不是您的问题,您的代码很好;但是如果您希望一个中断能够依次被中断,为了降低延迟,您必须在(相对的)“较慢”处理程序中重新启用中断。
最后一个建议:如果您将"if (y==100)“和最近的"y=0”移到"if (y==100)“下面,则"y=0”的可读性有所提高。
其余的看起来都没问题,但我会再次检查定时器的设置;我手头没有数据表,中断处理程序中可能有需要清除的标志(我不记得了)。假设您说一个定时器工作,我想您知道该做什么,两个定时器应该没有任何问题地运行。
https://stackoverflow.com/questions/61355642
复制相似问题