本帖最后由 zage2009 于 2011-11-8 16:08 编辑
在网上找了一些通用的38KHz(uPD6121)的红外编码的资料,使用了atmega16(16M,8分频,下降沿触发)的定时器1的输入捕捉功能,发现只有加入了定时器1的中断函数后(对num和times变量赋0)才能得到正确的键值,但是在输入捕捉中断函数中发送完毕后,num和times两个变量就已经赋值为0了,是否有必要再一次赋0呢?以下是关键的程序部分:#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
volatile uint arr[16]={0};//保存捕捉值
volatile uchar times=0;//记录捕捉次数
volatile uchar num=0;//数组索引
volatile uchar ir_code=0;//红外遥控键码
volatile uchar OK_flag=0;//解码完毕标志
void Timer1_init(void)//定时器1初始化
{
TCNT1=0x00;
ICR1=0x00;
TCCR1A=0x00;
TCCR1B|=(1<<CS11)|(1<<ICNC1);
TIMSK|=(1<<TICIE1)|(1<<TOIE1);
}
ISR(TIMER1_CAPT_vect)//输入捕捉中断
{
uint value;
value=ICR1;
TCNT1=0x00;
times++;
if(times>18&×<35)
{
arr[num]=value;
num++;
}
else if(times>=35)
{
times=0;
num=0;
OK_flag=1;
value=0;
}
}
ISR(TIMER1_OVF_vect)//定时器1中断函数
{
num=0;//如果这两个变量不赋值为0,就得不到正确的键值。
times=0;
}
|