微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ARM7LPC2131 红外遥控解码程序

ARM7LPC2131 红外遥控解码程序

时间:10-02 整理:3721RD 点击:

程序能进入中断,但就是不能成功解码。求各位大神指点迷津

/*********************************************************************/

#include "config.h"

#define uchar unsigned char

#define uint  unsigned int

#define IRIN  1<<14;  

                 //定义P0.14为红外接收器数据线的连接引脚

void delay(uchar x);           

void delay1(int ms);

uchar IRCOM[7];

unsigned char T;

/*******************************************************************************************************

*名称:DelayNs()                              

*功能:长软件延时                                      

*入口参数:dly  延时参数,值越大,延时越久

*出口参数:无

********************************************************************************************************/

void DelayNs(uint32 dly)

{

   uint32  i;

   for(;dly>0;dly--)

      for(i=0;i<5000;i++);

}

/*******************************************************************************************************

*名称:PWM_Init()                              

*功能:初始化PWM,并开启向量中断                                      

*入口参数:freq  初始化PWM频率

           Duty  占空比

*出口参数:无

********************************************************************************************************/

void PWM_Init(uint32 freq,uint32 Duty)

{

   PINSEL0=(PINSEL0&0xFFFCFFFF)|(0x02<<16);            //将PWM4连接到P0.8脚

   PINSEL0=(PINSEL0&0xFFFFFFF3)|(0x02<<2);             //将PWM3连接到P0.1脚  

   PINSEL0=(PINSEL0&0xFFFF3FFF)|(0x02<<14);            //将PWM2连接到P0.7脚

   PINSEL0=(PINSEL0&0xFFFFFFFC)|(0x02<<0);             //将PWM1连接到P0.0脚

    /*初始化PWM4*/

   PWMPCR|=(1<<12);                                    //允许PWM4输出,单边PWM

   PWMPR=0x00;                                         //不分频,计数频率为Fpclk

   PWMMCR=0x02;                                        //当PWMMR0匹配时复位PWM定时器

   PWMMR0=Fpclk/freq;                                  //设置PWM频率

   PWMMR4=PWMMR0*Duty/100;                             //设置占空比

   PWMLER=0x10;                                        //使能PWM匹配0、4锁存

   PWMTCR=0x09;                                        //PWM使能,启动PWM定时器

    /*初始化PWM3*/

   PWMPCR|=(1<<11);                                    //允许PWM3输出,单边PWM

   PWMPR=0x00;                                         //不分频,计数频率为Fpclk

   PWMMCR=0x02;                                        //当PWMMR0匹配时复位PWM定时器

   PWMMR0=Fpclk/freq;                                  //设置PWM频率

   PWMMR3=PWMMR0*Duty/100;                             //设置占空比

   PWMLER=0x08;                                        //使能PWM匹配0、3锁存

   PWMTCR=0x09;                                        //PWM使能,启动PWM定时器

   /*初始化PWM2*/

   PWMPCR|=(1<<10);                                    //允许PWM2输出,单边PWM

   PWMPR=0x00;                                         //不分频,计数频率为Fpclk

   PWMMCR=0x02;                                        //当PWMMR0匹配时复位PWM定时器

   PWMMR0=Fpclk/freq;                                  //设置PWM频率

   PWMMR2=PWMMR0*Duty/100;                             //设置占空比

   PWMLER=0x05;                                        //使能PWM匹配0、2锁存

   PWMTCR=0x09;                                        //PWM使能,启动PWM定时器

    /*初始化PWM1*/

   PWMPCR|=(1<<9);                                     //允许PWM1输出,单边PWM

   PWMPR=0x00;                                         //不分频,计数频率为Fpclk

   PWMMCR=0x02;                                        //当PWMMR0匹配时复位PWM定时器

   PWMMR0=Fpclk/freq;                                  //设置PWM频率

   PWMMR1=PWMMR0*Duty/100;                             //设置占空比

   PWMLER=0x03;                                        //使能PWM匹配0、1锁存

   PWMTCR=0x09;                                        //PWM使能,启动PWM定时器

}

/*******************************************************************************************************

*名称:MOTO_A_PWM()                              

*功能:电机控制端口A配置PWM                                      

*入口参数:Duty  PWM占空比

*出口参数:无

********************************************************************************************************/

void MOTO_A_PWM(uint32 Duty)

{

   PWMMR1=PWMMR0*Duty/100;                            //设置PWM占空比

   PWMLER=0x03;                                       //使能PWM匹配0、1锁存

   PWMTCR=0x09;                                       //PWM使能,启动PWM定时器

}

/*******************************************************************************************************

*名称:MOTO_B_PWM()                              

*功能:电机控制端口B配置PWM                                      

*入口参数:Duty  PWM占空比

*出口参数:无

********************************************************************************************************/

void MOTO_B_PWM(uint32 Duty)

