【集合STC89C52单片机的智能照明系统设计13000字(论文)】_第1页
【集合STC89C52单片机的智能照明系统设计13000字(论文)】_第2页
【集合STC89C52单片机的智能照明系统设计13000字(论文)】_第3页
【集合STC89C52单片机的智能照明系统设计13000字(论文)】_第4页
【集合STC89C52单片机的智能照明系统设计13000字(论文)】_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

12集合STC89C52单片机的智能照明系统设计摘要随着科学技术日益进步的时代,单片机的应用也越来越广泛,很大程度上方便了人们的生活。本设计是基于STC89C52单片机设计的一种智能照明系统,一方面是通过光敏电阻对室内环境的光线强度进行检测,利用PWM技术,然后经过单片机处理,控制LED的亮度;另一方面是通过热释电红外传感器对室内的人进行检测,通过是否有人控制LED灯的亮灭。除此之外,本设计还具备定时功能,通过设置时间段并且处于定时时间段内检测到有人时,LED灯的亮度才会发生变化,不处于时间段内一直熄灭。以上功能完全是在节约能源和延长灯具的使用寿命的基础上设计的,在一定程度上具备保护环境的作用。关键词:智能控制;PWM;STC89C52单片机目录1绪论 [14]。1.3本课题研究的主要内容为了满足人们生活的实际需要,本文设计的智能照明具有同步功能,并且通过智能化管理模式,使用户能够更加快速有效、方便地控制室内照明。对于手动/自动模式的切换和LED灯的启停等功能,不仅节能,而且提高了管理水平,更重要的是延长了灯的使用寿命。本次论文主要阐述的是智能照明从原理到实物模型制作的整个过程。主要课题研究的内容包括:智能照明模块的工作原理以及各模块之间的相互工作、整个智能照明控制系统的硬件电路设计和安装搭建、软件控制程序的编写和调试,实物的焊接和调试。具体如下:1)智能照明控制系统元器件的选型以及各元器件的功能。2)根据智能照明所需实现功能要求,确定智能照明硬件电路的设备3)智能照明系统的主程序及各模块的子程序的设计。4)编写相应的程序。5)智能照明系统的电路仿真与实物焊接调试。1.4本文结构本文第一部分通过查阅有关智能照明的资料和阅读大量的相关文献,了解了智能照明的背景以及目的意义和智能照明的国内外研究现状。第二部分对智能照明系统的总体设计、系统的组成模块以及需要器件的类型作了介绍。第三部分介绍了智能照明系统各个模块的硬件电路设计。第四部分对智能照明系统总体以及各个子模块的软件流程图做了介绍。第五部分是对智能照明控制系统的仿真、实物的焊接以及调试的过程进行了解。第六部分是智能照明设计的结论和展望。1182系统总体设计2.1智能照明系统所实现的功能(1)本系统具备24小时制、日期时间调节功能,待机显示日期/时间/光线强度等级/LED亮度等级;(2)使用一个光敏电阻检测光线状态,经ADC转换送单片机处理,光线强度设置0~9共10个等级,等级越高表示光线越强;(3)系统具有自动/手动模式,可以通过按键切换,并有指示灯指示所在模式状态:1)自动模式:如果使用人体红外线模块检测到有人,照明灯将根据灯光状态自动调整亮度。光线越强,亮度越暗,光线越弱,照明灯的亮度越强。如果未检测到任何人,延时30s后,照明灯自动熄灭;2)手动模式:按下按键手动打开照明并自行调整灯光亮度,该模式下灯的开关与是否有人没有联系;(4)定时功能:可通过按键设置定时时间段,并在设定的时间和有人在场的情况下,LED的亮度会根据环境的亮度自动进行调整,这是在自动模式下的情况;如果不处于定时时间段内则灯一直熄灭。2.2系统总体方案设计智能照明控制系统主要是由单片机最小系统、红外检测模块、液晶显示模块、定时模块、时钟模块、按钮模块以及电源模块七部分构成。单片机最小系统主要的作用就是对各种数据进行分析,再对各个模块进行相应的控制,使其完成系统所需的各项功能;传感器模块主要由热释电红外传感器、环境亮度传感器两部分组成,热释电红外传感器的作用就是通过感应人体的行为,感应到有人时灯就变亮;而环境亮度传感器就是通过光敏电阻采集室内环境的光线强度,并通过ADC0809对光敏电压信号进行处理,然后进行灯光亮度的调节;电源模块也是该系统必不可少的一部分,即电源决定着元器件能否正常工作;显示模块主要显示室内周围环境的光线强度、灯具的亮度、日期和时间;定时模块主要是通过按键设置定时时间段,在这段时间内只要有人并且系统处于自动模式的转态下,灯的亮度就会根据环境的光线强度进行自动调节,不处于定时时间内灯一直熄灭;按键模块主要的作用就是通过按键控制灯的亮灭、亮度的调节。系统框图如下图所示。时钟模块人体检测模块控制器时钟模块人体检测模块控制器光强检测模块按键模块光强检测模块按键模块显示模块定时模块电源模块显示模块定时模块电源模块图2-1系统框图2.3元器件选型2.3.1控制器的选型在本设计中,将以STC89C52单片机为控制核心,它是一种能源消耗少、性能比较好的新型智能微处理器,具有4k字节可重复在线编程和快速擦除、写入应用程序的一款存储器。它在指令系统和接口引脚上已经完全与MCA-51系列的单片机兼容,不仅可以取代MCS-51系列单片机,而且还可以直接使得该系统同时具备MCS-51系列产品所不具有的许多功能特点,将其组合使用起来可以构成真正的单片机最小应用系统。优势主要体现在减少了系统的硬件体积,提高了系统的工作可靠性,降低了系统的运行管理成本。2.3.2显示器的选型智能照明系统选用的显示屏为液晶显示器1602。它的体积小、能耗低、操作起来非常的容易,每行显示16个字符,总共两行。由于这类显示器只能显示ASCII码字符,进而被称做字符型液晶。这类显示器恰好满足设计要求,方便用户查看。综合考虑,选择1602液晶显示器可以使效果达到最好。2.3.3传感器的选型智能照明系统设计分为两部分检测,一是红外人体检测;二是光线强度检测。人体热释电传感器主要的用途是一种能用于通过探测接收人体发出的红外线而输出电信号的传感器,它是由陶瓷氧化物、压电晶体以及两个元件表面的电极共同构成。传感器监测温度的原理为:当Δt发生变化时,热释电效应将作用在两个Δq电极上并产生电荷,也就是说两个Δv电极之间会产生一个低电压,由于它的阻抗输出是非常高的,所以在传感器中会有一个用于进行阻抗变换的FET;当它与空气中的离子相互作用结合时,热释电效应ΔQ产生的电荷就会消失,即当环境温度恒定时,ΔT=0,传感器没有输出。当人体进入试验检测区域时,由于人体的温度与环境温度存在比较大的的差异,ΔT,OUIΔT输出;如果人体进入检测区域后停止移动,温度保持恒定不变,传感器也不输出。经过大量的研究分析显示,传感器如果没有光学透镜(又称菲涅耳透镜),其可以检测到的距离小于2米,有透镜的传感器检测到的距离可大于7米。光线强度检测电路主要是由一种型号为GL5539的光敏电阻组合而成,具有灵敏度高、测量区域范围宽以及光谱响应范围广等特性。例如,当一个光敏电阻被太阳光照射时,材料的电导率发生变化,表现为输出电阻值的改变。光线越强,电阻就越弱。因此,可以通过测量电路中的输出电压或电流值,然后经过A/D转换后,将模拟值直接转换为一个数字值,然后发送到单片机主控芯片进行处理,得到相应的照度。2.3.5时钟模块的选型智能照明系统选用DS1302时钟芯片。它是一款实时时钟芯片,可以提供秒、分、时、日、月、年等信息,并具有软件自动调整功能。它还可以通过AM/PM设置以24小时的形式执行还是以12小时的形式执行。DS1302的工作电压比较大,可以在2.0~5.5V范围内正常运作。还有一点就是它的功耗非常低。所以,当工作电压为2.0V时,工作电流小于300mA。在本设计中,用DS1302实现数据的读取可以更加容易。3硬件电路设计3.1硬件电路结构设计硬件集成电路总共是由液晶显示模块、中央控制器、电源模块、按键模块、人体红外检测模块、光敏电阻模块等六部分组成,如下图所示:STC89C52STC89C52Ds1302时钟芯片Ds1302时钟芯片独立按键SW-PB独立按键SW-PBLED灯驱动LED灯驱动光敏电阻GL5539光敏电阻GL55391602液晶显示器1602液晶显示器人体红外模块HC-SR501人体红外模块HC-SR501图3-1系统结构框图3.2单片机最小系统单片机的最小控制系统是由电源、复位以及晶振组成,如下图所示。图3-2单片机最小系统3.3电源电路设计图3-3电源电路图当电源经过开关(一个开关6个脚,按下接通2.3和5.4),然后再对这两个电容进行滤波。其中,型号为104的瓷片电容滤高频,100uF的电解电容滤低频稳压,容值越大,稳压效果越好,后面是LED指示灯接了一个限流电阻R16作为电源指示灯用,当开关开启时有电就回变亮123.4显示电路设计LCD1为液晶屏LCD1602,R1可以调节液晶屏的对比度。图3-4显示电路3.5红外人体检测电路设计J1为人体红外模块接入端。当有人时,第二个引脚输出为高点平,然后经过R12限流后三极管Q1打开。此时,三极管集电极接地,即TRIP为低电平,并且LED灯D3点亮。单片机可以通过TRIP是低电平判断是否有人。C1是一个滤波器,使+5V电源更干净,R10也是一个上拉电阻,当没有人在场时,晶体管被切断,TRIP通过上拉电阻变成一个高电平。1312图3-5传感器检测电路3.6按键电路设计按键电路如下图所示:按键一端接地,另一端直接与单片机的I/O口连接。此时,我们首先在程序中I/O口分配一个高电平,然后连续检测I/O端口电平的变化。不按键时,I/O口电平始终高;按键时,按键的另一端直接接地,相当于低电平。此时,我们从I/O端口读取的是高电平。一旦程序检测到I/O口从高电平变为低电平时,则表示按键被按下,并立即执行相应的操作。SET按键是设置按钮,是通过它进行相关功能的设置;ENTER按键是确认键;UP、DOWN分别是亮暗按钮,它的作用是调节LED等的亮暗;MODE按键是模式切换按钮,通过它可以设置自动或手动模式;SWITCH是开关按钮;143-6按键电路3.7光线检测电路设计光敏电阻指的是一种电阻值随着入射光强度的变化而发生改变的电阻,入射光强度降低,入射光变弱,电阻值增大,光敏电阻常被广泛用于光的监测、光的控制及光电信号的转换。因此,可以通过连续采集光电导体对地电压来获得灯周围光强度的变化。如下图所示,将ADC0809的参考电压设置为5V,时钟信号通过单片机P3.3端口被定时器中断。光敏电阻的接地电压从IN3口输入,由ADC0809转换成数字量。然后通过OUT1-7输出,由单片机进一步处理。153-7光敏电阻电路3.8LED灯驱动模块LED的亮度是由电流控制,通过控制电流调节LED灯的亮度。利用公式可知,利用调整PWM不同的占空比就可以控制电流的大小。电流通断的变化用NMOS管K2717实现,三极管9014提供驱动K2717的电流,PWM由P2.0输出,低电平有效。如下图所示:3-8LED灯驱动13163.9时钟电路模块U1为时钟芯片DS1302,通过第5、6、7脚与单片机相连,通过程序读取时钟芯片发过来的时间在显示。J1为纽扣电池,即备用电池,因为时间一直需要走,当外界电源没有关闭时,这里的纽扣电池就直接向时钟芯片供电,防止时间停止或异常。R3、R4、R5为上拉电阻,这里的主要作用是提高抗干扰能力。Y1是晶振,是提供振荡信号给芯片,芯片才能正常运行。3-9时钟电路17184.控制程序设计4.1智能照明系统的控制程序结构设计本设计采用了Keil软件对设计进行了编程,其优点是操作相对简单。智能照明的程序结构是由显示、定时、智能调光、按键、光强检测等五个子程序组成,如下图所示:智能照明系统设计的程序智能照明系统设计的程序光强检测程序光强检测程序按键控制程序按键控制程序显示程序显示程序人体检测程序人体检测程序图4-1控制程序结构框图4.2控制程序总流程设计打开系统开关,首先是各个模块自动进行初始化,传感器会对日期以及室内的光线强度进行检测,并将日期和光强信息通过STC89C52传送到显示屏。显示内容完全根据内部检测决定。此时,如果系统处于自动模式下,控制器就会判断室内是否有人,如果系统处于手动模式下,则系统会根据按键控制灯亮。系统处于自动模式时,如果传感器检测到有人时,系统根据光线强度自动调节亮灯,当系统检测到没有人后,延时30秒后自动关闭照明灯。图开始初始化开始初始化N读取日期时间

