You are on page 1of 40

基于单片机的教室智能照明系统设计

摘 要
当前在很多高校教室照明通常是通过学生或者工作人员通过按钮进行关闭 ,
然后巡逻人员进行检测,但是还是经常出现长明灯的问题,使得高校电能浪费
成为一个急需解决的问题。本文设计了一种智能灯光控制系统用于教室,这个系
统能够通过红外线传感器计算进入房间的人员数量,并根据人数自动调节灯光:
10 人时点亮一盏,20 人时点亮两盏,30 人则激活三盏灯;通过光敏电阻检测光
照值,当大于设置最大值,不开灯,在最小值和最大值之间,进行自动调节,
小于设置最小值,灯最亮;通过那就可设置不同的开灯人数和光照阈值;通过
LCD1602 显示屏显示数据。经过实物测试,给设计可以实现根据当前的光照强
度和当前的人数控制照明灯的开关,检测到无人自动进行关闭,其操作简单,
性能较好,能够满足当前高校对教室照明灯光控制需求。
关键词:单片机;教室照明系统;智能灯;人数检测;光敏电阻;数据采集
Abstract
At present, in many colleges and universities, the classroom lighting is usually
turned off by students or staff through the button, and then the patrol personnel to
detect, but there is still often the problem of permanent lamps, which makes the waste
of electrical energy in colleges and universities become an urgent problem to be
solved. The design of a single chip microcomputer based classroom intelligent light
control system, the system can enter the classroom through the infrared ray tube
statistics, detected the number of people in 10, open a lamp, 20 people open 2 lights,
30 people open three lights; The light value is detected by the photoresistor. When it
is greater than the maximum value, the light will not be turned on. Automatic
adjustment will be made between the minimum value and the maximum value.
Through that you can set different number of lights and light threshold; Display data
through LCD1602 display screen. After the physical test, the design can realize
according to the current lighting intensity and the current number of people to control
the switch of the lights, the detection of no one automatically shut down, its simple
operation, good performance, can meet the current university to the classroom
lighting control needs.
Key words:Single chip microcomputer;Classroom lighting system; Intelligent lamp;
Number detection; photoresistor; Data collection

目 录
第一章 概述...................................................................................................................1
1.1 研究背景及其目的意义..................................................................................1
1.2 国内外发展现状..............................................................................................1
1.3 研究内容..........................................................................................................2
第二章 系统方案设计...................................................................................................3
2.1 教室智能照明系统..........................................................................................3
2.2 主要元器件选择..............................................................................................3
2.2.1 主控芯片方案选择...............................................................................3
2.2.2 教室人数检测模块方案选择...............................................................3
2.3 系统总体设计思路..........................................................................................4
第三章 硬件电路...........................................................................................................5
3.1 控制核心模块电路..........................................................................................5
3.1.1 复位电路...............................................................................................6
3.1.2 晶振电路...............................................................................................7
3.1.3 下载口...................................................................................................7
3.2 系统电源电路..................................................................................................7
3.2 教室人数采集模块电路..................................................................................8
3.3 光照采集模块电路..........................................................................................8
3.4 LCD1602 显示模块电路...............................................................................10
3.5 按键模块电路................................................................................................10
3.6 照明模块电路................................................................................................11
第四章 软件设计.........................................................................................................12
4.1 编程软件介绍................................................................................................12
4.2 主程序流程设计............................................................................................12
4.3 独立按键子程序............................................................................................14
4.3 LCD1602 液晶显示子程序..........................................................................15
4.4 A/D 模块转换子程序...................................................................................16
第五章 实物测试.........................................................................................................17
5.1 实物焊接测试................................................................................................17
5.2 实物整体焊接测试........................................................................................17
5.3 实物上电测试................................................................................................18
5.4 实物前后门人数计数测试............................................................................19
5.5 实物光照测试................................................................................................20
第六章 结论与展望.....................................................................................................22
致谢..............................................................................................................................23
参考文献......................................................................................................................24
附录..............................................................................................................................25
附录 1:原理图...................................................................................................25
附录 2:PCB.......................................................................................................25
附录 3:主程序...................................................................................................27
第一章 概述
1.1 研究背景及其目的意义
在国内经济快速增长和社会发展这一背景下,能源供应与需求之间的冲突
日益加剧。电力消耗中,照明的比例持续上升,对电力资源的需求也越来越迫切
尤其是高校这种教学和生活人员密集的区域,也是主要的能源使用者之一。目前
许多高校的照明控制系统有着许多弊端相对落后,如能源使用不当、缺乏舒适度
系统布线繁琐和灯具使用寿命短等,这些因素导致了校园中“白天空照”和
“无用亮灯”等电能浪费现象的普遍存在。
随着高校不断增加招生规模,学生人数的上升带动了教学楼数量的增加。教
室作为高校学生的主要活动空间,其照明电量消耗高达校园总用电量的 40%,
并一直保持在较高水平,其中大量能源浪费在“白天空照”现象上。由于国内的
照明技术起步较晚,再加之预算限制,目前许多高等院校还在使用传统的照明
控制方式,面临着以下几个核心问题:
1)教室的光照强度过剩:即使在自然光线充沛的情况下,室内照明设备依
然全开。
2)“白天空照”现象:因学生缺乏节约电力的意识,在有限的房间使用情
况下,灯具通常全亮,并且学生离开教室后经常不关灯。
3)管理滞后:采用的是分层供电的方式,需由管理人员逐层检查并关闭教
室内的照明,这不仅增加了管理负担,还伴有复杂的布线以及灯具寿命短的问
题。
随着我国教育事业的蓬勃发展,高校教学楼的数量不断增加,伴随而来的
问题是电能的消耗日益增加,同时也存在电能浪费的现象。在国家大力提倡节能
减排的时代背景下,针对目前高校教室存在着“白天空照”现象,室内照明没
有充分利用自然光以实现按需照明和照明系统智能化程度低等问题,设计了以
单片机为核心控制器的高校教室智慧照明系统,对高校的节能工作具有重大意
义。

