您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机AVR单片机uPD6121/LC7461M/HT6222/AS6122等红外编码芯片的解码程序 正文
AVR单片机uPD6121/LC7461M/HT6222/AS6122等红外编码芯片的解码程序

AVR单片机uPD6121/LC7461M/HT6222/AS6122等红外编码芯片的解码程序

点击数:7581 次   录入时间:03-04 11:57:28   整理:http://www.55dianzi.com   AVR单片机
结果:得到uchar型的键码ir_code,如果解码出错,则ir_code=0xff 
-----------------------------------------------------------------------------*/ 
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

1
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 @@@@@@@@@@@@@@@@@@@@@@@@@@@改动

2


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单片机