首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >8051 c中的两个定时器和中断问题

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

Stack Overflow用户
提问于 2020-04-22 01:02:43
回答 1查看 189关注 0票数 1

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

我写的代码是眨眼导致的。

当我使用一个计时器时,led会闪烁,当我使用它们时会中断,两个用于led的端口不工作。

是否有任何规则不能同时使用两个中断或计时器?

还是我的单片机坏了?

顺便说一下,我使用的是AT89S52

keil uVision5编码

和用WLpro编程

这是我的密码

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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”的可读性有所提高。

其余的看起来都没问题,但我会再次检查定时器的设置;我手头没有数据表,中断处理程序中可能有需要清除的标志(我不记得了)。假设您说一个定时器工作,我想您知道该做什么,两个定时器应该没有任何问题地运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61355642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档