1.2 国内外发展现状
国外很多公司都有自己成熟的照明控制系统,例如西门子、施耐德、飞利浦
松下、ABB、奇胜等。以奇胜公司的 C-Bus 智能照明系统为例,系统的控制单元
通过一对双绞线连接成控制网络,其中双绞线作为通讯介质,某个系统的控制
单元发出控制信号在整个控制网络里进行传播,其余的各个系统控制单元接受
到控制信息后,做出相应的控制动作,进而实现智能化网络化的控制效果。
此外,国外智能照明系统比较独立且专门用于照明控制。采用远程实时遥控
现场人机交互面板、现场准确感应等人性化控制模式,营造出许多种适宜的光照
环境,同时采用集中控制分散管理的策略。

1
然而,国内的智能照明市场,因消费的观念、高昂的价格等原因,致使我们
在智能照明领域中的发展相对缓慢。但是随着近些年智能控制的发展以及人们对
于生活要求的不断提高,国内的智能照明行业也有了一定的发展。很多大公司推
出了智能照明解决方案,为国内智能照明市场注入了新鲜血液与活力。在室内照
明领域,相关的产品和技术还是处于起步阶段。主要的表现就是相关的产品比较
少,推广和应用的范围也很有限,特别是在住宅照明方面,具有广泛的发展潜
力。
智能照明系统的主要发展趋势有以下几点:
信息化:智能照明系统内的各种照明设备相互间可以通讯,不需要用户指挥
也能根据不同的状态互动运行,从而给用户带来最大程度的高效、便利、舒适与
安全。
网络化:利用计算机、嵌入式系统及网络通讯技术,将照明线路中的各种光
源通过网络连接到一起进行控制。
节能环保化:智能化的本质之一是降低用电的成本和提高效率,所以节能将
成为智慧照明系统需要实现的关键目标之一。环保是全球的要求,智慧照明系统
如何结合现有的技术降低学校用电功耗,提高光照环境质量,减少环境污染,
这些都是未来发展应该考虑的问题。

1.3 研究内容
本研究开发的教室照明的智能控制系统,将软件与硬件结合起来。硬件部分
提供了软件执行的基础及程序运行所需的平台。软件部分则负责收集硬件电路端
口的电平信号,并进行相应的分析与处理。这样的软硬件互动确保了系统的多功
能性,满足了设计目标的预期效果。

2
第二章 系统方案设计
2.1 教室智能照明系统
该系统通过智能化管理达到精准控制教室照明的目的。系统输入主要包括环
境光线强度和房间占用情况。在环境光线足够时,系统将保持照明关闭,并在检
测到人员且光照弱于设定阈值时启动照明,同时根据在场人数调整灯光数量。理
论上,这种方法能够高效地进行照明管理,以适应教室内部的实际需求。为确保
信号采集的准确性和灵敏度,同时最小化外界干扰,该控制系统的核心控制模
块被谨慎放置于教室内部,避免阳光直射。红外信号收发器被安置在教室入口处
以便准确监测并记录进出人数。系统由红外收发器和光敏传感器组成,以采集数
据,并由中央处理单元进行分析处理,进而精确控制教室内的照明。

2.2 主要元器件选择
该系统旨在实现易用性和节能效果,具备实时监测、识别和分析教室内人数
及照明状况的能力,并能根据检测到的数据对教室照明进行即时调控。因此,本
文需要选择合适的主控芯片和人数检测模块。

2.2.1 主控芯片方案选择

对于主控芯片而言,STC89S52 单片机作为一款基于 CMOS 技术的微处理


器,其显著的特点包括低功耗、成本效益高、8 位的寻址能力。芯片内置的 Flash
存储器由于其可反复擦写代码的特性,极大地方便了线上程序的更新和修改。选
用该处理器作为主控模块,主要考虑到其外设接口简洁、性价比出众。尽管工作
频率不高,但这款单片机的性能仍然足够应对本文设计的要求。

2.2.2 教室人数检测模块方案选择

方案一:采用人体热释电检测当前教室人数,采用该模块通过检测人体热
释电检测当前是否有人经过,该模块检测范围面积较大,且该模块的成本较低。
方案二:采用对射式计数模块作为此次设计教室人数的的检测模块,该模
块通过电平触发的顺序检测当前人员是进入教室还是走出教室,该模块结构较
为简单,且该模块控制也较为简单。
相较于方案一中用人体热释电检测当前教室人数的方法,此方法无法正确
判断检测人员进出教室的状态,而方案二中的对射式计数模块可以直接判断检
测人员是进入教室还是走出教室。

2.3 系统总体设计思路
此次设计的教室照明采用 STC89S52 单片机作为此次设计的主控芯片,对

