EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 648|回复: 0

[资料共享] msp430单片机红外遥控 编码 解码源程序

[复制链接]

185

主题

6

回帖

585

E币

助理工程师

Rank: 3Rank: 3

积分
376
发表于 2017-5-2 15:14:59 | 显示全部楼层 |阅读模式
捕获.PNG

完整源码下载:
完整源代码:红外编解码.rar (3.01 KB, 下载次数: 0)


主程序预览:
  1. /***************************红外编解码.c***************************************/
  2. //  * NAME          : 红外编解码.c
  3. //  * FUNCTION      : 红外的编码与解码
  4. //  * PROGRAMMED    : 刘中原
  5. //  * DATE(ORG)     : 2010.10.12
  6. //  * PROJECT       : 430红外遥控,数据传输
  7. //  * OS            : 所使用的操作系统
  8. //  * HISTORY       :
  9. //  * ID --- DATE -----------NOTE--------------------------
  10. //  * 00 94.04.14 初期完成
  11. //  * 01 94.05.14 第二版 XX机能修改(追加)
  12. //
  13. //编解码波形(NEC)
  14. //________________         __  __   __
  15. //                |        | | | |  |
  16. //                |        | | | |  |
  17. //                |        | | | |  |
  18. //                |        | | | |  |
  19. //                |        | | | |  |.....................................
  20. //                |        | | | |  |
  21. //                |        | | | |  |
  22. //                |________| |_| |__|   "0"高:0.56ms+低:0.565ms=1.125ms
  23. //|<-    9ms    ->|<-4.5ms>|"0"| "1"|   "1"高:0.56ms+低:1.69ms =2.25ms
  24. //|<-  引导码   ->|<-起始码|<-8位地址->|<-8位地址->|8位数据->|<-数据反码->|
  25. //
  26. //可以完成编码 解码  注释掉#define DECODE移去解码部分 #define ENCODE移去编码
  27. //sendFlg是发送完成标志,完成后置1  未完成时连发数据无效
  28. //
  29. //占用资源:TB CCR0中断 CCR4 CCR5中断  CCR0赋值为1125 时钟1MHz
  30. //红外输出端P2.0 32768Hz
  31. //P2.1为红外输入端口
  32. //
  33. /******************************************************************************/

  34. //
  35. #define DECODE      //解码
  36. #define ENCODE      //编码

  37. #include "msp430x16x.h"
  38. #include "红外编解码.h"

  39. /**********************************宏定义**************************************/
  40. #ifdef ENCODE                        /*=======编码=======*/

  41. #define BIT_0     P2SEL&=~BIT0                //红外编码后的低电平
  42. #define BIT_1     P2SEL|=BIT0                 //红外编码后的高电平
  43. #define SENDDAT   TBCCTL0|=CCIE           //启动数据发送 发送已存入addr0和dat0的数据
  44. //发送数据位高位部分 开始发数据位
  45. #define SENDBIT   TBCCR4=565-1;TBCCTL4|=CCIE
  46. #define SEND_END  TBCCTL0&=~CCIE;TBCCTL4&=~CCIE         //发送结束 关中断

  47. #endif                                        /*=======编码=======*/

  48. #ifdef DECODE                        /*=======解码=======*/

  49. #define DATIN   ((P2IN&BIT1)>>1)              //数据输入

  50. #endif                                        /*=======解码=======*/
  51. /******************************************************************************/

  52. #ifdef DECODE                        /*=======解码=======*/
  53. //解码后保存数据
  54. char addr1;
  55. char dat1;
  56. char readFlg = 0;                //成功读红外数据标志
  57. #endif                                        /*=======解码=======*/

  58. #ifdef  ENCODE                        /*=======编码=======*/
  59. //要编码的数据  发送缓存
  60. char addr0;
  61. char dat0;
  62. char sendFlg = 1;                //发送完成标志
  63. #endif                                        /*=======编码=======*/

  64. //初始化TB
  65. void int_TB()
  66. {
  67.         TBCTL = TBSSEL_2 + TBCLR + MC_1;      //TB时钟源:SMCLK 增模式
  68.         TBCCR0 = 1125 - 1;
  69.         
  70.         TBCCTL5 |= CCIE;
  71.         TBCCR5 = 450;
  72. }

  73. //有关端口初始化
  74. void int_io()
  75. {
  76.   
  77. #ifdef  ENCODE                        /*=======编码=======*/
  78.   //ACLK输出作为编码的载波
  79.         P2OUT &=~ BIT0;
  80.         P2DIR |= BIT0;
  81. #endif                                        /*=======编码=======*/
  82.   
  83. #ifdef DECODE                        /*=======解码=======*/
  84.   //解码输入端口P2.1
  85.         /*P2IES |= BIT1;
  86.         P2IFG &=~ BIT1;
  87.         P2IE |=BIT1;*/
  88. #endif                                        /*=======解码=======*/
  89.   
  90. }

  91. //初始化红外相关资源
  92. void int_hw()
  93. {
  94.         int_TB();
  95.         int_io();
  96. }

  97. #ifdef ENCODE                        /*=======编码=======*/
  98. //编码发送数据,eos标志最后数据一般为1,发送多字节数据时,最后一字节是1
  99. void sendDat(char addr,char dat)
  100. {
  101.         if(sendFlg)                //上次发送完成
  102.         {
  103.                 //数据存入发送缓存
  104.                 addr0 = addr;
  105.                 dat0  = dat;
  106.                 //开始发送
  107.                 SENDDAT;
  108.         }
  109. }
  110. #endif                                        /*=======编码=======*/

  111. #ifdef DECODE
  112. //红外数据解码函数
  113. void datDecode(unsigned int tAddr, unsigned int tDat)
  114. {
  115.         if(((tAddr>>8)&0xff)==(tAddr&0xff))                //地址高位低位相等 地址位数据正确
  116.         {
  117.                 addr1 = tAddr&0xff;
  118.                 if(((tDat>>8)&0xff)==((~tDat)&0xff))                //数据高位低位反 数据位数据正确
  119.                 {
  120.                         dat1 = ~(tDat&0xff);
  121.                         readFlg = 1;
  122.                 }
  123.                 else
  124.                 {
  125.                         readFlg = 2;
  126.                 }
  127.         }
  128.         else
  129.         {
  130.                 readFlg = 2;
  131.         }
  132.         
  133. }
  134. #endif


  135. //中断

  136. #ifdef ENCODE                        /*=======编码=======*/
  137. //TB0中断 编码
  138. #pragma vector=TIMERB0_VECTOR
  139. __interrupt void Timer_B (void)
  140. {
  141.     static char i = 0;    //计数 起始
  142.     static char state = 0;    //状态 起始:0  数据:1
  143.     static char cnt = 0;      //发送计数
  144.         
  145.     if(state==0)
  146.     {
  147.         if(i==0)
  148.         {
  149.             BIT_1;
  150.                         
  151.                         //完成标志置0 开始发送
  152.                         sendFlg = 0;
  153.         }
  154.         else if(i==8)
  155.         {
  156.             BIT_0;
  157.         }
  158.         else if(i==11)
  159.         {
  160.             SENDBIT;
  161.             state = 1;
  162.                         
  163.                         i = 255;
  164.         }
  165.    
  166.     }
  167.     else if(state==1)
  168.     {
  169.         BIT_0;
  170.    
  171.         if(cnt<8)               //地址高位
  172.         {
  173.             if(addr0&(1<<(7-cnt)))       //从高位到低位 是1延时+2:2.25ms
  174.             {
  175.                 if(i==1)
  176.                 {
  177.                     SENDBIT;
  178.                     i = 255;
  179.                                 cnt++;    //发送加1
  180.                 }
  181.             }
  182.             else
  183.             {
  184.                 SENDBIT;
  185.                 i = 255;
  186.                         cnt++;    //发送加1
  187.             }
  188.         }
  189.         else if(cnt<16)                //地址低位
  190.         {
  191.             if(addr0&(1<<(15-cnt)))       //从高位到低位 是1延时+2:2.25ms
  192.             {
  193.                 if(i==1)
  194.                 {
  195.                         SENDBIT;
  196.                     i = 255;
  197.                                 cnt++;    //发送加1
  198.                 }
  199.             }
  200.             else
  201.             {
  202.                 SENDBIT;
  203.                 i = 255;
  204.                         cnt++;    //发送加1
  205.             }
  206.         }
  207.                 else if(cnt<24)                //数据
  208.                 {
  209.                         if(dat0&(1<<(23-cnt)))       //从高位到低位 是1延时+2:2.25ms
  210.                 {
  211.                 if(i==1)
  212.                 {
  213.                         SENDBIT;
  214.                     i = 255;
  215.                                 cnt++;    //发送加1
  216.                 }
  217.                         }
  218.                         else                          //是0延时+1:1.125ms
  219.                         {
  220.                 SENDBIT;
  221.                 i = 255;
  222.                         cnt++;    //发送加1
  223.                         }
  224.                 }
  225.                 else if(cnt<32)                //数据反码  
  226.                 {
  227.                         if((~dat0)&(1<<(31-cnt)))       //从高位到低位 反码是1延时+2:2.25ms
  228.                         {
  229.                 if(i==1)
  230.                 {
  231.                         SENDBIT;
  232.                     i = 255;
  233.                                 cnt++;    //发送加1
  234.                 }
  235.                         }
  236.                         else                          //是0延时+1:1.125ms
  237.                         {
  238.                 SENDBIT;
  239.                 i = 255;
  240.                         cnt++;    //发送加1
  241.                         }
  242.                 }
  243.                 /*else if(cnt==32)        //最后多发一位0,否则无法识别最后一位
  244.                 {
  245.                         
  246.                 SENDBIT;
  247.                 i = 255;
  248.                         cnt++;    //发送加1
  249.                 }*/
  250.                 else
  251.                 {
  252.                         //完成标志置1
  253.                         sendFlg = 1;
  254.                         
  255.                         //变量归零
  256.                         state = 0;
  257.                         cnt = 0;
  258.                         i = 255;
  259.                         SEND_END;                //停止发送
  260.                         
  261.                         BIT_0;
  262.                 }
  263.    
  264.     }
  265.    
  266.     i++;      //计数加1
  267.         
  268.         TBCCTL4 &=~ CCIFG;                //中断标志清除
  269. }

  270. #endif                                        /*=======编码=======*/

  271. //TB1中断
  272. #pragma vector=TIMERB1_VECTOR
  273. __interrupt void Timer_B1(void)
  274. {
  275.   static int i = 0;         //计数变量 接收用
  276.   static char state = 0;   //代表接收状态的变量
  277.   static char cnt = 0;                //读取位数计数

  278.   
  279.   switch( TBIV )
  280. {
  281.         case  0x08:                          // TBCCR4 编码发送数据位部分
  282. #ifdef ENCODE                        /*=======编码=======*/
  283.                 BIT_1;
  284.                 TBCCTL4 &=~ CCIE;
  285. #endif                                        /*=======编码=======*/
  286.                 break;
  287.     case  0x0a:                          // TBCCR5 解码用
  288. #ifdef DECODE                        /*=======解码=======*/
  289.                 TBCCR5 = (TBR+440>1124)?(TBR+440-1124):(TBR+440);
  290.                 if(TBCCR5>1124) TBCCR5 = 1124;                                                //防止TBCCR5出界

  291.                 i++;

  292.                 if(DATIN==0&&readFlg>0)                //上次读取完成(可能有错误 readFlg=2 错误数据) 又有数据到来
  293.                 {
  294.                         readFlg = 0;
  295.                         i = 0;
  296.                 }
  297.                 if(state==0&&readFlg == 0)                        //起始码
  298.                 {
  299.                         if(i<15&&DATIN)                //引导码有高电平 错误数据帧
  300.                         {
  301.                                 readFlg = 2;
  302.                         }
  303.                         else if(i>26&&DATIN==0X01)                //引导码正确 准备读数据
  304.                         {
  305.                                 state = 1;                //1状态 读数据
  306.                                 
  307.                                 i = 0;
  308.                         }
  309.                 }
  310.                 else if(state==1)                //数据
  311.                 {
  312.                         static unsigned int tAddr = 0;                //地址位临时变量
  313.                         static unsigned int tDat = 0;                //数据位临时变量
  314.                         
  315.                         static char datFlg = 0;
  316.                         if(cnt<16)                        // 地址 位
  317.                         {
  318.                                 if(DATIN==0x00&&datFlg==0)
  319.                                 {
  320.                                         datFlg = 1;                        //有数据
  321.                                        
  322.                                         i = 0;
  323.                                 }
  324.                                 if((i==2||i==3)&&datFlg&&DATIN==0X00)
  325.                                 {
  326.                                         tAddr |= (0X00)<<(15-cnt);
  327.                                         i = 0;
  328.                                         datFlg = 1;
  329.                                         cnt++;
  330.                                         return;
  331.                                 }
  332.                                 else if((i==3)&&DATIN==0X01&&datFlg)
  333.                                 {
  334.                                         tAddr |= (0X01)<<(15-cnt);
  335.                                         i = 0;
  336.                                         datFlg = 0;
  337.                                         cnt++;
  338.                                 }
  339.                                 else if(i>3)
  340.                                 {
  341.                                         readFlg = 2;
  342.                                         cnt = 0;
  343.                                         datFlg = 0;
  344.                                         tAddr = 0;
  345.                                         tDat = 0;
  346.                                        
  347.                                         state = 0;
  348.                                 }
  349.                         }
  350.                         else if(cnt<32)                        //数据位接收
  351.                         {
  352.                                 if(DATIN==0x00&&datFlg==0)
  353.                                 {
  354.                                         datFlg = 1;                        //有数据
  355.                                        
  356.                                         i = 0;
  357.                                 }
  358.                                 if((i==2||i==3)&&datFlg&&DATIN==0X00)
  359.                                 {
  360.                                         tDat |= (0X00)<<(31-cnt);
  361.                                         i = 0;
  362.                                         datFlg = 1;
  363.                                         cnt++;
  364.                                         return;
  365.                                 }
  366.                                 else if((i==3)&&DATIN==0X01&&datFlg)
  367.                                 {
  368.                                         tDat |= (0X01)<<(31-cnt);
  369.                                         i = 0;
  370.                                         datFlg = 0;
  371.                                         cnt++;
  372.                                 }
  373.                                 else if(i>3)
  374.                                 {
  375.                                         readFlg = 2;
  376.                                         cnt = 0;
  377.                                         datFlg = 0;
  378.                                         tAddr = 0;
  379.                                         tDat = 0;
  380.                                        
  381.                                         state = 0;
  382.                                 }
  383.                                 
  384.                         }
  385.                         else
  386.                         {
  387.                                 datDecode(tAddr, tDat);
  388.                                 //解码结束
  389.                                 i = 0;
  390.                                 
  391.                                 cnt = 0;
  392.                                 state = 0;
  393.                                 datFlg = 0;
  394.                                 tAddr = 0;
  395.                                 tDat = 0;
  396.                         }
  397.                 }
  398.                
  399. #endif                                        /*=======解码=======*/
  400.                 break;
  401.     case  0x0e:                       //overflow 溢出,未用
  402.                 break;
  403.   }
  404. }

  405. /*
  406. #ifdef DECODE                        =======解码=======*/
  407. //PORT2中断 此中断仅解码接收数据用
  408. /*#pragma vector=PORT2_VECTOR
  409. __interrupt void PORT2_ISR(void)
  410. {
  411.         switch(DATIFG&BIT1)
  412.         {
  413.         case 2:
  414.                 //开始接收数据
  415.                 DATREAD;      
  416.                 break;
  417.         }
  418.   
  419.         DATIFG = 0;                        //清除标志位
  420. }

  421. #endif                                        =======解码=======*/
复制代码


积分规则
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-23 22:04 , Processed in 0.046790 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表