找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2488|回复: 1
收起左侧

单片机红外控制继电器(遥控插座)达到控制家电 附源码

[复制链接]
ID:428459 发表于 2018-11-24 18:08 | 显示全部楼层 |阅读模式
开始用红外遥控做的一个插座项目,共四路继电器,可以单独控制开关也可以同时开关,很方便的使用。

制作出来的实物图如下:
IMG_20181124_180230.jpg

背


单片机控制源码如下:
  1. #include<reg51.h>
  2. #define uint unsigned  int
  3. #define  uchar unsigned char

  4. sbit jdq1=P1^0;
  5. sbit jdq2=P1^1;
  6. sbit jdq3=P1^2;
  7. sbit jdq4=P1^3;
  8. sbit jdq5=P1^4;
  9. sbit jdq6=P1^5;
  10. sbit jdq7=P1^6;
  11. sbit jdq8=P1^7;
  12. sbit IRIN = P3^2;




  13. unsigned char IrValue[6];          //用来存放读取到的红外值
  14. unsigned char Time,t,a,c,Second;


  15. void dsq0z();
  16. void IrInit();
  17. void DelayMs(unsigned int );
  18. void delay(uint z);

  19. /*******************************************************************************
  20. * 函数名         : main
  21. * 函数功能                   : 主函数
  22. * 输入           : 无
  23. * 输出                  : 无
  24. *******************************************************************************/

  25. void main()
  26. {
  27.         unsigned char b;
  28.         IrInit();
  29.         while(1)
  30.         {
  31.                 IrValue[4]=IrValue[2]>>4;                          //高位
  32.                 IrValue[5]=IrValue[2]&0x0f;                //低位
  33.                 if(c==5)
  34.                         {jdq4=1;
  35.                         jdq8=1;
  36.                
  37.                        
  38.                         }
  39.                
  40.                 if(IrValue[4]==4&&        IrValue[5]==5&&b==0)
  41.                 {
  42.                 P1=0;                }//全开
  43.                 if(IrValue[4]==4&&        IrValue[5]==4&&b==0)
  44.                 {
  45.                 jdq1=1;
  46.     jdq2=1;
  47.     jdq3=1;
  48.     jdq4=1;
  49.     jdq5=1;
  50.     jdq6=1;
  51.     jdq7=1;
  52.     jdq8=1;                }//全关
  53.                 if(IrValue[4]==1&&        IrValue[5]==6&&b==0)
  54.                 {
  55.                 jdq1=0;
  56.     jdq2=0;
  57.     jdq3=0;
  58.     jdq4=0;                }//前四开
  59.                 if(IrValue[4]==0&&        IrValue[5]==12&&b==0)
  60.                 {
  61.                 jdq5=0;
  62.     jdq6=0;
  63.     jdq7=0;
  64.     jdq8=0;                }//后四开
  65.                 if(IrValue[4]==0&&        IrValue[5]==7&&b==0)
  66.                 {    a=0;
  67.                 }
  68.         if(IrValue[4]==4&&        IrValue[5]==6&&b==0)
  69.                 {
  70.                 jdq1=0;        }
  71.                 if(IrValue[4]==4&&        IrValue[5]==7&&b==0)
  72.                 {
  73.                 jdq1=1;        }//继电器1
  74.                 if(IrValue[4]==4&&        IrValue[5]==0&&b==0)
  75.                 {
  76.                 jdq2=0;        }
  77.                 if(IrValue[4]==4&&        IrValue[5]==3&&b==0)
  78.                 {
  79.                 jdq2=1;        }//继电器2
  80.                 if(IrValue[4]==1&&        IrValue[5]==5&&b==0)
  81.                 {
  82.                 jdq3=0;        }
  83.                 if(IrValue[4]==0&&        IrValue[5]==9&&b==0)
  84.                 {
  85.                 jdq3=1;        }//继电器3
  86.                 if(IrValue[4]==1&&        IrValue[5]==9&&b==0)
  87.                 {
  88.                 jdq4=0;        }
  89.                 if(IrValue[4]==0&&        IrValue[5]==13&&b==0)
  90.                 {
  91.                 jdq4=1;        }//继电器4
  92.                 if(IrValue[4]==1&&        IrValue[5]==8&&b==0)
  93.                 {
  94.                 jdq5=0;        }
  95.                 if(IrValue[4]==5&&        IrValue[5]==14&&b==0)
  96.                 {
  97.                 jdq5=1;        }//继电器5
  98.                 if(IrValue[4]==1&&        IrValue[5]==12&&b==0)
  99.                 {
  100.                 jdq6=0;        }
  101.                 if(IrValue[4]==5&&        IrValue[5]==10&&b==0)
  102.                 {
  103.                 jdq6=1;        }//继电器6
  104.                 if(IrValue[4]==5&&        IrValue[5]==2&&b==0)
  105.                 {
  106.                 jdq7=0;        }
  107.                 if(IrValue[4]==4&&        IrValue[5]==10&&b==0)
  108.                 {
  109.                 jdq7=1;        }//继电器7
  110.                 if(IrValue[4]==0&&        IrValue[5]==8&&b==0)
  111.                 {
  112.                 jdq8=0;        }
  113.                 if(IrValue[4]==4&&        IrValue[5]==2&&b==0)
  114.                 {
  115.                 jdq8=1;        }//继电器8
  116.                
  117.         }
  118. }                                                                        
  119. /*******************************************************************************
  120. * 函数名         : DelayMs()
  121. * 函数功能                   : 延时
  122. * 输入           : x
  123. * 输出                  : 无
  124. *******************************************************************************/

  125. void DelayMs(unsigned int x)   //0.14ms误差 0us
  126. {
  127.         unsigned char i;
  128.         while(x--)
  129.         {
  130.                 for (i = 0; i<13; i++)
  131.                 {}
  132.         }
  133. }
  134. void delay(uint z)
  135. {   uint x,y;
  136.         for(x=z;x>0;x--)
  137.         {
  138.                 for(y=110;y>0;y--);
  139.       
  140.       
  141.         }
  142. }
  143.       
  144. /*******************************************************************************
  145. * 函数名         : IrInit()
  146. * 函数功能                   : 初始化红外线接收
  147. * 输入           : 无
  148. * 输出                  : 无
  149. *******************************************************************************/

  150. void IrInit()
  151. {
  152.         IT0=1;//下降沿触发
  153.         EX0=1;//打开中断0允许
  154.         EA=1;        //打开总中断

  155.         IRIN=1;//初始化端口
  156. }
  157. /*******************************************************************************
  158. * 函数名         : ReadIr()
  159. * 函数功能                   : 读取红外数值的中断函数
  160. * 输入           : 无
  161. * 输出                  : 无
  162. *******************************************************************************/

  163. void ReadIr() interrupt 0
  164. {
  165.         unsigned char j,k;
  166.         unsigned int err;
  167.         Time=0;                                         
  168.         DelayMs(70);

  169.         if(IRIN==0)                //确认是否真的接收到正确的信号
  170.         {         
  171.                
  172.                 err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
  173.                 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  174.                 侯,程序死在这里*/      
  175.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                 
  176.                 {                       
  177.                         DelayMs(1);
  178.                         err--;
  179.                 }
  180.                 if(IRIN==1)                        //如果正确等到9ms低电平
  181.                 {
  182.                         err=500;
  183.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
  184.                         {
  185.                                 DelayMs(1);
  186.                                 err--;
  187.                         }
  188.                         for(k=0;k<4;k++)                //共有4组数据
  189.                         {                              
  190.                                 for(j=0;j<8;j++)        //接收一组数据
  191.                                 {

  192.                                         err=60;               
  193.                                         while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  194.                                         {
  195.                                                 DelayMs(1);
  196.                                                 err--;
  197.                                         }
  198.                                         err=500;
  199.                                         while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
  200.                                         {
  201.                                                 DelayMs(1);//0.14ms
  202.                                                 Time++;
  203.                                                 err--;
  204.                                                 if(Time>30)
  205.                                                 {
  206.                                                         EX0=1;
  207.                                                         return;
  208.                                                 }
  209.                                         }
  210.                                         IrValue[k]>>=1;         //k表示第几组数据
  211.                                         if(Time>=8)                        //如果高电平出现大于565us,那么是1
  212.                                         {
  213.                                                 IrValue[k]|=0x80;
  214.                                         }
  215.                                         Time=0;                //用完时间要重新赋值                                                      
  216.                                 }
  217.                         }
  218.                 }
  219.                 if(IrValue[2]!=~IrValue[3])
  220.                 {
  221.                         return;
  222.                 }
  223.         }                       
  224. }
  225. void dsq0z()
  226.   {

  227.             EA=1;      
  228.           ET0=1;
  229.          TH0=(65536-50000)/256 ;
  230.          TL0=(65536-50000)%256 ;
  231.          TR0=1;

  232.   }


  233. void dsq0(void)  interrupt 1
  234. {


  235.         TH0=(65536-50000)/256 ;
  236.          TL0=(65536-50000)%256 ;
  237.          if(a==0)
  238.          {
  239.             t++;
  240.             if(t==2)
  241.          {
  242.                     t=0;
  243.                    c++;
  244.     }      


  245. }

  246. }
复制代码

全部资料51hei下载地址:
红外插座.zip (44.8 KB, 下载次数: 30)

评分

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

查看全部评分

回复

使用道具 举报

ID:247623 发表于 2018-11-24 21:31 | 显示全部楼层
我去,没有仿真图,早知道没有原理图,我就不下了,浪费我黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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