单片机智能台灯设计实现全解析

摘 要

伴随着现代社会的不断发展,商品新的发展方向和市场前景大量地由商品的新科技成分决策,智能技术性在电
子设备中的运用具备广阔的实际意义。近些年,伴随着电子设备的迅速发展趋势,家用机器设备愈来愈智能化。
  现阶段早已具体使用的智能日用具有智能全自动洗衣机、中央空调、电滋炉等。并且全部应用的智能家用台灯
都是有一个相同的特性,都选用单片机作为中心操纵模块。对比一般台灯,单片机智能家用台灯应用更便捷,安全
性稳定性更高,高效率更高,更主要的是更环保节能。
  智能台灯是根据红外传感器来感应身体的红外信号,换句话说仅在有人的情况下,红外传感器的输入输出信息
会被变大,达到单片机的输入门限电压。单片机运行,台灯点亮。当检测到目标离去时,单片机操控台灯全自动关
掉,进而实现节能环保的目地。除此之外,台灯的工作模式可以根据功能按键设定为全自动或手动模式。在这之
前,假如监测到一个人的坐姿不端正,可以通过红外光电进行检查,台灯中蜂鸣器会发出声响,提示用户调整座
姿。该功能模块可以协助保护用户的眼睛视力。
关键词:单片机,智能台灯,红外传感器,人体感应

第一章 引 言

1.1 研究课题的目的和意义
  伴随着科技的发展,大家的生活水平不断提升,新科技产品愈来愈受大家喜爱。怎样开发设计能巨大提升大家
生活品质、方便使用的家用台灯,变成台灯领域的主要研究领域。台灯是大家日常生活中不可缺少的家用设备。与
一般日灯管对比,其用电量更小,光亮集中,是大家晚间阅读文章和作业的左膀右臂。殊不知,大家常常在离开时
忘掉关闭台灯,这将导致巨大电力消耗。假如台灯离门较远,当夜晚来临时,大家迫不得已在暗夜里开灯[15],十
分不方便,并且有一定的安全风险。如今,尽管根据微控制器与传感器自动控制灯光效果开关的工艺已广泛运用于
房屋楼梯道等场地,可是在生活家居层面,自动控制灯光效果开关的体系却不常见,作用还不够健全和智能化。例
如楼梯道里的灯一般全是靠响声操纵的。利用声控采集信号,随后微处理器操纵灯光效果的开关。可是,它不可以
精确辨识和屏蔽掉影响。当自然环境中有很多噪声时,如车辆或动物的噪声,照明灯具难以避免会遭受噪声的影
响,导致没必要的能源消耗。因而,文中探讨了检验人体红外辐射的传感器控制电路,以解决目前自动控制电源电
路的缺点。现阶段已经有专业用以检测人红外辐射光波长的红外传感器[21],为自动控制灯光控制系统给予了出色
的信息收集控制模块[3]。
  本课题设计了一种根据STM32单片机设计的电控系统,根据红外传感器检验身体的红外辐射数据信号来操纵台灯
的开关。当人在红外传感器的监测范畴内,并达到别的一些设置标准(如低光照强度)时,数据信号收集控制模块可
以保证合理的激励数据信号,根据对应的PWM操纵灯的亮度,自动调节亮度[12]进而实现节能环保的目地。并且具有
光电开关检测纠正坐姿[2]报警提醒和定时提醒功能[4]。
1.2 智能台灯的历史和发展概况
  同国外智能台灯的发展相比,国内的智能台灯发展起步晚,智能台灯在我国早已发展了二十年左右。发展漫长
而又艰辛,其发展可以归纳为四个阶段,即萌生阶段、发展阶段、徘徊阶段和融合演变阶段。智能台灯机器设备处
在发展期的中国。厂商们仅仅只处于认知的状态,中国还没专业的厂商。这个时候,从业代理的厂商寥寥无几。即
使如此,目标客户也不是中国客户。伴随着中国公司对外国技术性的了解和科技创新,这时,中国智能家居产业进
入了发展阶段。中国申请注册智能台灯制造业企业超出50家,主要遍布于北京市、深圳市、上海市等地。智能台灯
的销售和技术性管理体系不断完善。此阶段海外的智能台灯基本上沒有进到中国销售市场,但此时中国销售市场发
展太快,发生了问题,恶性价格竞争,对智能台灯领域的发展造成了很大的不良影响。
  之后智能台灯行业发展缓慢,步入了徘徊阶段。生产厂家包装过度,作用夸大其词,与商品比较严重不符合,
具体商品达不到推广实际效果,客户体验差。因此,客户逐渐怀疑智能台灯是否可靠,实用。许多厂商在这个阶段
无法生存开始转行。在这段时间,海外智能台灯知名品牌悄悄地进到我国市场,中国尚在的公司也慢慢找到自身的
发展方位,变成工业生产智能控制系统的生产商。
  尽管中国厂商陆续转为工业自动化,但一直没舍弃智能家居系统的理想。自2011年初至今,销售增长的趋势越