3
输入的信号进行处理,控制输出,从而实现对于此次设计的功能需求。除此以外
外接电路还包括:电源电路模块、LED 照明电路模块、LCD1602 显示电路模块、
独立按键模块、光照采集电路、信号转换模块以及对射式计数模块,整体系统方
案设计如图 2.1 所示。第一部分是采用对射式计数模块对进入教室和出入教室的
人数进行检测,从而得到当前教室的人数;第二部分则是通过光照强度检测模
块获取当前教室内的光照强度;第三部分是按键模块,通过按键设计开灯的人
数和光照的阈值;第四部分是供电模块,通过该模块给整个系统进行供电;输
出由两个部分组合而成,第一部分是显示模块,显示当前的加入人数和当前的
光照强度;第二部分是照明模块,控制照明打开。
图 2.1 系统框图
具体实施步骤如下:
1、通过两对红外对射式计数管模拟前后门进行人数计数,当人数在 10 人以
及 10 人之内时,开启第一盏灯、当人数达到 20 人时,开启第 2 盏灯、人数达到
30 人时,开启第三盏灯;
2、通过光敏电阻检测光照值,当大于设置最大值,不开灯,在最小值和最
大值之间,进行自动调节,小于设置最小值,灯最亮;
3、通过独立按键设置不同的开灯人数和光照阈值;
4、通过 LCD1602 显示屏显示数据。

4
第三章 硬件电路
3.1 控制核心模块电路
此次设计即基于单片机的人数检测系统设计采用 STC89S52 单片机作为此
次设计的核心模块,该模块的作用为中间桥梁的作用,表 3.1 为本文设计中对
芯片各引脚的配置情况。将输出的红外对射管、光照强度信息及其按键信号进行
处理,控制照明模块及其显示模块模块迅速进行工作,通过软件及其硬件设计
使其实现此次设计人数检测和控制光照的功能。
表 3.1 STC89S52 单片机引脚配置
STC89S52 引脚 外接元件引脚 说明
P0.0-P0.7 LCD1602 DB0-DB7 LCD1602 数据接口
红外接收管是否接收到
P1.0-P1.3 对射式计算模块 OUT
红外线
P1.4-P1.6 LED 照明电路 模拟教室 LED 照明
P2.0-P2.2 按键电路 K1-K3 控制按键
P2.5 LCD1602 RS LCD1602 读使能端
P2.6 LCD1602 RW LCD1602 写使能端
P2.7 LCD1602 E LCD1602 使能端

P3.5 A/D 转换电路 A/D 转换电路片选使能

P3.6 A/D 转换电路 CLK A/D 转换电路时钟输入


A/D 转换电路数据信号输
P3.7 A/D 转换电路 DO

RST 按键复位 RES 复位电路
XTAL1-XTAL2 晶振电路 11.0592M 晶振
单片机可以正常进行工作的最少元器件组成称之为单片机的最小的系统,
单片机最小系统的设计电路如图 3.1 所示,通过图可以看出,单片机最小系统
包括 STC89S52 单片机、复位电路以及晶振电路。

5
图 3.1 单片机最小系统电路图

3.1.1 复位电路

在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统
再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合
在运行的系统中控制其复位。
1)开机时复位
在电路图中,电容的大小是 ,电阻的大小是 10k。所以根据公式,可
以算出电容充电到电源电压的 0.7 倍(单片机的电源是 5V,所以充电到 0.7 倍
即为 3.5V),需要的时间是 。在单片机启动的 0.1S 内
电容两端的电压时在 0~3.5V 增加。这个时候 10K 电阻两端的电压为从 5V~1.5V
减少(串联电路各处电压之和为总电压)。所以在 0.1S 内,RST 引脚所接收到
的电压是 5V~1.5V。在 5V 正常工作的单片机中小于 1.5V 的电压信号为低电平信
号,而大于 1.5V 的电压信号为高电平信号。所以在开机 0.1S 内,单片机系统自
动复位。
2)按键时复位
在单片机启动 0.1S 后,电容 C 两端的电压持续充电为 5V,这时候 10K 电
阻两端的电压接近于 0V,RST 处于低电平所以系统正常工作。当按键按下的时
候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键
按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电压
在 0.1S 内,从 5V 释放到变为了 1.5V,甚至更小。根据串联电路电压为各处之和
这个时候 10K 电阻两端的电压为 3.5V,甚至更大,所以 RST 引脚又接收到高电
平,单片机系统会自动复位。

3.1.2 晶振电路

在 STC89S52 单片机系统中,由于内部时钟容易受外界干扰,而单片机的
运行必须依赖于稳定的时钟脉冲,因此在要求严格的场合,外接晶振电路还是
很有必要的。如图 3.1 中的晶振电路,本文设计的系统中选取 11.0592M 晶振。使
用 11.0592MHz 的晶振可以产生 9600 的波特率。

3.1.3 下载口

使用 USB—TTL 模块进行下载,使用专门的下载工具 stc-isp 软件,将程序


录入系统。

3.2 系统电源电路
系统电源电路如图 3.2 所示,其由一个 type-c 的插座、一个自锁按键、一个

6
的电解电容、一个 1k 的限流电阻和一个 LED 灯组成。对于电解电容的选
择,由于电源本身的具有纹波的特性以及电源线具有电阻,负载电流的变化会
在该电阻上形成不同的电压降,进一步加大了电压的波动,因此每块电路板上
都有电源滤波电容。负载电流越大,滤波电容容量也越大。至于选取多大的电容
一般是 100~ 。当供电正常并且自锁按键按下时,LED 灯会点亮,表明板
子处于供电状态。
图 3.2 系统电源电路图