显示日期时间自动模式?根据按键控制亮灯YN30秒到?灭灯Y有人?YN根据光线强度自动调节亮灯结束读光线强度并显示4.3子系统设计4.3.1显示程序设计本系统采用1602液晶显示作为输出显示,可显示两行字符,不能显示汉字,19在里面放置128个字符的ASCLL字符集字库,只有并行接口,无串行接口。显示程序的流程如下图所示:单片机将采集到的外部数据(光线强度、红外人体感应等)并行发到液晶显示屏显示。开始开始初始化数据初始化数据否外部信号检测外部信号检测是写入命令写入命令写入数据写入数据状态显示状态显示返回返回图4-3显示程序流程图4.3.2光线强度检测程序设计光线检测子程序主要通过光敏电阻对环境的光照强度进行检测,将检测到的数据通过A/D转换模块,将模拟信息转化为数字信息,方便单片机进行运算,按一定的算法实现灯光亮度的调节。20开始开始系统初始化系统初始化光敏电阻检测光强光敏电阻检测光强A/D转换A/D转换返回亮度调节子程序返回亮度调节子程序图4-4光线强度检测流程图4.3.3按键控制程序设计在智能照明系统中,当系统定时器完成初始化并启动后,按键开始扫描判是手动控制还是自动控制。如果key4=1(自锁按键key4松开即为自动控制),则ADC获取光敏电阻电压V,然后进一步判断光敏电阻电压V的值是否小于0.4,如果是小于0.4,则last=0(按下);反之,判断电压是否0.4<=V<2.7;如果是则last=2,反之,进一步判断电压的值是否2.9<=V<4;如果是则last=7,反之,last=10;LED发光。如果key4=0(自锁按键key4按下即为手动控制),则开始判断按键key3是否等于0,;如果等于0,则last=10;反之,然后判断按键key2是否等于0,如果等于0,则last=6;反之,判断按键key1是否等于0;如果是则last=1;反之,last=5,LED发光。最后,返回以上步骤重复开始进行判断。该程序是通过控制电流调节LED的亮度。利用调整不同的占空比就可以控制电流的大小,从而调节LED的亮度,对LED的耗电进行相应的管理。2122开始开始定时器初始化并启动定时器初始化并启动YKey4=0YKey4=0NNADC获取光敏电阻电压VADC获取光敏电阻电压VYYLast=10Last=0V<0.4?YYLast=10Last=0V<0.4?Key3=0?NNNNYYLast=6Last=20.4<=V<2.7?KYYLast=6Last=20.4<=V<2.7?Key2=0?NNNNYYLast=1Last=7Key1=0?YYLast=1Last=7Key1=0?2.9<=V<4?NNLast=5LED发光占空比:Last/10Last=10Last=1Last=1NNLast=5LED发光占空比:Last/10Last=10Last=1Last=1 图4-5按键控制流程图4.3.4人体检测程序设计人体检测子程序主要是用于系统处于自动模式下,如果检测到有人,则对光照的强度进行检测,从而实现合适的光照亮度。开始开始系统初始化系统初始化N是否为自动模式N是否为自动模式YY是否有人是否有人YY光线检测光线检测亮度调节亮度调节返回返回图4-6人体检测流程图235系统调试5.1系统仿真系统仿真图中的STC89C52为真个系统的控制核心,将以二进制格式编写的程序烧录后,按照编写的指令进行操作,DS1302的执行方式通过将P2.0、P2.1和P2.2连接到右上角的DS1302时钟芯片来控制,在STC89C52的控制下,液晶显示器1602可以显示当前时间并指示用户改变时间;左下方的继电器能在设定的开启时间闭合,在设定的关闭时间断开;继电器闭合,中间蓝色信号灯亮;九个独立按键,配合液晶显示器1602完成系统时间、开、关时间的设置;右下方的整个模块是系统提示模块。当系统时间与设定的开启或者关闭时间相同时,D1闪烁3次,蜂鸣器响3次;D2用于模拟继电器,当继电器闭合时被点亮。如下图所示:图5-1系统仿真图25245.2实物焊接过程下图是智能照明系统所用到的各种材料:单片机最小系统、STC89C52单片机1个、1602显示器1个、电源模块、LED灯7个、按键9个、人体检测模块1个、电源插座1个等。该系统包括显示模块、电源模块、人体检测模块、单片机最小系统以及按键模块等。实物如下图所示。图5-2实物图5.3硬件调试过程中的问题及解决方法问题一:实物焊接完之后液晶显示屏上没有内容解决办法:首先将板子观察一遍有没有地方没有焊接好,观察完之后没有检查出问题,然后重新将实物的触点焊接一遍。焊接完之后还是没有内容,最后发现把P0排阻焊反了,有字的一面应该是朝单片机。通过调整,显示屏上有了内容。问题二:实物焊接过程中触点未焊透解决办法:在焊接的过程中可能由于焊的角度不正确、是操作不当或者是焊的力度不够(焊速过快)等原因引起电路不通。采取的办法就是通过尝试加大焊接的覆盖面积,适度矫正焊接角度。问题三:触点焊错解决办法:在焊接过程中将两个插件电阻的触点位置焊接错误导致电路不通,最终经过排查,重新焊接。5.4各模块功能调试5.4.1显示模块调试显示模块的主要功能是显示日期、时间、光线强度等级以及灯的亮度等级,除此之外,还有定时功能,主要用于检测室内环境的光线亮度从而调整灯的亮度。整个系统接通电源后,显示屏幕的第一行显示光线强度等级(L:7)和日期;第二行显示LED灯的亮度等级(LED:9),后面则是具体的时间,然后就是星期(1是从星期天开始,以此类推,3就表示星期二)。如下图5-4所示:图5-4显示模块调试23266结论与展望6.1结论本课题所要研究设计的智能照明控制系统主要是采用STC89C52单片机作为智能照明控制系统的核心,以LCD1602显示器、蜂鸣器、时钟芯片DS1302、按键以及发光二极管等器件作为外围设备来完成整个系统的工作。本系统通过光线强度的采集,并在LCD1602显示器上显示日期、时间、光线强度等级和灯的亮度等级。除此之外,还有定时功能、手动/自动模式切换,有效的控制了照明灯的利用率,从而实现节约能源这一理念,大大增加了灯具的使用寿命。由此可见,本设计能够实现预期的功能。6.2展望

