📄 infrared_test._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 + -