3.2 教室人数采集模块电路
该电路模块采用对射式红外对射管检测当前教室的人数,其实际装置主要
是一个光耦合器(opTIcalcoupler,OC),通常把发光器(红外线发光二极管
LED)与受光器(光敏半导体管)封装在同一管壳内。输入的电信号驱动发光二
极管(LED),使之发出一定波长的光,被光探测器接收而产生光电流,再经
过进一步放大后输出。这就完成了电—光—电的转换,从而起到输入、输出、隔
离的作用。由于槽型光耦输入输出间互相隔离,电信号传输具有单向性等特点,
因而具有良好的电绝缘能力和抗干扰能力。
在实际操作中对射管的一款向外发射信号,传感器的 OUT 引脚接收发射的
信号,如果接收到(即槽型光耦中间无遮挡物),则 OUT 口输出低电平,否则
输出高电平。检测到两端有物品时为低电平时,通过该方式检测当前进入教室的
人数,教室人数采集模块原理图如图 3.3 所示。

图 3.3 对射式计数模块电路图

3.3 光照采集模块电路
该模块采用光敏电阻检测当前教室周围的光照强度,如图 3.4 所示直接利
用光敏电阻和一个 10k 电阻进行分压测量待测点电压值(CH1 点),通过 ADC
将模拟量转化为数字量,再经过数据转换,最后得到光照值。当正输入端电压大
于负输入端的时候,输出高电平,即 VCC,当负输入端的电压大于正输入端的
电压的时候输出为低电平,即 0V,因此输出为 0 或 1 的数字信号。因为传感器
是常开的,所以在没有检测到光照时,传感器断开,正向输入端电压大于反相

7
输入端,此时输出为高电平;当检测到光照时,传感器导通,反相输入端电压
大于正向输入端,此时输出为低电平。

图 3.4 光照强度检测模块电路原理图
在信号转换的过程中,本文采用 ADC0832 芯片来完成。ADC 是用于将模拟
形式的连续信号转换为数字形式的离散信号的一类设备。ADC0832 为 8 位分辨
率 A/D 转换芯片,其最高分辨可达 256 级,可以适应一般的模拟量转换要求。其
芯片内部遵循着如下计算逻辑:

(3-1)

( 3-

2)
由公式(3-1)和(3-2)可知,电源输入与参考电压的复用,使得芯片的模拟
电压输入在 0~5V 之间。芯片转换时间仅为 ,具有双数据输出可作为数据
校验,以减少数据误差,转换速度快且稳定性能强。
独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过 DI
数据输入端,可以轻易的实现通道功能的选择。当芯片不进行模数转换时,片选
端 CS 需要置 1。在当芯片需要模数转换时,片选端 CS 需要置 0,并且需要持续
到模数转换完成。芯片使能选通后,在第 1 个 CLK 下降沿到来之前,DI 需要置
1,这意味着开始转换。之后在下两个 CLK 下降沿到来之前,DI 需输入两位选
择 A/D 转换器 4 个工作通道模式的数据。到这一步,本次模数转换中 DI 端工作
部分已完成,不再输入数据,而是由 DO 端进行工作。在随后的 CLK 下降沿到
来之前开始输出转换后的数字信号,先输出 8 位数据的最高位,之后在每一个
CLK 下降沿到来之前依次输出数据的一位,直到输出 8 位数据的最低位;随后
的每一个 CLK 下降沿到来之前依次输出相反字节的数据次低位到最高位,这就
完成了一次 A/D 转换。在编程时会比较两次输出的 8 位数据是否一致,若一致说
明 A/D 转换数据没有错误,就会将其数据保存下来。

8
3.4 LCD1602 显示模块电路
本文设计采用 LCD1602 显示模块将检测的光照强度和人数显示在显示屏
上,供用户进行查看。该显示模块的 3 引脚和 1 引脚接 3.3K 的电阻然后接地,
这部分主要使得该显示屏的亮度处于较为适宜的范围,该电阻的阻值为一个典
型值;该显示模块的 4 引脚为指令/数据选择信号,当该引脚低电平时允许单片
机将数据写到显示屏;该显示模块的 5 引脚为读写选择功能引脚,该引脚为 1
状态,将数据写到存储器中;该显示模块的 6 引脚为使能引脚,当该引脚为高
电平,对显示屏进行使能,使得单片机进行工作;该显示模块的 7 到 14 为数据
传输引脚,单片机将数据传输到显示进行显示。如图 3.5 为 LCD1602 显示模块
设计电路原理图:

图 3.5 显示模块原理图

3.5 按键模块电路
按键模块采用三个独立按键进行设计,其中分别具有四个引脚,两个边角
相通,所以在使用的时候,都是连接对角的两个引脚,其中一个接到单片机的
I/O 端口,另外一端接地。在按键没有动作的时候,输出的是高电平,如果有按
下动作发生,则输出的是低电平。一般只要扫描跟按键引脚相连的 I/O 端口,如
果发现有低电平产生,则判定该按键处于按下状态。有些时候,电路或者外围有
电磁干扰,也会使单片机的 I/O 端口产生低电平,这种干扰信号会让单片机误
认为是按键动作。所以,在扫描按键的时候应该做去抖动处理,把干扰信号过滤
掉,从而获得准确的按键状态信号。
按键 K1 的作用是切换界面(显示界面和设置界面),按键 K2 的作用在为
在设置界面进行+1 操作,设置人数值增加,设置光照强度值增加,按键 K3 的
作用为设置人数减少,设置光照强度值减少。按键电路原理图如图 3.6 所示,按
键左边连接到一起,然后再连接到电源地,按键的右端分别连接到单片机的
P20、P21、P22 引脚,按键的工作原理为:按键没有按下,按键两边没有连接,
使得按键两端处于高电阻的状态,当按键按下时,按键将单片机的引脚接地,
使得单片机处于低电平,单片机通过扫描按键的电平,监测按键是否按下。

