单片机 MSP430G2553 红外接受 使用P2.0中断方式 使用一般方式


在这里插入图片描述
在这里插入图片描述

1 中断方式

1.1 IR.c

#include "IR.h"

#define CPU_F ( (double) 8000000)
#define delay_us( x )   __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x )   __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )
#define uchar   unsigned char
#define uint    unsigned int
#define ulong   unsigned long
#define u8  unsigned char
#define u16 unsigned int


uchar KEY_VAL = 0; /* 遥控的值 */
unsigned char code[4] = { 0x00, 0x00, 0x00, 0x00 };    //地址码,地址反码,数据码,数据反码

/*
 * ***********************************************************************
 *               MSP430IO口初始化
 * ***********************************************************************
 */
void initIRGPIO()
{
    RED_IN;
    P2IE |= BIT0;
    P2IES |= BIT0;
    P2IFG = 0;
}

/*
 * *************************************************************************
 *              遥控器键值赋功能值子程序
 * *************************************************************************
 */
void Key_Icode(void)
{
    switch (code[2])
    /* 第3个字节是数据,第4个字节是反码 */
    { /* 为了更稳定,可以加上第4个字节数据的判断 */
    case KEY_0:
        KEY_VAL = 0;
        break;
    case KEY_1:
        KEY_VAL = 1;
        break;
    case KEY_2:
        KEY_VAL = 2;
        break;
    case KEY_3:
        KEY_VAL = 3;
        break;
    case KEY_4:
        KEY_VAL = 4;
        break;
    case KEY_5:
        KEY_VAL = 5;
        break;
    case KEY_6:
        KEY_VAL = 6;
        break;
    case KEY_7:
        KEY_VAL = 7;
        break;
    case KEY_8:
        KEY_VAL = 8;
        break;
    case KEY_9:
        KEY_VAL = 9;
        break;
    case KEY_POWER:
        KEY_VAL = 10;
        break;

    default:
        KEY_VAL = 67;
        break;
    }
}
extern void doUserKeyInput(unsigned char keyValue);
//*********************红外遥控器中断程序*******************//
#pragma vector=PORT2_VECTOR   //中断程序的格式:#pragma vector=中断矢量
__interrupt void port2(void)  //格式:__interrupt void 函数名(void)
{
    P2IFG = 0X00;                     //清P1中断标志
    unsigned int i = 0, j = 0, time = 0;    //time高电平持续时间计数值
    if ((P2IN & BIT0) == 0)
    {
        for (i = 0; i < 7; i++)
        {
            delay_ms(1);
            if (P2IN & BIT0)    //9MS内有高电平,则判断为干扰,退出处理程序
            {
                return;
            }
        }
        while (!(P2IN & BIT0))
            ;  //等待9ms低电平过去,电平变为高电平
        for (i = 0; i < 4; i++)
        {
            for (j = 0; j < 8; j++)
            {
                while (P2IN & BIT0)
                    ;     //等待4.5ms 高电平过去
                while (!(P2IN & BIT0))
                    ;  //等待变高电平
                while (P2IN & BIT0)      //计算高电平时间
                {
                    delay_us(100);
                    time++;
                    if (time >= 30)      //高电平时间过长,则退出处理程序
                    {
                        return;
                    }
                }
                code[i] = code[i] >> 1;   //接收一位数据
                if (time >= 8)
                {
                    code[i] = code[i] | 0x80; //高电平时间大于0.56,则为数据1
                }
                time = 0;               //计时清零
            }
        }

        Key_Icode();
    }
}


1.2 IR.h


#ifndef __IR
#define __IR

#include "msp430g2553.h"

/* 红外接收头H1838控制脚,单脚控制 */
#define RED_IN  P2DIR   &= ~BIT0        /* 设置输入,红外接收头接单片机PE3口 */
#define RED_OUT P2DIR   |= BIT0         /* 设置输出 */
#define RED_L   P2OUT   &= ~BIT0        /* 置低电平 */
#define RED_H   P2OUT   |= BIT0         /* 置高电平 */
#define RED_R   (P2IN & BIT0)           /* 读电平 */
/*
 * ***********************************************************************
 *              遥控器键码
 * ***********************************************************************
 */

#define KEY_0       0x16            /* 键0 */
#define KEY_1       0x0C            /* 键1 */
#define KEY_2       0x18            /* 键2 */
#define KEY_3       0x5E            /* 键3 */
#define KEY_4       0x08            /* 键4 */
#define KEY_5       0x1C            /* 键5 */
#define KEY_6       0x5A            /* 键6 */
#define KEY_7       0x42            /* 键7 */
#define KEY_8       0x52            /* 键8 */
#define KEY_9       0x4A            /* 键9 */
#define KEY_POWER   0x45            /* 电源 */
#define KEY_MODE    0x46            /* 模式 */
#define KEY_SOUND   0x47            /* 静音 */

void initIRGPIO();

#endif

1.3 使用

KEY_VAL 为全局变量。

 while (1)
    {

        if (KEY_VAL != 0)
        {
            doUserKeyInput(KEY_VAL); /* 红外输入 传入1234 和硬件的按键一样 */
            KEY_VAL = 0;  //使用后归0  下次依旧可以使用
        }
     }

