嵌入式学习小组
直播中

刘先睿

7年用户 201经验值
私信 关注

为什么循环等待定时器中断后累加次数不能过多?

循环等待定时器中断后,累加次数只要一多,时间就不准,这是为什么?
  HI,ALL
       本来是红外发射码,但是发现只要定时器用得多了,就有问题,只能将代码一点一点删除,现在就剩下发38K脉冲持续500次,延时一段时间,再循环。实测38K持续时间忽长忽短,不知所以,请大侠解释一下。。
  #include  
  //#include  
  ***it P1_1=P1^1;     //  LED
  static bit OP;                 //the turn on or off of the IR led
  ***it P1_3=P1^3;      // IR pin
  static unsigned char flag;     //the flag of IR emission  
   static unsigned int lead_high;
   static unsigned int lead_low;
   static unsigned int count;     //delay count  
   static unsigned int endcount;   //terminate count  
  void   SendIRdata(void);  
  void timer0_int(void);
  void IR_transfer_test(void);
  void delay_100ms(int);
  void main(void)   
  {
    IE=0x0;
      P1_1=0;
      //AUXR |= 0x80;         //SET TIMER0 1T MODE
    P1M1 &= 0xF7;
    P1M0 |= 0x08;        //SET P1_3 PUSH-PULL MODE
      
         
    timer0_int();
      
      IR_transfer_test();
      
  }   
   void IR_transfer_test()
  {      
   
         //int i;
  //  int j;
      count=0;   
    flag=0;   
      OP=0;   
      P1_3=0;                        
      lead_high=500;   
      lead_low=500;
      
      do{   
     EA=1;
     SendIRdata();  
         EA=0;  
         P1_3=0;
       delay_100ms(1);
         
    } while(1);
   
  }
  void SendIRdata()  
  {     
      
      endcount=lead_high;   
    flag=1;   
    count=0;   
    //ET0=1;TR0 = 1;
      
    do{}while(count   
                  
      //TR0 = 0;ET0=0;
      //endcount=lead_low;   
    //flag=0;   
   // count=0;   
      //ET0=1;TR0 = 1;
         
    //do{}while(count      // TR0 = 0;ET0=0;
      }  
         
  void timer0_int()
  {           
   
    EA=1;
      AUXR |= 0x80;     //定时器时钟1T模式
      TMOD &= 0xF0;     //设置定时器模式
      TMOD |= 0x02;     //设置定时器模式
      TL0 = 0x64;       //设置定时初值
      TH0 = 0x64;       //设置定时重载值
      TF0 = 0;      //清除TF0标志
      ET0=1;
      TR0 = 1;      //定时器0开始计时
      
  }
  void timeint(void) interrupt 1  
  {     
      
      count++;   
      if (flag==1)   
       {
         OP=~OP;   
            
       }  
      else   
       {
          OP = 0;
           
        }  
        P1_3 = OP;
      
  }   
  void delay_100ms(int k)  
  {      
    int i,j;   
    for(k;k>0;k--)
   {   
    for(i=0;i<150;i++)     
       {  
             for(j=0;j<100;j++);
       }  
      }        
           
  }
   

回帖(2)

陈博琳

2019-11-5 07:54:52
你在主循环中有一段程序关闭中断,(EA=0)。如果定时器触发中断时刚好中断被关闭,就会导致计时不准。。。。。
举报

李彬

2019-11-5 08:03:37
顶一下吧!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分