找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3866|回复: 1
打印 上一主题 下一主题
收起左侧

STM32单片机红外遥控1838原理分析及源代码

[复制链接]
跳转到指定楼层
楼主
ID:585517 发表于 2019-7-30 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
遥控  :NEC 编码  960nm的波长  晶振为455KHZ,对应的发射频率(载波频率)为38KHZ,
        遥控ID为0(即系统识别码),反码为255,不同的遥控ID有可能不一样。
接收头:1838 脉冲型

遥控码由三部分组成
1、leader code   9ms的高电平 + 4.5ms 的低电平
2、系统识别码    区别不同的红外遥控设备
3、操作码        8bit操作码和8bit的操作反码组成

发送方的电平跟接收方解调出来的电平是反向的。
红外接收头接收到遥控器的信号后,解码出后的数据格式如下:
写程序即根据这个信号的格式来写。
__________________               _______   _   _   _   _   _   _   _   _   ____   ____   ____   ____   ____   ____   ____   ____                                 ___________________________________               _______   ___________________________________________________________
                  |_____________|       |_| |_| |_| |_| |_| |_| |_| |_| |_|    |_|    |_|    |_|    |_|    |_|    |_|    |_|    |x x x x x x x x|x x x x x x x x|                                   |_____________|       |_|                                                                    
                      |<-    9ms  ->|<4.5ms>|
                  |----leader code------|-----custom code 8bit----------|-----------------custom code' 8bit---------------------| key data 8bit |key data'8bit  |<---------------40ms---------------><----9ms-----><2.1ms>--|--------------- 此时的高电平超过40ms,然后出现9ms的低电平,2.1ms的高电平 连发码----------------


0和1均以0.56ms的低电平开始(实际测量是500us的样子),不同的是后面出现的高电平,
如果高电平是0.56ms(实际测量是500us的样子),则表示0,如果高电平是1.68ms(0.56*3=1.68)则表示1
0.56ms:|_|
      _   _   _
0:     |_| |_| |
      _   ____   ____  
1:     |_|    |_|    |_

写代码的时候只需要检测高电平的时间即可。
以下时间都是通过示波器实际测量所得。
引导码的高电平:4.5ms
0的高电平     :0.56ms(实测0.5ms的样子)
1的高电平     :1.68ms
连发码的高电平:2.1ms

-------------------------------------------------------------------------------------------------------
不同的遥控按键值是不一样的,需要实际测量,测量的时候可通过串口打印出键值来测量
下面的键值是野火ISO STM32开发板配套的遥控器对应的键值

电源  :162
MENU  : 226
TEST  : 34
+     : 2
RETURN: 194
|<<   : 224
>     : 168
>>|   : 144
0     : 104
-     : 152
C     : 176
1     :48
2     :24
3     :122
4     :16
5     :56
6     :90
7     :66
8     :74
9     :82  