来越明显。通过大幅度的改善可以看出,智能台灯领域已经开始发生改变,进入了新的拐点,从徘徊阶段进入了融
合演变的非常关键的阶段。此时,智能台灯已经进入了发展相对较快的阶段,同时也汲取了以前的经验教训。中国
制造商相互沟通协议,产生新的行业生产标准,大大缩短了产品开发周期时间,规范了产品实施标准,降低了研发
难度。伴随着中国出色的家居家具公司更加高度重视智能台灯的发展,尤其是对以客户为中心的智能台灯的科学研
究,一大批中国出色的智能台灯知名品牌已经快速兴起,慢慢变成中国智能家居产业的引领者。
1.3 本课题的研究内容与方法、解决方案
  本课题研究选用红外传感器开展智能化系统设计。现阶段已发现的红外传感器都能对身体红外信号给予回应,
但信号采集放大电路模块能不能正常运行决定于它的响应幅度和工作频率,因而选用适宜的红外传感器进行电路设
计十分关键。要完成自动控制系统的作用,不但要了解单片机的原理,还需要学习常见的单片机汇编程序和实现本
设计系统软件的单片机控制模块的程序编辑。
  延时函数及内部AD模数转换[15],PWM脉冲控制要求:设计人体数据信号采集放大的控制电路构造,且需考虑到
根据STM32F103C8T6单片机的智能灯的设计与实现。制作出实际物品验证课题的正确与否。
  自动控制模块要求:以32单片机为主要器件,外围电路由蜂鸣器、内部模数转换、PWM脉冲调节光、人体红外传
感器[21]、DS1302时钟电路、OLED液晶显示、光电开关等部件构成[1]。程序流程用C语言撰写,在32单片机开发板
上调试,仿真模拟人出现的状况,检测自动控制模块的反应功能和准确性,最后同信号采集结合完成具体功能的实
现。
  研究方法:根据阅读文献了解的红外线传感器的原理;挑选合适的电气元器件,设计出电路原理图;设计出台
灯的控制的程序,并通过仿真软件进行功能上的检验调试;将程序装载进单片机。
  解决方案:未开始进行设计前,阅读大批量的有关论文参考文献,了解目前热释电红外传感器[5]的运用现况,
对实物设计所需的专业知识详细了解,包含32单片机、光电开关、红外传感等。在研究设计中间阶段,分析设计电
路,着重于信号采集和电路控制。设计的后期,整理设计过程,最后完成实物以及论文编写。
1.4 本论文的思路
  论文依据实物设计的思路,从单片机,蜂鸣器等器件的选型到各模块的设计,以及最后的软硬件调试。论文分
别从五个部分进行了介绍:
首章的引言部分,主要介绍了智能台灯的研究背景和意义,以及智能家居设备在国内外发展的大概情况。
  第二章主要介绍了硬件部分的设计,对设计所需的部分方案的选择,器件的选择做了详细介绍,也对主要的功
能模块的电路原理图进行详细的说明,包括时钟模块人体感应模块和一些外围的电路等的说明。
第三章软件设计部分,将各模块的程序运行的逻辑,通过流程图的形式直观地把相关的功能展现出来。
  第四章是软硬件调试部分,主要是对设计的功能进行调试,检测功能是否正确,将正确的功能效果展示并且加
以说明。
第五章的主要内容是对设计的总结,还有设计的不足或尚可加以优化改进的展望。

第二章 系统硬件设计思路

2.1 整体电路框架
2.1.1 硬件框图设计
本系统组成如图1所示,主要有八个部分组成:
(1)以STM32组成的中央控制单元:处理信号并发出控制命令
(2)传感器及信号处理电路:检测人体辐射红外信号及光强信号,经过处理后变成可处理的数字信号
(3)按键设置模式
(4)时钟电路
(5)光明采集当前环境光线强度
(6)OLED液晶显示亮度
(7)蜂鸣器提醒电路
(8)PWM脉冲控制灯光亮度调节:由光敏电阻采集周围环境光线,并通过PWM脉冲进行调节灯光强度
图2.1 系统机构图

2.1.2 整体原理图
如附录I所示。
2.2 选型确认
2.2.1 单片机的选择
列入可选名单的单片机有三个,分别是CPLD,STC89C52以及STM32单片机。
  首先CPLD的优点接口多,方便操作。不仅编写的程序使用硬件描述语言,控制效果更好,而且需要的外围电路
也十分简单。除此之外,CPLD体积小,更稳定,扩展容易等诸多优点,常与DSP或者FPGA等控制器结合出现在许多大
规模的系统中,使系统控制更高效。本次设计的功能并不复杂,而且对数据的处理能力要求不高,所以放弃选择这
个单片机。
  其次STM89C52单片机,52单片机具有很好的储存的功能,同时也拥有功耗低器件性能高的优点,但是由于52单