9
图 3.6 按键电路原理图

3.6 照明模块电路
此次设计采用三个照明模块模块控制教室的照明,检测到人数人数在 1 人
以上,10 人以下,开启第一盏灯,20 人时开启第 2 盏灯,30 人时开启第三盏灯;
照明模块的工作原理为:单片机输出的电流不能直接驱动照明模块,因此在照
明模块之前接了一个三极管,对电流进行放大,照明模块原理图如图 3.7 所示。

图 3.7 照明模块原理图

第四章 软件设计
4.1 编程软件介绍

10
本设计所用到的编程软件为 Keil5,其界面如图 4.1 所示:

图 4.1 Keil5 开发界面


相对于其他软件编程环境,Keil5 更加的轻便快捷,操作更加的简单,深受
广大嵌入式软件开发者的喜爱。Keil5 支持多种芯片,包括 51 单片机 、
STM32、HC32、NXP 等,生成的 HEX 文件,可通过烧录器直接烧录到单片机中,
非常方便。另外,Keil5 编译有三种,一种是单编,一种是部分编译,还有一种
是全部编译,这样给开发人员更多的选择,并且编译的结果,显示在界面的最
下方,供开发者查找错误。详细编程代码见附录 3。

4.2 主程序流程设计

11
系统的主流程图如图 4.2 所示;在主程序中:首先对各个模块进行初始化,
随后进入 while 主循环,在主循环中,首先进入第一个函数按键函数,该函数
主要分为两部分,第一部分为调用按键扫描函数获取按键键值,第二部分通过
键值进行相应的处理操作,比如切换界面、调整人数和光照阈值等;接着进入第
二个函数监测函数,该函数主要通过光照强度检测模块检测和人数当前的人数
和光照强度进行检测;之后进入第三个函数显示函数,该函数通过不同的显示
标志位显示不同的界面,包括主界面显示当前的光照值和人数等;最后进入第
四个函数处理函数,该函数主要判断当前教室有人,且当前的光照强度较暗,
根据当前的人数控制照明灯亮的数量,人数在 10 人,开一盏灯,20 人开 2 盏灯,
30 人开三盏灯;光照值,当大于设置最大值,不开灯,在最小值和最大值之间 ,

12
进行自动调节,小于设置最小值,灯最亮。
图 4.2 程序总体流程图

4.3 独立按键子程序
首先,定义按键引脚,进行初始化引脚状态。接下来判断模式标志位是否为
1,如果为 1,则为支持连续按模式,将按键状态标志位置 1。然后判断按键状态
标志位是否为 1 并且按键引脚为低电平,如果两个条件同时满足,则延时 10ms
进行消抖,将按键状态标志位置 0。再次判断按键引脚是否为低电平,如果为低
电平,则按键按下,返回相对应的按键键值。如果按键状态标志位不为 1 或者按

键引脚不为低电平,则判断按键引脚是否为高电平,如果为高电平,则按键抬

13
起,将按键状态标志位置 1,然后返回 0。如果按键引脚不为高电平,则按键没
有抬起,则直接返回 0。其子流程如图 4.3 所示。
图 4.3 独立按键子流程图

4.3 LCD1602 液晶显示子程序


如图 4.3 所示为 LCD1602 显示流程,第一步,初始化设置,首先设置工作
方式,设置成 8 位数据总线、两行显示模式、字体标志为 5×8 点阵+游标显示模
式;其次,设置显示开/关控制,设置成开显示、不显示光标、光标不闪烁;接
下来设置进入模式,设置成游标右移,显示不发生移位元;最后,进行清屏。第
二步,检测 LCD1602 显示屏是否处于忙状态,设置 RS=0,RW=0,E=1,利用
do,while 循环检测 busy 引脚电平,如果 busy 引脚是高电平,则代表此时
LCD1602 显示屏处于忙状态,不能接收单片机传来的指令,直到 busy 引脚为低
电平。第三步,设置显示位置,设置 RS=0,RW=0,E=1,数据口=需要显示的
坐标。第四步,传入显示数据,设置 RS=1,RW=0,E=1,数据口=需要显示的
数据。

图 4.3 LCD1602 液晶显示子流程图

14
4.4 A/D 模块转换子程序
通过 A/D 转换模块对采集的光照进行模数转换并对光照强度进行监测。首
先初始化引脚,然后 CS 拉低使能 ADC,接着 DI 拉高开始转换,先配置通道,
如果是通道 0,则通道选择第一位和第二位分别置 1 和 0;如果是通道 1,则通
道选择第一位和第二位分别置 1 和 1。配置好通道后,开始读取前 8 位数据,然
后读取后 8 位数据,数据读取完后 CS 拉高释放 ADC。最后判断前 8 位数据是否
等于后 8 位数据,如果相等,则返回数据,如果不等,则返回 0,A/D 数模转换
程序子流程如图 4.4 所示。
图 4.5 A/D 模块转换子流程图
第五章 实物测试
开始

初始化引脚

CS拉低
使能ADC

DI拉高
开始转换


通道0

通道配置 通道配置
1和0 1和1

读取前8位数

读取后8位数

CS拉高
释放ADC

前8位数据等于 否
后8位数据

返回数据 放回0

结束

15
5.1 实物焊接测试
在进行实物的焊接之前,需要先对此次设计的所有元器件进行检测,防止
焊接上去功能损坏的元器件,此次设计的大部分检测采用电压表进行检测,电
压表通过检测元器件的电压或者电流进行,主控芯片采用实验室专门检测芯片
的仪器进行检测。将检测出来损坏的元器件进行重新替换和检测,然后进行实物
的焊接,在进行实物的焊接时,单片机的方向及其其它器件需要注意其方向的
正反,焊接完成之后,先对焊接的实物进行进行虚焊、短路进行检查,检查无误
之后,将提前写好的程序导入单片机中。

