您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机uPD6121 avr红外解码程序 正文
uPD6121 avr红外解码程序

uPD6121 avr红外解码程序

点击数:7912 次   录入时间:03-04 11:50:11   整理:http://www.55dianzi.com   AVR单片机
-----------------------------------------------------------------------------*/ 
void get_code(void){ 
        uchar i,dat,/*键码*/_dat;/*键码反码*/ 
        uint temp=0; 
        for(i=0;i<16;i++){ 
           if(arr[i]<7000){ 
             //“0” 
             temp<<=1; 
           } 
           if(arr[i]>13000){ 
             //“1” 
             temp<<=1; 
             temp|=1;       
           }        
        } 
        _dat=(uchar)(temp&0x00ff);/*键码*/ 
        dat=(uchar)((temp>>8)&0x00ff);/*键码反码*/ 
           /*“键码”与“键码反码相与,如果为0则解码正确*/ 
        if((dat&_dat)==0){ 
           ir_code=dat; 
     } 
        else{ 
           TCNT1H = 0x00;  
           TCNT1L = 0x00;  
           ir_code=0xff;//解码出错 
     } 
        times=0; 
        index=0; 

void init_devices(void) 

 CLI();  
 port_init(); 
 timer1_init(); 
 MCUCR = 0x00; 
 GICR  = 0x00; 
 TIMSK = 0x20;  
 SEI();  

void main(void){ 
 uchar i; 
 init_devices(); 

 while(1){ 

            if (OK_flag){ 
               get_code();//解码 
               OK_flag=0; 
     } 
            for(i=0;i<200;i++){ 
              dis_int(ir_code);//显示键码 
            } 

      }  



//------------------------------------------------------------------------------

楼主程序今测试了下: 
  主要有两点改动 

用M64,T3,晶体7.3728 ,GCC 20040214 


void timer1_init(void)  
{  
 TCCR3B = 0x00; //stop  
 TCNT3H = 0x00; //setup  
 TCNT3L = 0x00;  
 ICR3H  = 0x00;  
 ICR3L  = 0x08;  
 TCCR3A = 0x00;  
/*一体化接收头的DATA引脚接到ATmega64的PE7(ICP3)引脚,采用上升沿捕捉的方法解码*/  
/*晶振为7.3728M,8分频*/  
 TCCR1B = 0xC2; //start Timer @@@@@@@@@@@@@@@@@@@@@@@@@@@改动 
}  



SING(XXXXXXXXXXXXXXX) 
{     
    uint value;  
    value=ICR3L;                     
    value|=(uint)(ICR3H << 8);   
    TCNT3H = 0x00;   
    TCNT3L = 0x00;   
    times++;    
    if(times>18)&&(times<35){  
      //从第19个上升沿开始保存,直到第34个,短按时共有36个上升沿  
      arr[index]=value;     
      index++;    
    }  
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@改动 
  else if(times>35)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@改动 

 //else if(times>=35) //用此语句时第二个键值的第一位被上一键值的第36个脉冲复用, 
{  
        //第35个上升沿到来时,解码完毕    
       times=0;  
       index=0;  
       OK_flag=1;  
    }  
}   
  





上一页  [1] [2] 


本文关键字:程序  AVR单片机单片机-工控设备 - AVR单片机