片机的储存器只有8位,不能够满足设计需要完成的功能要求,所以将此单片机放弃。
最后STM32单片机,功能多,拥有16位的系统,低功耗,而且数电模块和模电模块同时在一块芯片上,能够解决非常
多的问题。STM32F103C8T6是该系列应用较为广泛的一款控制芯片,功耗低,体积较小巧,方便扩展,非常的可靠,
性价比很高。
所以综上所述,将STM32单片机用作设计的主控制器。
2.2.2 光照检测方式
  第一种方式:选择光敏电阻,将不同的电压值对应相对的环境亮度值,再通过转换后得到不同的数字信号,将
这些信号传送给单片机进行处理。
  第二种方式是采用光敏二极管或者三极管等光感器件,将环境的亮度与不同数字电平相对应,然后与单片机的
IO引脚直接相接。
因为光敏电阻的效果与方案二相差较小,而且价格低,所以最终选择第一种方式。
2.2.3 液晶显示方案
  第一种方案:采用点阵数码管显示。发光二极管是构成点阵数码管的主要器件,能够满足数字文字两种显示要
求,但点阵式数码管价格不满足设计要求,偏高,且设计不需要过高性能的显示要求,因此放弃采用此方案。
  第二种方案:采用LED数码管。其特点是使用简单方便,价格低廉,具有稳定的性能。在数字显示方面具有非常
好的实用性。但是本设计中除了需要数字的显示,还需要比较多的文字显示,LED数码管不能很好的满足设计需求,
所以放弃采用此方案。
  第三种方案:采用OLED液晶显示。常与单片机配合使用,能够同时满足对数字和文字显示的要求,显示位数
多,内容清晰,对于程序的编写也十分的简单便捷。价格也在可接受范围内,与设计所需的要求非常的贴合,因此
最终将方案三作为使用方案。
2.2.4 人体感应方式
  第一种方式:采用红外对管进行检测。红外发送与接收管分别安装在相对位置。如果红外接收管没有收到信
号,证明中间有物体遮挡,表示有人进入。
  第二种方式:采用集成电路BIS0001。芯片的传感信号处理的能力非常高。与少量外接元器件和热释电红外传感
器则可构成被动式的热释电红外开关等。常用于自动开启类的装置上比如生活中常见的走廊声控灯,厕所的感应洗
手池等等。
  由于第一种方式需要红外发送与接收管以相对的方式放置,而且对放置的距离有很高的限制,无法在实际物品
上安装实现,太过复杂麻烦,所以本设计采用第二种方式。
2.2.5 时钟芯片选择
对于时钟芯片准备了两种选择方案。
  第一种是选择单片机的内部时钟,通过编写程序来显示当前的信息和参数,不需要外接传感器,但是由于单片
机的内部时钟精度较差,十分容易产生积累误差,且无法掉电行走,因此放弃此方案。
  第二种是选择DS1302时钟芯片,此芯片是专门用来处理万年历方面信息的,精度高,价格便宜,并且数据可以
通过电子能够实现掉电行走,通电后无需重新进行设置,非常符合设计要求,所以将方案二作为实施方案。
2.3 单片机部分设计
  能让单片机正常的工作,而且能够它的功能可以正常的运行的集成在一个芯片上的完整的计算机系统称为单片
机的最小系统。单片机作为控制的核心,它的芯片上同时拥有定时器设备,一部分的输出设备以及通讯接口。单片
机目前具有非常先进发展,如图2.2所示:

图2.2单片机最小系统框图
  单片机作为生活中常用的控制器件,是微型计算机的重要组成部分,主要有内部的单块集成电路组成,其内部
主要模块分别是CPU处理芯片即中央处理器,储存器以及IO接口。我们需要使用相对应的程序下载软件,加载写入的
程序可以实现外围电路的控制和使用。STM32单片机由于电压低,处理能力强,以及可以快速清除字节的特点,医疗
机构和工业生产中得到广泛应用。
  为了实现各种功能,需要完成单片机与外部电路之间的信息交流,此时,需要将单片机的引脚连接到所需功能
的电路上,才能够实现该功能。由于单片机的发展和科技不断地进步,更加重视单片机形状的大小和外观上的设
计,所以研究人员设计单片机的许多引脚能够实现双功能或者是多功能。本设计采用的是40线双列直插式封装形
式,其特点如下:
(1)工作频率 48 MHz
7
8
(2)16-bit 定时器 8
(3)32-bit 定时器 1
(4)A/D 转换器 1×12-bit
(5)D/A 转换器 1×12-bit
(6)通信接口 1xSPI/I2S;1xSPI; 2xI2C;2xUSART;CEC
(7)I/O端口 39
(8)电压 2~3.6 V
   本课题设计选取的是STM32单片机系列中的STM32F103C8T6单片机。同52系列的单片机相比较,STM32单片机就
增加了其余更多的功能, 32系列的单片机,拥有更加敏捷的运行速度,且自身拥有2个AD转换,具有非常高的实用
性。
STM32的实物图,如图2.3所示,主要器件功能介绍如表2.1所示:

