MSP430G2接收红外遥控信号

   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();
}
				
时间: 2024-08-26 07:40:17

MSP430G2接收红外遥控信号的相关文章

基于STC12系列单片机的通用红外遥控信号分析程序(一)

前言 最近学51单片机学习到红外遥控解码与发送部分,开发板的相关教程只有NEC协议的解码,基本的解码套路是1838接收头输出管脚接单片机外部中断0,当接收到红外信号时产生下降沿触发中断,在中断函数中先延时9ms判断电平再延时4.5ms判断电平,从而跳过引导码:再分别延时560us.1690us左右不等的时间判断电平来解码“0”或“1”,直到结束:红外发送思路就是根据NEC协议及红外码值的二进制码分别控制高低电平,并延时相应的时间.但存在这么几个问题: 1. 解码逻辑写死在中断处理函数中,不方便扩

[每日电路图] 2、红外遥控电路原理设计与解析【转+解读】

          楼主说:本文主要讲一个红外遥控电路的原理及设计,第四部分是重点,用电路图说明具体过程——接收,计数,满足条件触发控制电路! from elecfans:http://www.elecfans.com/article/88/131/198/2015/20151215394306.html 一.概述: 红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波:红外接收电路由红外接收二极管.三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器.

cortex_m3_stm32嵌入式学习笔记(二十三):红外遥控实验(输入捕捉+解码)

红外遥控是一种无线.非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中. 红外遥控的编码方式目前广泛使用的是: PWM(脉冲宽度调制)的 NEC 协议和 PhilipsPPM(脉冲位置调制) 的 RC-5 协议的.ALIENTEK MiniSTM32 开发板配套的遥控器使用的是NEC 协议,其特征如下: 1. 8 位地址和 8 位指令长度: 2.地址和命令 2 次传输(确保可靠性) 3. PWM

基于短消息的远程家电红外遥控系统

通过远程广域网控制家电设备是信息家电的主要发展方向之一.由于价格低廉.覆盖面广.使用方便等原因,短消息平台已经成为远程家电控制的重要方法. 本文研究和开发了一种基于短消息的远程红外遥控系统.该系统以Java语言应用程序作为客户控制终端,以短消息作为控制信号的传输平台,以家电常用的红外遥控器作为控制设备,形成了比较完备的远程家电控制系统原型. 本文首先分析了广域网传输技术.家电控制设备.客户控制终端等三个关键技术的选型问题,并据此提出了系统设计的总体结构. 随后,本文介绍了系统的硬件设计,着重讨论

[原创]基于51单片机的红外遥控课程设计

[注]: 一眨眼,大学接近尾声,具有找工作需要,所以把大学做的电子设计“劣作”放上来.希望考研失意,还能赶上“好工作”的春招班车.如果大伙有什么工作推荐也可以联系我哦,因为一年考研少接触了这方面,所以难免有些生疏.但请相信我!给我机会我会很认真学的! 邮箱:[email protected] 转载请注明出处呀! 基于51单片机的红外遥控课程设计 目录 第一章 设计简介... 3 第二章 系统方案... 3 一.设计方案对比... 3 二.方案设计... 4 第三章 硬件设计... 5 一.红外遥

基于STC89C52的oled红外遥控闹钟

这个红外遥控主要是程序通过对按下的键的键码进行解析,并运行相应的功能代码 一次按键动作的遥控编码信息为 32 位串行二进制码.对于二进制信号“0”,一个脉冲占 1.2ms:对于二进制信号“1”,一个脉冲占 2.4ms,而每一脉冲内低电平均为 0.6ms.从起始标志到 32 位编码脉冲发完大约需80ms,此后遥控信号维持高电平.若按键未释放,则从起始标志起每隔 108ms 发出 3 个脉冲的重复标志.在 32 位的编码脉冲中,前 16 位码不随按键的不同而变化,我们称之为用户码.它是为了表示特定用

基于Arduino的红外遥控

1.红外接收头介绍  一.什么是红外接收头?  红外遥控器发出的信号是一连串的二进制脉冲码.为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管发射出去,而红外线接收装置则要滤除其他杂波,叧接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调. 二.工作原理  内置接收管将红外发射管发射出来癿光信号转换为微弱的电信号,此信号经由IC内部放大器进行放大,然后通过自动增益控制.带通滤波.解调变.波形整形后还原为遥控器发射出的原始编码,经由接

RTL-SDR + GnuRadio+RFcat 分析、重放无线遥控信号

0×00 前言 前段时间在<永不消逝的电波(二)HackRF入门:家用无线门铃信号重放> 一文中通过HackRF录制.重放了无线遥控信号,不过一直没来得及对信号进行分析,刚好在国外网站看到有大牛对遥控信号进行了分析(详见refer部分).在这里便按照国外大牛分析无线遥控信号的方法来依葫芦画瓢. *本文仅分享信号分析方式,因信号调制编码方式有所不同,如数据分析有出错,希望大家不要打我= ̄ω ̄=  0×01 环境搭建 Mac可使用port(www.macports.org) 或者brew(brew

红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法

最近在调试红外遥控格力空调,在论坛中学到了不少东西.参考: (1)<解决问题系列(4)--红外编码分析利器使用> (2)<315Mhz模块传输替代315Mhz遥控器> 调试环境: 软件:Arduino IDE 1.0 硬件:Arduino uno r3 问题分> 我使用的遥控器型号是YAD0F. 在使用逻辑分析仪dump出原始码之后,使用sendRaw函数来发送原始码,发现空调没有反应.原始码如下: 9004,4499,699,1609,697,511,695,511,695