码迷,mamicode.com
首页 > 其他好文 > 详细

MSP430G2接收红外遥控信号

时间:2015-05-23 15:29:56      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:

   launch pad接收红外信号经此程序处理后以不同的值保存在char red中,数码管显示出按键对应的char red的值。可由此修改程序完成遥控。
  此例中红外线发射格式:9ms高电平引导码+4.5ms结果码+53.76ms逻辑编码(有效数据)区,在逻辑编码区内的串行数据,0.56ms 的低电平+0.56ms 的高电平编码为0, 0.56ms 的低电平+ 1.68ms 的高电平编码为1。

//引脚:p2.3,p2.4,p1口控制数码管的扫描显示。P2.0为红外接受输入口。
#include <msp430.h>
#define IRIN (P2IN&BIT0) //红外接收头输入值
unsigned char red,new;
unsigned char Time,dat[4];
unsigned char CODE[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };
/*
 * 延时
 */
void delay_1ms(unsigned int nValue)//delay 1ms at 8M
{
    unsigned int nCount;
    unsigned int ii;
    unsigned int jj;
    nCount = 1980;
    
    for(ii = nValue;ii > 0;ii--)
    {
        for(jj = nCount;jj > 0;jj--)
        _NOP();
    }
}

void delay_5us(unsigned int nValue)//delay 5us at 8M
{
    unsigned int ii;

    for(ii = 2*nValue;ii > 0;ii--)
    {
        _NOP();_NOP();_NOP();_NOP();
        _NOP();_NOP();_NOP();_NOP();
        _NOP();_NOP();_NOP();_NOP();
        _NOP();_NOP();_NOP();_NOP();
    }
}

/********************************************************************************
 * Show()
 ********************************************************************************/
void Show()
{
    int i;
    
    for( i=0;i<3;i++ )
    {
        char x,y,z;
        x=red%10;
        y=red/10 %10;
        z=red/100 %10;

        switch(i)
        {
        case 0:P2OUT =0X00;                   P1OUT=CODE[x];                break;
        case 1:P2OUT =BIT3;                    P1OUT=CODE[y];                break;
        case 2:P2OUT =BIT4;                    P1OUT=CODE[z];                break;
        }
    }
}

/*******************************************************************************
* 函数名  : ReadIr()
* 函数功能  : 获取红外数值
* 说明  :用示波器观察红外接收头输出波形或者参考相关资料来解码,
* 本例中9ms高电平引导码+4.5ms结果码+53.76ms逻辑编码(有效数据)区,
* 在逻辑编码区内的串行数据,0.56ms 的低电平+0.56ms 的高电平编码为0, 0.56ms 的低电平+ 1.68ms 的高电平编码为1,
* 编码结果共 32 位,占用 4 个字节,其高字节 C31-C24 为遥控器识别码,C23-C16 为
* 遥控器识别码的反码,即遥控识别码和遥控识别反码之和为 0xFFFF,
* 按键操作码是不同遥控器的识别码,即不同遥控器的遥控识别码不同,同一遥控器不同按键的遥控识别码相同。 
* 其低字节 C15-C8 为按键操作码,C7-C0 为按键操作码的反码,即按键操作码和按键操作
* 反码之和为 0xFFFF,同一遥控器不同按键的按键操作码不同。 
*******************************************************************************/
void ReadIr(void)
{
    char j,k,n=0;

    if((P2IFG&BIT0) == BIT0)
    {
        P2IFG &= ~BIT0; //清除P1.0中断标志
        P2IE &=~BIT0; //关闭P1.0中断功能
        delay_1ms(2);
        if (IRIN==1)
             {
                P2IE |=BIT0;
                return;
              }
        while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
             {
                delay_5us(28);
                n++;
                if(n>100){P2IE|=BIT0;return;}
             }
        n=0;
        for (j=0;j<4;j++)
        {
            for (k=0;k<8;k++)
            {
                while (IRIN) //等 IR 变为低电平
                { delay_5us(28); }
                while (!IRIN) //等 IR 变为高电平
                { delay_5us(28); }
                while (IRIN) //计算IR高电平时长
                {
                    delay_5us(28);
                    n++;
                    if (n>=30){P2IE|=BIT0;return;}
                }
                dat[j]=dat[j] >> 1;
                if (n>=11) {dat[j] = dat[j]|0x80;}
                n=0;
            }
        }
    if ((dat[2]+dat[3])!= 0xff) {P2IE|=BIT0;return;}
    P2IE|=BIT0;
    new=1;
    red=dat[2];
    }
    delay_1ms(10);
}
/****************************************************************************
*函数名:main
*输  入:无
*输  出:无
*功  能:主函数
****************************************************************************/
void main (void)
{
    WDTCTL = WDTPW + WDTHOLD;

    if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
    {
       while(1);                               // If calibration constants erased       do not load, trap CPU!!
    }
    BCSCTL1 = CALBC1_8MHZ;                    // Set range
    DCOCTL = CALDCO_8MHZ;                     // Set DCO step + modulation */
    
    P1DIR =0xff;
    P2DIR =0xfe;
    P2IES |=BIT0;
    P2IE |=BIT0;
    
    _EINT();

    while(1)
        {
            Show();
        }
}

#pragma vector=PORT2_VECTOR
__interrupt void CNM()
{
    ReadIr();
}

MSP430G2接收红外遥控信号

标签:

原文地址:http://www.cnblogs.com/chuckle/p/4524111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!