图2.3 STM32F103C8T6实物图
表2.1 单片机主要器件介绍
  
电源指示灯
LED
电源指示灯亮,表示单片机正处于正常的运行状态,,指示灯出现显示亮度较暗或者不停闪烁的情
况,单片机可能有故障存在。
PC13指示灯 也称用户指示灯,这个功能的使用让一些比较简单的功能更容易测试,例如对检测单片机的运行状态
等。
BOOT选择 有 3种编程方式。如用户的SARM、闪存和系统的存储器。
复位电路 低电平复位。
8M晶振 主要作用是对单片机系统的频率进行设置,频率为72MHZ
32.768KHz
晶振 对内置RTC提供使用,省去了使用专门的时钟芯片对定时器进行处理的麻烦等。
2.4 光照检测模块
  光敏电阻是由硫化镉或硒化镉等半导体材料制作而成的特殊电阻器,基于光电效应的工作原理。电阻的阻值随
着环境亮度强度的改变而改变,亮度强度升高,阻值快速降低,亮电阻值可小至1KΩ以下。光敏电阻对亮度有着高
敏感度,没有光照射的时候,呈现为高阻状态,暗电阻值一般可达1.5MΩ。
  光敏电路通过光敏电阻来对环境的亮度进行收集,根据不同的亮度强度输出不同的电阻值,将数据传输给单片
机,由单片机的内部AD进行模数的转换,依据不同的数值由PWM脉冲电路进行调节灯光。

2.5 人体感应模块
2.5.1 热释电传感器
  热释电红外传感器能够做到与身体不触碰的情况下捕捉到身体放射出的红外线,并将捕捉到的红外线转变为相
对的电压信号。热释电传感器有着非常多的特点,例如成本较低高,灵敏度高,无需红外线发射源等。但是在实际
的使用时,需要同菲涅尔透镜组合使用[20],安装在传感器的前面,提高传感器接收的灵敏度,同时增大检测的距
离及范围。

2.5.2 信号处理电路
本设计使用BIS0001对热释电传感器[8]的输出信号进行处理,BIS0001的引脚图如图2.6所示:

部分组件介绍如表2.2所示:
表2.2 部分组件介绍
  
光敏电阻,用于周围环境亮度的收集检测,阻值与环境亮度呈现相反关系。阻值下降,使引脚9会保持低电平 R3 的输入,从而将触发信号Vs拦截。
SW1工作方式的选择开关,引脚1状态下,为可重复触发工作方式;引脚2状态下,为可重复触发工作方式。
2.6 液晶显示模块
LED是128列×64行点阵的OLED、字符、图形显示模块,接口电路简单,使用方便。如图2.8所示,时液晶电路的的设计
框图:

2.7 时钟模块
  采用DS1302时钟芯片,具有功能消耗低、性能特性高的特点,除此外还拥有RAM的实时时钟电路的功能。芯片的
使用方法简单,接线方便,可以对年月日时分秒进行计时,同时带有闰年补偿的功能[17]。DS1302示意图如图2.9所
示:

各引脚的功能如表2.3所示:
表2.3 各引脚功能
  
1引

主电源的引脚VCC2。
2和
3引

X1、X2外接晶振引脚。(外接32.768kHz晶振)
4引

GND为接地引脚。
5引

CE/RST为复位/片选线。通过把RST输入驱动置高电平来启动所有的数据传送。
1.RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
  2.RST提供终止单字节或多字节数据的传送手段
6引

I/O为数据输入输出口。在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从
低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据
时从低位0位到高位7
7引

SCLK为串行时钟输入
8引

备用电源的引脚VCC1
DS1302控制字符的介绍如表2.4所示:
表2.4 控制字符介绍
  
位7 1为数据可以写入,0为数据不可写入
位6 1表示存取RAM数据,0表示只存取日历时钟数据
位5~位1 指示操作单元的地址
位0 最低有效位,1为读操作,0为写操作
2.8 按键设置模块
  按键电路部分一共设置4个按键,分别控制参数设置,加减,自动模式,手动模式。按键采用独立式,每个按键
单独连接IO端口,互不影响。
2.9 PWM灯光调节模块
  PWM具有从处理器直至被控系统信号皆是数字形式的优点,不需要使用数模转换的操作,通过使用高分辨率计数
器的方式,具体模拟信号的电平,是由调制的方波的占空比来进行编码。通过不同的光线值进行数据处理后,PWM脉
冲灯光调节电路可以直接调节当前灯光亮度,这样的话台灯不但可以节约电能源还可以起到视力保护的作用。

2.10 蜂鸣器模块
  蜂鸣器提醒电路主要是为了提醒使用者的注意使用时间,长时间的在灯光下学习工作,会造成势力的疲劳,设
计使用按键对提醒时间设置,达到提醒时间,蜂鸣器发出提醒。蜂鸣器提醒电路的示意图如图2.12所示:

