您的位置 首页 基础

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

使用AVR的输入捕捉可以对组码进行有效地区分,这里是对红外接收头接收到遥控器的码型进行解码,也可以扩展到其他的应用领域。关于红外的基…

运用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<<ICNC1)|(0<<ICES1)|(0< // Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK = (1<ICIE1);//定时器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<(8*i+8)))
{
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;
}

*/
//————-

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/252177.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部