微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 红外遥控系统原理及单片机软件解码程序

红外遥控系统原理及单片机软件解码程序

时间:11-23 来源:互联网 点击:
首先,必须要了解一些基本原理。其实按下遥控器的某一个键,遥控器会发出一连串经过调制后的信号,这个信号经过红外一体化模块接收后,输出解调后的数字脉冲,每个按键对应不同的脉冲,故识别出不同的脉冲就能识别出不同的按键。

上图就是很常见的车载MP3遥控器,比较小巧,很好用。下面是红外发射和接受原理:

到此读者可能会有疑惑,那么不同的调制解调方法那么出来的脉冲规则是不一样的?是的,的确如此。

遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理(一般家庭用的DVD、VCD、音响都使用这种编码方式)。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:

采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图所示。

如图可见,0与1前端的低电平持续都是0.56ms,那么就是后面的高电平持续时间不同,0为0.56ms,1为1.685ms,找到不同之处,编程时就有识别的依据了!

上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如图所示。

UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合的编码。

请看下图,来自网络:

当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个引导码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发码)将仅由起始码(9ms)和结束码(2.25ms)组成。(实际上人手的动作是很慢的,即使你快速的按下按键,可能对于芯片来说还是超过108ms,所以如何处理连发码是很关键的)

遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,图为发射波形图。

下面是我写的代码,按键编码通过串口发送到电脑端:

由于时间关系,代码注释不多。

其中START_Judge()函数是判断9ms低电平,既是判断有无遥控信号。

BOOT_REPEATING_CODE_Judge()是判断是引导码还是连发码,引导码则进入接受数据环节,连发码表明数据已经接受结束。

H_L_LEVEL_Judge()是接受数据时判断高低电平。

如果乱码,请参考:

http://blog.csdn.net/mhjerry/article/details/6601324

注明:以下代码为纯软件方式,没有用到中断,定时器方式,纯CPU查询,但测试结果倒也可以,至少比较稳定,得到的码值不管对不对,都是那个值。

[cpp]view plaincopy

  1. /*------------------------------------------------------------*-
  2. 红外收发.C
  3. ------------------------------------------------------------
  4. 遥控器测试
  5. -*------------------------------------------------------------*/
  6. #include
  7. //---红外接收一体化输出口----------------------------------
  8. sbitIR_Out=P3^2;
  9. bitSTART_Flag=0;
  10. bitBOOT_REPEATING_CODE_Flag=0;
  11. unsignedcharDATA[4]={0};
  12. bdataunsignedcharTEMP_BIT;
  13. sbitB0=TEMP_BIT^0;
  14. sbitB1=TEMP_BIT^1;
  15. sbitB2=TEMP_BIT^2;
  16. sbitB3=TEMP_BIT^3;
  17. sbitB4=TEMP_BIT^4;
  18. sbitB5=TEMP_BIT^5;
  19. sbitB6=TEMP_BIT^6;
  20. sbitB7=TEMP_BIT^7;
  21. //---有无遥控信号判断函数----------------------------------
  22. bitSTART_Judge();
  23. //---连发码判断函数----------------------------------------
  24. bitBOOT_REPEATING_CODE_Judge();
  25. //---"0"和"1"识别------------------------------------------
  26. bitH_L_LEVEL_Judge();
  27. //---串口初始化--------------------------------------------
  28. voidUART_Initial();
  29. voidDELAY_Us(unsignedintUs)
  30. {
  31. unsignedintx;
  32. for(x=0;x<=(Us/200-1);x++);
  33. }
  34. voidDELAY_Ms(unsignedintMs)
  35. {
  36. unsignedintx,y;
  37. for(x=0;x<=(Ms-1);x++)
  38. {
  39. for(y=0;y<=120;y++);
  40. }
  41. }
  42. voidmain()
  43. {
  44. unsignedchari;
  45. UART_Initial();
  46. IR_Out=1;
  47. while(1)
  48. {
  49. START_Fla

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top