5.2 实物整体焊接测试
整体实物焊接如下图 5.1 所示,在图中可以清楚的看到此次系统主要包括
STC89C52 单片机及其组成的最小系统,LCD1602 显示屏,独立按键,对射式
计数模块、光照采集模块、A/D 转换模块、LED 照明电路模块等构成此次设计的
室内照明控制系统,整体实物如图 5.1 所示。

图 5.1 整体实物图

5.3 实物上电测试
将提前写好的程序导入单片机中,然后进行上电运行,通过显示屏可以看
到,此时通过 A/D 转换电路将采集的光照进行模数转换,通过按键设置最大值
和最小值,设置光照最大值为 60 ,实物测试如图 5.2 所示;光照最小值为 30 ,
实物测试如图 5.3 所示。

16
图 5.2 设置光照最大值

图 5.3 设置光照最小值

5.4 实物前后门人数计数测试
用户可以根据自己的需求对前后门人数的进出进行统计,人数人数在 10 人
内,开一盏灯,实物测试如图 5.4 所示;20 人开 2 盏灯,实物测试如图 5.5 所示;
30 人开三盏灯,实物测试如图 5.6 所示。

17
图 5.4 亮 1 盏灯

图 5.5 亮 2 盏灯

18
图 5.6 亮 3 盏灯

5.5 实物光照测试
用户可以根据自己的需求设置当前的光照强度,当光照强度大于设置的最
大值时,不开灯,实物测试如图 5.7 所示;当光照强度在最小值和最大值之间
时,进行自动调节,实物测试如图 5.8 所示;当光照强度小于设置的最小值时
灯最亮,实物测试如图 5.9 所示。

图 5.7 光照大于 60

19
图 5.8 光照在 60-30 之间

图 5.9 光照小于 30

20
第六章 结论与展望
本设计以 STC89C52 单片机为核心控制器,加上其他的模块一起组成了基
于单片机的室内光照控制系统的设计的整个系统,系统是由 STC89C52 单片机 、
A/D 转换模块、光照采集模块、对射式计数管模块、LED 照明模块、按键模块 、
LCD1602 显示屏等部分组成。用户可以更具自己的需求设置光照的最大值和最
小值,灯亮的盏数,然后通过传感器传输到单片机进行处理判断,显示当前的
亮灯情况和光照强度值。系统获得数据后会与阈值比较并为光照强度调节提供控
制信号,实现远程控制,从而使室内光照度保持在一定的范围内。
由于时间及其测试条件的影响,此次设计也存在很多的不足。此次设计只针
对室内光照控制系统中的光照强度的监测与控制,可以通过声音控制灯的熄灭
情况,通过声音传感器对灯的熄灭进行控制;这个也是未来在研究及其学习中
需要改进的地方。

21
致谢
光阴似箭,时光飞逝,转瞬本科生涯即将结束,这两年对我来说无疑是意

义重大的,回忆过去的点点滴滴恍若发生在昨天。在论文即将截稿之际,借此机

会我将衷也的感谢大学期间给予我最大帮助的老师们,陪我一起走过匆匆岁月

的同学们,及其一起学习奋进的室友兄弟们。首先要感谢的是我的指导老师,毕

设期间老师在设计与论文上对于我的问题耐心解答以及悉心教导我。其次我重要

感谢我的班主任,刚入学就对我我们学习方向进行了规划,遇到问题时也会耐

必的教导。我的毕业论文能顺利完成也多亏指导老师的教导,从论文的选题到研

究内容、研究方法的确定,后期论文的修改,直到论文定稿老师都花费了大量的

心血。此次设计的室内光照控制系统通过硬件和软件共同组成,通过对比元器件

的性能、成本、进行画图、组装、编程、测试完成此次设计。经过这次的的毕业设计

我学会了更多的单片机控制系统的操作,将学习和查阅的理论知识应用到实际

操作中来,增强了我的动手能力,为未来走入工作岗位打下了坚实的基础。

22
参考文献
[1] 李红. 绿色校园教室照明控制的设计[J]. 科学技术创新, 2020(34):2.
[2] 白煜, 李香萍. 基于机器视觉的嵌入式教室照明自动控制系统开发[J]. 实验室研究与探索,
2021.
[3] 高淑芝, 李天池. 基于单片机的教室照明智能控制系统设计[J]. 控制工程, 2020(011):027.
[4] 邹恩, 张增根, 霍庆,等. 高校教室照明节能自动控制系统设计[J]. 2021(2015-17):2-4.
[5] 陈茂凌, 杨卉娟, 韩冰. 教室照明中照度检测方法的探讨[J]. 光源与照明, 2019(1):3.
[6] 程敏. 关于教室照明光环境现场检测标准的几点建议[C]// 2019 年中国照明论坛——半导
体照明创新应用暨智慧照明发展论坛论文集. 2019.
[7] 覃剑戈. 基于 Dialux EVO 的中小学教室照明优化方法研究[D]. 北京建筑大学, 2019.
[8] 程敏、安波、吴火然、胡锡兵. 教室优质照明光环境检测认证中的相关问题及分析[C]//
2020 年中国照明论坛——半导体照明创新应用暨智慧照明发展论坛. 2020.
[9] None. 云南:防控儿童青少年近视提出具体要求[J]. 教育(周刊), 2019(9):1.
[10] 张恭铭, 王国华, 赵建平,等. 北京地区中小学及高校教室照明改造频闪实测研究[J]. 建筑
科学, 2021, 37(6):6.
[11] 王志成, 陈朝晖. 《中小学及幼儿园教室照明技术规范》河南省地方标准发布[J]. 实验教
学与仪器, 2022, 39(6):1.
[12] 王跃飞, 吕鹤男, 吕天刚. 一种低眩光效应的 LED 教室照明灯具设计[J]. 中国照明电器,
2022(3):7.
[13] 江治国. 基于 ZigBee 技术的高校教室照明控制系统设计[J]. 西安文理学院学报:自然科
学版, 2018, 21(4):7.
[14] 李艳苹, 高辉, 宋起超,等. 基于 SCADA 的教室照明控制系统设计[J]. 中国科技信息,
2016(9):2.
[15] 李文军, 陈杰, 王永峰. 教室照明控制系统的设计[J]. 现代信息科技, 2022, 6(10):3.

