当前位置:   article > 正文

红外(IR)NEC协议驱动软件设计_ir nec协议

ir nec协议

1、红外遥控原理

        红外遥控原理是一种利用红外线(波长约为940纳米左右的不可见光)进行无线通信的技术,广泛应用于家用电器、多媒体设备及其他各类电子产品的遥控控制。其基本原理可以概括为以下几个步骤:

1. 信号编码:

•遥控器内部含有一个微型处理器,将用户的按键行为编码为特定的二进制数据序列。根据不同的红外遥控协议(如NEC、RC5、Sony SIRC等),数据会被转换为脉宽调制(PWM)信号,通过高低电平的持续时间(占空比)来表示二进制的0和1。

2. 红外发射:

•编码后的数据通过红外发射管(IR LED)发送出去。发射管在接收到脉冲信号后,会产生一定频率(通常为38kHz左右)的红外光脉冲信号。脉冲的高电平对应红外LED的开启,低电平对应关闭。

3. 接收与解码:

•红外接收器(如一体化的红外接收头)检测到这些红外光脉冲信号,并将其转换为电信号。

•接收器内部包含一个光电二极管,用于感应红外光强度的变化,然后经过一系列信号放大、滤波、整形等处理,还原出原始的脉冲信号。

•微控制器对接收到的脉冲信号进行解码,识别出其中的地址码、命令码及其校验码,从而执行相应的动作。

4. 协议解析与执行:

•解码后的数据按照红外遥控协议的约定进行解析,确定是哪个设备的哪个命令。

•控制设备(如电视、空调等)根据接收到的指令执行相应的操作。

总的来说,红外遥控系统实现了通过无线方式将用户指令传输给被控设备,并确保指令的正确执行。其优势在于成本较低、技术成熟且应用广泛,但也存在一定的局限性,如传输距离较短、易受角度和遮挡物影响等。

2、NEC协议

        关于NEC协议的介绍:NEC协议

3、软件方案

        结合红外遥控原理和NEC协议的规定,实现方案主要包含硬件和软件两部分,在实际的IR模块硬件设计中,一般会实现时序信号编解码流程,提高系统性能和简化软件复杂度。

        本文的软件设计将基于简单的GPIO模拟的方式:通过原理实现简单的红外发射,接收流程。总体设计如下:

方案说明:

        按照红外协议的编解码规则,整个设计中,需要保证使用38KHz的载波频率进行通信,则GPIO或PWM输出频率为38KHz,同时调整占空比,达到实际的需求。

4、代码实现

        以下代码主要作为伪代码实现基本的发射和接收逻辑。

  1. #include <stdio.h>
  2. /*电平定义*/
  3. #define IR_HIGH 1
  4. #define IR_LOW 0
  5. /*状态机定义*/
  6. #define IDLE 0
  7. #define DATA_START 1
  8. #define ADDRESS_CHECK 2
  9. #define COMMAND_START 3
  10. #define COMMAND_CHECK 4
  11. #define REPEAT_CHECK 5
  12. //获取GPIO电平值
  13. unsigned char IR_GetGPIOLevel(void)
  14. {
  15. //
  16. }
  17. //输出电平
  18. void IR_SetGPIOLevel(unsigned char level)
  19. {
  20. }
  21. /*延时函数*/
  22. void IR_Delayus(unsigned int us)
  23. {
  24. //
  25. }
  26. void IR_Delayms(unsigned int ms)
  27. {
  28. //
  29. }
  30. /*同步码*/
  31. void IR_OutputSYNC(void)
  32. {
  33. IR_SetGPIOLevel(IR_HIGH);
  34. IR_Delayms(9); //9ms高电平脉冲
  35. IR_SetGPIOLevel(IR_LOW);
  36. IR_Delayus(4500); //4.5ms低电平脉冲
  37. }
  38. /*逻辑0输出*/
  39. void IR_Output0(void)
  40. {
  41. IR_SetGPIOLevel(IR_LOW);
  42. IR_Delayus(560); //560us低电平脉冲
  43. IR_SetGPIOLevel(IR_HIGH);
  44. IR_Delayus(560); //560us高电平脉冲
  45. }
  46. /*逻辑1输出*/
  47. void IR_Output1(void)
  48. {u
  49. IR_SetGPIOLevel(IR_LOW);
  50. IR_Delayus(560); //560us低电平脉冲
  51. IR_SetGPIOLevel(IR_HIGH);
  52. IR_Delayus(1690); //1690us高电平脉冲
  53. }
  54. /*数据输出*/
  55. void IR_SendData(unsigned char data)
  56. {
  57. int i;
  58. unsigned char bit; //LSB ---> MSB
  59. for(i=0; i<8; i++)
  60. {
  61. bit = (data >> i) & 0x1;
  62. if(bit)
  63. IR_Output1();
  64. else
  65. IR_Output0();
  66. }
  67. }
  68. /*信号编码*/
  69. void IR_Encode(unsigned char addr, unsigned char cmd)
  70. {
  71. IR_OutputSYNC(); //同步码
  72. IR_SendData(addr); //地址
  73. IR_SendData(~addr); //地址反码
  74. IR_SendData(cmd); //命令
  75. IR_SendData(~cmd); //命令反码
  76. }
  77. /*电平检测*/
  78. unsigned int IR_GetHighTime(void)
  79. {
  80. unsigned int time;
  81. //获取高电平时间
  82. //...
  83. return time;
  84. }
  85. unsigned int IR_GetLowTime(void)
  86. {
  87. unsigned int time;
  88. //获取高电平时间
  89. //...
  90. return time;
  91. }
  92. /*信号解码*/
  93. void IR_Decode()
  94. {
  95. unsigned char data;
  96. unsigned char state = IDLE;
  97. while(1)
  98. {
  99. switch(state)
  100. {
  101. case IDLE:
  102. {
  103. //判断电平时间,9ms高电平后跟4.5ms低电平
  104. if()
  105. {
  106. state = DATA_START; //跳到下一个状态
  107. }
  108. }
  109. break;
  110. case DATA_START:
  111. {
  112. /*开始接收8位地址位。- 对每一位,检测560μs低电平和1690μs高电平(表示1)或560μs低电平和560μs高电平(表示0)。- 每接收一位,将结果累加到地址缓冲区,并进入ADDRESS_CHECK状态*/
  113. state = ADDRESS_CHECK; //跳到下一个状态
  114. }
  115. break;
  116. case ADDRESS_CHECK:
  117. {
  118. /*接收并检查8位地址的反码,与之前接收到的地址位进行比较,验证是否一致。
  119. - 如果一致,则进入COMMAND_START状态,否则返回IDLE状态,等待新的同步信号*/
  120. }
  121. break;
  122. case COMMAND_START:
  123. {
  124. /*类似于地址接收,开始接收8位命令位,并将结果累加到命令缓冲区*/
  125. }
  126. break;
  127. case COMMAND_CHECK:
  128. {
  129. /*接收并检查8位命令的反码,与之前接收到的命令位进行比较,验证是否一致。
  130. - 如果一致,则认为本次接收的红外信号有效,触发相应的命令执行操作。
  131. - 不一致则返回IDLE状态,重新等待同步信号*/
  132. }
  133. break;
  134. case REPEAT_CHECK:
  135. {
  136. /*如果在完成命令反码检查后,接收到的是一个单独的560μs低电平和560μs高电平组合(重复码特征),则视为重复命令,执行相应的重复命令处理。
  137. - 如果不是重复码特征,则返回IDLE状态,等待新的命令*/
  138. }
  139. break;
  140. }
  141. }
  142. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/493084
推荐阅读
相关标签
  

闽ICP备14008679号