打印

【TI 技术资料分享】+红外线解码资料源程序

[复制链接]
959|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
必胜客A|  楼主 | 2015-3-10 17:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于MSP430F149为主芯片下的红外线解码资料源程序 基于MSP430F149为主芯片下的红外线解码资料源程序.zip (37.8 KB)
//******************************************************************************
//  MSP430P149 Demo - InfraredRX, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK
//
//  Description: Echo a received character, RX ISR used. Normal mode is LPM3,
//  USART1 RX interrupt triggers TX Echo.
//  ACLK = UCLK1 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k
//  Baud rate divider with 32768hz XTAL [url=home.php?mod=space&uid=681799]@9600[/url] = 32768Hz/9600 = 3.41 (0003h 4Ah )
//  //* An external watch crystal is required on XIN XOUT for ACLK *//       
//
//
//                MSP430F149
//            -----------------
//        /|\|              XIN|-
//         | |                 | 32kHz
//         --|RST          XOUT|-
//           |                 |
//           |                 |
//           |           P2.7  |<----INR_RXD
//           |                 |
//
//  Copyright (c) 2009.04  WH, All Rights Reserved.
//  WebSite:www.smart-dz.cn
//  Description : The InfraredRX module
//  History     :                                                           
//     [Author]   [Date]      [Version]    [Description]                     
//     [1] dragonhzw   2009/04/09  Ver 1.0.0    Initial file.
//
//  Built with IAR Assembler for MSP430V3.20A/W32 (3.20.1.9)
//******************************************************************************
#include <msp430x14x.h>
#include "InfraredRX.h"
//-------------------------------------------------------------------------------
unsigned char  dis_code[18] = {0x3f,0x06,0x5b,0x4f,0x66,  //段码表   
                              // 0    1   2    3    4      对应内容   
                           0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};   
                          // 5    6    7    8    9   A    B    C     D    E    F




unsigned char  dis_0 = 0;     // 个位值   
unsigned char  dis_1 = 0;     // 十位值   
unsigned char  dis_2 = 0;     // 百位值   
unsigned char  dis_3 = 0;     // 千位值  
                       
unsigned char  IR_State=IR_Idle;//接收状态变量,初值为空闲
unsigned char  IR_Ready=0;//数据接收完标志
unsigned char  IR_Repeat=0;//连发标志
unsigned char  IR_Data[4]={0,0,0,0};//接收到的4字节数据
unsigned char  Tmp;
unsigned char  IRtimer=0;
//--------------------------------------------------------------------------------
/***FUNC+*********************************************************************/
/* Name   : Port2INT                                                         */
/* Descrp : 端口1中断处理程序                                                */
/* Input  : num.                                                             */   
/* Output : None.                                                            */
/* Return : None.                                                            */   
/***FUNC-*********************************************************************/
#pragma vector=PORT2_VECTOR
__interrupt void Port2INT(void)
{
    unsigned int Count;
    //红外线接收头中断
    if(P2IFG&BIT7)
    {
      Count= TAR;//读取计数值
      TACTL|=MC0+TACLR;//定时器B重新开始计数
      switch(IR_State)
      {
        case IR_Idle:
        {
          IR_State = IR_WaitStart;
          IRtimer = 11;
          break;
        }
        case IR_WaitStart:
        {
            if((Count>ms_125)&&(Count<ms_15))
            {
                //接收到引导码
                IR_Data[0]=0;
                IR_Data[1]=0;
                IR_Data[2]=0;
                IR_Data[3]=0;
                Tmp=1;
                IR_Repeat=0;
                IR_State=IR_GetAddress;
            }
            else if((Count>ms_9)&&(Count<ms_125))
            {//接收连发代码
                IR_Repeat=1;
                IR_State=IR_Idle;   
            }
            else
            {
                IR_State=IR_Idle;
            }
            break;
        }
        case IR_GetAddress:
        {         
            if(Count>ms_168)
            {//接收到1
                IR_Data[0]|=Tmp;
            }
            Tmp<<=1;
            if(!Tmp)
            {
                IR_State=IR_GetAddressInv;
                Tmp=1;
            }
            break;
       }
       case IR_GetAddressInv:
       {
            if(Count>ms_168)
            {//接收到1
                IR_Data[1]|=Tmp;
            }
            Tmp<<=1;
            if(!Tmp)
            {
                IR_State=IR_GetData;
                Tmp=1;
            }
        break;
       }
       case IR_GetData:
       {
            if(Count>ms_168)
            {//接收到1
                IR_Data[2]|=Tmp;
            }
            Tmp<<=1;
            if(!Tmp)
            {
                IR_State=IR_GetDataInv;
                Tmp=1;
            }
         break;
        }
        case IR_GetDataInv:
        {
            if(Count>ms_168)
            {//接收到1
                IR_Data[3]|=Tmp;
            }
            Tmp<<=1;
            if(!Tmp)
            {      
                if(((IR_Data[0]^IR_Data[1])==0xFF)&&((IR_Data[2]^IR_Data[3])==0xFF))
                    IR_Ready=1;//校验数据
                IR_State=IR_Idle;
            }
        break;
        }
        default:
        {
            IR_State=IR_Idle;
            break;
        }
      }
    }
    P2IFG=0x00;//清除中断标志位
}
/***FUNC+*********************************************************************/
/* Name   : InitTimerA                                                       */
/* Descrp : 定时器A初始化                                                    */
/* Input  : num.                                                             */   
/* Output : None.                                                            */
/* Return : None.                                                            */   
/***FUNC-*********************************************************************/
void InitTimerA(void)
{
  TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK 增计数 清除TAR
  TACCR0=65535;//时间间隔10ms
}
/***FUNC+*********************************************************************/
/* Name   : InitTimerB                                                       */
/* Descrp : 定时器B初始化                                                    */
/* Input  : num.                                                             */   
/* Output : None.                                                            */
/* Return : None.                                                            */   
/***FUNC-*********************************************************************/
void InitTimerB(void)
{
  TBCTL=TBSSEL1+ID1+ID0+MC0+TBCLR;//选择1/8SMCLK 增计数 清除TBR
  TBCCTL0=CCIE;//CCR0中断允许 比较模式
  TBCCR0=10000;//时间间隔10ms
}
/***FUNC+*********************************************************************/
/* Name   : TimerBINT                                                        */
/* Descrp : 定时器B中断                                                      */
/* Input  : num.                                                             */   
/* Output : None.                                                            */
/* Return : None.                                                            */   
/***FUNC-*********************************************************************/
#pragma vector=TIMERB0_VECTOR
__interrupt void TimerBINT(void)
{
    if(IRtimer)
    {
        IRtimer--;
    }
    else
    {
        IR_State = IR_Idle;//解码超时
    }
}
/***FUNC+*********************************************************************/
/* Name   : Init_CLK                                                         */
/* Descrp : Set PLL Clock.                                                   */
/* Input  : None.                                                            */   
/* Output : None.                                                            */
/* Return : None.                                                            */   
/***FUNC-*********************************************************************/
void Init_CLK(void)
{
   int index;
   BCSCTL1&=~0X00;   //打开XT2振荡器
   do
   {
      IFG1 &= ~OFIFG;       // 清除振荡器失效标志
      for (index = 0xFF; index > 0; index--)// 延时,等待XT2起振
    {
        ;
    }
    } while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振
   
    BCSCTL2 =SELM_2+SELS;   //选择MCLK、SMCLK为XT2   
}