main函数:

  1. int main(void)
  2. {        
  3. uint8_t key_val;

  4. /* config the led */
  5. LED_GPIO_Config();
  6. LED1_ON;

  7. /* 配置SysTick 为10us中断一次 */
  8. SysTick_Init();

  9. /* 重新配置SysTick的中断优先级为最高,要不然SysTick延时中断抢占不了IO EXTI中断
  10. * 因为SysTick初始化时默认配置的优先级是最低的
  11. * 或者当你用其他定时器做延时的时候,要配置定时器的优先级高于IO EXTI中断的优先级
  12. */
  13. NVIC_SetPriority (SysTick_IRQn, 0);


  14. /* USART config 115200 8-N-1 */
  15. Debug_USART_Config();
  16. printf("\r\n 这是一个红外遥控发射与接收实验 \r\n");

  17. /* 初始化红外接收头CP1838用到的IO */
  18. IrDa_Init();

  19. for(;;)
  20. {        
  21. if( frame_flag == 1 ) /* 一帧红外数据接收完成 */
  22. {
  23. key_val = IrDa_Process();
  24. printf("\r\n key_val=%d \r\n",key_val);
  25. printf("\r\n 按键次数frame_cnt=%d \r\n",frame_cnt);
  26. printf("\r\n 中断次数isr_cnt=%d \r\n",isr_cnt);

  27. /* 不同的遥控器面板对应不同的键值,需要实际测量 */
  28. switch( key_val )
  29. {
  30. case 0:
  31. LED1_TOGGLE;
  32. printf("\r\n key_val=%d \r\n",key_val);
  33. printf("\r\n Error \r\n");
  34. break;

  35. case 162:
  36. LED1_TOGGLE;
  37. printf("\r\n key_val=%d \r\n",key_val);
  38. printf("\r\n POWER \r\n");
  39. break;

  40. case 226:
  41. LED1_TOGGLE;
  42. printf("\r\n key_val=%d \r\n",key_val);
  43. printf("\r\n MENU \r\n");
  44. break;

  45. case 34:
  46. LED1_TOGGLE;
  47. printf("\r\n key_val=%d \r\n",key_val);
  48. printf("\r\n TEST \r\n");
  49. break;

  50. case 2:
  51. LED1_TOGGLE;
  52. printf("\r\n key_val=%d \r\n",key_val);
  53. printf("\r\n + \r\n");
  54. break;

  55. case 194:
  56. LED1_TOGGLE;
  57. printf("\r\n key_val=%d \r\n",key_val);
  58. printf("\r\n RETURN \r\n");
  59. break;

  60. case 224:
  61. LED1_TOGGLE;
  62. printf("\r\n key_val=%d \r\n",key_val);
  63. printf("\r\n |<< \r\n");
  64. break;

  65. case 168:
  66. LED1_TOGGLE;
  67. printf("\r\n key_val=%d \r\n",key_val);
  68. printf("\r\n > \r\n");
  69. break;

  70. case 144:
  71. LED1_TOGGLE;
  72. printf("\r\n key_val=%d \r\n",key_val);
  73. printf("\r\n >>| \r\n");
  74. break;

  75. case 104:
  76. LED1_TOGGLE;
  77. printf("\r\n key_val=%d \r\n",key_val);
  78. printf("\r\n 0 \r\n");
  79. break;

  80. case 152:
  81. LED1_TOGGLE;
  82. printf("\r\n key_val=%d \r\n",key_val);
  83. printf("\r\n - \r\n");
  84. break;

  85. case 176:
  86. LED1_TOGGLE;
  87. printf("\r\n key_val=%d \r\n",key_val);
  88. printf("\r\n C \r\n");
  89. break;

  90. case 48:
  91. LED1_TOGGLE;
  92. printf("\r\n key_val=%d \r\n",key_val);
  93. printf("\r\n 1 \r\n");
  94. break;

  95. case 24:
  96. LED1_TOGGLE;
  97. printf("\r\n key_val=%d \r\n",key_val);
  98. printf("\r\n 2 \r\n");
  99. break;

  100. case 122:
  101. LED1_TOGGLE;
  102. printf("\r\n key_val=%d \r\n",key_val);
  103. printf("\r\n 3 \r\n");
  104. break;

  105. case 16:
  106. LED1_TOGGLE;
  107. printf("\r\n key_val=%d \r\n",key_val);
  108. printf("\r\n 4 \r\n");
  109. break;

  110. case 56:
  111. LED1_TOGGLE;
  112. printf("\r\n key_val=%d \r\n",key_val);
  113. printf("\r\n 5 \r\n");
  114. break;

  115. case 90:
  116. LED1_TOGGLE;
  117. printf("\r\n key_val=%d \r\n",key_val);
  118. printf("\r\n 6 \r\n");
  119. break;

  120. case 66:
  121. LED1_TOGGLE;
  122. printf("\r\n key_val=%d \r\n",key_val);
  123. printf("\r\n 7 \r\n");
  124. break;

  125. case 74:
  126. LED1_TOGGLE;
  127. printf("\r\n key_val=%d \r\n",key_val);
  128. printf("\r\n 8 \r\n");
  129. break;

  130. case 82:
  131. LED1_TOGGLE;
  132. printf("\r\n key_val=%d \r\n",key_val);
  133. printf("\r\n 9 \r\n");
  134. break;

  135. default:
  136. break;
  137. }
  138. }
  139. }
  140. }
复制代码
全部资料51hei下载地址:
程序.7z (363.33 KB, 下载次数: 66)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:222621 发表于 2019-9-3 15:34 | 只看该作者
感谢楼主分享,我拿去学学
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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