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

2019-07-30 17:39发布

基于MSP430F149为主芯片下的红外线解码资料源程序 基于MSP430F149为主芯片下的红外线解码资料源程序.zip (37.8 KB, 下载次数: 7) 2015-3-10 17:03 上传 点击文件名下载附件
  1. //******************************************************************************
  2. //  MSP430P149 Demo - InfraredRX, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK
  3. //
  4. //  Description: Echo a received character, RX ISR used. Normal mode is LPM3,
  5. //  USART1 RX interrupt triggers TX Echo.
  6. //  ACLK = UCLK1 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k
  7. //  Baud rate divider with 32768hz XTAL [url=home.php?mod=space&uid=681799]@9600[/url] = 32768Hz/9600 = 3.41 (0003h 4Ah )
  8. //  //* An external watch crystal is required on XIN XOUT for ACLK *//       
  9. //
  10. //
  11. //                MSP430F149
  12. //            -----------------
  13. //        /||              XIN|-
  14. //         | |                 | 32kHz
  15. //         --|RST          XOUT|-
  16. //           |                 |
  17. //           |                 |
  18. //           |           P2.7  |<----INR_RXD
  19. //           |                 |
  20. //
  21. //  Copyright (c) 2009.04  WH, All Rights Reserved.
  22. //  WebSite:www.smart-dz.cn
  23. //  Description : The InfraredRX module
  24. //  History     :                                                           
  25. //     [Author]   [Date]      [Version]    [Description]                     
  26. //     [1] dragonhzw   2009/04/09  Ver 1.0.0    Initial file.
  27. //
  28. //  Built with IAR Assembler for MSP430V3.20A/W32 (3.20.1.9)
  29. //******************************************************************************
  30. #include <msp430x14x.h>
  31. #include "InfraredRX.h"
  32. //-------------------------------------------------------------------------------
  33. unsigned char  dis_code[18] = {0x3f,0x06,0x5b,0x4f,0x66,  //段码表   
  34.                               // 0    1   2    3    4      对应内容   
  35.                            0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};   
  36.                           // 5    6    7    8    9   A    B    C     D    E    F




  37. unsigned char  dis_0 = 0;     // 个位值   
  38. unsigned char  dis_1 = 0;     // 十位值   
  39. unsigned char  dis_2 = 0;     // 百位值   
  40. unsigned char  dis_3 = 0;     // 千位值  
  41.                        
  42. unsigned char  IR_State=IR_Idle;//接收状态变量,初值为空闲
  43. unsigned char  IR_Ready=0;//数据接收完标志
  44. unsigned char  IR_Repeat=0;//连发标志
  45. unsigned char  IR_Data[4]={0,0,0,0};//接收到的4字节数据
  46. unsigned char  Tmp;
  47. unsigned char  IRtimer=0;
  48. //--------------------------------------------------------------------------------
  49. /***FUNC+*********************************************************************/
  50. /* Name   : Port2INT                                                         */
  51. /* Descrp : 端口1中断处理程序                                                */
  52. /* Input  : num.                                                             */   
  53. /* Output : None.                                                            */
  54. /* Return : None.                                                            */   
  55. /***FUNC-*********************************************************************/
  56. #pragma vector=PORT2_VECTOR
  57. __interrupt void Port2INT(void)
  58. {
  59.     unsigned int Count;
  60.     //红外线接收头中断
  61.     if(P2IFG&BIT7)
  62.     {
  63.       Count= TAR;//读取计数值
  64.       TACTL|=MC0+TACLR;//定时器B重新开始计数
  65.       switch(IR_State)
  66.       {
  67.         case IR_Idle:
  68.         {
  69.           IR_State = IR_WaitStart;
  70.           IRtimer = 11;
  71.           break;
  72.         }
  73.         case IR_WaitStart:
  74.         {
  75.             if((Count>ms_125)&&(Count<ms_15))
  76.             {
  77.                 //接收到引导码
  78.                 IR_Data[0]=0;
  79.                 IR_Data[1]=0;
  80.                 IR_Data[2]=0;
  81.                 IR_Data[3]=0;
  82.                 Tmp=1;
  83.                 IR_Repeat=0;
  84.                 IR_State=IR_GetAddress;
  85.             }
  86.             else if((Count>ms_9)&&(Count<ms_125))
  87.             {//接收连发代码
  88.                 IR_Repeat=1;
  89.                 IR_State=IR_Idle;   
  90.             }
  91.             else
  92.             {
  93.                 IR_State=IR_Idle;
  94.             }
  95.             break;
  96.         }
  97.         case IR_GetAddress:
  98.         {         
  99.             if(Count>ms_168)
  100.             {//接收到1
  101.                 IR_Data[0]|=Tmp;
  102.             }
  103.             Tmp<<=1;
  104.             if(!Tmp)
  105.             {
  106.                 IR_State=IR_GetAddressInv;
  107.                 Tmp=1;
  108.             }
  109.             break;
  110.        }
  111.        case IR_GetAddressInv:
  112.        {
  113.             if(Count>ms_168)
  114.             {//接收到1
  115.                 IR_Data[1]|=Tmp;
  116.             }
  117.             Tmp<<=1;
  118.             if(!Tmp)
  119.             {
  120.                 IR_State=IR_GetData;
  121.                 Tmp=1;
  122.             }
  123.         break;
  124.        }
  125.        case IR_GetData:
  126.        {
  127.             if(Count>ms_168)
  128.             {//接收到1
  129.                 IR_Data[2]|=Tmp;
  130.             }
  131.             Tmp<<=1;
  132.             if(!Tmp)
  133.             {
  134.                 IR_State=IR_GetDataInv;
  135.                 Tmp=1;
  136.             }
  137.          break;
  138.         }
  139.         case IR_GetDataInv:
  140.         {
  141.             if(Count>ms_168)
  142.             {//接收到1
  143.                 IR_Data[3]|=Tmp;
  144.             }
  145.             Tmp<<=1;
  146.             if(!Tmp)
  147.             {      
  148.                 if(((IR_Data[0]^IR_Data[1])==0xFF)&&((IR_Data[2]^IR_Data[3])==0xFF))
  149.                     IR_Ready=1;//校验数据
  150.                 IR_State=IR_Idle;
  151.             }
  152.         break;
  153.         }
  154.         default:
  155.         {
  156.             IR_State=IR_Idle;
  157.             break;
  158.         }
  159.       }
  160.     }
  161.     P2IFG=0x00;//清除中断标志位
  162. }
  163. /***FUNC+*********************************************************************/
  164. /* Name   : InitTimerA                                                       */
  165. /* Descrp : 定时器A初始化                                                    */
  166. /* Input  : num.                                                             */   
  167. /* Output : None.                                                            */
  168. /* Return : None.                                                            */   
  169. /***FUNC-*********************************************************************/
  170. void InitTimerA(void)
  171. {
  172.   TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK 增计数 清除TAR
  173.   TACCR0=65535;//时间间隔10ms
  174. }
  175. /***FUNC+*********************************************************************/
  176. /* Name   : InitTimerB                                                       */
  177. /* Descrp : 定时器B初始化                                                    */
  178. /* Input  : num.                                                             */   
  179. /* Output : None.                                                            */
  180. /* Return : None.                                                            */   
  181. /***FUNC-*********************************************************************/
  182. void InitTimerB(void)
  183. {
  184.   TBCTL=TBSSEL1+ID1+ID0+MC0+TBCLR;//选择1/8SMCLK 增计数 清除TBR
  185.   TBCCTL0=CCIE;//CCR0中断允许 比较模式
  186.   TBCCR0=10000;//时间间隔10ms
  187. }
  188. /***FUNC+*********************************************************************/
  189. /* Name   : TimerBINT                                                        */
  190. /* Descrp : 定时器B中断                                                      */
  191. /* Input  : num.                                                             */   
  192. /* Output : None.                                                            */
  193. /* Return : None.                                                            */   
  194. /***FUNC-*********************************************************************/
  195. #pragma vector=TIMERB0_VECTOR
  196. __interrupt void TimerBINT(void)
  197. {
  198.     if(IRtimer)
  199.     {
  200.         IRtimer--;
  201.     }
  202.     else
  203.     {
  204.         IR_State = IR_Idle;//解码超时
  205.     }
  206. }
  207. /***FUNC+*********************************************************************/
  208. /* Name   : Init_CLK                                                         */
  209. /* Descrp : Set PLL Clock.                                                   */
  210. /* Input  : None.                                                            */   
  211. /* Output : None.                                                            */
  212. /* Return : None.                                                            */   
  213. /***FUNC-*********************************************************************/
  214. void Init_CLK(void)
  215. {
  216.    int index;
  217.    BCSCTL1&=~0X00;   //打开XT2振荡器
  218.    do
  219.    {
  220.       IFG1 &= ~OFIFG;       // 清除振荡器失效标志
  221.       for (index = 0xFF; index > 0; index--)// 延时,等待XT2起振
  222.     {
  223.         ;
  224.     }
  225.     } while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振
  226.    
  227.     BCSCTL2 =SELM_2+SELS;   //选择MCLK、SMCLK为XT2   
  228. }

  229. /*******  红外遥控器键值表  ******
  230. 45  46  47
  231. 44  40  43
  232. 07  15  09
  233. 16  19  0d
  234. 0c  18  5e
  235. 08  1c  5a
  236. 42  52  4a
  237. **********************************/
  238. /***FUNC+*********************************************************************/
  239. /* Name   : main                                                             */
  240. /* Descrp : 主程序                                                           */
  241. /* Input  : num.                                                             */   
  242. /* Output : None.                                                            */
  243. /* Return : None.                                                            */   
  244. /***FUNC-*********************************************************************/
  245. void main( void )
  246. {
  247.     WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
  248.     Init_CLK();//时钟初始化
  249.     //Init_UART1();
  250.     InitTimerA();//定时器A初始化
  251.     InitTimerB();//定时器B初始化
  252.     /****************************************************************************/
  253.     /* 1、初始化数码管引脚                                                     */
  254.     /****************************************************************************/
  255.     // 将P4设置为I/O口
  256.     P4SEL = 0x00;
  257.     // 将P4设置为输出方向
  258.     P4DIR = 0xFF;
  259.     // 将P4口输出全高
  260.     P4OUT = 0xFF;
  261.     // 将P3设置为I/O口
  262.     P3SEL = 0x00;
  263.     // 将P3设置为输出方向
  264.     P3DIR |= 0x0F;
  265.     P3OUT = 0x0F;
  266.     /****************************************************************************/
  267.     /* 2、初始化红外线接收引脚                                                  */
  268.     /****************************************************************************/
  269.    
  270.     P2DIR&=~BIT7;//P2.7设置为输入方向
  271.    
  272.     P2IES|=BIT7;//P2.7下降沿触发中断
  273.     P2IE|=BIT7;//P2.7中断允许
  274.     _EINT();//打开中断

  275.     while(1)
  276.     {
  277.         if(IR_Ready==1)
  278.         {   //计算要显示的每位数字
  279.             while(1)
  280.         {   //计算要显示的每位数字
  281.               IR_Ready=0;  
  282.               
  283.               dis_0 = (IR_Data[2]&0xF0)>>4;//数码管后2位显示数据
  284.               P4OUT = dis_code[dis_0];
  285.               P3OUT &= ~BIT1;        // 开第一个显示(P2.2口控制个位数码管)   
  286.               delay_ms(5);
  287.               P3OUT |= BIT1;        // 关第一个显示(P2.2口控制个位数码管)
  288.               
  289.               dis_1 = (IR_Data[2]&0x0F);
  290.               P4OUT = dis_code[dis_1];
  291.               P3OUT &= ~BIT2;        // 开第一个显示(P2.2口控制个位数码管)   
  292.               delay_ms(5);
  293.               P3OUT |= BIT2;        // 关第一个显示(P2.2口控制个位数码管)

  294.             
  295.               P4OUT =0x76;//'H'
  296.               P3OUT &= ~BIT3;        // 开第一个显示(P2.2口控制个位数码管)   
  297.               delay_ms(5);
  298.               P3OUT |= BIT3;        // 关第一个显示(P2.2口控制个位数码管)
  299.         }
  300.     }
  301.     }
  302. }
  303. /***FUNC+*********************************************************************/
  304. /* Name   : delay_ms                                                         */
  305. /* Descrp : delay time                                                       */
  306. /* Input  : num.                                                             */   
  307. /* Output : None.                                                            */
  308. /* Return : None.                                                            */   
  309. /***FUNC-*********************************************************************/
  310. void delay_ms(unsigned long ms)       // 延时毫秒@12M,ms最大值255   
  311. {   
  312.     unsigned char i;   
  313.     while(ms--)   
  314.         for(i = 0; i < 124; i++);   
  315. }   
复制代码

0条回答

一周热门 更多>