{

   PWMMR2=PWMMR0*Duty/100;                            //设置PWM占空比                          

   PWMLER=0x05;                                       //使能PWM匹配0、2锁存

   PWMTCR=0x09;                                       //PWM使能,启动PWM定时器

}

/*******************************************************************************************************

*名称:MOTO_C_PWM()                              

*功能:电机控制端口C配置PWM                                      

*入口参数:Duty  PWM占空比

*出口参数:无

********************************************************************************************************/

void MOTO_C_PWM(uint32 Duty)

{

   PWMMR3=PWMMR0*Duty/100;                            //设置PWM占空比

   PWMLER=0x08;                                       //使能PWM匹配0、3锁存

   PWMTCR=0x09;                                       //PWM使能,启动PWM定时器

}

/*******************************************************************************************************

*名称:MOTO_D_PWM()                              

*功能:电机控制端口D配置PWM                                      

*入口参数:Duty  PWM占空比

*出口参数:无

********************************************************************************************************/

void MOTO_D_PWM(uint32 Duty)

{

   PWMMR4=PWMMR0*Duty/100;                            //设置PWM占空比                          

   PWMLER=0x10;                                       //使能PWM匹配0、4锁存

   PWMTCR=0x09;                                       //PWM使能,启动PWM定时器

}

/*******************************************************************************************************

*名称:MOTO_Init()                              

*功能:电机控制端口初始化                                      

*入口参数:无

*出口参数:无

********************************************************************************************************/

void MOTO_Init(void)

{

   PWM_Init(200,0);

}

/*******************************************************************************************************

*名称:STOP()                              

*功能:停止电机                                      

*入口参数:无

*出口参数:无

********************************************************************************************************/

void STOP(void)

{

   MOTO_A_PWM(0);                                    //设置A端口占空比为0                             

   MOTO_B_PWM(0);                                    //设置B端口占空比为0

   MOTO_C_PWM(0);                                    //设置C端口占空比为0                             

   MOTO_D_PWM(0);                                    //设置D端口占空比为0

}

/*******************************************************************************************************

*名称:MOTO_L_forward()                              

*功能:左电机正转                                      

*入口参数:Duty  占空比

*出口参数:无

********************************************************************************************************/

void MOTO_L_forward(uint32 Duty)

{

   MOTO_C_PWM(Duty);

   MOTO_D_PWM(0);                                    //设置D端口占空比为0

}

/*******************************************************************************************************

*名称:MOTO_L_back()                              

*功能:左电机反转                                      

*入口参数:Duty  占空比

*出口参数:无

********************************************************************************************************/

void MOTO_L_back(uint32 Duty)

{

  MOTO_C_PWM(0);                                    //设置C端口占空比为0

  MOTO_D_PWM(Duty);

}

/*******************************************************************************************************

*名称:MOTO_R_forward()                              

*功能:右电机正转                                      

*入口参数:Duty  占空比

*出口参数:无

********************************************************************************************************/

void MOTO_R_forward(uint32 Duty)

{

   MOTO_A_PWM(Duty);

   MOTO_B_PWM(0);                                    //设置B端口占空比为0

}

/*******************************************************************************************************

*名称:MOTO_R_back()                              

*功能:右电机反转                                      

*入口参数:Duty  占空比

*出口参数:无

********************************************************************************************************/

void MOTO_R_back(uint32 Duty)

{

  MOTO_A_PWM(0);                                    //设置A端口占空比为0

  MOTO_B_PWM(Duty);

}

/*******************************************************************************************************

*名称:MOTO_forward()                              

*功能:电机正转                                      

*入口参数:Duty  占空比

*出口参数:无

********************************************************************************************************/

void MOTO_forward()

{

  MOTO_L_forward(50);

  MOTO_R_forward(50);  

}                          //控制直流电机占空比为50%,正转

/*******************************************************************************************************

*名称:MOTO_back()                              

*功能:电机反转                                      

*入口参数:Duty  占空比

*出口参数:无

********************************************************************************************************/

void MOTO_back()

{

  MOTO_L_back(50);

  MOTO_R_back(50);                               //控制直流电机占空比为50%,反转

}

/*******************************************************************************************************

*名称:MOTO_left()                              

*功能:电机左转                                      

*入口参数:Duty  占空比

*出口参数:无

********************************************************************************************************/

void MOTO_left()

{

  MOTO_R_forward(50);

  MOTO_L_forward(0);                             //控制电机左转

}        

/*******************************************************************************************************

*名称:MOTO_right()                              

*功能:电机右转                                      

*入口参数:Duty  占空比

*出口参数:无

********************************************************************************************************/

void MOTO_right()

{

  MOTO_L_forward(50);               

  MOTO_R_forward(0) ;                             //控制电机右转

}

/*******************************************************************************************************

*名称:MOTO_speed1()                              

*功能:电机正转                                      

*入口参数:Duty  占空比

*出口参数:无

********************************************************************************************************/