2.11 坐姿纠正模块
  利用光电开关来达到坐姿纠正的目的,但光电开关被物体遮挡时,通过蜂鸣器提醒,纠正使用者坐姿。常用的
红外线光电开关,是利用物体对红外线光束的反射原理[16],由同步回路感应反射回来的光的强弱而检测物体的存
在与否来实现功能的,光电传感器首先发出红外线光束到达或透过物体或镜面对红外线光束进行反射,光电传感器
接收反射回来的光束,根据光束的强弱判断物体的存在。示意图如图2.13所示:
2.12 本章小结
  本章节对主要的电路以及原理图做了介绍。主要介绍的内容包含:单片机最小单元、人体红外线检测、OLED液
晶显示、DS1302时钟等。使用Altium Designer原理图绘制软件,绘制不同的模块电路图,通过不同的电路图,分析
不同模块的实现原理。
附录I

第三章 系统软件设计与实现

3.1 主程序流程图
  主程序模块:将系统通电后,对传感器的各引脚进行配置,之后由光敏采集数据信息,DS1302时钟初始化,通
过OLED液晶时钟显示当前的时间,由光电开关判断使用者坐姿是否端正,设置好的歇息时间是否达到,是否需要蜂
鸣器提醒,把数据通过OLED液晶显示当前采集到的数据,最后进入按键扫描判断按键是否按下如果按下则处理按键
扫描函数。

图3.1 主程序流程图
3.2 液晶显示程序流程图
  液晶显示屏正常工作,键入命令控制字,然后键入要显示的数据。在编写命令控制指令之前,优先通过指令,
检验液晶显示屏是否处于正常工作的状态,倘若正处在工作状态,等待显示工作结束的信号发出,之后开始写新的
控制字数据。
液晶显示模块的流程图如图3.2所示:

图3.2 液晶显示模块程序设计流程图
3.3 按键时钟程序流程图
3.3.1 按键时钟功能概述
对五个不同按键功能分别定义函数工作原理:检测信号的高低电平。按键按下,低电平被单片机引脚IO口检测,并
执行对应的功能。
3.4 蜂鸣器提醒流程图
3.4.1 蜂鸣器功能概述
  执行主函数之后,坐姿一直被检测是否端正或者是是否达到设置好的时间,在通过按键设定完成需要提醒时间
后,然后检测是否到了提醒的时间,
3.5 人体红外感应程序流程图
  热释电传感器一般被用作红外传感器设计,这种传感器前面窗口加有一块滤光片,用以滤除1- 14μm(人体发
出的红外信号为1- 14μm)以外的红外线[20],增加抗干扰能力。为了提高灵敏度,传感器需要安装菲涅尔透镜。
在人体红外检测到有人后,会输出高电平。此时三极管导通,单片机收到高电平信号。如图3.5所示,人体红外工作
流程图::
16

图3.5 人体红外感应模块流程图
3.6 光敏采集程序设计流程图
  光敏采集在收集到当前的数据后,将模拟量传输给单片机AD引脚处理,在进行了初始化之后,通过模数转换获
取当前的亮度值。工作流程图如图3.6所示:

图3.6 光敏采集工作流程图
3.7 DS1302时钟程序设计流程图
  第一步初始化变量,在变量初始化后之后,将DS1302写保护关闭,复位关闭后,将DS1302地址写入,并进行延
时操作,之后向该地址写入数据,地址增加,然后需要判断数据是否成功的写入,若没有地址成功的被写入,则重
新回到地址的写入,成功写入后将复位关闭,再次写入DS1302地址,经过一段时间后,将数据读出,判断数据有没
有写完,成功写完数据后,显示数据,若没有写完,则返回重新写入。
如图3.7所示:

图3.7 DS1302时钟工作流程图
3.8 本章小结
  在本模块结合设计想要达到的功能,通过流程图的形式,呈现不同功能单元的控制逻辑,展现本设计完成思路
的目的。