/*******  红外遥控器键值表  ******
45  46  47
44  40  43
07  15  09
16  19  0d
0c  18  5e
08  1c  5a
42  52  4a
**********************************/
/***FUNC+*********************************************************************/
/* Name   : main                                                             */
/* Descrp : 主程序                                                           */
/* Input  : num.                                                             */   
/* Output : None.                                                            */
/* Return : None.                                                            */   
/***FUNC-*********************************************************************/
void main( void )
{
    WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
    Init_CLK();//时钟初始化
    //Init_UART1();
    InitTimerA();//定时器A初始化
    InitTimerB();//定时器B初始化
    /****************************************************************************/
    /* 1、初始化数码管引脚                                                     */
    /****************************************************************************/
    // 将P4设置为I/O口
    P4SEL = 0x00;
    // 将P4设置为输出方向
    P4DIR = 0xFF;
    // 将P4口输出全高
    P4OUT = 0xFF;
    // 将P3设置为I/O口
    P3SEL = 0x00;
    // 将P3设置为输出方向
    P3DIR |= 0x0F;
    P3OUT = 0x0F;
    /****************************************************************************/
    /* 2、初始化红外线接收引脚                                                  */
    /****************************************************************************/
   
    P2DIR&=~BIT7;//P2.7设置为输入方向
   
    P2IES|=BIT7;//P2.7下降沿触发中断
    P2IE|=BIT7;//P2.7中断允许
    _EINT();//打开中断

    while(1)
    {
        if(IR_Ready==1)
        {   //计算要显示的每位数字
            while(1)
        {   //计算要显示的每位数字
              IR_Ready=0;  
              
              dis_0 = (IR_Data[2]&0xF0)>>4;//数码管后2位显示数据
              P4OUT = dis_code[dis_0];
              P3OUT &= ~BIT1;        // 开第一个显示(P2.2口控制个位数码管)   
              delay_ms(5);
              P3OUT |= BIT1;        // 关第一个显示(P2.2口控制个位数码管)
              
              dis_1 = (IR_Data[2]&0x0F);
              P4OUT = dis_code[dis_1];
              P3OUT &= ~BIT2;        // 开第一个显示(P2.2口控制个位数码管)   
              delay_ms(5);
              P3OUT |= BIT2;        // 关第一个显示(P2.2口控制个位数码管)

            
              P4OUT =0x76;//'H'
              P3OUT &= ~BIT3;        // 开第一个显示(P2.2口控制个位数码管)   
              delay_ms(5);
              P3OUT |= BIT3;        // 关第一个显示(P2.2口控制个位数码管)
        }
    }
    }
}
/***FUNC+*********************************************************************/
/* Name   : delay_ms                                                         */
/* Descrp : delay time                                                       */
/* Input  : num.                                                             */   
/* Output : None.                                                            */
/* Return : None.                                                            */   
/***FUNC-*********************************************************************/
void delay_ms(unsigned long ms)       // 延时毫秒@12M,ms最大值255   
{   
    unsigned char i;   
    while(ms--)   
        for(i = 0; i < 124; i++);   
}   


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

176

帖子

2

粉丝