ARM7LPC2131 红外遥控解码程序
程序能进入中断,但就是不能成功解码。求各位大神指点迷津
/*********************************************************************/
#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++){}
}
}
谢谢小编的分享
。
学习学习,谢谢分享!