学 生 毕 业 设计
毕 业 设 计 任 务 书
一、设计的教学目的
1、提高学生运用所学知识分析问题和解决问题的能力;
2、培养学生知识应用能力、动手能力、创新能力、文字表达能力等,为今后的学习和工作打下良好的基础;
3、培养学生认真负责的工作态度。
二、设计的主要内容
1、总体方案确定。根据设计要求完成系统的总体设计方案;
2、系统硬件设计。系统硬件设计主要包括:按键输入电路、单片机数据输入输出电路、光敏和声敏控制电路、蜂鸣器报警电路、二极管路灯模拟电路,在此基础上完成原理图的绘制以及PCB图绘制和封装;
3、系统软件设计。本设计主要研究智能路灯控制系统,通过对时间的定时和光敏传感器的应用,达到对路灯的亮灭控制。对下半夜的路灯节能模式的开启和声敏系统的安全模式的跳转。对灯泡的亮灭进行采集,达到报警的程序描述;
4、制作实物。依据原理图列元器件清单,制作PCB板,购买元器件,进行电路板焊接,最后进行实物调试,完成实物的制作。
三、设计的基本要求
1、题目应恰当、准确地反映本课题的研究内容。
2、中心突出,内容充实,数据可靠,层次分明,图表清晰,结论正确。
3、所使用的度量单位一律采用国际标准单位。
4、字数不少于3000字。
四、进度安排
5、参考文献
[1] 蔡美琴, 张为民. MCS-51系列单片机系统及其应用[M]. 高等教育出版社, 2004: 13-45.
[2] 刘建清. 轻松玩转51单片机C语言[M]. 北京航空航天大学出版社, 2011: 255-269.
[3] 康华光. 电子技术基础 模拟部分[M]. 北京: 高等教育出版社, 1998: 98-123.
[4] 余锡存. 单片机原理与接口技术[M]. 西安: 西安电子科技大学出版社, 2003: 35-62 .
[5] 杜军, 邱瑞学. PL2101在路灯控制系统中的应用[J]. 国外电子元器件. 2003. 9 :33-34.
[6] 熊涛, 丁辛芳, 陈德英. 一种新颖的照明控制电路[J]. 传感器技术, 1999, 18 (5): 50-53.
[7] 王海伦, 叶冬芬. 单片机控制的照明智能控制系统[J]. 电气时代, 2005, (1): 121-122.
[8] 谭浩强. C程序设计[M]. 北京: 清华大学出版社, 2007: 145-169.
[9] 严蔚敏, 吴伟明. 数据结构(C)语言版)[M]. 北京: 清华大学出版社, 2010: 256-287.
[10] V. Yu. Teplov, A.V.Anisimov. Thermostatting System Using a Single-Chip Microcomputer and Thermoelectric Modules Based on the Peltier Effect[J] , 2002, 27(6): 67-104.
学 生 毕 业 设 计
开 题 报 告 书
毕业设计答辩申请表
学 生 毕 业 设 计
答 辩 评 审 表
2013年06月01日
毕业设计成绩评定标准及评审表(理工科类)
专业:电子科学与技术 课题:城市智能路灯控制系统设计 学生:欧敏辉
说明:1.本方案供学院部参考,评分方案和比例均可根据实际情况进行调整。
2.学生的答辩成绩取诸答辩委员会的平均成绩。
3.答辩委员会除给出答辩成绩外,还应汇总和审查指导教师、材料评阅人给出的成绩,然后分档(优
≥90;良80-89分;中70-79分;及格60-69分;不及格≤59分)给出学生毕业设计成绩。
注:①评语包括设计(论文)优点、缺点、数据、材料、论证、结论是否正确,有无新的见解等。
②等级标准:优≥90;良≥80;中≥70;及格≥60;不及格<60;
学 生 毕 业 设计
2013年06月01日
湖南城市学院本科毕业设计诚信声明
本人郑重声明:所呈交的本科毕业设计,是本人在指导老师的指导下,独立进行,设计成果和制作的产品实物不存在知识产权争议。对本设计的研究做出重要贡献的个人和集体均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。
本科毕业设计作者签名:
年 月 日
摘要................................................................................................................................1
关键词............................................................................................................................1
引言................................................................................................................................2
3.2.2 白天系统工作模式驱动程序............................................................13
城市智能路灯控制系统设计
摘要:本文研究的城市智能路灯控制系统,是针对我国在城市照明上所存在的巨大的能源消耗,而开发的基于单片机的新型节能控制系统。集光敏控制、声敏控制、节能控制、报警控制于一体。智能路灯节能控制系统利用STC89C52为核心芯片,通过对时间的定时控制来控制路灯,通过光敏和声敏开关来控制突发情况,以及与下半夜进入节能模式相结合,利用LED作为模拟路灯,并且配合报警模块实现智能路灯控制系统。
关键词:STC89C52;LED路灯;光敏开关;声敏开关
引言
近年来,随着我国经济改革的深入发展和信息化时代的深入,路灯的发展给城市带来了明亮和方便。路灯是城市形象的代表,也是城市交通安全的保障,给人民的生活带来特别大的便利。但随着路灯的发展城市路灯的维护量增大,带来维护人员不足的问题,使得路灯故障时不能得到及时的修复以致造成人民生活的不便。维护费用也随之增加,社会成本过高,电费支出过多,财政承担相对困难,增加了政府的处理能力,滞后经济和社会的发展。因此迫切需要解决此问题,故针对这种情况本人设计并制作了这一节能智能型的模拟路灯控制系统,其主要价值在于能更好的节能与监测,在很多方面给人们带来了方便,给维护人员带来便利,希望此系统能在现实中发挥其潜在的价值。
在社会不断发展的今天,保证道路照明设备的有效性与安全性,得到了越来越多的重视。国际社会也对此做出了很多改进,对照明灯以及智能恒压控制方面做出了重大贡献。目前包括就近的中科恒源公司做的集太阳能和风能于一体的新能源节能路灯,江苏新思维光电有限公司,做专业的LED户外照明,高杆灯和交通灯灯。这足以说明这片领域是有很大的社会价值和商业前景。城市亮化工程是城市现代化建设的重要内容,为营造优美舒适的投资环境,提升城市形象,提高路灯系统的管理水平,在满足城市道路照明要求的同时,实现智能化的节能照明,在客观上有迫切要求,也是解决城市美化与能源紧张最佳选择。
课题设计的主要研究内容是针对目前路灯照明中存在的问题,结合国内外各种路灯节能的研究成果,设计一种基于单片机控制的节能路灯系统。通过单片机的功能多样性实现本课题的基本要求。
当有工作人员人为控制路灯的开关时,路灯随即被打开和关闭。通过LCD1602显示屏显示当前时钟时间。通过设置,可以设定定时开路灯时间,和定时关路灯时间。当时间达到设定的开路灯时,则路灯自动开启。当时间达到路灯的关闭时间时,路灯则自动关闭。先通过光照计检测15LUX的光照,15LUX是一般规定的路灯最低开启光照强度,来设定的规定的开灯光照,当白天的光照低于15LUX的光照强度时,可以通过光敏控制开关感应到光线强度的变化,自动开启路灯,更好的实现对路灯的控制。当午夜12:00时,系统自动开启节能模式,采用路灯的间隔亮灭。不会给交通照明带来干扰,也可以节约一半的能源。当有车辆和行人经过的时候,通过声敏控制开关检测到声音。通过电压的变化来将节能模式下灭掉的灯重新点亮。可以方便车辆和行人通行。该毕业设计课题所用的电源电压为+5V,利用USB作为电源,通过LM7805将电流转换成+5V电压作为电压源。不管是在前半夜的正常开灯的模式下,还是在后半夜的节能模式下,当有灯泡坏了的时候。系统通过蜂鸣器会自动报警,并在LCD1602上面显“Lamp Bad ”。便于提醒工作人员及时维修,以免因耽误时间而造成不必要的损失。实现节能,高效相结合的现代城市智能路灯控制系统。
本系统主要由STC89C52单片机控制电路、时钟电路、按键输入电路、光控开关电路、声控开关电路、二极管模拟路灯显示电路、报警电路,液晶显示,串口输入电路、线性电源电路等组成。单片机控制电路主要负责对时钟的设定和控制、路灯的亮灭、光控开关和声控开关的开启和下半夜路灯的控制信息进行的处理。通过DS1302时间模块输出整个系统的时序,是整个系统实现的前提。LCD显示的主要是根据季节的变化设定的开时间和关时间,以及报警的提示“Lamp Bad”。按键电路主要包括人工开启和关闭路灯,当前时钟的设置,还有就是开灯时间的设置和关灯时间的设置。光控开关主要负责的是在白天光照强度低于15LUX时的情况下来开启路灯,用于实现无人控制的的突发事件。进入下半夜,系统通过对定时器时间做出判断,通过对I/O口的设定来开启节能模式。此时的声控开关才有作用,主要负责的是当有行人或者车辆经过的时候开启节能模式下灭掉的路灯。串口输入电路负责的是把源程序加载到单片机中,通过连接计算机和串口来用于加载程序和进行修改再加载。电源电路是用USB作为电源输出口,连接到所设计的系统,为系统的运行供电。报警器主要负责的是报警,提醒维护人员相关灯出现了故障,请及时维修,这样可以在第一时间减少维修,减少交通隐患。系统整体框图如图1.1所示。
系统运行后,LCD上面会显示相关的初始开关灯设置时间。通过对按键的输入,设置开启路灯时间和关闭路灯时间,再通过确认按键确认好输入的值。系统进行时序运行。白天如果没有突发黑暗的时候,就会通过这个定时设置在傍晚的时候开启路灯。在时钟运行到了十二点的时候,系统自动开启节能模式照明。此时因为人流量和车流量是很少的时候,全部开启路灯就造成了不必要的浪费了,采用间隔亮灭灯,也可以达到照明的效果。当有行人或者车辆经过的时候,系统通过声敏控制开关,来开启节能模式下灭掉的灯,这样可以避免因为光线暗而造成的交通事故,而且被点亮的灯可以延时5秒,当五秒过后没有车辆了,灯又会重新恢复节能模式,当仍有行人和车辆的时候,灯会继续亮的。继而这样运行下去,到了第二天早上,通过开始设定的关灯时间来关闭路灯,此时又恢复了普通状态,声控开关处于关闭状态。直至下一个傍晚再开启路灯,实现这样的循环。通过按键的输入,随着四季的关照程度不同,可以设定不同的开关灯时间,而不是固定式的时间,减少一些能源浪费。
图1.1 系统整体框图
系统硬件部分由MCU、DS1302与按键控制模块、LCD显示模块、按键控制模块、光敏/声敏控制模块、报警模块、LED模拟路灯模块、USB串口及USB接口电路模块,分各模块单独设计电路,硬件系统总电路图如图2.1所示。
图2.1 硬件总电路图
单片机最小系统为整个系统的核心,控制着整个系统的运行,让单片机稳定的运行是非常必须的,单片机最小系统原理图如图2.2所示。单片机最小系统控制部分主要由STC89C52、晶振电路、复位电路等电路组成,是每个用单片机系统实现的必须的外围电路[1]。主要通过一个按键控制单片机的复位,这样接可以更好的实现操作人员的复位。避免系统因为程序或者操作失误引起的进入死循环,或者卡机状态。电压接的是+5V,对于本设计,全部采用的电源都是+5V。晶振采用是是12MHZ频率的晶振,因为这个频率的晶振可以实现每条指令需要的时间是2us。便于对时间的计算和统计,特别适用于时序电路。
图2.2 MCU和DS18B20模块电路
DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路.提供秒分时日日期。月年的信息,每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式.DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个接口线:1 RES 复位,2 I/O 数据线,3 SCLK串行时钟。时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信。DS1302 工作时功耗很低,保持数据和时钟信息时功率小于1mW。DS1302 是由DS1202 改进而来[2],增加了以下的特性。双电源管脚用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器。本设计课题为DS1302采用的时钟芯片是3.2768MHZ的晶振。
图2.3 DS1302封装
光敏开关采用了KC_IRS模块和声敏开关采用了冲击声效传感器。整个模块电路如图2.4所示。
图2.4光敏/声敏控制开关以及LED电路
KC_IRS模块是一种可编程的模拟传感器比较器检测模块[3],可直接代替传统的LM393等类似的比较所检测的模拟电压值。该模块软件设置可调精度、检测范围、检测距离、预设检测环境等模式。采用TTL电平输出,低电平有效输出。预设值一经设定,KC_IRS模块永远记录预设值。这种模块的优点是红外类模拟传感器软件设置了滤波防干扰处理。DAT是信号输出引脚,而STG是设置信号输入引脚。通过程序实现在光照强度低于15LUX时,开启路灯。
非运算放大器处理检测环境噪声的冲击声效传感器,声效信号检测稳定。冲击声效传感器提供了一种手段,以添加到项目中的噪声控制和响应噪声,如一个鼓掌的双手。通过主板上的麦克风,该传感器检测到变化的分贝,这将触发一个高电平脉冲被发送通过该传感器的信号管脚。这种变化可以被任何微控制器的I/O引脚所读取。冲击声效传感器的最大探测距离为3米。但是如果你使用在此区域的传感器在当前环境因素里有触发错误的读数,可在该范围内调节板上电位器以缩短检测范围。咪头前级带三极管放大,将放大后的信号送入处理器,进行比较和延时稳定滤波输出,当检测到环境下的冲击声效时,板上红色LED将点亮。若用示波器侦测SIG脚,可查看高脉冲信号。若检测人谈话声,需要调节电位器,可侦测到连续的方波脉冲,同时红色发光管将以当前的声效分贝值进行闪烁,输出信号是数字量,可用程序直接像检测按键一样或用外中断,脉冲计数处理即可。也是类似于光敏开关的作用来控制路灯的开启。
串口电路主要是组成是串口驱动芯片CH340T,本设计以USB作为供电电源。
图2.5串口通信和电源模块电路
CH340T是一个USB总线的转接芯片,实现USB转串口、USB转IrDA红外或者USB转打印口[4]。在串口方式下,CH340T提供常用的MODEM联络信号,用于计算机扩展异步串口,或者将普通的串口设备直接升级到USB总线。而电路所用的电源由USB提供,不需要通变压器把市电或者15V电源源通过LM7805转化为+5V的电压。很方便快捷的通过计算机串口进行调试。
2.6 核心模块PCB图
2.7 主模块PCB图
本系统的软件由集成开发工具KeiluVision专业版开发。软件主程序流程图如图3.1所示[5]。本系统的工作过程大致为:系统开机后,LCD显示屏显示当前时间,对于该系统调试,先设置好当前时间。根据北京时间设定,这作为开路灯和关路灯的时间参照。再设置开启路灯时间和关闭路灯时间,这些都可以直接在LCD1602上显示。LCD1602相当于一个电子表,总的程序就是围绕着这个时序运转的。在白天,是属于关灯的时间,但是当光照强度低于15LUX的时候,通过光敏开关感应到光强的变化,路灯就自动开启。方便白天川流不息的车辆和行人。也可以在白天人为开启路灯,当有路灯坏了的时候,蜂鸣器会报警而且会在LCD1602上面显示“Lamp Bad”。
在傍晚到了快要开灯的时间,根据之前设定的开灯时间,路灯自动开启路灯,这个时候处于正常照明时间。当晚上十二点的时候,系统自动开启节能模式,这个时候的人和车辆都是很少的,因为这个时候人们普遍都休息了,所以按照之前那样正常照明模式开启全部路灯,很浪费电也很没有必要。所以采用相间隔亮灭的方式来节能,能节约一半的能源。这样不会给道路照明带来大的问题,配合着声敏控制开关,当有行人和车辆经过的时候,声敏开关检测到分贝的变化,就开启因为节能灭掉的灯,这样如前半夜一样,给交通带来方便,当车辆已经过了的时候,灯又会恢复成节能模式。当夜晚有灯坏了的时候,也会如白天一样报警,如果此时有工作人员值班,也能及时的发现问题。可以尽早安排第二天早上去维修,及时排除故障。
此课程设计的创新之处就是白天当关照强度低于15LUX的时候,路灯会自动开启,方便车辆和行人通行[6]。十二点之后的节能模式也是创新点,这个可以节约特别多的能源,并且又不只是那样,通过声敏开关,有行人和车辆经过的时候,系统自动开启,所以完全不会对交通和照明有任何影响,这样做到了节能和方便快捷于一起,符合新型的路灯系统的要求。不足之处是虽然该系统能实现报警,并且可以在1602上面显示,但是只显示有灯泡坏了,没有考虑到城市的路灯那么多,单纯的报警和显示坏了,还是不能精确到哪一盏灯,这给维修和排查带来一些不便,自己将更加完善去实现。
图3.1 主程序流程图
对于每个系统都有其初始程序和模块,系统的初始模块是系统运行的前提。该系统采用的是串行传输数据,将源程序通过串行口下载到单片机中。系统上电后进行复位。随即在1602上面会显示初始设定时钟值,工作人员可以通过“SET”来设定当前时间,按一下是设置当前时间,按两下“SET”,是用来设定定时开路灯的时间,按下三下是设置定时关路灯时间。总共有四个按键,第三个是设置时按键,第四个是设置分按键。
图3.2 初始模式驱动程序流程图
初始化程序流程过程如图3.2 所示。将源程序在Keil中仿真生成HEX文件,把这个文件通过串口电路烧写到单片机中,本设计USB串口既是串口线路,也是电源电路,通过USB供电,以供整个系统运行。LCD1602是整个系统的显示模块,通过显示屏显示当前时间,并设置当前时间、开路灯时间、关路灯时间。
3.2.2 白天系统工作模式驱动程序
图3.3 白天系统工作模式驱动程序流程图
白天系统工作模式是整个系统的运行的有创意的一个点,就是光敏控制开关的那个模块。当清晨,单片机的检测时间到了定时关路灯时间,此时路灯全部关闭。在整个白天时钟运行中,除了工作人员检测是否有灯泡坏了,一般都不会亮灯。当光照强度低于15LUX的时候,通过光敏控制开关,检测到光线强度的变化,系统则自动开启路灯系统。当光照强度又恢复的时候,光敏检测到光照强度超过15LUX时,则关闭路灯。不会造成浪费也会给交通带来更安全的保障。
图3.4 上半夜系统工作模式驱动程序流程图
上半夜的模式就是现在很多城市的普通照明方式,这种方式在上半夜的时候很适用,那个时候的人流量和车流量特别的多。这个时候需要光照特别强,以便于交通安全,此时的交通安全是最重要的,当有路灯坏掉的时候,也会及时报警,这个时候一般情况下还有工作人员在值班,可以通过路况信息提醒广大的司机用户注意安全[8]。
下半夜模式是该设计最大的亮点,和传统的照明模式不同[6]。设计的更加节能化,传统的路灯系统,上半夜和下半夜都是一样的,下半夜的时候其实是人特别需要休息的时候,这个时候的车流量和人流量是很少的,如果仍全部开启路灯,造成了太多的能源浪费,我们现在一直都倡导的是低碳和节能的生活,所以传统的照明模式已经很难满足我们的要求了。所以采用的是在下半夜点亮相间隔的路灯,如点亮一三五七九,而关闭二四六八十,这样不但能节约一半的能源,而且也不会给照明带来大的影响。但是在节能的同时不能给交通带来安全隐患,安全问题是最重要的问题,所以在设计添加了一个声敏控制开关,当有行人和车辆经过的时候,通过道路分贝的变化,声敏开关检测到分贝变化,从而开启节能模式下灭掉的灯,使道路的照明如前半夜一样亮,确保交通安全保障[9]。
图3.5 下半夜系统工作模式驱动程序流程图
该设计接通电源后,会在1602上面显示程序设置初始值,如图4.1所示。通过按下“SET”键,来设定当前时间,如图4.2所示。按下两次“SET”,是设定开灯时间,如图4.3所示。按下三次“SET”来设定关灯时间,如图4.4所示。这些都是系统的初始化,是系统运行的前提。通过对时间的设定,根据对四季不同的光照的强度来设定时间。作为主控制室,1602又相当于一个数字时钟。该设计模块的电源电压是+5V。通过USB来作为电压源。
图4.1 当前时间图 图4.2 设定时间图
图4.3 设定开灯时间图 图4.4 设定关灯时间图
每一个系统都有手动控制开关,这是一个系统最简单的功能,如图4.5所示。通过手动开关,在白天可以通过手动开关开启路灯,看蜂鸣器是否报警和1602是否有“Lamp Bad”的字样,这样的话就知道是否有灯坏了,可以及时派人去维修,不让故障拖延,造成安全隐患。在白天,如果光照低于15LUX时,此时光照强度很暗,此时如果没有工作人员及时开路灯,会是很危险的。通过光敏控制开关,感应光的强度,会及时开启路灯,给道路照明,方便车辆和行人通行,如图4.6所示。到了傍晚的时候,时间到达了定时开路灯的时候,会开启路灯,如图4.7所示。
图4.5 白天手动开灯图 图4.6 白天黑暗天气光敏开关开灯
图4.7 开灯后的正常模式图 图4.8 节能模式图
程序设置在12:00以后,开启节能模式,节能模式就是在传统的照明模式上做的一些小创新,采用相间隔的照明方式。在这之后的下半夜,路上的行人和车流量已经很少了,这个时候再按照传统的照明方式很浪费电。这个时候如果采用相间隔的方式,根据光学的知识和光的照明程度,是不会给照明带来大的问题的。虽然只是简单的相间隔亮灭,但是对于一个很大的城市来说,可以节约一半的能源做到尽可能大的节能,如图4.8所示。
道路安全问题是我们城市路灯最主要的负责的问题,所以不能一味的在强调节能,而忽视了道路安全问题,虽然节能模式下的光照足以供整个城市道路运行,但是还是存在一定的安全隐患。于是设定一个声敏控制开关,当有行人和车辆经过的时候,通过道路分贝的变化反应到声敏中,就会启动节能模式下灭掉的灯。这样可以确保道路足够的明亮来方便行人和车辆安全通行。如图4.9,是有车辆或行人经过的时候,声敏感应到声音变化,然后点亮4.8图下灭掉的路灯。在任何一个模式或时间段下,只要有路灯坏了,系统通过蜂鸣器报警和通过1602显示“Lamp Bad”的字样,如图4.10所示。
图4.9 节能模式下声敏开关开灯图 图4.10 路灯坏了时候1602的显示图
该数控稳压电源主要由单片机STC89C52、LCD1602液晶显示器、按键、电源电路+5V、时钟电路、模拟路灯电路、声敏控制开关、光敏控制开关、报警电路[10]。实验样机如图5.1所示.
图5.1 主要硬件模块组成分块图
(1) 检查电路,看是否有未焊接好的元器件,有的话就焊接好。
(2) 检查电源与地是否有短路的,无短路才可以进行下面的步骤。
(3) 如电源和地正常时才可以通电检测。
(4) 将单片机的主控板和主要应用板想连接。主控板包括单片机的最小系统和串口电路。如图5.1所示,大的模块是主要应用板模块,小的模块是单片机的主控模块。通过两个串接接口连接起来。
图5.3 硬件电路模块图
(5) 连接串口到计算机的USB,通过相应的软件把生成的HEX文件加载到单片机中,按下复位,程序烧写完毕。
(6) 通电,指示灯亮红灯,1602上面有时间初始值和“City Lamp sys”,即城市路灯系统。整个系统是通过USB供电作为电源,为+5V。当检测到这些的时候,说明系统已经是初始化了,可以进行下面的步骤了。
(7) 按下“SET”按键,设定好当前时间,开灯时间和关灯时间。一般情况下,程序会按照这个时间来开关灯。对于光敏和声敏是该系统的外接电路,在操作的过程中,在白天光照强度低于15LUX的时候,光敏开关就会开启路灯。在晚上12:00过后,当有噪声(模拟的行人和车辆的声音),声敏开关就会开启节能模式下灭掉的灯。
5.4 Keil软件中程序仿真图
5.5生成HEX文件图
图5.4 硬件电路模块分区表示图
图5.5 主控电路模块分区表示图
本毕业设计是基于传统的路灯系统上建立起来的,实现了多方式控制路灯,达到节能、报警、高效的方式。结合光敏控制开关可以实现在白天光照强度低于15LUX时开启路灯。声敏控制开关可以实现在下半夜节能模式下,重新点亮路灯。这两种方式都可以开启路灯,给交通带来便利。但是本设计我觉得最大的不足之处就是当有路灯坏了的时候,LCD可以显示有灯坏了,也通过蜂鸣器报警,但是不能精确到那盏灯坏了。这给维修带来了一定的不方便性,因而存在些需要改进的地方。
[1] 蔡美琴, 张为民. MCS-51系列单片机系统及其应用[M]. 高等教育出版社, 2004: 13-45.
[2] 刘建清. 轻松玩转51单片机C语言[M]. 北京航空航天大学出版社, 2011: 255-269.
[3] 康华光. 电子技术基础 模拟部分[M]. 北京: 高等教育出版社, 1998: 98-123.
[4] 余锡存. 单片机原理与接口技术[M]. 西安: 西安电子科技大学出版社, 2003: 35-62 .
[5] 杜军, 邱瑞学. PL2101在路灯控制系统中的应用[J]. 国外电子元器件. 2003. 9 :33-34.
[6] 熊涛, 丁辛芳, 陈德英. 一种新颖的照明控制电路[J]. 传感器技术, 1999, 18 (5): 50-53.
[7] 王海伦, 叶冬芬. 单片机控制的照明智能控制系统[J]. 电气时代, 2005, (1): 121-122.
[8] 谭浩强. C程序设计[M]. 北京: 清华大学出版社, 2007: 145-169.
[9] 严蔚敏, 吴伟明. 数据结构(C)语言版)[M]. 北京: 清华大学出版社, 2010: 256-287.
[10] V. Yu. Teplov, A.V.Anisimov. Thermostatting System Using a Single-Chip Microcomputer and Thermoelectric Modules Based on the Peltier Effect[J] , 2002, 27(6): 67-104.
本次毕业设计的顺利完成,深深的激励着我。从课题的选择到项目的最终完成,是在我的指导老师胡赛纯的亲切关怀和悉心指导下完成的。她严肃的科学态度,严谨的治都始终给予我细心的指导和不懈的支持。老师在学业上给我以精心指导、也特别关注和建议我们去实践和锻炼。在此谨向胡老师致以诚挚的谢意和崇高的敬意!其次,感谢通信与电子工程学院实验室的所有老师,感谢您们给我提供一个设备充足、资料齐全、网络方便的开放性实验室。再次,要感谢科瑞特的老师们,他们为我的设计提供了很多参考资料,让我能克服一个个困难,并不断完善自己的设计。最后,对培育和教导过我的母校和老师、鼓励和帮助我的所有人再次致以最诚挚的感谢和最衷心的祝福!
//开灯时间必须大小关灯时间 否则出错
#include
#define uint unsigned int
#define uchar unsigned char
sbit key_b = P2^4;
sbit key_m = P2^5;
sbit key_j = P2^6;//
sbit key_z = P2^7;//-
sbit RS = P1^1;
sbit EN = P1^0;
#define DATA P0
sbit beep = P2^3;
sbit CLK = P2^2;
sbit DAT = P2^1;
sbit CS = P2^0;
sbit RG = P1^3;
sbit Voice = P1^2;
sbit LED1 = P3^6;
sbit check1 = P3^7;
sbit LED2 = P3^4;
sbit check2 = P3^5;
sbit LED3 = P3^2;
sbit check3 = P3^3;
sbit LED4 = P3^0;
sbit check4 = P3^1;
sbit LED5 = P1^6;
sbit check5 = P1^7;
sbit LED6 = P1^4;
sbit check6 = P1^5;
uchar sec,min,hour,on_hour = 17,off_hour = 6,on_min = 20,off_min = 30;
uchar DSsec;
bit FF = 0;
bit key_en;
uchar mode;
bit flag,Vf,bad;
/*********************************************************************************************
备注:以下是DS1302 底层驱动
*********************************************************************************************/
//延时函数
void delay_DS(int num)
{
while(num--);
}
//写一个字节
void write_byte(uchar dat_)
{
uchar i;
CLK = 0;
for(i=0;i<8;i++)
{
DAT = dat_ & 0x01; //取最低位 数据和地址最低位传输
delay_DS(2);
CLK = 1;
delay_DS(2);
CLK = 0;
dat_ >>= 1;
}
}
//读一个字节
uchar read_byte()
{
uchar i,dat_;
for(i=0;i<8;i++)
{
dat_ >>= 1;
if(DAT == 1)
dat_ |= 0x80;
CLK = 1;
delay_DS(2);
CLK = 0;
delay_DS(2);
}
return dat_;
}
//先写地址,再写数据
void write_data(uchar cmd,uchar dat_)
{
CS = 0;
CLK = 0;
CS = 1;
write_byte(cmd);
write_byte(dat_);
CLK = 1;
CS = 0;
}
//先写地址,再读数据
uchar read_data(uchar cmd)
{
uchar dat_;
CS = 0;
CLK = 0;
CS = 1;
write_byte(cmd);
dat_ = read_byte();
CLK = 1;
CS = 0;
// dat_ = ((dat_& 0x7F) >> 4) * 10 + (dat_& 0x0F); //将读出数据转化
return((dat_ / 16) * 10 + ( dat_ % 16)); //十进制返回
// return dat_;
}
//▄︻┻═┳一
uchar asctobcd(uchar cha) //10转16
{
return ((cha / 10) * 16 + (cha % 10));
}
/*********************************************************************************************
函数名:初始DS1302第一工作的时间
调 用:init_set1302()
参 数:无
返回值:无
结 果:
备 注:
*********************************************************************************************/
void init_set1302()
{
DSsec = read_data(0x81);
if(DSsec > 0x59) //读取秒高位为1时 说明时间停止了 则初始化一次开启时钟
{
write_data(0x8e,0x00); //写控制字,取消保护
write_data(0x80,0x53); //秒 秒第七位为0 开启时钟 否则关闭
write_data(0x82,0x56); //分
write_data(0x84,0x16); //时 24小时制
write_data(0x90,0xa5); //a5 R2=2K电阻 a6充电1.075mA 1010 01 10 开启充电 一个二极管 R2=4K电阻
write_data(0x8e,0x80); //控制加保护
}
else
{
write_data(0x8e,0x00); //写控制字,取消保护
write_data(0x80,DSsec); //秒 秒第七位为0 开启时钟 否则关闭
write_data(0x90,0xa5); //a5 R2=2K电阻 a6充电1.075mA 1010 01 10 开启充电 一个二极管 R2=4K电阻
write_data(0x8e,0x80); //控制加保护
}
}
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
void lcd_write_com(uchar com) //些命令,RS=0
{
DATA = com;
RS = 0;
EN = 0;
delay(10);
EN = 1;
delay(10);
EN = 0;
}
void lcd_write_data(uchar dat) //写数据,RS=1
{
DATA = dat;
RS = 1;
EN = 0;
delay(10);
EN = 1;
delay(10);
EN = 0;
}
/*-------------------------------------------
函数名:Set_xy_LCM ()
功 能:设定显示坐标位置
--------------------------------------------*/
void set_xy_lcd(unsigned char x,unsigned char y)
{
unsigned char address;
if(x == 0)
address = 0x80 + y;//第一行
else
address = 0xc0 + y;//第二行
lcd_write_com(address);
}
/*-------------------------------------------
函数名:Display_List_Char()
功 能:按指定位置显示一串字符
--------------------------------------------*/
void write_str_lcd(unsigned char x, unsigned char y, unsigned char *s)
{
set_xy_lcd(x,y);
while(*s)
{
lcd_write_data(*s);
s++;
}
}
/************************************************************************************
函数名:按指定位置显示一个字符
调 用:Display_List_Char()
参 数:x:行选择 (0、1) y:列选择(0~15) dat:需要写入LCM的一个数据
返回值:无
结 果:
备 注:
***********************************************************************************/
void write_char_lcd(unsigned char x, unsigned char y, unsigned char dat)
{
set_xy_lcd(x,y);
lcd_write_data(dat);
}
void lcd_init()
{
lcd_write_com(0x38);
lcd_write_com(0x0c);
lcd_write_com(0x06);
}
void delay_nus(unsigned int i) //延时:i>=12 ,i的最小延时单12 us
{
i=i/10;
while(--i);
}
void delay_nms(unsigned int n) //延时n ms
{
n=n+1;
while(--n)
delay_nus(900); //延时 1ms,同时进行补偿
}
void bee()
{
char a;
for(a = 0; a < 50; a ++)
{
beep = ~beep;
delay_nus(100);
}
for(a = 0; a < 100; a ++)
{
beep = ~beep;
delay_nus(50);
}
beep = 1;
}
void key_scan()
{
uchar temp;
if(key_b == 0)
{
bee();
delay_nms(10);
if(key_b == 0)
{
FF = ~FF;
beep = ~beep;
flag = 0;
}
while(~key_b);
}
if(key_m == 0)
{
bee();
delay_nms(10);
if(key_m == 0)
{
if(++ mode == 4)
mode = 0;
if(mode == 0)
write_data(0x8e,0x80); //控制加保护
else
write_data(0x8e,0x00); //写控制字,取消保护
}
while(~key_m);
}
if(key_z == 0)
{
bee();
delay_nms(10);
if(key_z == 0) //min+
{
if(mode == 1) //时间设置
{
if(++ min >= 60)
min = 0;
temp = asctobcd(min);
write_data(0x82,temp);
}
else if(mode == 2) //开灯时间
{
if(++ on_min >= 60)
on_min = 0;
}
else if(mode == 3) //关灯时间
{
if(++ off_min >= 60)
off_min = 0;
}
}
while(~key_z);
}
if(key_j == 0)
{
bee();
delay_nms(10);
if(key_j == 0) //hour +
{
if(mode == 1) //时间设置
{
if(++ hour >= 24)
hour = 0;
temp = asctobcd(hour);
write_data(0x84,temp);
}
else if(mode == 2) //开灯时间
{
if(++ on_hour >= 24)
on_hour = 0;
}
else if(mode == 3) //关灯时间
{
if(++ off_hour >= 24)
off_hour = 0;
}
}
while(~key_j);
}
}
void ON_LED()
{
if(hour >= 0 && hour <= 5) //12点后的时间
{
if(Vf) //检测到声音全亮
{
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = 0;
}
else //否则间隔点
{
LED1 = LED3 = LED5 = 0;
LED2 = LED4 = LED6 = 1;
}
}
else //否则全亮
{
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = 0;
}
}
void OFF_LED()
{
if(RG == 0 && hour >= 8 && hour <= 17)
{
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = 0;
}
else
{
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = 1;
}
}
void pro()
{
if(FF) //人工开启
{
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = 0;
if(on_hour < off_hour)
flag = 1;
}
else
{
if(on_hour >= off_hour) //19 > 18
{
if(hour >= on_hour)
{
if(hour == on_hour)
{
if(min >= on_min)
ON_LED();
else
OFF_LED();
}
else
ON_LED();
}
else if(hour <= off_hour) //5 < 6
{
if(hour == off_hour)
{
if(min >= off_min)
OFF_LED();
else
ON_LED();
}
else
ON_LED();
}
else
OFF_LED();
}
else
flag = 1;
}
if(check1 == 1 || check2 == 1 || check3 == 1 || \
check4 == 1 || check5 == 1 || check6 == 1)
{
beep = 0;
bad = 1;
}
else
{
bad = 0;
beep = 1;
}
}
void LCD_dis()
{
if(mode == 0)
{
write_str_lcd(1,0," Time ");// : : ");
if(read_data(0x81) != sec) //每秒刷新
{
sec = read_data(0x81);
min = read_data(0x83);
hour = read_data(0x85);
write_char_lcd(1,8,(hour / 10) + 0x30);
write_char_lcd(1,9,(hour % 10) + 0x30);
write_char_lcd(1,10,0x3a);
write_char_lcd(1,11,(min / 10) + 0x30);
write_char_lcd(1,12,(min % 10) + 0x30);
write_char_lcd(1,13,0x3a);
write_char_lcd(1,14,(sec / 10) + 0x30);
write_char_lcd(1,15,(sec % 10) + 0x30);
}
if(bad == 0) //没有故障时
write_str_lcd(0,0," City Lamp sys ");
else //" Time 24:24:24 ");
write_str_lcd(0,0," Lamp Bad ");
}
else
{
if(flag)
{
write_str_lcd(0,0,"Set time Error! "); //开灯时间必须大于关灯时间 否则出错
write_str_lcd(1,0,"ON hour>OFF hour"); //开灯时间必须大于关灯时间 否则出错
}
else
{
switch(mode)
{
case 1: //" Time 24:24:24");
write_str_lcd(1,0,"Adj time H M ");
write_char_lcd(1,10,(hour / 10) + 0x30);
write_char_lcd(1,11,(hour % 10) + 0x30);
write_char_lcd(1,14,(min / 10) + 0x30);
write_char_lcd(1,15,(min % 10) + 0x30);
break;
case 2: //" Time 24:24:24");
write_str_lcd(1,0,"ON time H M ");
write_char_lcd(1,10,(on_hour / 10) + 0x30);
write_char_lcd(1,11,(on_hour % 10) + 0x30);
write_char_lcd(1,14,(on_min / 10) + 0x30);
write_char_lcd(1,15,(on_min % 10) + 0x30);
break;
case 3: //" Time 24:24:24");
write_str_lcd(1,0,"OFF time H M ");
write_char_lcd(1,10,(off_hour / 10) + 0x30);
write_char_lcd(1,11,(off_hour % 10) + 0x30);
write_char_lcd(1,14,(off_min / 10) + 0x30);
write_char_lcd(1,15,(off_min % 10) + 0x30);
break;
}
}
}
}
void sys_init()
{
TMOD=0x1; //20ms
TH0=0xb1;
TL0=0xe0;
TR0=1;
ET0=1;
EA=1;
}
void main()
{
sys_init();
lcd_init();
init_set1302();
while(1)
{
key_scan();
if(key_en)
{
key_en = 0;
LCD_dis();
}
if(mode == 0)
pro();
}
}
/*********************************************************************************************
函数名:定时器0中断
调 用:元
参 数:无
返回值:无
结 果:
备 注:
*********************************************************************************************/
void timer0(void) interrupt 1
{
static uchar cont;
TH0=0xb1;
TL0=0xe0;
//add your code here.
key_en = 1;
if(Voice)
Vf = 1;
if(Vf)
{
if(++ cont >= 254)
{
cont = 0;
Vf = 0;
}
}
}
本文来源:https://www.2haoxitong.net/k/doc/29ae1ad88ad63186bceb19e8b8f67c1cfad6eed9.html
文档为doc格式