附录II
Main主程序:
#include "stm32f10x.h"
#include "OLED_I2C.h"
#include "ds1302.h"
#include "timer.h"
#include "gpio.h"
#include "delay.h"
#include "key.h"
#include "adc.h"
#include "stdio.h"
#include "string.h"
unsigned char setn=0;
unsigned char txshi=12,txfen=0,txmiao=0;
u8 tixing=0;//0:时间提醒关,1:时间提醒开
u8 mode=0;//0:自动模式,1手动模式
unsigned char miao = 0;//没有人的计时时间
unsigned char PWM_Val = 0xFF;//用于PWM调节
unsigned char GearTemp = 0;//0~3档
u8 RemindFlag=0;//提醒时间到了标志
u8 PostureFlag=0;//坐姿提醒
void DisplayTime(void)//显示时间函数
{
unsigned char x=4;
if(setn==0)DS1302_DateRead(&SysDate);//读时间
   OLED_ShowChar((x++)*8,0,SysDate.hour/10+'0',2,setn+1-1);
   OLED_ShowChar((x++)*8,0,SysDate.hour%10+'0',2,setn+1-1);
OLED_ShowChar((x++)*8,0,':',2,0);
   OLED_ShowChar((x++)*8,0,SysDate.min/10+'0',2,setn+1-2);
   OLED_ShowChar((x++)*8,0,SysDate.min%10+'0',2,setn+1-2);
OLED_ShowChar((x++)*8,0,':',2,0);
   OLED_ShowChar((x++)*8,0,SysDate.sec/10+'0',2,setn+1-3);
   OLED_ShowChar((x++)*8,0,SysDate.sec%10+'0',2,setn+1-3);
}
void DisplayTiXingTime(void)//显示提醒时间函数
{
unsigned char x=8;
if(tixing==1)
{
   OLED_ShowChar((x++)*8,4,txshi/10+'0',2,setn+1-4);
   OLED_ShowChar((x++)*8,4,txshi%10+'0',2,setn+1-4);
OLED_ShowChar((x++)*8,4,':',2,0);
24
   OLED_ShowChar((x++)*8,4,txfen/10+'0',2,setn+1-5);
   OLED_ShowChar((x++)*8,4,txfen%10+'0',2,setn+1-5);
OLED_ShowChar((x++)*8,4,':',2,0);
   OLED_ShowChar((x++)*8,4,txmiao/10+'0',2,setn+1-6);
   OLED_ShowChar((x++)*8,4,txmiao%10+'0',2,setn+1-6); if(txshi==SysDate.hour&&txfen==SysDate.
min&&txmiao==SysDate.sec)RemindFlag=1;
}
else
{
OLED_ShowStr(64,4,"--:--:--",2);
RemindFlag=0;
}
}
void DisplayMode(void)
{
u8 i=0;
if(tixing==1)
{
   for(i=0;i<2;i++)OLED_ShowCN(i*16+79,6,i,1);OLED_ShowCN(111,6,6,1);//显示提醒开
}
else//关
{
   or(i=0;i<2;i++)OLED_ShowCN(i*16+79,6,i,1);OLED_ShowCN(111,6,7,1);//显示提醒关
}
if(mode==1)//手动
{
   for(i=0;i<2;i++)OLED_ShowCN(i*16,6,i+14,1);//显示手动
}
else//自动
{
   for(i=0;i<2;i++)OLED_ShowCN(i*16,6,i+12,1);//显示自动
}
}
void LedGearHandle(u8 temp)//调节LED档位
{
switch(temp)
{
case(0):PWM_Val = 0xFF;LED = 0;break;
case(1):PWM_Val = 0x78;break; //120
case(2):PWM_Val = 0x32;break; //50
case(3):PWM_Val = 0x00;LED = 1;break;
default:PWM_Val = 0x00;LED = 1;break;
}
OLED_ShowChar(80,2,temp+'0',2,0);//显示档位
}
void AutoHandle(void)//自动模式处理函数,根据光线调节LED亮度
{
25
u16 test_adc=0;
u16 light=0;
/获取光线值
   test_adc = Get_Adc_Average(ADC_Channel_9,5);//读取通道9的5次AD平均值
light = test_adc*99/4096;//转换成0-99百分比
light = light >= 99? 99: light;//最大只能到百分之99
if(mode==0)//在自动模式下,根据光线调节档位
{
if(miao==0)GearTemp=0;//秒计时到0,说明没有人了,关闭LED
else//否则根据光线调节
{
if(light>=85)GearTemp=0;
if(light<85)GearTemp=1;
if(light<55)GearTemp=2;
if(light<25)GearTemp=3;
}
}
}
void KeySettings(void)//按键设置函数
{
unsigned char keynum = 0;
keynum = KEY_Scan(0);//获取按键值
if(keynum==1)//设置
{
setn++;
if(tixing==1){
if(setn > 6)setn=0;}
else {
if(setn > 3)setn=0;
}
}
if(keynum==2)//加
{
   if(setn==0 && mode==1)//不在设置状态下,并且在手动模式下,手动增加档位
{
if(GearTemp<3)GearTemp++;
}
if(setn == 1)//设置时
{
SysDate.hour ++;
if(SysDate.hour == 24)SysDate.hour=0;
DS1302_DateSet(&SysDate);//设置时间
}
if(setn == 2)//设置分
{
SysDate.min ++;
if(SysDate.min == 60)SysDate.min=0;
26
DS1302_DateSet(&SysDate);//设置时间
}
if(setn == 3)//设置秒
{
SysDate.sec ++;
if(SysDate.sec == 60)SysDate.sec=0;
DS1302_DateSet(&SysDate);//设置时间
}
if(setn == 4)//设置提醒时
{
txshi ++;
if(txshi == 24)txshi=0;
}
if(setn == 5)//设置提醒分
{
txfen ++;
if(txfen == 60)txfen=0;
}
if(setn == 6)//设置提醒秒
{
txmiao ++;
if(txmiao == 60)txmiao=0;
}
}
if(keynum==3)//减
{
   if(setn==0 && mode==1)//不在设置状态下,并且在手动模式下,手动档位减
{
if(GearTemp>0)GearTemp--;
}
if(setn == 1)//设置时
{
if(SysDate.hour == 0)SysDate.hour=24;
SysDate.hour --;
DS1302_DateSet(&SysDate);
}
if(setn == 2)//设置分
{
if(SysDate.min == 0)SysDate.min=60;
SysDate.min --;
DS1302_DateSet(&SysDate);
}
if(setn == 3)//设置秒
{
if(SysDate.sec == 0)SysDate.sec=60;
SysDate.sec --;
DS1302_DateSet(&SysDate);
27
}
if(setn == 4)//设置提醒时
{
if(txshi == 0)txshi=24;
txshi --;
}
if(setn == 5)//设置提醒分
{
if(txfen == 0)txfen=60;
txfen --;
}
if(setn == 6)//设置提醒秒
{
if(txmiao == 0)txmiao=60;
txmiao --;
}
}
if(keynum==4)//模式切换
{
mode=!mode;
DisplayMode();
}
if(keynum==5)//提醒开关
{
setn=0;
BEEP=0;
tixing=!tixing;
DisplayMode();
}
}
void BuzzerSound(void)//蜂鸣器提醒声音
{
static u8 BeepCount=0;
BeepCount++;
if(BeepCount==1)BEEP=0;
if(BeepCount==2)BEEP=1;
if(BeepCount==4)BEEP=0;
if(BeepCount==5)BEEP=1;
if(BeepCount==7)BEEP=0;
if(BeepCount==9)
{
BEEP=0;
BeepCount=0;
}
}
int main(void)
{
28
char i=0;
DelayInit();
I2C_Configuration(); //IIC初始化
OLED_Init(); //OLED初始化
KEY_Init(); //按键初始化
BEEP_AND_GD_RTHW_GPIO_Config();
OLED_CLS();//清屏
DS1302_Init(&SysDate);
DelayMs(100);
DS1302_DateRead(&SysDate);//读时间
OLED_CLS();//清屏
   for(i=0;i<4;i++)OLED_ShowCN(i*16,2,i+8,0);//测试显示中文:亮度等级
OLED_ShowStr(62,2,": ",2);//显示冒号
   for(i=0;i<4;i++)OLED_ShowCN(i*16,4,i,0);//测试显示中文:提醒时间
DisplayMode();
Adc_Init();
TIM2_Init(49,71); //定时器初始化,定时50us
TIM3_Init(499,7199); //定时器初始化,定时50ms
//Tout = ((arr+1)*(psc+1))/Tclk ;
//Tclk:定时器输入频率(单位MHZ)
//Tout:定时器溢出时间(单位us)
while(1)
{
KeySettings();
DisplayTime();
DisplayTiXingTime();
AutoHandle();
LedGearHandle(GearTemp);
if(GD == 0)//检测坐姿不正确
{
if(PostureFlag==0)
{
PostureFlag=1;
BEEP=1;//蜂鸣器提醒
OLED_CLS();//清屏
for(i=0;i<6;i++)OLED_ShowCN(i*16+16,2,i+16,0);//测试显示中文:请注意坐姿!
DelayMs(1000);
OLED_CLS();//清屏
   for(i=0;i<4;i++)OLED_ShowCN(i*16,2,i+8,0);//测试显示中文:亮度等级
OLED_ShowStr(62,2,": ",2);//显示冒号
   for(i=0;i<4;i++)OLED_ShowCN(i*16,4,i,0);//测试显示中文:提醒时间
DisplayMode();
}
}
else
{
PostureFlag=0;
29
}
}
}
void TIM2_IRQHandler(void)//定时器2中断服务程序 
{
static u8 time_count = 0;
   if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
  TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位
time_count++;
   if(time_count > 200)time_count = 0;//10ms一个周期
if(time_count >= PWM_Val)LED = 1;//占空比调节
else LED = 0;
}
}
void TIM3_IRQHandler(void) //TIM3中断
{
static u8 count=0,count2=0;
   if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
   TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源
if(count2++>=2)
{
count2 = 0;
if(GD == 1)
{
if(RemindFlag==1&&txshi==SysDate.hour&&txfen==SysDate.min)
{
BuzzerSound();
}
else
{
BEEP=0;
}
}
}
if(count++ >= 20)//1秒时间到
{
count = 0;
if(RTHW==1)miao=30;//检测到有人,时间赋值30秒
else
{
if(miao>0)miao--;//没有人,30秒倒计时
}
}
}
}
3

