⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 infrared_test._c

📁 AVR 红外接收源代码,对学习红外的人很有帮助
💻 _C
字号:
/******************************************/
/*             北京MCU学习之家            */
/*            红外输入演示程序            */
/*             作者:白如冰                */
/*             2005年10月1日              */
/*  目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
/******************************************/
//红外接收头的引脚定义 
//   1----->data-----> (PD3(int1))
//   2----->gnd
//   3----->vss
/******************************************/
//在外部中断函数中打开定时器T0 ,T0计时100ms后
//进入T0中断关闭外部中断,进行数据处理
//到主函数中在打开外部中断1,继续采集输入信号
//*****************************************/

#include <iom8v.h>
#include <macros.h>
#pragma interrupt_handler int1_isr:iv_INT1
#pragma interrupt_handler t0_isr:iv_TIMER0_OVF

#define INFR_DIR      DDRD
#define INFR_PORT     PORTD
#define INFR_DATA     3
#define buffer_max    75
unsigned char infra_data[4],rece_flag;
unsigned int counter_buffer[buffer_max];
unsigned char flag_start,rece_data_count,t0_counter,flag_t0;


/* 初始化外部中断1 */  
void init_infr(void) 
    {
	 unsigned char i;
	 INFR_DIR&=~(1<<INFR_DATA); //PD3为输入方向
	 INFR_PORT|=1<<INFR_DATA;   //PD3初始为高电平
	 MCUCR = 0x04; //int1 电平变化产生中断
     GICR  = 0x80; //int1 外部中断使能 
	 TCCR0=0; //T0 1024分频
	 TCNT0=0; //初始值为0 32ms中断一次,200ms许7次
	 TIMSK=1;//允许T0溢出中断
	 TCCR1B=0;//关闭定时器T1
	 TCNT1=0; //初始值为0
	 flag_start=0;
	 rece_data_count=0;
	 t0_counter=0;
	 for(i=0;i<buffer_max;i++)
	 counter_buffer[i]=0;
	 infra_data[0]=0x31;
	 infra_data[1]=0x32;
	 infra_data[2]=0x33;
	 infra_data[3]=0x34;
	 rece_flag=0;
	 flag_t0=0;
	 SEI();  //全局中断使能
     
    }

/*外部中断1 中断函数 */	

void int1_isr(void)
{ 
  unsigned char i;
  
  if(flag_start==0)   //开始计时T1
  {
    TCCR1B=2;//开始计时 8分频
	flag_start=1;
  }
  
  else
  {  
     
     TCCR1B=0;
	 counter_buffer[rece_data_count++]=TCNT1;
	 TCNT1=0;
     TCCR1B=2; //T0 8分频 开始计时
	 if((counter_buffer[0]<4000)&&(counter_buffer[1]>5000)) //如果第一个数据不是有效数据退出
	 { 
	    for(i=0;i<buffer_max;i++) 
	   counter_buffer[i]=0;    //清空缓冲区
	   rece_data_count=0;      //接收数据计时清 0
	   flag_start=0;           //开始标志置0
	   TCCR1B=0;               //关闭定时器 T1
  	   TCNT1=0;                //定时器T1 清0
	   TCCR0=0;               //关闭定时器 T0
	   TCNT0=0;                  //定时器T0 清0
	   flag_t0=0;
	   
	   return;
	  }
	  else
	  //如果是有效数据
	  {
	
	  
	  if(flag_t0==0)
	  {
	  TCNT0=0;  //定时器T0 清0
	  TCCR0=5; //T0 1024分频 开始计时100MS
	  flag_t0=1;
	  }
	  }
	
	 
  } 

 
}

/*定时器T0 中断函数 */	

void t0_isr(void)
{
  unsigned char i;

 TCNT0=0;
 t0_counter++;
 if(t0_counter>3)
 {
  
  GICR  = 0x00;          //关掉外部中断1
  TCCR0=0;               //关掉T0
  TCNT0=0;
  TCCR1B=0;               //关闭定时器 T1
  TCNT1=0;                //定时器T1 清0
  
  t0_counter=0;
  
 if((counter_buffer[1]>4000)&&(counter_buffer[1]<5000)&&
    (counter_buffer[66]>400)&&(counter_buffer[66]<700))
    {
	//如果是有效数据
	   rece_flag=1;
	 for(i=3;i<66;i+=2)
	{
	    if(counter_buffer[i]>800)
	     {
	       if(i<18)
		   {
		     infra_data[0]>>=1;
		     infra_data[0]|=0x80;
	       }
		   else if(i<34)
		   {
		     infra_data[1]>>=1;
		     infra_data[1]|=0x80;
	       }
		   else if(i<50)
		   {
		     infra_data[2]>>=1;
		     infra_data[2]|=0x80;
	       }
		   else if(i<66)
		   {
		     infra_data[3]>>=1;
		     infra_data[3]|=0x80;
	       }
	     }	
		else
		 {
	     	if(i<18)
			{
			 infra_data[0]>>=1;
			}
			else if(i<34)
			{
			 infra_data[1]>>=1;
			}
		    else if(i<50)
			{
		     infra_data[2]>>=1;
			}
		    else if(i<66)
		    {
		     infra_data[3]>>=1;
		    }
	      }	
	  }
	  for(i=0;i<buffer_max;i++)
	  counter_buffer[i]=0;
	  rece_data_count=0;
	  flag_start=0;
	  TCCR1B=0;
  	  TCNT1=0;
	  flag_t0=0;
	  return;
	 
    }
	
	//如果不是有效数据
	 
	  for(i=0;i<buffer_max;i++)
	  counter_buffer[i]=0;
	  rece_data_count=0;
	  flag_start=0;
	  TCCR1B=0;
  	  TCNT1=0;
	  flag_t0=0;
	  GICR  = 0x80;//打开外部中断1
	  
   }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -