xtacel
获得 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
大家好, 从网上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