23
附录
附录 1:原理图

24
25
附录 2:PCB

26
附录 3:主程序
/**********************************
变量定义
**********************************/
uchar key_num = 0; //按键扫描标志位

uchar flag_display = 0; //显示界面标志位


uint time_num = 0; //10ms 计时变量
char display_buf[16]; //显示缓存区

uint light_value = 0; //光照值


uint light_max = 60; //光照最大值
uint light_min = 30; //光照最小值

uint pulse_num = 0; //计数值


uint man_num1 = 15; //人数等级 1
uint man_num2 = 30; //人数等级 2
//uint man_num3 = 30; //人数等级 3

uint flag_led = 0; //led1 标志位


//bit flag_led2 = 0; //led2 标志位
//bit flag_led3 = 0; //led2 标志位

uint actual_number = 0; //实到人数


bit flag_qd = 0; //确定标志位
bit flag_fs = 0; //发送标志位
uint flag_out1 = 0,flag_in1 = 0,flag_out2 = 0,flag_in2 = 0;//计数触发记录

extern uint pwm_value; //pwm



/**********************************
函数声明
**********************************/
void Delay_function(uint x); //延时函数(ms)
void Key_function(void); //按键函数
void Monitor_function(void); //监测函数
void Display_function(void); //显示函数
void Manage_function(void); //处理函数

/****

27
******* 主函数 *****/
void main()
{
Lcd1602_Init(); //LCD1602 初始化
Delay_function(50); //延时 50ms
lcd1602_clean(); //清屏
Delay_function(50); //延时 50ms
Timer0_Init(); //定时器 0 初使化函

Delay_function(50); //延时 50ms

while(1)
{
Key_function(); //按键函数
Monitor_function(); //监测函数
Display_function(); //显示函数
Manage_function(); //处理函数

Delay_function(10); //延时 10ms


time_num++; //计时变量+1
if(time_num == 5000)
{
time_num = 0;
}
}
}

/****
******* 延时 x ms 函数
*****/
void Delay_function(uint x)
{
uint m,n;
for(m=x;m>0;m--)
for(n=110;n>0;n--);
}

/****
*******按键函数
*****/
void Key_function(void)
{

28
key_num = Chiclet_Keyboard_Scan(0); //按键扫描
if(key_num != 0) //有按键按下
{
switch(key_num)
{
case 1: //按键 1,切换设置
界面
flag_display++;
if(flag_display >= 5)
flag_display = 0;

lcd1602_clean(); //清屏
break;

case 2: //按键 2
switch(flag_display)
{
case 0: //界面 0:

break;

case 1:
//界面 1:光照最大值+1
if(light_max < 99)
light_max++;
break;

case 2:
//界面 2:光照最小值+1
if(light_min < light_max - 1)
light_min++;
break;

case 3: //界面
3:人数 1 阈值+1
if(man_num1 < 99)
man_num1++;
break;

case 4: //界面
4:人数 2 阈值+1
if(man_num2 < 99)

29
man_num2++;
break;

// case 5: //界面
5:人数 3 阈值+1
// if(man_num3 < 99)
// man_num3++;
// break;

default:
break;
}
break;

case 3: //按键
3
switch(flag_display)
{
case 0: //界面 0:

break;

case 1:
//界面 1:光照最大值-1
if(light_max > light_min + 1)
light_max--;
break;

case 2:
//界面 2:光照最小值-1
if(light_min > 0)
light_min--;
break;

case 3: //界面
3:人数 1 阈值-1
if(man_num1 > 0)
man_num1--;
break;

case 4: //界面
4:人数 2 阈值-1

30
if(man_num2 > 0)
man_num2--;
break;

// case 5: //界面
5:人数 3 阈值-1
// if(man_num3 > 0)
// man_num3--;
// break;

default:
break;
}
break;

default:
break;
}
}
}

