标题: 关于51单片机的定时器问题 [打印本页]

作者: 菜菜的周某人    时间: 2022-1-6 12:04
标题: 关于51单片机的定时器问题
本帖最后由 菜菜的周某人 于 2022-1-6 12:11 编辑

大家好,我想问下,现在我51单片机同时使用了两个定时器,即定时器0和定时器1,分别是50ms和20ms的中断,中断服务函数里分别是进中断20次闪烁LED1和进中断50次闪烁LED2,我的初始目的是将两个作为1s对比,但是现在问题现象是这两个灯的闪烁频率不是设定的1s了,反而闪烁频率极快,类似是程序紊乱了,这是为什么?麻烦论坛大佬帮忙指导下。

作者: lkc8210    时间: 2022-1-6 14:52
个别问题要先贴代码才能讨论下去
作者: AUG    时间: 2022-1-6 15:39
盲猜用到同个全局变量了
作者: qwer9177    时间: 2022-1-6 15:44
分开写代码
作者: wulin    时间: 2022-1-6 16:50
用一个定时器能解决的事情不要开两个定时器,等玩熟了开几个定时器都不会互扰。
  1. #include <reg51.h>

  2. sbit LED1=P1^0;
  3. sbit LED2=P1^1;

  4. unsigned char count1,count2;


  5. void InitTimer0(void)//10毫秒@12.000MHz
  6. {
  7.     TMOD = 0x01;
  8.     TH0 = 0xD8;
  9.     TL0 = 0xF0;
  10.     EA = 1;
  11.     ET0 = 1;
  12.     TR0 = 1;
  13. }

  14. void main(void)
  15. {
  16.         InitTimer0();
  17.         while(1);
  18. }

  19. void Timer0Interrupt(void) interrupt 1
  20. {
  21.         TH0 = 0xD8;
  22.         TL0 = 0xF0;
  23.         if(++count1==5)
  24.         {
  25.                 count1=0;
  26.                 LED1=~LED1;
  27.         }
  28.         if(++count2==2)
  29.         {
  30.                 count2=0;
  31.                 LED2=~LED2;
  32.         }
  33. }
复制代码


作者: 冰火风轮    时间: 2022-1-6 17:33
猜在 100 MS 时,中断打架了
作者: PEB188    时间: 2022-1-7 08:02
冰火风轮 发表于 2022-1-6 17:33
猜在 100 MS 时,中断打架了

中断有先后顺序,怎么会发生打架。如果中断间隔很短,中断里要运行的代码时间超出中断时间,才会错乱吧。像他几十ms的中断应该不至于打架。同时中断也是最高优先级先运行完再运行次优先级的吧。
作者: kissdb    时间: 2022-1-7 15:24
一般情况是个别数据忘记清零了,
作者: 13205495918    时间: 2022-1-7 15:35
程序贴出来,你这个可能的错误原因不是唯一的,x
作者: 菜菜的周某人    时间: 2022-1-7 17:56
谢谢大家的回复,问题找到了,由于我是以赋实参进行定时器初始化的,所以定时器0和1的两次初始化的TMOD寄存器先后冲突了,我将赋值操作改成位或操作就可以了
作者: 123456ZXC1    时间: 2022-1-8 15:02
建议先搞一个吧  把代码粘贴上了 不然没办法差错
作者: 攻城狮小李    时间: 2022-1-9 13:16
程序可以进行仿真,看看目标端口变化的情况,或者直接上示波器看LED灯控制端口的波形情况,怀疑是不是在中断里面没有清零定时器




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1