#include<msp430x14x.h>
//*************************************************
//***********基于MSP430的红外遥控器解码程序
//***********利用I/O口的中断功能结合定时间器,捕捉周期时间确定数值
//***********每16位编码表示一个按键
//***********只检测了1-6号键盘,其他的按照同样方式进行解码,相信你能做得到
//***********注意起始条件的判断
int count=0;//接受脉冲计数,16个信号
int overflow=0;//定时器A溢出次数计数
int biao=0;//起始标志位
unsigned int ki;//键值
unsigned int temp2=0;//定时器计数值
int d[33]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//脉冲时间保存
void Init_System(void)
{
Init_CLK();
Init_TimerA();
P2IE|=BIT3;
P2IES|=BIT3;
}
void Init_TimerA(void)
{
TACTL=TACLR+TASSEL1+ID1; //时钟源=ACLK,8分频,清TAR
TACCTL0=CCIE; //CCR0中断允许
TACCR0=60000; //定时125ms
TACTL|=MC0; //开始计数,增计数模式
}
//***************系统时钟设置****************//
// 主时钟MCLK=SMCLK=4M //
// 辅助时钟ACLK=32768 //
//*******************************************//
void Init_CLK(void)
{
unsigned int i;
BCSCTL1&=~(XT2OFF+XTS);
// XT2on,ACLK为32768
//BCSCTL1&=~(XTS);
BCSCTL2 |= SELM1+SELS; // MCLK = SMCLK = XT2
do {
IFG1 &=~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG) != 0); // fail?
}
////============主函数==============////
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
Init_System(); //系统初始化
_EINT(); //开总中断
while(1); //等待中断
}
////===============定时中断=============////
#pragma vector=TIMERA0_VECTOR
__interrupt void Lamp_Drive(void)
{
overflow++;
}
#pragma vector=PORT2_VECTOR
__interrupt void yaokong(void)
{
int i;
unsigned int temp1;
temp1=TAR;
P1OUT|=Light1;
P2IFG=0x00;
P2IE&=~BIT3;
_EINT();
for(i=0;i<=50;i++);//调试的过程中发现一干扰信号,此延时用来屏蔽干扰
if ((P2IN&BIT3)!=0x00)
{
P2IFG=0x00;
P2IE|=BIT3;
P1OUT&=~Light1;
return;
}
if(biao==0)
{
for(i=0;i<1000;i++)//起始位,注意起始位的判断
{
if((P2IN&BIT3)!=0x00)
break;
}
if(i==1000)
{
biao=1;
count=0;
overflow=0;
}
}
else
{
if(count<=16)
{
if(overflow==0)
{
d[count]=temp1-temp2;
}
else
{
d[count]=temp1+60000-temp2;
overflow=0; //时间保存数组D[j]
}
if(count==16)
{
unsigned int tempui;
ki=0;
tempui=1;
for(i=1;i<=16;i++)
{
if(d[i]>=1500)
ki |= tempui;
tempui=tempui<<1;//计数大于1500则表示数据位1
}
biao=0;
if (ki==0x2102||ki==0x2302||ki==0x2502||ki==0x2702||ki==0x2902||ki==0x2B02)
{ if(ki==0x2102)
ki=1;
if(ki==0x2302)
ki=2;
if(ki==0x2502)
ki=3;
if(ki==0x2702)
ki=4;
if(ki==0x2902)
ki=5;
if(ki==0x2B02)
ki=6;
Concentr=(unsigned int)ki;
Disp_Current(Concentr,Temp);
}
}
}
count++;
}
temp2=temp1;
P2IFG=0x00;
P2IE|=BIT3;
//P1OUT&=~Light1;
} |