今天下午的时分,调试尽力之下,总算把红外解码弄出来了。其实曾经有次竞赛的时分就现已用到了红外,仅仅那次用的是51单片机,用的是外部中止和延时检测脉宽来进行解码,由于51的时钟这些比较简略,所以解码很简略就正确了。可是现在换到了ARM7平台下,由于对它的不是很熟悉,怎样用一般句子完成准确延时对我来说是个难点。终究考虑用两个计划来完成红外的解码。计划一是用外部中止加定时器延时检测脉宽进行解码,可是成果并没有我想的那样夸姣,调试了半响也没有完成正确的解码,个人认为是使命节拍的影响,可是的确不知道该怎样修正,终究抛弃计划一,改用计划二,用定时器捕获完成红外的解码,并终究完成。
LPC2103芯片带有定时器捕获,能够设置为下降沿,上升沿或双边缘捕获中止。由于结合到此款红外编码方法,所以选用下降沿进行捕获。定时器0由于用作了体系节拍定时器,所以我挑选了定时器1的捕获。
定时器1进行如下的初始化。
print?
然后在定时器1中止服务函数里,就算出相邻两次下降沿之间的差值。然后经过音讯邮箱把音讯发送到脉宽检测使命进行处理。
print?
在检测脉宽使命里,我只需要根据测定脉宽与原本编码原有的脉宽进行比较判别,然后进行相关移位数据操作,得到数据码值。
由于我的遥控器有点不同,地址码与地址反码不互反,所以不能进行地址的判别,所以滤除掉了引导码与地址码,直接进行了数据码的处理。
只需数据码与数据反码取反相同,则调试LED闪耀一下。
当然我还没有详细知道遥控器按键对应的详细码制是多少,并且还没有检测到连发码,留下下次把码制经过串口发送到上位机进行显现。
print?
print?
-
这是检测脉宽使命的中心代码:
while(1) - {
- OSMboxPend(Msg,0,&err);//等候脉宽检测音讯
- if(tValue>2145&&tValue<2345)//进行脉宽检测
- {
- ucTemp=1;//逻辑1
- }
- elseif(tValue>1025&&tValue<1225)
- {
- ucTemp=0;//逻辑0
- }
- elseif(tValue>13400&&tValue<13600)
- {
- ucCounter=0;//引导码
- usData0=0;
- usData1=0;
- flag=1;
- }
- else
- {
- continue;
- }
- if(flag)//数据处理进程
- {
- ucCounter++;
- if(ucCounter<16)
- {
- usData0|=(uint16)ucTemp;
- usData0<<=1;
- }
- elseif(ucCounter==16)
- {
- usData0|=(uint16)ucTemp;
- }
- elseif(ucCounter<32)
- {
- usData1|=(uint16)ucTemp;
- usData1<<=1;
- }
- elseif(ucCounter==32)
- {
- usData1|=(uint16)ucTemp;
- flag=0;
- OSSemPost(Sem);//发送信号量,进行码制转化使命,我的使命仅仅简略的完成了判别解码是否成功。
- }
- }
- }