• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

循环等待定时器中断后,累加次数只要一多,时间就不准,这是为什么?

xtacel 2015-10-31 浏览量:1024

循环等待定时器中断后,累加次数只要一多,时间就不准,这是为什么?

HI,ALL

     本来是红外发射码,但是发现只要定时器用得多了,就有问题,只能将代码一点一点删除,现在就剩下发38K脉冲持续500次,延时一段时间,再循环。实测38K持续时间忽长忽短,不知所以,请大侠解释一下。。

#include

//#include

sbit P1_1=P1^1;     //  LED

static bit OP;                 //the turn on or off of the IR led

sbit 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++);

     } 

    }       

        

}

 

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
其他答案 数量:2
  • 你在主循环中有一段程序关闭中断,(EA=0)。如果定时器触发中断时刚好中断被关闭,就会导致计时不准。。。。。
    • 发布于2015-11-01
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

循环等待定时器中断后,累加次数只要一多,时间就不准,这是为什么?