智能照明从单纯的照明功能逐渐转变为更加重视人的视觉和行为的智能照明。在这些行为的基础上,开发出更加科学、高效、舒适健康的智能照明,可以更好地满足用户的需求。将新型光源和照明技术结合起来有助于构建新型照明系统,照明技术平台的应用范围非常广泛,前景无限,努力构建尖端技术和科学思考的新型照明文化。2728参考文献李晓妹,吴慧敏.基于单片机的智能照明控制系统设计思路.广西农业机械化,2019(5):28-28.李春秀.基于单片机的智能照明控制系统设计与实现.通讯世界,2019,26(9):188-190.高美珍,洪家平.基于单片机的室内智能照明系统设计.湖北师范大学学报:自然科学版,2019,39(3):96-100.石永生,陈广盛,赵金龙.基于单片机的智能照明控制系统设计.信息通信,2013(10):63-64.凌六一,韦颖,周孟然,黄友锐,邢丽坤,洪炎,唐超礼,闫鹏程.结合Protues虚拟仿真“单片机”课程的案例教学方法研究.兰州教育学院学报,2019,35(9):95-96.崔晓龙.基于单片机的无线智能照明系统设计[J].电子制作,2018,(16):3-4黄超,王虹喻.基于STM8F003无线智能照明系统设计.电路与系统,2016,5(1):1-9.张红,赵琳,王雅君,刘正光.绿色智能照明控制系统设计.电子制作,2017(7):13-14.李艳萍,殷倩如,姚圣男,张福鼎.基于单片机的分布式智能照明控制系统设计.广西节能,2019(2):28-29.彭嘉杰,彭小红,卢路路,苏荣鉴.大学教室智能照明控制系统设计.现代计算机:上下旬,2014(21):68-72.王桂兰,郭万民,肖珂等.基于行为识别和单片机的智能照明系统设计[J].信息通信,2017,(4):48-49贾冬颖,王巍.基于STC单片机LED智能照明系统的设计.照明工程学报,2010(2):71-73.刘瑞妮.基才WiFi和单片机的教学楼智能照明系统的设计.电子设计工程,2018,26(5):133-136.姜彬,居晓琴.基于AT89C2051的智能照明控制系统的设计.信息与电脑:理论版,2014(12):150-151.王大芬,程盼.基于单片机的智能照明系统设计[J].计算机产品与流通,2018(12):121.郑礼源.基于STC89S52单片机的智能照明控制系统设计.自动化应用,2019(5):68-70.RacepointEnergyLLC;ResearchersSubmitPatentApplication,"IntelligentLightingControlSystemZoneIdentificationApparatuses,Systems,AndMethods",forApproval(USPTO20200288557).2020,:8612-.RacepointEnergyLLC;PatentApplicationTitled"IntelligentLightingControlSystemSecureConnectionControlApparatuses.Systems,AndMethods"PublishedOnline(USPTO20200275546).2020,:847-.李光耀,王利,易子川,周国富.基于Zigbee的智能照明系统研究与设计.照明工程学报,2016,27(3):1-6.赵禹臣,翟娟.基于单片机的教室智能照明系统.软件,2019,40(3):26-29.JiangLuansheng,LiuChunxia,GuoXiumei,etal.TheDesignofIntelligentLightingSysteminCollegeClassroom.2012,17:90-95.[1]RuiniLiu.DesignofIntelligentLightingSystembasedonWiFiandArduinoSingleChipMicrocomputer[P].Proceedingsofthe7thInternationalConferenceonEducation,Management,InformationandMechanicalEngineering(EMIM2017),2017.[23].RacepointEnergyLLC;PatentApplicationTitled"IntelligentLightingControlSystemPhaseCuttingApparatuses,Systems,AndMethods"PublishedOnline(USPTO20200323059).2020,:2479.2930附录1原理图附录2程序主程序#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintuchartime_data[7];ucharcodewrite_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//数据的地址ucharcoderead_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};ucharcodetable1[]="L:|2000/00/00";ucharcodetable2[]="LED:|00:00:000";ucharcodetable3[]=""; //清屏内容ucharcodetable4[]="SetRealTime";ucharcodetable5[]="SetOpenTime";3132ucharcodetable6[]="StartTime:";ucharcodetable7[]="00:00:00";ucharcodetable8[]="EndTime:";ucharcodetable9[]="Date:2000/00/00";ucharcodetable0[]="Time:00:00:000";bitflag; //有人标志位=1bitAdjust; //调节标志位,=1表示进入调节模式,=0是正常模式bitAuto_flg; //自动模式标志位,=1表示手动模式,=0是自动模式sbitrs=P1^0; //LCD1602sbitrw=P1^1; //LCD1602sbite=P1^2; //LCD1602sbitsck=P2^5; //时钟端口sbitio=P2^6; //时钟端口sbitrst=P2^7; //时钟端口sbitSELT=P1^5; //选择键sbitENTER=P1^6; //确认键sbitUP=P1^7; //加键sbitDOWN=P3^0; //减键sbitMODE=P3^1; //切换按键接口sbitSWITCH=P3^3; //手动开关sbitADD=P3^4; //亮sbitREDUCE=P3^5; //暗sbitAUTO_LED=P1^3; //自动模式灯接口sbitHAND_LED=P1^4; //手动灯接口sbitLAMP=P2^3; //灯接口sbitCS=P2^2; //ADC0832sbitClk=P2^0; //ADC0832sbitDATI=P2^1; //ADC0832sbitDATO=P2^1; //ADC0832sbitTRIP=P3^2; //人体红外接口ucharSelect_num; //选择按键按下次数ucharEnter_num; //确认按键按下次数floatYear,Month,Day,Hour,Minute,Second; //时间设置值ucharWeek; floatHour_H,Minute_H,Second_H; //设置开始时间floatHour_L,Minute_L,Second_L; //设置结束时间uchardat=0x00; //AD值ucharCH; //通道变量charLight; //光线强度charnum; //PWM中断次数charpwm; //脉宽参数0-9ucharHAND_SWITCH; //手动开关状态uintTimer_Counter; //倒计时10s中断计数ucharMiao; //倒计时10suintCount; voidread_rtc();/*********************************************************************************************************************/voiddelay1(uintz) //延时函数{ uintx,y; for(x=z;x>0;x--) for(y=10;y>0;y--);}voidwrite_com(ucharcom) //写指令函数{ rw=0; delay1(5); rs=0; delay1(5); e=1; delay1(5); P0=com; delay1(5); e=0; delay1(5); }voidwrite_date(uchardate) //写数据函数{ rw=0; delay1(5); rs=1; delay1(5); e=1; delay1(5); P0=date; delay1(5); e=0; delay1(5); }3334voidinit() //初始化函数{ ucharnum; Hour_H=23;//默认定时时间 Minute_H=59; Second_H=59; Hour_L=18; Minute_L=0; Second_L=0; e=0; //时序表e初始为0 write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口 write_com(0x0c); //设置光标 write_com(0x06); //光标自动加1,光标输入方式 write_com(0x01); //清屏 write_com(0x80); //设置初始显示位置 for(num=0;num<16;num++) { write_date(table1[num]); delay1(5); } write_com(0x80+0x40); for(num=0;num<16;num++) { write_date(table2[num]); delay1(5); } }voidSetTime_dispaly(ucharadd,uchardat) //第一个:参数的地址,第二个:参数的内容{ ucharshi,ge; shi=dat/10; //把十位提取出来 ge=dat%10; //把个位提取出来 write_com(add); //要写的地址 write_date(0x30+shi); //十位的内容1602字符库 write_date(0x30+ge); //个位的内容1602字符库}voidWeek_dispaly(ucharadd,uchardat) //第一个:参数的地址,第二个:参数的内容{ write_com(add); //要写的地址 write_date(0x30+dat); //十位的内容1602字符库}voidDate_dispaly(ucharadd,uchardat) //第一个:参数的地址,第二个:参数的内容{ ucharshi,ge; shi=dat/16; //把十位提取出来 ge=dat%16; //把个位提取出来 write_com(add+3); //要写的地址 write_date(0x30+shi); //十位的内容1602字符库 write_date(0x30+ge); //个位的内容1602字符库 }voidLCD_Clean(uchari) //液晶屏清除显示{ ucharnum; if(i==1) { write_com(0x80); //设置初始显示位置 for(num=0;num<16;num++) //显示第一行内容 { write_date(table3[num]); delay1(1); } } if(i==2) { write_com(0x80+0x40); for(num=0;num<16;num++) //显示第二行内容 { write_date(table3[num]); delay1(1); } }}voidLCD_Display_String(unsignedcharline,unsignedchar*string){ //液晶屏显示内容,把要显示的内容写到对应的位置 unsignedchari; unsignedcharaddress=0;3536 if(line==1) { address=0x80; //0X80是第1行的第1个位置,0x81第2位 } elseif(line==2) { address=0x80+0x40; //0X80+0x40是第2行的第1个位置,0X80+0x40+1是第2行第2位 } for(i=0;i<16;i++) { write_com(address); write_date(string[i]); address++; }}voidlight_dispaly(charadd,chardat) //光线强度显示函数{ write_com(0x80+add); //要写的地址 write_date(0x30+dat); //个位的内容 1602字符库}voidTime_Display(void){ read_rtc(); Date_dispaly(0x80+0x40+9,time_data[6]);//显示秒 Date_dispaly(0x80+0x40+6,time_data[5]); //显示分 Date_dispaly(0x80+0x40+3,time_data[4]); //显示时 Date_dispaly(0x80+11,time_data[3]); //显示日 Date_dispaly(0x80+8,time_data[2]); //显示月 Week_dispaly(0x80+0x40+15,time_data[1]);//显示周 Date_dispaly(0x80+5,time_data[0]); //显示年 // Year/10*16+Year%10 Year=time_data[0]/16*10+time_data[0]%16; Week=time_data[1]/16*10+time_data[1]%16; Month=time_data[2]/16*10+time_data[2]%16; Day=time_data[3]/16*10+time_data[3]%16; Hour=time_data[4]/16*10+time_data[4]%16; Minute=time_data[5]/16*10+time_data[5]%16; Second=time_data[6]/16*10+time_data[6]%16;}voidwrite_ds1302_byte(uchardat){ uchari; for(i=0;i<8;i++) { sck=0; io=dat&0x01; //准备数据,从最低位开始 dat=dat>>1; sck=1; }}voidwrite_ds1302(ucharadd,uchardat){ rst=0; _nop_(); //CPU原地踏步 sck=0; _nop_(); rst=1; _nop_(); write_ds1302_byte(add); //传地址 write_ds1302_byte(dat); //传数据 rst=0; //不受其他影响 _nop_(); io=1; //释放 sck=1;}ucharread_ds1302(ucharadd){ uchari,value; rst=0; _nop_();//CPU原地踏步 sck=0; _nop_(); rst=1; _nop_(); write_ds1302_byte(add); for(i=0;i<8;i++) { value=value>>1; sck=0;3738 if(io) value=value|0x80; sck=1; } rst=0; _nop_(); sck=0; _nop_(); sck=1; io=1; returnvalue;}voidset_rtc() //设置时间{ uchari,j; for(i=0;i<7;i++) //转换BCD码 { j=time_data[i]/10; time_data[i]=time_data[i]%10; time_data[i]=time_data[i]+j*16; } write_ds1302(0x8e,0x00); //去除写保护 for(i=0;i<7;i++) { write_ds1302(write_add[i],time_data[i]); } write_ds1302(0x8e,0x80);//加写保护}voidread_rtc(){ uchari; for(i=0;i<7;i++) { time_data[i]=read_ds1302(read_add[i]); //最终读出来的数16进制 }}/*************************************************按键****************************************************************/voidKeyscan(void){ if(SELT==0) { delay1(2); if(SELT==0) { while(!SELT); Select_num++; //选择键按下一次 Adjust=1; //进入调节模式 } if(Select_num==1) { LCD_Clean(1); LCD_Clean(2); LCD_Display_String(1,table4); LCD_Display_String(2,table5); write_com(0x80+0); //写>> write_date(0x3e); write_com(0x80+1); //写>> write_date(0x3e); Enter_num=0; } if(Select_num==2) { LCD_Clean(1); LCD_Clean(2); LCD_Display_String(1,table4); LCD_Display_String(2,table5); write_com(0x80+0x40+0); //写>> write_date(0x3e); write_com(0x80+0x40+1); //写>> write_date(0x3e); Enter_num=0; } if(Select_num==3) { LCD_Clean(1); LCD_Clean(2); LCD_Display_String(1,table1); LCD_Display_String(2,table2); Select_num=0; Enter_num=0; Adjust=0; } write_com(0x0c);3940 //光标不再闪烁 Enter_num=0; } if(ENTER==0) { delay1(2); if(ENTER==0) { while(!ENTER); Enter_num++; } if(Select_num==1) //设置实时时间 { if(Enter_num==1) { LCD_Clean(1); LCD_Clean(2); LCD_Display_String(1,table9); LCD_Display_String(2,table0); SetTime_dispaly(0x80+8,Year); SetTime_dispaly(0x80+11,Month); SetTime_dispaly(0x80+14,Day); SetTime_dispaly(0x80+0x40+6,Hour); SetTime_dispaly(0x80+0x40+9,Minute); SetTime_dispaly(0x80+0x40+12,Second); Week_dispaly(0x80+0x40+15,Week); write_com(0x80+8); //光标闪烁地址,停留在年的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==2) { write_com(0x80+11); //光标闪烁地址,停留在月的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==3) { write_com(0x80+14); //光标闪烁地址,停留在日的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==4) { write_com(0x80+0x40+6); //光标闪烁地址,停留在时的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==5) { write_com(0x80+0x40+9); //光标闪烁地址,停留在分的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==6) { write_com(0x80+0x40+12); //光标闪烁地址,停留在秒的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==7) { write_com(0x80+0x40+15); //光标闪烁地址,停留在星期的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==8) { Enter_num=0; write_com(0x0c); //光标不再闪烁 LCD_Clean(1); LCD_Clean(2); LCD_Display_String(1,table1); LCD_Display_String(2,table2); time_data[0]=Year;///10*16+Year%10; time_data[1]=Week;///10*16+Week%10; time_data[2]=Month;///10*16+Month%10; time_data[3]=Day;///10*16+Day%10; time_data[4]=Hour;///10*16+Hour%10; time_data[5]=Minute;///10*16+Minute%10; time_data[6]=Second;///10*16+Second%10; set_rtc(); //设置时间 Select_num=0; Adjust=0; } }4142 if(Select_num==2) //设置开关锁时间 { if(Enter_num==1) { LCD_Clean(1); LCD_Clean(2); LCD_Display_String(1,table6); LCD_Display_String(2,table7); SetTime_dispaly(0x80+0x40+4,Hour_L); SetTime_dispaly(0x80+0x40+7,Minute_L); SetTime_dispaly(0x80+0x40+10,Second_L); write_com(0x80+0x40+4); //光标闪烁地址,停留在时的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==2) { write_com(0x80+0x40+7); //光标闪烁地址,停留在分的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==3) { write_com(0x80+0x40+10); //光标闪烁地址,停留在秒的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==4) { write_com(0x0c); //光标不再闪烁 LCD_Clean(1); LCD_Clean(2); LCD_Display_String(1,table8); LCD_Display_String(2,table7); SetTime_dispaly(0x80+0x40+4,Hour_H); SetTime_dispaly(0x80+0x40+7,Minute_H); SetTime_dispaly(0x80+0x40+10,Second_H); write_com(0x80+0x40+4); //光标闪烁地址,停留在时的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==5) { write_com(0x80+0x40+7); //光标闪烁地址,停留在分的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==6) { write_com(0x80+0x40+10); //光标闪烁地址,停留在秒的位置上 write_com(0x0f); //光标闪烁 } if(Enter_num==7) { Enter_num=0; write_com(0x0c); //光标不再闪烁 LCD_Clean(1); LCD_Clean(2); LCD_Display_String(1,table1); LCD_Display_String(2,table2); Select_num=0; Adjust=0; } } } if(UP==0) { delay1(2); if(UP==0) { while(!UP); if(Select_num==1) { if(Enter_num==1) { Year++; if(Year>99) Year=0; SetTime_dispaly(0x80+8,Year); write_com(0x80+8); write_com(0x0f); } if(Enter_num==2) { Month++;4344 if(Month>12) Month=1; SetTime_dispaly(0x80+11,Month); write_com(0x80+11); write_com(0x0f); } if(Enter_num==3) { Day++; if(Day>31) Day=1; SetTime_dispaly(0x80+14,Day); write_com(0x80+14); write_com(0x0f); } if(Enter_num==4) { Hour++; if(Hour>23) Hour=0; SetTime_dispaly(0x80+0x40+6,Hour); write_com(0x80+0x40+6); write_com(0x0f); } if(Enter_num==5) { Minute++; if(Minute>59) Minute=0; SetTime_dispaly(0x80+0x40+9,Minute); write_com(0x80+0x40+9); write_com(0x0f); } if(Enter_num==6) { Second++; if(Second>59) Second=0; SetTime_dispaly(0x80+0x40+12,Second); write_com(0x80+0x40+12); write_com(0x0f); } if(Enter_num==7) { Week++; if(Week>7) Week=1; Week_dispaly(0x80+0x40+15,Week); write_com(0x80+0x40+15); write_com(0x0f); } } if(Select_num==2) { if(Enter_num==1) { Hour_L++; if(Hour_L>23) Hour_L=0; SetTime_dispaly(0x80+0x40+4,Hour_L); write_com(0x80+0x40+4); write_com(0x0f); } if(Enter_num==2) { Minute_L++; if(Minute_L>59) Minute_L=0; SetTime_dispaly(0x80+0x40+7,Minute_L); write_com(0x80+0x40+7); write_com(0x0f); } if(Enter_num==3) { Second_L++; if(Second_L>59) Second_L=0; SetTime_dispaly(0x80+0x40+10,Second_L); write_com(0x80+0x40+10); 4546 write_com(0x0f); } if(Enter_num==4) { Hour_H++; if(Hour_H>23) Hour_H=0; SetTime_dispaly(0x80+0x40+4,Hour_H); write_com(0x80+0x40+4); write_com(0x0f); } if(Enter_num==5) { Minute_H++; if(Minute_H>59) Minute_H=0; SetTime_dispaly(0x80+0x40+7,Minute_H); write_com(0x80+0x40+7); write_com(0x0f); } if(Enter_num==6) { Second_H++; if(Second_H>59) Second_H=0; SetTime_dispaly(0x80+0x40+10,Second_H); write_com(0x80+0x40+10); write_com(0x0f); } } } } if(DOWN==0) { delay1(2); if(DOWN==0) { while(!DOWN); if(Select_num==1) { if(Enter_num==1) { Year--; if(Year<0) Year=99; SetTime_dispaly(0x80+8,Year); write_com(0x80+8); write_com(0x0f); } if(Enter_num==2) { Month--; if(Month<1) Month=12; SetTime_dispaly(0x80+11,Month); write_com(0x80+11); write_com(0x0f); } if(Enter_num==3) { Day--; if(Day<1) Day=31; SetTime_dispaly(0x80+14,Day); write_com(0x80+14); write_com(0x0f); } if(Enter_num==4) { Hour--; if(Hour<0) Hour=23; SetTime_dispaly(0x80+0x40+6,Hour); write_com(0x80+0x40+6); write_com(0x0f); } if(Enter_num==5) { Minute--; if(Minute<0) Minute=59; SetTime_dispaly(0x80+0x40+9,Minute);4748 write_com(0x80+0x40+9); write_com(0x0f); } if(Enter_num==6) { Second--; if(Second<0) Second=59; SetTime_dispaly(0x80+0x40+12,Second); write_com(0x80+0x40+12); write_com(0x0f); } if(Enter_num==7) { Week--; if(Week<1) Week=7; Week_dispaly(0x80+0x40+15,Week); write_com(0x80+0x40+15); write_com(0x0f); } } if(Select_num==2) { if(Enter_num==1) { Hour_L--; if(Hour_L<0) Hour_L=23; SetTime_dispaly(0x80+0x40+4,Hour_L); write_com(0x80+0x40+4); write_com(0x0f); } if(Enter_num==2) { Minute_L--; if(Minute_L<0) Minute_L=59; SetTime_dispaly(0x80+0x40+7,Minute_L); write_com(0x80+0x40+7); write_com(0x0f); } if(Enter_num==3) { Second_L--; if(Second_L<0) Second_L=59; SetTime_dispaly(0x80+0x40+10,Second_L); write_com(0x80+0x40+10); write_com(0x0f); } if(Enter_num==4) { Hour_H--; if(Hour_H<0) Hour_H=23; SetTime_dispaly(0x80+0x40+4,Hour_H); write_com(0x80+0x40+4); write_com(0x0f); } if(Enter_num==5) { Minute_H--; if(Minute_H<0) Minute_H=59; SetTime_dispaly(0x80+0x40+7,Minute_H); write_com(0x80+0x40+7); write_com(0x0f); } if(Enter_num==6) { Second_H--; if(Second_H<0) Second_H=59; SetTime_dispaly(0x80+0x40+10,Second_H); write_com(0x80+0x40+10); 4950 write_com(0x0f); } } } } if(MODE==0) //切换按键按下 { delay1(2); //消抖 if(MODE==0) { while(!MODE); //按键释放 Auto_flg=~Auto_flg; //模式切换 if(Auto_flg==0) //自动模式 { AUTO_LED=0; //自动灯亮 HAND_LED=1; pwm=0; //关灯 Miao=0; flag=0; } if(Auto_flg==1) //手动模式 { AUTO_LED=1; HAND_LED=0; //手动灯亮 pwm=0; //关灯 Miao=0; flag=0; } } } if(Auto_flg==1) //手动模式 { if(SWITCH==0) { while(!SWITCH); //等待按键释放 if(pwm==0) //关闭时开启 HAND_SWITCH=0; if(pwm!=0) HAND_SWITCH=1; //开启时关闭 switch(HAND_SWITCH) { case0: pwm=9; break; case1: pwm=0; break; } } if(ADD==0) //亮按下 { while(!ADD); //等待按键释放 TR0=1; //启动PWM调光 pwm++; if(pwm>=9) pwm=9; light_dispaly(0x40+4,pwm); //显示LED强度 } if(REDUCE==0) //暗按下 { while(!REDUCE); //等待按键释放 TR0=1; //启动PWM调光 pwm--; if(pwm<=0) pwm=0; light_dispaly(0x40+4,pwm); //显示LED强度 } }}/*************************************ADC0832*****************************************/ucharadc0832(ucharCH) //AD转换子程序{ uchari,test,adval; adval=0x00; test=0x00; Clk=0; //初始化 DATI=1; _nop_(); CS=0; _nop_(); Clk=1; _nop_(); if(CH==0x00) //通道选择5152 { Clk=0; DATI=1;//通道0的第一位 _nop_(); Clk=1; _nop_(); Clk=0; DATI=0;//通道0的第二位 _nop_(); Clk=1; _nop_(); } else { Clk=0; DATI=1;//通道1的第一位 _nop_(); Clk=1; _nop_(); Clk=0; DATI=1;//通道1的第二位 _nop_(); Clk=1; _nop_(); } Clk=0; DATI=1; for(i=0;i<8;i++)//读取前8位的值 { _nop_(); adval<<=1; Clk=1; _nop_(); Clk=0; if(DATO) adval|=0x01; else adval|=0x00; } for(i=0;i<8;i++)//读取后8位的值 { test>>=1; if(DATO) test|=0x80; else test|=0x00; _nop_(); Clk=1; _nop_(); Clk=0; } if(adval==test)//比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉 dat=test; _nop_(); CS=1; //释放ADC0832 DATO=1; Clk=1; returndat;}voidLight_Check(void){ dat=adc0832(CH); //采集光线电压 if((dat>=0)&(dat<20)) //根据采到的电压值给定光线强度,电压越高,光线强度越低 {Light=9;} if((dat>=20)&(dat<40)) {Light=8;} if((dat>=40)&(dat<60)) {Light=7;} if((dat>=60)&(dat<80)) {Light=6;} if((dat>=80)&(dat<100)) {Light=5;} if((dat>=100)&(dat<120)) {Light=4;} if((dat>=120)&(dat<140)) {Light=3;} if((dat>=140)&(dat<160)) {Light=2;} if((dat>=160)&(dat<180)) {Light=1;} if((dat>=180)&(dat<=255)) {Light=0;} 5354 light_dispaly(3,Lig

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论