• 基于51单片机的教室智能照明控制系统


    硬件方案

            本系统以51单片机作为控制模块的核心部件,采用热释红外人体传感器检测人体的存在,采用光敏三极管构成的电路检测环境光的强度;根据教室合理开灯的条件,通过对人体存在信号和环境光信号的识别与判断,完成对教室灯光的智能控制,避免了教室用电的大量浪费。系统还具有报警功能;同时还采用了软/硬件的“看门狗”等抗干扰措施。
             整体电路主要由51单片机STC89C52、时钟芯片DS1302、液晶屏LCD1602、比较器芯片LM339、光敏电阻、红外对管、按键、LED等构成;原理图如图:


     

    PCB及仿真图:

    设计功能

    • 使用4个LED灯模拟教室的照明灯,在符合条件开启时,人数小于10人亮一个灯,10-20人亮二个灯,20-30人亮三个灯,大于30人则全亮四个灯。
    • 教室使用两个红外对管来检测是否有人进入并进行人数统计,人数可以统计到二位数99人,并实时将人数显示到液晶屏LCD上,液晶屏同时显示实时日期/时间/星期。利用光敏电阻检测教室的光线强弱;
    • 系统分自动/手动模式,可以通过按键切换模式,并有LED指示当前所在模式,在自动模式下,可以设定定时时间段,在定时时间段内,当教室有人(人数大于0)的情况下,如果光线暗弱则自动打开照明灯,照明灯点亮个数根据人数而定,不在定时时间段或者教室无人的情况下,关闭所有照明灯,另外在手动模式下,可以通过手动开关控制照明灯的亮灭,人数统计部分仍然生效。

    软件设计

    主程序源码

    1. void main()
    2. {
    3.     AUTO_LED=0;                     //默认自动模式
    4.     temperature=readtemperature();
    5.     init();                         //液晶初始化
    6.     T0_init();                     //定时器初始化
    7.     delay1(8000);
    8.     while(1)
    9.     {
    10.         if(Adjust==0)             //非调节模式下显示时间人数和温度
    11.         {    
    12.             temperature=readtemperature();            //读取温度
    13.             temperature_dispaly(3,temperature);        //显示温度
    14.             Time_Display();         //显示时间
    15.             Open();                  //动作判断,根据光线和声响开关
    16.             Count_Value();         //计算人数
    17.         }
    18.         Keyscan();                 //扫描键盘
    19.     }
    20. }
    21. void temperature_dispaly(char add,char dat)             //温度显示函数:第一个:参数的地址,第二个:参数的内容
    22. {
    23.     uchar shi,ge;
    24.     shi=dat/10;                                         //把温度的十位提取出来
    25.     ge=dat%10;                                         //把温度的个位提取出来
    26.     write_com(0x80+0x40+add);                            //要写的地址
    27.     write_date(0x30+shi);                                //十位的内容   1602字符库
    28.     write_date(0x30+ge);                             //个位的内容    1602字符库
    29. }
    30. /*****************************************定时器初始化和主函数***********************************************************/
    31. void T0_init(void)
    32. {
    33.     TMOD=0x11;                          //设置定时器0为工作方式1
    34.     TH0=(65536-50000)/256;          //50MS定时
    35.     TL0=(65536-50000)%256;
    36.     EA=1;                              //开定时器T0的中断    总中断
    37.     ET0=1;                           //允许T0中断
    38. //    TR0=1;                           //开启定时器
    39. }
    40. void Timer0() interrupt 1                    //定时器T0中断函数
    41. {
    42.     TH0=(65536-50000)/256;                    //赋初值=50ms
    43.     TL0=(65536-50000)%256;                    //TH0=3C,TL0=B0
    44.     Count++;                                //每中断一次,Count加一,计数20次,表示1s的时间到
    45.     if(Count>=20)                            //1s到
    46.     {
    47.         Count=0;
    48.         Miao++;
    49.         if(Miao>=3)                            //3秒内无触发另一个,全部清零
    50.         {
    51.             Miao=0;
    52.             OUT1_flag=0;                     //清零
    53.             IN1_flag=0;
    54.             TR0=0;                             //关闭定时器
    55.         }
    56.     }
    57. }

    资料链接:https://pan.baidu.com/s/1dN9Pt-k9bpk-M4jwNUOOPQ?pwd=zkcw 
    提取码:zkcw

  • 相关阅读:
    [附源码]java毕业设计逸尘房屋销售管理系统
    前端开发攻略---合并表格单元格,表格内嵌套表格实现手风琴效果。
    Java八股文(K8S)
    月报总结|Moonbeam6月份大事一览
    信息学奥赛一本通:1164:digit函数
    python_基础语法(列表、列表基本操作)
    js对象深拷贝(深克隆)
    Linux学习(8)——常用指令
    线上展厅多元运用
    MySQL 教程:MySQL IN 语句(高级)
  • 原文地址:https://blog.csdn.net/m0_60790717/article/details/128059081