找回密码
 立即注册

QQ登录

只需一步,快速开始

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

8路红外遥控开关控制器(可扩展为32路)

[复制链接]
跳转到指定楼层
楼主
ID:107189 发表于 2016-3-6 14:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 51黑tt 于 2016-3-6 14:47 编辑

论坛上有一些希望能DIY多路的红外遥控开关,我在此做了一个DOME版的,同样用我熟悉的SAA3010T的解码程序(省下了不少时间),程

序可以直接用于AT89C51或AT89C2051或相容的芯片,用2051时,P1.0,P1.1要用10K电阻上拉。使用一体化接收头时电源方面一定要做好滤波

,如用大的滤波电容使直流更加的稳定,用104(0.1uF)的小电容去掉高频等等,只有这样才能在一定程序上提高抗干扰性。在程序方面,

我这里做的很简单,用了遥控器的1-8号键做1-8的继电器控制,按一下为继电器通,再按一下为继,二次按键的间隔时间大约在1秒钟,这

样就可以避免按一次键会使继电器返复通断(按一次键的时间不定发送键值的次数也不定)。还用了遥控的电源按键,按下时所有断电器关

闭。这个电路如果使用AT89C51的话可以找到32路或更多的控制。有网友说要做兼容多遥控学习型的,我想也是可行的,那会用到IC2器件,

存储收到的数据做为学习,接收时再对比对,但是如果你的数据较多的话会造成速度慢等问题。我个人认为还是用专一的遥控器好点,比如

说你用电视遥控去遥控电视和红外开关,当你要开电视或许同时会触发到红外开关。









