×
单片机 > 单片机程序设计 > 详情

利用AVR的输入捕捉进行红外解码

发布时间:2020-06-19 发布时间:
|
使用AVR的输入捕捉可以对组码进行有效地区分,这里是对红外接收头接收到遥控器的码型进行解码,也可以扩展到其他的应用领域。

关于红外的基本知识参看下面的参考文章。需要说明的是红外的数据端口电源最好加10uf滤波电容,然后数据引脚加上1K限流电阻。

硬件平台:ATMega16-16PU    红外接收头4338     康佳遥控器

编译器: IAR For AVR

代码:

/*================START==================*/

#include  
#include
#include

/**********************************************************
                       变量声明
**********************************************************/

unsigned int Receive_NewData = 0;
unsigned int Receive_OldData = 0;
unsigned int Calc_num = 0;
unsigned int Temp;
unsigned char Num;
unsigned char buffer[5]={0};

/**********************************************************
           定时器1 捕获定时器初始化
**********************************************************/
void Timer1_Init(void)
{
    TCCR1A = 0x00; 
                                                                                                    // Input Capture on Falling Edge 
    TCCR1B = (1<                                                                                                      // Timer(s)/Counter(s) Interrupt(s) initialization 
    TIMSK = (1< }
/**********************************************************
                  开始捕获
**********************************************************/
void main(void) 

          Timer1_Init();
          _SEI();                                                                               // Global enable interrupts 
          while(1){;}
}
/**********************************************************
                   定时器1 捕获中断 中断服务程序
**********************************************************/
#pragma vector=TIMER1_CAPT_vect                         //定时器1 输入捕获中断
__interrupt void OldTimer1_capt_isr(void) 
// Timer 1 input capture interrupt service routine 

      unsigned char i,j;
      Receive_NewData = ICR1;                                    //得到新的数据
      Temp = Receive_NewData - Receive_OldData ;   //用这一次的数据减去上一次的数据,得到本次捕捉时间
      Receive_OldData = Receive_NewData ;              //更新数据到 Receive_OldData
      
      if(Temp>100 && Temp<150)                                // ‘0 ’ 信号
      {
        Num = 0;
      }
      else if(Temp>230 && Temp<280)                     // ‘1 ’ 信号
      {
        Num = 1;
      }
      else if(Temp>1300 && Temp<1800)                 // ‘ hearder ’信号 
      {
        Calc_num = 0;
        Num = 2; 
      }
      else                                                                     //干扰信号
      { 
        return ;
      }

                                                                                  //将二进制码转换成十六进制

      //按下的按键键值码型应为 1001 1000 1000 0011 0011 1011 (1110 1100 0001 0011 )11
      for(i=0;i<5;i++)
      {
             if((Calc_num>8*i) && (Calc_num         {
          buffer[i]=buffer[i] | Num;
          buffer[i]<<=1;
        }
        else if(Calc_num==(8*i+8))
        {
          buffer[i]=buffer[i] | Num;
        }
      }


      Calc_num++;                                           //计数变量


      if(Calc_num>41)
        {
          Calc_num=0;
          for(j=0;j<5;j++)
          {
            buffer[j]=0;
          }
        }
     
}

/*================END==================*/

粗体部分是下面代码总结的:

/*
        if((Calc_num>0) && (Calc_num<8))
        {
          buffer[0]=buffer[0] | Num;
          buffer[0]<<=1;
        }
        else if(Calc_num==8)
        {
          buffer[0]=buffer[0] | Num;
        }
    //------------- 
      
        if((Calc_num>8) && (Calc_num<16))
        {
          buffer[1]=buffer[1] | Num;
          buffer[1]<<=1;
        }
        else if(Calc_num==16)
        {
          buffer[1]=buffer[1] | Num;
        }
    //-------------    
         if((Calc_num>16) && (Calc_num<24))
        {
          buffer[2]=buffer[2] | Num;
          buffer[2]<<=1;
        }
        else if(Calc_num==24)
        {
          buffer[2]=buffer[2] | Num;
        }
    //------------- 
        if((Calc_num>24) && (Calc_num<32))
        {
          buffer[3]=buffer[3] | Num;
          buffer[3]<<=1;
        }
        else if(Calc_num==32)
        {
          buffer[3]=buffer[3] | Num;
        }
    //------------- 
       if((Calc_num>32) && (Calc_num<40))
        {
          buffer[4]=buffer[4] | Num;
          buffer[4]<<=1;
        }
        else if(Calc_num==40)
        {
          buffer[4]=buffer[4] | Num;
        }
      
      */
    //-------------

关键字:AVR  输入捕捉  红外解码

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址