在各位大侠前辈的提示下,我找了段红外线的代码修改后,用来测试
#define Start_T1 TCCR1B|=CS11;TCNT1=0//复位预计分频器并开启定时器T1
#define Stop_T1 TCCR1B&=~CS11 //关闭定时器T1
/*-----------------IR信号指示灯操作函数---------*/
#define EN_IR_LED DDRB|=P
#define CLR_IR_LED PORTB&=~P1
#define SET_IR_LED PORTB|=P1
/*----------------------某些端口操作-------------------*/
//volatile unsigned char i,j,k;
volatile unsigned long IRcode; //定义一个长度为4字节de无符号long类型变量来存储代码
volatile unsigned char *IRcodePointer ; //定义一个无符号de单字节指针变量,
//用此地址变量来分别读取IRCodede
//4个字节 其中操作码为 IRcodePointer[2]
//用户码为 IRcodePointer[0]
volatile unsigned char IRReceiveEffective=0; //IR信号接收有效 当程序响应接收以后请马上清零 这样才会继续接收下一IR码
volatile unsigned char IRReceiveCurrentBit=0; //IR信号当前接收位 0时表示第0位即同步码(4.5ms高电平)
volatile unsigned int Pulse_length=0; //捕获de脉冲宽度
volatile unsigned char ICP_Parity=0; //捕获中断奇偶次计数 1时为偶次 并在此时判断脉宽
volatile unsigned char Received_Key_Temp; //红外接收操作键缓存if(!IRReceiveEffective)
{
if(ICP_Parity==0)
{
ICP_Parity++;
TIMSK1|=OCIE1A;
TCCR1B|=ICNC1;
TCCR1B&=~ICES1; //设置输入捕获 沿有效
Start_T1 ;
PORTD|=0X06;
}
else
{
Stop_T1;
ICP_Parity=0;
TCCR1B|=ICES1;//设置输入捕获 上升沿有效
TCCR1B|=ICNC1;
Pulse_length=ICR1;
if(IRReceiveCurrentBit==0)
{
if(Pulse_length>=13000&&Pulse_length<18000)// 如果shi引导码 (16ms) 进入下一个bitde读取
{IRReceiveCurrentBit++; IRcode=0; }
}
else if(IRReceiveCurrentBit<24) //接收24位数据
{
IRcode>>=1;
if(Pulse_length<800&&Pulse_length>300) //判断shi否为 1 ( 0.528ms)
IRcode|=0x800000;
IRReceiveCurrentBit++;
if(Pulse_length<300){IRcode<<=1; IRReceiveCurrentBit--;}
if(IRReceiveCurrentBit==24)
{//PORTD&=0XF9;delay_ms(100);
IRcode&=0X0FFFF;//用于测试接收的地址数据是否正确
if(IRcode==0x05555){PORTD&=0XF9;delay_ms(100);}//如果正确,发光二极管亮
IRReceiveCurrentBit=0; //重置IR接收位为第0位,为下次接收做准备
if(IRcodePointer[0]==(unsigned char)(~IRcodePointer[1])&&IRcodePointer[2]==(unsigned char)(~IRcodePointer[3]))
{
IRReceiveEffective=1; //数据有效
}
delay_ms(10); //因为24位数据后面还有一个信号上跳变,所以要适当延时,延时0.65ms以上即可
}
}
}
}
遥控的振荡电阻4.7M,2262的地址码全为悬空,根据测试情况来看,码头是收到,但是从地址码的接受来看,接受内容和实际不一致,望高手指点
|