C51源码:
  1. /*----------------------------------------

  2. 8路红外遥控开关控制器
  3. (SAA3010T电视遥控器)

  4. All rights reserved.

  5. 明浩 E-mail: pnzwzw@163.com
  6.        pnzwzw@cdle.net

  7. 只用八路时可以用AT89C2051代替AT89C51
  8. 一体化接收头输出端拉P3.2(int0),P1为控制输出端。
  9. 可以扩展到32路或更多
  10. 输出为低电平有效
  11. ----------------------------------------*/

  12. #include <AT89x51.h>

  13. static unsigned char data IRCode[3],IRCON,IRCON2;
  14. static unsigned char data DT;

  15. void main(void)
  16. {
  17. unsigned int de;

  18. TMOD = 0x01; //定时器0方式1
  19. EA = 1; //允许CPU中断
  20. IT0 = 1; //INT0下降沿有效
  21. EX0 = 1; //开INT0中断;
  22. do
  23. {
  24. for (de=0; de<10000; de++)
  25. P3_6 = 1;
  26. for (de=0; de<10000; de++)
  27. P3_6 = 0;
  28. if (DT)
  29. {
  30. for (de=0; de<30000; de++) //这里起到按键值正确后会有一个延时,防止重复按键
  31. P3_6 = 1;
  32. for (de=0; de<30000; de++)
  33. P3_6 = 0;
  34. DT = 0;
  35. }
  36. EX0 = 1;
  37. }
  38. while(1);
  39. }

  40. //定时器0中断处理
  41. void timeint(void) interrupt 1 using 2
  42. {
  43. TH0=0xFD;
  44. TL0=0x1E; //设定时值为800us

  45. if (IRCON<3)
  46. {
  47. if (IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
  48. {
  49. IRCON2++;
  50. IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
  51. IRCode[IRCON]=IRCode[IRCON] | P3_2; //每八次填满一个字节,一个字节存放遥控编码4个位
  52. }
  53. else
  54. {
  55. IRCON++; //填满一个字节,指向下一个变量
  56. IRCON2=0; //计数清零
  57. }
  58. }
  59. else
  60. {
  61. TR0 = 0; //关闭定时器
  62. ET0 = 0; //定时器0中断关闭
  63. if ((IRCode[1]!=0xFF) && (IRCode[2]!=0xFF))
  64. {
  65. if (IRCode[1] == 0x55)
  66. {
  67. switch (IRCode[2])
  68. {
  69. case 0xAB: //1-8键控制
  70. P1_0 = ~P1_0;
  71. DT = 1;
  72. break;
  73. case 0xAC:
  74. P1_1 = ~P1_1;
  75. DT = 1;
  76. break;
  77. case 0xAD:
  78. P1_2 = ~P1_2;
  79. DT = 1;
  80. break;
  81. case 0xB2:
  82. P1_3 = ~P1_3;
  83. DT = 1;
  84. break;
  85. case 0xB3:
  86. P1_4 = ~P1_4;
  87. DT = 1;
  88. break;
  89. case 0xB4:
  90. P1_5 = ~P1_5;
  91. DT = 1;
  92. break;
  93. case 0xB5:
  94. P1_6 = ~P1_6;
  95. DT = 1;
  96. break;
  97. case 0xCA:
  98. P1_7 = ~P1_7;
  99. DT = 1;
  100. break;
  101. case 0xD2: //按关闭电源键,关闭所有继电器
  102. P1 = 0xFF;
  103. DT = 1;
  104. break;
  105. }
  106. }
  107. }
  108. }
  109. }

  110. //INT0中断
  111. void INT0Fun(void) interrupt 0 using 2
  112. {
  113. EX0 = 0; //外部中断0关闭
  114. ET0 = 1; //定时器0中断打开
  115. TH0=0xFD;
  116. TL0=0x1E; //设定时值为800us

  117. for (IRCON=0; IRCON<3; IRCON++)
  118. IRCode[IRCON] = 0;
  119. IRCON = 0;
  120. IRCON2 = 0; //计数清零

  121. TR0 = 1;//开始计数
  122. }

  123.   
复制代码




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

使用道具 举报

沙发
ID:108142 发表于 2016-3-10 00:32 来自触屏版 | 只看该作者
我的微信SUN469923905请大神指教
回复

使用道具 举报

板凳
ID:194844 发表于 2017-5-1 19:35 | 只看该作者
verygood!
回复

使用道具 举报

地板
ID:154669 发表于 2017-5-2 10:46 | 只看该作者
有制作教程吗,
回复

使用道具 举报

5#
ID:95393 发表于 2017-5-23 02:53 来自触屏版 | 只看该作者
先做个记号,有空钻研一下程序
回复

使用道具 举报

6#
ID:204748 发表于 2017-5-28 13:11 来自触屏版 | 只看该作者
谢谢分享。谢谢奉献。谢谢楼主。
回复

使用道具 举报

7#
ID:272625 发表于 2018-2-20 00:43 | 只看该作者
楼主请教下,为什么程序编译通过,可烧录到单片机什么反应都没有。程序如下:/**********************BST-V51实验开发板例程************************
回复

使用道具 举报

8#
ID:272625 发表于 2018-2-20 00:43 | 只看该作者
/**********************BST-V51实验开发板例程************************
*  平台:BST-V51 + Keil U3 + STC89C52
*  名称:8路红外遥控开关控制器   
*  日期:2018-1-17
*  晶振:11.0592MHZ

(SAA3010T电视遥控器)

All rights reserved.

明浩 E-mail: pnzwzw@163.com

      pnzwzw@cdle.net

只用八路时可以用AT89C2051代替AT89C51

一体化接收头输出端拉P3.2(int0),P1为控制输出端。

可以扩展到32路或更多

输出为低电平有效
******************************************************************/
#include<AT89X51.h>
static unsigned char data IRCode[3],IRCON,IRCON2;
static unsigned char data DT;

void main(void)

{
   unsigned int de;

   TMOD = 0x01; //定时器0方式1  

   EA = 1; //允许CPU中断

   IT0 = 1; //INT0下降沿有效

   EX0 = 1; //开INT0中断;  

   do

   {

      for (de=0; de<10000; de++)

      P3_6 = 1;

      for (de=0; de<10000; de++)

      P3_6 = 0;

      if (DT)

      {

         for (de=0; de<30000; de++) //这里起到按键值正确后会有一个延时,防止重复按键

         P3_6 = 1;

         for (de=0; de<30000; de++)

         P3_6 = 0;

         DT = 0;

      }

      EX0 = 1;

   }

      while(1);

}

//定时器0中断处理

void timeint(void) interrupt 1 using 2

{

   TH0=0xFD;

   TL0=0x1E; //设定时值为800us

   if (IRCON<3)

   {

      if (IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位

     {
        IRCON2++;

        IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位

        IRCode[IRCON]=IRCode[IRCON] | P3_2; //每八次填满一个字节,一个字节存放遥控编码4个位

     }

     else

     {

        IRCON++; //填满一个字节,指向下一个变量

        IRCON2=0; //计数清零

     }

   }

      else

     {

        TR0 = 0; //关闭定时器

        ET0 = 0; //定时器0中断关闭

        if ((IRCode[1]!=0xFF) && (IRCode[2]!=0xFF))

       {

          if (IRCode[1] == 0x55)

          {

             switch (IRCode[2])

             {

                case 0x0C: //1-8键控制已改为MP3通用遥控器

                P1_0 = ~P1_0;

                DT = 1;

                break;

                case 0x18:

                P1_1 = ~P1_1;

                DT = 1;

                break;

                case 0x5E:

                P1_2 = ~P1_2;

                DT = 1;

                break;

                case 0x08:

                P1_3 = ~P1_3;

                DT = 1;

                break;

                case 0x1C:

                P1_4 = ~P1_4;

                DT = 1;

                break;

                case 0x5A:

                P1_5 = ~P1_5;

                DT = 1;

                break;

                case 0x42:

                P1_6 = ~P1_6;

                DT = 1;

                break;

                case 0x52:

                P1_7 = ~P1_7;

                DT = 1;

                break;

                case 0x45: //按关闭电源键,关闭所有继电器

                P1 = 0xFF;

                DT = 1;

                break;

             }

         }

      }

   }

}



//INT0中断

void INT0Fun(void) interrupt 0 using 2

{

    EX0 = 0; //外部中断0关闭

    ET0 = 1; //定时器0中断打开

    TH0=0xFD;

    TL0=0x1E; //设定时值为800us

    for (IRCON=0; IRCON<3; IRCON++)

    IRCode[IRCON] = 0;

    IRCON = 0;

    IRCON2 = 0; //计数清零

    TR0 = 1;//开始计数

}


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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