小弟头次写程序,实在是困惑,我的问题是:程序下降沿中断,以判断两次下降时间差来解码,因为没能解码,我就写了下面那个判断两次下降沿的时间差来确定,我用示波器确认了红外发出的波形是正确的,1838一体红外头输出给单片机解码的波形脉宽也是正确的,但我用下面那程序把时间差 timeH timeL发到串口上显示就比我实际编码的值大量9倍左右,比如我编码0的脉宽是1.12ms但发到串口上的数据有9ms左右!! 
 我真不知道为什么,而且以这大9倍多的时间为依据去解码也能正确!!! 
有做过红外的前辈帮小弟看看呀!!实在很困惑,程序那里错了呀!!! 
 
#include <reg51.h> 
#include"uart.h" 
unsigned char IRcode;  //红外解码值 
unsigned char timeL,timeH; //保存时间 
unsigned int  time_us;  //保存下降沿差时间 
unsigned char uSendData; 
bit NewIRcode=0;     //指示当处理完了4位码后,就有了新的遥控码 
 
/*******************初始化************************/ 
void initial()   
{  
 EA = 0; 
  
 TMOD=0x01; //定时器0,工作方式1 ;  
 TCON=0x01; //外中断0下降沿触发(IT0=1)(其中包括TR1=0,TR0=0) 
 TH0=0x00;  //初始化定时器0 
 TL0=0x00;    
  
 EA=1;     //开全中断 
 ET0=1;   //开放T0中断 
 EX0=1;    //开放INT0 
} 
/**********************interrupt0****************************** 
中断0(P3^2脚)下降沿中断,以判断两次下降时间差来解码, 
12M 
***********************************************************/ 
unsigned char TempTH[32]; 
unsigned char uInterruptNum = 0;      //中断的次数 
void IR_ISR() interrupt 0 using 1  //红外数据中断处理函数 
{    
// static unsigned char cn=0;  //处理数据计数 
  
 EX0 = 0;          // 关INT 0 
 TR0 = 0;         // 关 Timer 0 
 TR0=0;          //关定时器0 
 timeH=TH0;   //保存时间 
 timeL=TL0; 
 TH0=0X00;   //时间重新置0 
 TL0=0X00; 
 TR0=1;          //开定时器0 
  EX0 = 1;         // 开INT 0 
 
 TempTH[uInterruptNum] = timeH; 
 uInterruptNum++; 
    TempTH[uInterruptNum] = timeL; 
    uInterruptNum++; 
} 
 
/***************************中断入***************************/ 
void Timer0_ISR() interrupt 1 using 2 {} //定时器0中断函数 
 
/****************************主函数******************************/ 
 
void main() 
{   
  unsigned char i; 
 initial();   
 Uart_initial();  //串口初始化  
  
 while(1)     
 {  
   
  if(uInterruptNum >= 16) 
  { 
   for(i = 0; i < uInterruptNum; i++) 
   { 
    Uart_send(TempTH[i]); 
   } 
   uInterruptNum = 0; 
  }    
  
 }  
   
} |   
     
  
 |