void MOTO_speed1()

{

  MOTO_L_forward(100);

  MOTO_R_forward(100);                           //电机加速

}

/*******************************************************************************************************

*名称:MOTO_speed2()                              

*功能:电机正转                                      

*入口参数:Duty  占空比

*出口参数:无

********************************************************************************************************/

void MOTO_speed2()

{

  MOTO_L_forward(50);

  MOTO_R_forward(50);                            //电机正常速度

}

/*******************************************************************************************************

*名称:MOTO_speed3()                              

*功能:电机正转                                      

*入口参数:Duty  占空比

*出口参数:无

********************************************************************************************************/

void MOTO_speed3()

{

  MOTO_L_forward(20);

  MOTO_R_forward(20);                            //电机减速  

}

/*******************************************************************************************************/

void __irq IRQ_Eint1(void)

{

  unsigned char j,k,N=0;

// MOTO_forward();

  PINSEL0&=0xcfffffff;     //设置P0.14为GPIO功能

  IO0DIR=IO0DIR&(~(1<<14));

  //IO0DIR|=IRIN;

  //IO0SET|=IRIN;        //I/O口初始化

  T=IO0PIN&IRIN;


  VICIntEnClr=(1<<15);//禁止外部中断1   

  delay(15);

  if(T!=0)       //然后再检测红线接收脚是有数据招收,有继续,没有则退出

  {

    VICIntEnable=(1<<15);          //打开中断

    return;             //跳出去

  }                       //确认IR信号出现


  while (!T)  //等IR变为高电平,跳过9ms的前导低电平信号。

  {delay(1);}        

  for (j=0;j<4;j++)         //收集四组数据前两组为地址码,仅仅接着是两个命令码,这是NEC公司所定义的协议里规定的

  {

    for (k=0;k<8;k++)        //每组数据有8位

    {T= IO0PIN&IRIN;

      while (T)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。

      {delay(1);}

      T= IO0PIN&IRIN;

      while (!T)          //等 IR 变为高电平

      {delay(1);}

      T=IO0PIN&IRIN;

      while (T)           //计算IR高电平时长

      {

        delay(1);

        N++;           

        if (N>=30)

            {VICIntEnable=(1<<15);//允许外部中断1中断;

             return;            //太长了就自动推出中断服务程序

            }                     //0.14ms计数过长自动离开。

      }                        //高电平计数完毕

     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”

     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”                        

     N=0;

    }//end for k

  }//end for j

   if(IRCOM[2]!=~IRCOM[3])   //判断接收到指令是不是正确

     {VICIntEnable=(1<<15);//允许外部中断1中断

       return;

     }

          switch(IRCOM[2])

      {

            case 0x16:

             MOTO_forward();                  //控制直流电机占空比为50%,正转               

         break;

         case 0x0c:                                                

             MOTO_back();                          //控制直流电机占空比为50%,反转   

         break;

         case 0x18:                        

             MOTO_left();                         //控制电机左转        

         break;

         case 0x5e:                        

             MOTO_right();                        //控制电机右转

         break;

         case 0x08:               

             MOTO_speed1();                     //电机加速

         break;

         case 0x1c:

         MOTO_speed2();                           //电机正常速度

         break;

         case 0x5a:

             MOTO_speed3();                            //电机减速   

         break;

         case 0x42:

             STOP();                                        //控制直流电机停止

         break;

      }

      VICIntEnable=(1<<15);//允许外部中断1中断

EXTINT=0x02;

VICVectAddr=0x00;

}   

/*******************************************************************************************************/

void Eint1_Init(void)

{

    /*设置P0.14为外部中断1*/

    PINSEL0=(PINSEL0&0xcfffffff|0x20000000);

    EXTMODE|=(1<<1);                 //设置外部中断为边沿触发模式

    EXTPOLAR&=~(1<<1);               //设置为下降沿触发

    IRQEnable();

    /*采用向量IRQ开启EXINT1*/

    VICIntSelect=VICIntSelect&(~(1<<15));          //设置所有中断1为IRQ中断

    VICVectCntl0=0x2f;

    VICVectAddr0=(uint32)IRQ_Eint1;     //设置中断服务程序地址

    EXTINT=0x02;                     //清零EINT1中断标志

    VICIntEnable=1<<15;              //使能EINTI中断

}


/*******************************************************************************************************/

int main(void)

{


  PWM_Init(200,0);

  Eint1_Init();

  while(1);

  return(0);      

}

/**********************************************************/

void delay(unsigned char x)    //x*0.14MS

{

unsigned char i;

  while(x--)

{

  for (i = 0; i<13; i++) {}

}

}


/**********************************************************/

void delay1(int ms)

{

unsigned char y;

  while(ms--)

{

  for(y = 0; y<250; y++){}

}

}



谢谢小编的分享

学习学习,谢谢分享!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top