头像-81069

xtacel

  • 江苏省苏州市
  • 单片机 EDA/PCB RF/无线
  • 消费电子

个人成就

获得 0 次赞

帮助过0人

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

循环等待定时器中断后,累加次数只要一多,时间就不准,这是为什么? 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

红外遥控发射NEC编码,代码有问题,LEAD的持续时间无法按要求调整,求助!!

大家好,      从网上DOWN了程序,优化了一下,主要想调整NEC编码的占空比(不是38K载波的占空比),但是实际测试输出LEAD波形时并不按设计的走(地址码与数据码都未发现有问题),如,695次调用TIMER0中断,输出延时是对的,但是900次调用中断后就不对了,感觉哪里有东西打断了进程?也尝试在不同的地方加中断、计数使能,但是总有问题。      我用的是STC12C5202AD单片机,用KEIL 5编译,已经将芯片导入到KEIL里,使用外部12M晶振。      代码如下: ------------------------自定义头文件---------------------------- #ifndef _C51_ZY_H_ #define _C51_ZY_H_ void UartInit(); void delay_us(int i); void IR_transfer(char iraddr1,char iraddr2,char p_irdat); void timer0_int_13us(void); void delay_100ms(int k) ; #endif ---------------主程序-----------------------------------------      #include #include sbit P1_1=P1^1;     //  LED char  iraddr1=0x44;    //the first byte of the hex address char  iraddr2=0x9b;     //the second byte of the hex address char  p_irdata=0x12;    //IR DATA void main(void)   {   P1_1=0;         AUXR |= 0x80;         //SET TIMER0 1T MODE   P1M1 &= 0xF7;   P1M0 |= 0x08;        //SET P1_3 PUSH-PULL MODE         //UartInit();                  IR_transfer(iraddr1,iraddr2,p_irdata);         //delay_us(10);                  }    ----------------------TIMER0初始化----------------------------- #include #include                                             void  timer0_int_13us(void) {                             AUXR |= 0x80;                //定时器时钟1T模式         TMOD &= 0xF0;                //设置定时器模式         TMOD |= 0x01;                //设置定时器模式         ET0 = 1;         TL0 = 0x64;                //设置定时初值         TH0 = 0xFF;                //设置定时初值         TF0 = 0;                //清除TF0标志         TR0 = 1;                //定时器0开始计时 } -----------------------延时子程序-------------------------- void delay_100ms(int k)  {        int i,j;      for(k;k>0;k--) {     for(i=0;i