第四章 软硬件调试

4.1 软硬结合调试
  在本设计中,对于硬件部分电路的设计,采用的是Altium Designer原理图绘制软件,设计的硬件实物的设计与
制作也是通过此电路的原理图进行制作的。系统的软件部分也是通过Keil软件进行设计编写的。
下面用流程图的形式,展示过程中通过什么样的方式将软件和硬件结合,来实现系统的目的效果。
流程图如下图4.1所示:

图4.1 系统验证流程示意图
  (1)首先,在上电后,观察液晶显示屏幕情况,观察时间是否正确,使用按键调节正确时间,初始状态下,台灯
设置在自动模式,在自动模式下,通过对环境光照亮度强度的检测,自动调节台灯光照强度,可以用手电模拟环境
光,将手电靠近光敏电阻,此时模拟环境光明亮,此时台灯是关闭状态,远离后台灯自动调亮,屏幕显示当前亮度
档位。
  (2)调节模式到手动模式,使用按键对灯光亮度调节,一共有三个亮度强度,同时显示屏幕会显示当前亮度的等
级。
(3)使用定时提醒功能,打开功能开关,设置提醒时间,将提醒时间设置在10秒钟后,时间到达后,蜂鸣器报警提
醒。
(4)最后,遮挡光电开关,模拟出现坐姿不端正的情况,蜂鸣器发出提醒,屏幕显示注意坐姿。
4.2 系统效果展示
按照上述测试的步骤,验证设计的全部功能。
图中,按键自左到右依次功能为1.时间设置选项按键2.亮度加,时间加按键3.亮度减,时间减按键4.模式切换按键
5.定时提醒开关按键。
初始状态下,台灯打开处于自动模式,如图4.2所示:
19