2 一般方式

2.1 IR.c

#include "IR.h"


#define CPU_F ( (double) 8000000)
#define delay_us( x )   __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x )   __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )
#define uchar   unsigned char
#define uint    unsigned int
#define ulong   unsigned long
#define u8  unsigned char
#define u16 unsigned int
uchar   KEY_VAL     = 0;            /* 遥控的值 */
uchar   code_value  = 0;
uchar   key_code[4];

/*
 * ***********************************************************************
 *               MSP430IO口初始化
 * ***********************************************************************
 */
void initIRGPIO()
{
    P2REN   |= BIT0 ;
    RED_H;
    RED_IN;
}

/*
 * *************************************************************************
 *              遥控器键值赋功能值子程序
 * *************************************************************************
 */
void Key_Icode( void )
{
    switch ( key_code[2] )  /* 第3个字节是数据,第4个字节是反码 */
    {                       /* 为了更稳定,可以加上第4个字节数据的判断 */
    case KEY_0:
        KEY_VAL = 0;
        break;
    case KEY_1:
        KEY_VAL = 1;
        break;
    case KEY_2:
        KEY_VAL = 2;
        break;
    case KEY_3:
        KEY_VAL = 3;
        break;
    case KEY_4:
        KEY_VAL = 4;
        break;
    case KEY_5:
        KEY_VAL = 5;
        break;
    case KEY_6:
        KEY_VAL = 6;
        break;
    case KEY_7:
        KEY_VAL = 7;
        break;
    case KEY_8:
        KEY_VAL = 8;
        break;
    case KEY_9:
        KEY_VAL = 9;
        break;
    case KEY_POWER:
        KEY_VAL = 10;
        break;

    default:
        KEY_VAL = 67;
        break;
    }
}


/*
 * *************************************************************************
 * 遥控器解码子程序
 * *************************************************************************
 */

void RedCode_UpdataKEY_VAL(void)
{
    uchar i, j, k = 0;

    for ( i = 0; i < 19; i++ )
    {
        delay_us( 400 );        /* 延时400us */
        if ( RED_R )            /* 9ms内有高电平,则判断为干扰,退出处理程序 */
        {
            return;
        }
    }

    while ( !RED_R )
        ;                       /* 等待9ms低电平过去 */

    for ( i = 0; i < 5; i++ )       /* 是否连发码 */
    {
        delay_us( 500 );
        if ( !RED_R )
        {
            return;
        }
    }

    while ( RED_R )
        ;                                       /* 等待4.5ms高电平过去 */

    for ( i = 0; i < 4; i++ )                       /* 接收4个字节的数据 */
    {
        for ( j = 0; j < 8; j++ )               /* 每个字节的数据8位 */
        {
            while ( !RED_R )
                ;                       /* 等待变高电平 */
            while ( RED_R )                 /* 计算高电平时间 */
            {
                delay_us( 100 );
                k++;
                if ( k > 22 )           /* 高电平时间过长,则退出处理程序 */
                {
                    return;
                }
            }

            code_value >>= 1;               /* 接受一位数据 */
            if ( k >= 7 )
            {
                code_value |= 0x80;     /* 高电平时间大于0.56,则为数据1 */
            }
            k = 0;                          /* 计时清零 */
        }
        key_code[i] = code_value;               /* 四个字节的数据 */
    }

    Key_Icode();                                    /* 调用赋值函数  KEY_VAL就是最后值 */
}

2.2 IR.h


#ifndef __IR
#define __IR

#include "msp430g2553.h"

/* 红外接收头H1838控制脚,单脚控制 */
#define RED_IN  P2DIR   &= ~BIT0        /* 设置输入,红外接收头接单片机PE3口 */
#define RED_OUT P2DIR   |= BIT0         /* 设置输出 */
#define RED_L   P2OUT   &= ~BIT0        /* 置低电平 */
#define RED_H   P2OUT   |= BIT0         /* 置高电平 */
#define RED_R   (P2IN & BIT0)           /* 读电平 */
/*
 * ***********************************************************************
 *              遥控器键码
 * ***********************************************************************
 */

#define KEY_0       0x16            /* 键0 */
#define KEY_1       0x0C            /* 键1 */
#define KEY_2       0x18            /* 键2 */
#define KEY_3       0x5E            /* 键3 */
#define KEY_4       0x08            /* 键4 */
#define KEY_5       0x1C            /* 键5 */
#define KEY_6       0x5A            /* 键6 */
#define KEY_7       0x42            /* 键7 */
#define KEY_8       0x52            /* 键8 */
#define KEY_9       0x4A            /* 键9 */
#define KEY_POWER   0x45            /* 电源 */
#define KEY_MODE    0x46            /* 模式 */
#define KEY_SOUND   0x47            /* 静音 */

void initIRGPIO();
void RedCode_UpdataKEY_VAL(void);


#endif

2.3 使用

 while (1)
    {
        RedCode_UpdataKEY_VAL();  //读取红外
        if (KEY_VAL != 0)
        {
            doUserKeyInput(KEY_VAL); /* 红外输入 传入1234 和硬件的按键一样 */
            KEY_VAL = 0;  //使用后归0  下次依旧可以使用
        }
    }
发布了105 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/104538401