找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机智能灯光系统程序+Proteus仿真电路图

[复制链接]
ID:841372 发表于 2020-11-10 14:06 | 显示全部楼层 |阅读模式
智能过道照明系统主要功能
⑴系统设有2个按键功能按键(模式切换键和开关键),和一个单片机复位按键;
⑵系统设有1个电源指示灯和5个状态指示灯,分别为:光照检测信号指示灯(光线暗时指示灯亮),红外热释电传感器信号指示灯(检测到人体信号指示灯亮),自动模式继电器工作状态指示灯(自动模式下,继电器接通,指示灯亮),模式指示灯(手动模式时指示灯亮),手动模式继电器工作状态指示灯(手动模式下,继电器接通,指示灯亮);
⑶系统设置了两种工作模式:自动工作模式和手动工作模式,开机默认为自动模式,可通过“模式切换键”来实现模式切换;
⑷在自动模式下,继电器接通时间是延迟变量来控制的,延迟变量>0,继电器接通,延迟变量=0,继电器断开。延迟变量由检测到的信号控制,在检测到光线暗时,并且检测到有人时,延迟变量就等于设置的延迟时间,从而实现在人走后一段时间,灯泡自动熄灭,节能的目的;
⑸设置的延迟时间可以修改的,在自动模式下,长按“开关键”,每5秒钟,延迟时间加10秒,并且5个状态指示灯会显示出来,每5秒钟从左到右亮一个指示灯,延迟时间最大为50秒。
⑹在手动模式下时,可通过“开关键”控制继电器开关;

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png 原理图.jpg

单片机源程序如下:
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit renti=P2^1;                 //定义人感
  6. sbit guangming=P2^0;         //定义光照检测脚
  7. sbit jdq=P2^7;                   //继电器
  8. sbit L1=P2^6;                   //定义指示灯
  9. sbit L2=P2^5;
  10. sbit L3=P2^4;
  11. sbit L4=P2^3;
  12. sbit L5=P2^2;
  13. sbit K1=P1^0;                  //定义开关
  14. sbit K2=P1^1;                          
  15. int count;rt,gm,qd,shijian,sj=10,moshi=1,shijian1,count1,shezhi=0;         //变量
  16. void qudou(void)     //去抖延迟                                                                                  
  17. { int i;
  18.    for(i=0;i<2400;i++);
  19. }
  20. void key()                            //按键扫描
  21. {if(K1==0)                 //去抖   
  22.    { qudou();
  23.      if(K1==0)                 //模式按键按下
  24.     {moshi++;                 //moshi=1是自动,=0是手动
  25.          if(moshi>=2) moshi=0;
  26.          jdq=1;
  27.     }while(K1==0);
  28.         }
  29. if(moshi==1)          //在自动模式
  30. {if(K2==0)                //开关按键按下   
  31.    { qudou();
  32.      if(K2==0)
  33.     {shezhi=1;                 //开关按键长按可以设置延迟时间,具体看中断
  34.          shijian1=0;
  35.     }while(K2==0);
  36.         }
  37.         else shezhi=0;                   //没按开关按键就退出设置
  38.   }
  39. }
  40. void rentijiance()                  //红外人体检测子程序
  41. { if(renti==0) rt=1;          //检测到没人体时,传感器发送低电平给单片机,rt就为1        rt=0(有人),rt=1(无人)
  42.    else rt=0;
  43. }
  44. void guangzhaoqiangdu()           //光照强度子程序
  45. { if(guangming==0) gm=1;          //检测到光线亮时,传感器发送低电平给单片机,gm就为1  gm=0(光照暗),gm=1(光照亮)
  46.    else gm=0;
  47. }               
  48. void panduan()                        //判断
  49. {if(moshi==1)
  50. {if(gm==0)
  51.   {if(rt==0)
  52.    shijian=sj;
  53.    else
  54.    shijian=shijian;}
  55.   else
  56.   shijian=shijian;
  57. }
  58. else
  59. shijian=0;
  60. }
  61. void zhishideng()                 //指示灯函数
  62. {L5=gm;
  63. L4=rt;
  64. if(moshi==1)
  65. L3=jdq;
  66. else
  67. L3=1;
  68. L2=moshi;
  69. if(moshi==0)
  70. L1=jdq;
  71. else
  72. L1=1;
  73. }
  74. void qudong()                           //继电器驱动
  75. {if(moshi==1)                    //自动模式下
  76. {if(shijian>0) jdq=0;         //根据延迟时间控制继电器
  77.   else jdq=1;
  78. }
  79. else                                        //手动模式下
  80. {if(K2==0)                   
  81.    { qudou();
  82.      if(K2==0)                         //开下开关按键控制继电器的开关
  83.     {jdq=!jdq;
  84.     }while(K2==0);
  85.         }
  86. }
  87. }
  88. void main()                                         //主程序
  89. {      TMOD=0x1;                     //中断开启
  90.        TH0=0xb1;
  91.        TL0=0xe0;
  92.        TR0=1;      
  93.        ET0=1;                                                        
  94.        EA=1;                     
  95.        while(1)                       //无线循环
  96.        {key();                                //按键扫描
  97.             rentijiance();                //人体
  98.             guangzhaoqiangdu();        //光照
  99.                 panduan();                         //判断
  100.                 zhishideng();                 //指示灯
  101.                 qudong();                        //驱动
  102.            }
  103. }
  104. void time0(void) interrupt 1          //中断
  105. {     TH0=0xb1;                                                  
  106.       TL0=0xe0;
  107.      if(shijian>0)                  //用来计时延迟
  108.          { count++;
  109.       if(count==50)  
  110.         { count=0;
  111.               shijian--;
  112.         }
  113.          }

  114.           if(shezhi==1)                 //在自动模式下用来设置延迟时间
  115.           {count1++;
  116.       if(count1==50)  
  117.         { count1=0;
  118.               shijian1++;
  119.                   if(shijian1<=5)         //长按5秒,延迟时间为10s,并有1个指示灯显示
  120.                   {sj=10; L5=0;L4=1;L3=1;L2=1;L1=1;}
  121.                   else if(shijian1<=10)        //长按10秒,延迟时间为20s,并有2个指示灯显示
  122.                   {sj=20; L5=0;L4=0;L3=1;L2=1;L1=1;}
  123.                   else if(shijian1<=15)        //长按15秒,延迟时间为30s,并有3个指示灯显示
  124.                   {sj=30; L5=0;L4=0;L3=0;L2=1;L1=1;}
  125.                   else if(shijian1<=20)        //长按20秒,延迟时间为40s,并有4个指示灯显示
  126.                   {sj=40; L5=0;L4=0;L3=0;L2=0;L1=1;}
  127.                   else if(shijian1>25)        //长按25秒,延迟时间为50s,并有5个指示灯显示
  128.                   {sj=50; L5=0;L4=0;L3=0;L2=0;L1=0;}

  129.         }
  130.            }
  131.          
  132. }
复制代码

所有资料51hei提供下载:
智能灯光.rar (53.66 KB, 下载次数: 134)

评分

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

查看全部评分

回复

使用道具 举报

ID:666063 发表于 2021-1-4 11:21 | 显示全部楼层
请问有没有相关文档
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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