图4.2 系统初始状态下自动模式效果示意图
  通过上图4.2展示的信息可以看出,台灯处于自动模式下,通过对光敏电阻的遮挡以及光线照射来模拟日常使用
时不同光线强度,检测台灯是否可以实现自动调节灯光强度的效果,且屏幕是否可以正确显示亮度等级。
使用按键调节当前模式,使台灯处于手动模式,如图4.3所示:
图4.3 系统手动模式效果示意图

通过图4.3可以看出台灯再手动模式下,通过按键的调节,可以正确做到调节不同的灯光亮度,且屏幕可以正确
显示当前亮度等级。
  如下图4.4所示,使用手指遮挡光电开关模拟光电开关检测到物体距离过近的情况,当光电开关检测到距离过近
时,蜂鸣器及时发出提醒,并在屏幕上显示:“请注意坐姿!”,提醒使用者及时调整坐姿。

定时提醒正常处于关闭状态,提醒时间未设置如图4.5所示:

图4.5 系统定时提醒关闭状态效果示意图
  通过打开定时提醒模式开关,使用按键调节提醒时间,到达规定时间后,蜂鸣器发出声响,提醒使用者注意学
习时长,注意休息。如图4.6所示,将时间设置在10秒钟之后,到达时间后,蜂鸣器发出蜂鸣提醒。

图4.6 系统定时提醒打开状态效果示意图
4.3 本章小结
  通过本章节的内容可以看出,在不同模式下,对光线的调节都可以做到正确的显示,时钟模块的计时以及时间
的调节功能正确,光电开关的反应以及液晶屏幕信息的显示也未出现错误。本章内容对于设计的展示,验证了设计
达到了所要完成的目标。

第五章 总结与展望

5.1 总结
设计的主要目标实现自动调节灯光以及提醒功能,能够为节约电力能源,注意青少年视力以及身体健康的问题。
  程序部分的设计使用的是Keil软件编程。对设计的电路图使用Altium Designer原理图绘制软件进行绘制。
  课题的处理器设计使用的是STM32F103C8T6单片机,使用光敏电阻采集周围环境光线强度,光电开关判断使用者
坐姿是否正确,蜂鸣器用来进行提醒,DS1302时钟芯片显示当前时间,最终显示在OLED液晶屏上。
  为了解目前台灯的现状和对需要研究问题的分析。在设计开始前以及过程中查阅了大量的相关参考资料,对所
需资料进行了综合分析,通过所了解学习的单片机基础知识设计系统电路,经过仿真模拟电路,最后做出实物,确
定了功能的可实行性。
  设计过程中,将大学所学到的焊接知识运用在实际中,动手操作,做到了理论与实践结合,同时加强了许多基
本技能的操作,在制作过程中,通过与老师同学沟通交流,将所遇到的困难及问题解决,最后经过的调试,实现设
计所需要的功能。
5.2 展望
  人们的生活随着科技的进步而愈发便捷,学生的学习压力不断地扩大对于青少年的身体健康应该越来越重视,
此设计为了能够可以良好的保护学生的视力,纠正坐姿,功能良好。当然,虽然完成了大概的功能,但是由于时间
相对有限以及自身知识水平的不足,本系统还有需要完善提高以及扩展的地方,将台灯与其余的外联设备相连接,
实现物联网的功能,使用更加便捷,希望日后学习中能够更好的完善与提高。

作者:QQ1694456187

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机智能台灯设计实现全解析

发表回复