/****
*******监测函数
*****/
void Monitor_function(void)
{
if(time_num % 10 == 0) //100ms 检测一次
{

light_value = 20*((Adc0832_Get_Value(0)/255.0)*5); //获取


光照强度(0-100)
}
if(flag_qd == 0) //确定键未按下
{
/*前门*/
if(IN1 == 1 && OUT1 == 0)
//红外进触发且红外出未触发
flag_in1 = 1;
//红外进标志位置 1
if(IN1 == 0 && flag_in1 == 1 && OUT1 == 1)
//红外进未触发且红外进标志位为 1 且红外出触发
{

31
flag_in1 = 2;
//红外进标志位置 2
flag_out1 = 1;
//红外出标志位置 1
}
if(IN1 == 0 && flag_in1 == 2 && OUT1 == 0 && flag_out1 == 1)
//红外进未触发且红外进标志位为 2 且红外出未触发且红外出标志位为 1
{
actual_number++;
//人+1
flag_out1 = 0;
//清除红外出标志位
flag_in1 = 0;
//清除红外进标志位
}

if(OUT1 == 1 && IN1 == 0)


//红外出触发且红外进未触发
flag_out1 = 1;
//红外出标志位置 1
if(OUT1 == 0 && flag_out1 == 1 && IN1 == 1)
//红外出未触发且红外出标志位为 1 且红外进触发
{
flag_out1 = 2;
//红外出标志位置 2
flag_in1 = 1;
//红外进标志位置 1
}
if(OUT1 == 0 && flag_out1 == 2 && IN1 == 0 && flag_in1 == 1)
//红外出未触发且红外出标志位为 2 且红外进未触发且红外进标志位为 1
{
if(actual_number > 0)
actual_number--;
//人-1
flag_in1 = 0;
//清除红外进标志位
flag_out1 = 0;
//清除红外出标志位
}
/*后门*/
if(IN2 == 1 && OUT2 == 0)
//红外进触发且红外出未触发

32
flag_in2 = 1;
//红外进标志位置 1
if(IN2 == 0 && flag_in2 == 1 && OUT2 == 1)
//红外进未触发且红外进标志位为 1 且红外出触发
{
flag_in2 = 2;
//红外进标志位置 2
flag_out2 = 1;
//红外出标志位置 1
}
if(IN2 == 0 && flag_in2 == 2 && OUT2 == 0 && flag_out2 == 1)
//红外进未触发且红外进标志位为 2 且红外出未触发且红外出标志位为 1
{
actual_number++;
//人+1
flag_out2 = 0;
//清除红外出标志位
flag_in2 = 0;
//清除红外进标志位
}

if(OUT2 == 1 && IN2 == 0)


//红外出触发且红外进未触发
flag_out2 = 1;
//红外出标志位置 1
if(OUT2 == 0 && flag_out2 == 1 && IN2 == 1)
//红外出未触发且红外出标志位为 1 且红外进触发
{
flag_out2 = 2;
//红外出标志位置 2
flag_in2 = 1;
//红外进标志位置 1
}
if(OUT2 == 0 && flag_out2 == 2 && IN2 == 0 && flag_in2 == 1)
//红外出未触发且红外出标志位为 2 且红外进未触发且红外进标志位为 1
{
if(actual_number > 0)
actual_number--;
//人-1
flag_in2 = 0;
//清除红外进标志位

33
flag_out2 = 0;
//清除红外出标志位
}
// }

}
}

/****
*******显示函数
*****/
void Display_function(void)
{
switch(flag_display) //根据不同的显示模
式标志位,显示不同的界面
{
case 0: //界面 0:
lcd1602_display_str(1,0,"Light:"); //显示
光照值
lcd1602_display_light(1,6,light_value);
lcd1602_display_str(2,0,"pulse_num:"); //
显示光照值
lcd1602_display_num(2,10,actual_number);
break;

case 1: //界面
1: 设置光照最大值
lcd1602_display_str(1,2,"Set Light Max");
if(time_num % 20 == 0)
{
sprintf(display_buf,"%d",light_max);
lcd1602_display_str(2,7,display_buf);
}
if(time_num % 40 == 0)
{
lcd1602_display_str(2,7," ");
}

break;

34
case 2: //界面
2:
lcd1602_display_str(1,2,"Set Light Min");
if(time_num % 20 == 0)
{
sprintf(display_buf,"%d",light_min);
lcd1602_display_str(2,7,display_buf);
}
if(time_num % 40 == 0)
{
lcd1602_display_str(2,7," ");
}
break;

case 3: //界面
3:
lcd1602_display_str(1,2,"Set Man Num1");
if(time_num % 20 == 0)
{
sprintf(display_buf,"%d",man_num1);
lcd1602_display_str(2,7,display_buf);
}
if(time_num % 40 == 0)
{
lcd1602_display_str(2,7," ");
}
break;

case 4: //界面
3:
lcd1602_display_str(1,2,"Set Man Num2");
if(time_num % 20 == 0)
{
sprintf(display_buf,"%d",man_num2);
lcd1602_display_str(2,7,display_buf);
}
if(time_num % 40 == 0)
{
lcd1602_display_str(2,7," ");
}
break;

35
// case 5: //界面
3:
// lcd1602_display_str(1,2,"Set Man Num3");
// if(time_num % 20 == 0)
// {
// sprintf(display_buf,"%d",man_num3);
// lcd1602_display_str(2,7,display_buf);
// }
// if(time_num % 40 == 0)
// {
// lcd1602_display_str(2,7," ");
// }
// break;

default:
break;
}
}

/****
*******处理函数
*****/
void Manage_function(void)
{
if(flag_display == 0) //测量界面
{
if(light_value < light_min) //光照值小于最小值,光照
最亮
{
pwm_value = 10;
}
else if(light_value > light_max)
{
pwm_value = 0;
}
else if(light_value < light_max && light_value > light_min)
{
pwm_value = 10 - 10*(light_value-light_min) / (light_max-
light_min);
}

if(actual_number > man_num2)

36
{
flag_led = 3;
}
else if(actual_number > man_num1)
{
flag_led = 2;
}
else if(actual_number >= 1)
{
flag_led = 1;
}
else
flag_led = 0;
}
else //设置界

{
flag_led = 0;
}
}

37

You might also like