[技术问答] 清晰解读红外遥控系统之二:GPIO模拟红外遥控发射

[复制链接]
 楼主| jerow 发表于 2018-8-29 12:28 | 显示全部楼层 |阅读模式
(1)NEC码的发射完整波形图诠释如下(接收与发射反向):
547745b862107e930a.png
 楼主| jerow 发表于 2018-8-29 12:29 | 显示全部楼层
(2)用一个GPIO口模拟IR,来输出到另一个接收端,程序如下:
  1. void Simulate_IR_Init(void) //GPIO初始化
  2. {
  3.        MFT4MOD=0;
  4.        PTDIR0_4=1;   //设置输出
  5.        IR_LINE=1;   //默认为高,IR脚的默认电平也是为高
  6. }
  7. void  T_560US(void)
  8. {
  9.         BusWait(_560us); //使用一定的机器时间来耗时,精度可以用示波器来测出
  10. }
  11. void  T_1680US(void)   //3个560US
  12. {
  13.         T_560US();
  14.         T_560US();
  15.         T_560US();
  16. }
  17. void T_500US(void)
  18. {
  19.         BusWait(_500_us);
  20. }
  21. void  T_1MS(void)
  22. {
  23.         T_500US();
  24.         T_500US();
  25. }
  26. void T_9MS(void)    //开始码
  27. {
  28.         T_1MS();
  29.         T_1MS();
  30.         T_1MS();
  31.         T_1MS();
  32.         T_1MS();
  33.         T_1MS();
  34.         T_1MS();
  35.         T_1MS();
  36.         T_1MS();
  37. }
  38. void T_4_5_MS(void)    //结果码
  39. {
  40.         T_1MS();
  41.         T_1MS();
  42.         T_1MS();
  43.         T_1MS();
  44.         T_500US();
  45. }
  46. void send_d0(void)       //发数据0,参照上述图示反向
  47. {
  48.         IR_LINE=0;
  49.         T_560US();
  50.         IR_LINE=1;
  51.         T_560US();
  52. }
  53. void send_d1(void) //发数据1,参照上述图示反向
  54. {
  55.         IR_LINE=0;
  56.         T_560US();
  57.         IR_LINE=1;
  58.         T_1680US();
  59. }
  60. void send_ir_byte(uchar tp)   //发送一个字节
  61. {
  62.         uchar i;
  63.         for(i=0;i<8;i++)
  64.         {
  65.                 if(tp&0x80)
  66.                 {
  67.                        send_d1();
  68.                 }
  69.                 Else
  70.                 {
  71.                        send_d0();
  72.                 }
  73.                 tp<<=1;      //从高位往低位发送
  74.         }
  75. }
  76. void ir_start(void)         //NEC遥控码起始条件
  77. {
  78.         IR_LINE=0;
  79.         T_9MS();
  80.         IR_LINE=1;
  81.         T_4_5_MS();
  82. }
  83. void send_ir_key(uchar key)    //发送单个遥控码的完整程序
  84. {
  85.         Simulate_IR_Init();          //初始化GPIO
  86.         ir_start();                        //NEC起始


  87.         send_ir_byte(IR_USER_CODE);    //客户码
  88.         send_ir_byte(~IR_USER_CODE);   //客户码反码
  89.         send_ir_byte(key);                      //数据码
  90.         send_ir_byte(~key);                    //数据码反码


  91.         IR_LINE=0;
  92.         T_560US();   //为了跟最后一个数据位区别开来,如上图所示


  93.         IR_LINE=1; //恢复默认的高
  94. }
萧洛毫 发表于 2018-8-29 12:37 | 显示全部楼层
支持下,谢谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

520

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

72

主题

520

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部