基于-pwm调光的智能多功能台灯设计

基于-pwm调光的智能多功能台灯设计

ID:22804437

大小:1.05 MB

页数:69页

时间:2018-10-31

上传者:U-21680
基于-pwm调光的智能多功能台灯设计_第1页
基于-pwm调光的智能多功能台灯设计_第2页
基于-pwm调光的智能多功能台灯设计_第3页
基于-pwm调光的智能多功能台灯设计_第4页
基于-pwm调光的智能多功能台灯设计_第5页
资源描述:

《基于-pwm调光的智能多功能台灯设计》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

本科毕业设计题目基于PWM的智能多功能台灯设计姓名韦洋专业自动化学号201042004指导老师曹卫锋郑州科技学院电气工程学院二○一四年五月 郑州科技学院毕业设计(论文)任务书题目基于PWM的智能多功能台灯设计专业自动化学号201042004姓名韦洋主要内容、基本要求、主要参考资料等:主要内容:(1)功能要求:台灯能够自动调整光强亮度,检测环境温度,显示日历等。(2)硬件要求:整个系统的硬件部分包括单片机,键盘、显示和信号输出等。上述内容为基本要求,可按照自己的理解增加功能使之更完善。基本要求:(1)明确毕业设计任务,复习与查阅有关资料。(2)对设计进行简要说明,总体设计方案,设计电路,使用计算机绘图,画出详细的电路接线图,列出元器件清单。电路图要求工整、清楚、正确,并标明管脚。(3)软件编程必须有流程图,程序必须加注释,各程序段的开始要注明该段功能和作用。(4)要求使用A4打印稿,不少于2万字。格式遵照学校规定。主要参考资料:(1)周航慈.单片机应用程序设计技术[M].北京航空航天大学出版社(2)中国期刊全文数据库。(3)“电子技术应用”、“电子设计应用”、“单片机与嵌入式系统应用”等期刊。(4)张毅刚.MCS-51单片机应用设计[M].哈尔滨工业大学出版社(5)http://stc.eitp.com.cn/a/zuopinzhanshi/diqijiedasaizuopin/(6)http://forum.eepw.com.cn/forum/357/1完成期限:指导教师签名:专业负责人签名:年月日 郑州科技学院毕业设计(论文)开题报告课题名称基于PWM的智能多功能台灯设计课题来源教师拟定课题类型AX指导教师曹卫峰学生姓名韦洋学号201042004专业自动化开题报告内容:(调研资料的准备,设计的目的、要求、思路与预期成果;任务完成的阶段内容及时间安排;完成设计(论文)所具备的条件因素等。)1.调研资料的准备毕业设计是对我们在大学所学知识的一次系统而全面的总结,要求有一定的深度和广度,只有这样才能把所学知识融会贯通,将知识转化为能力。为了为我们的老师、家长和我们自己画下一个完美的句号,调研资料准备如下:(1)在图书馆查阅与单片机、传感器、PWM脉宽调制相关电路等有关的文字书籍;(2)通过互连网查阅所使用芯片相关的电子资料,以及国内外相关技术;(3)通过老师的指导与解惑,对设计内容有基本的了解,确定所使用的单片机类型和芯片型号,掌握各种硬件原理。避免设计误区,争取高效率。2.设计的目的与要求目的:利用单片机微控系统和各个集成电子模块设计出一款能够调节台灯亮度,能够显示时间,万年历,能够检测室内温度,拥有闹钟功能,有硬件设计图和软件设计流程图。要求:(1)设计显示模块以及恒流驱动模块,时钟模块,按键系统,蜂鸣系统,温度检测等硬件电路;(2)设计PWM调光系统能够对LED进行调节。(3)对设计的电路进行分析。(4)设计软件程序流程图及软件主控制程序。(5)设计调试程序与硬件电路相匹配完成智能控制。3.设计思路 为了达到设计的目的,经过反复查阅资料,设计出电路原理,熟悉为实现其功能所需要的各种元器件,集成模块,软件设计,软硬件结合。(1)选用STC51单片机利用PWM脉宽调制原理通过程序改变脉宽参数用单片机来控制每个周期内高低电平数从而实现电压的调节,改变台灯的亮度。(2)时钟系统时钟系统采用高性能的DS1302时钟芯片,该芯片功能丰富,使用简单,是一款高精度实时时钟芯片;其可以自动产生、年、月、日、时、分、秒等时间信息。显示系统选用1602字符型液晶显示模块。(3)温度检测系统温度检测系统选用数字温度传感器DS18B20。该传感器集成度高功耗小高性能。可直接将温度转为串行数字信号。(4)蜂鸣系统蜂鸣系统用于产生闹钟报警及按键提示音,由单片机及三极管的通断实现对蜂鸣器声音控制。(5)供电系统LED灯采用恒流驱动芯片PT4115,单片机采用5V直流电源来进行供电,其他模块采用直流电源供电。(6)软件程序设计熟悉并掌握C语言程序设计的方法和思路,能够熟练掌握单片机仿真软件proteus的使用和仿真。4.设计的预期成果:完成论文,制作出实物。5.任务完成的阶段内容及时间安排(1)第1周~第2周:图书馆和网上查找资料,消化资料;(2)第3周~第5周:制作外围硬件电路;(3)第6周~第10周:完成各个模块对硬件以及程序的调试工作,使系统正常运行;(4)第11周~第12周:完成论文。6.完成设计(论文)所具备的条件因素 如期完成本次设计具备以下条件因素,可以在图书馆查阅与单片机,PWM调光的相关书籍、杂志和期刊,在图书馆的电子资源网络上搜索相关资料,学习仿真软件的使用方法和技巧,具有调试硬件电路以及软件的仪器与设备,积极听取老师的指导与意见。注:课题来源要填写明确(如教师拟定、学生建议、某企事业单位项目等)课题类型:(1)A—工程设计;B—技术开发;C—软件工程;D—理论研究;E—调研报告(2)X—真实课题;Y—模拟课题;Z—虚拟课题;要求(1)、(2)均要填,如AY,BY等。 目录中文摘要I英文摘要II前言IV1设计的总体要求及方案选择11.1调光技术的选择11.2主要集成芯片的选择22硬件系统电路设计42.1整体电路系统模块42.2单片机主控系统42.3恒流驱动系统52.4时钟系统72.5液晶显示系统82.6温度检测系统102.7蜂鸣系统122.8按键系统122.9电源系统133系统软件设计143.1系统主程序143.2按键检测和处理程序153.3外部中断程序163.4定时器中断程序163.5C语言程序编写和ISP软件程序下载174软件的调试和仿真195硬件的组装与调试205.1元器件的选择与测量205.2电子元器件的焊接与组装205.3电子电路的调试215.3.1调试方法21 5.3.2调试步骤21总结24致谢26参考文献27附录1电路实物图28附录2电路原理总图29附录3电路程序清单30附录4元器件清单58 基于PWM的智能多功能台灯设计摘要随着电子技术的日益发展,人们生活中的照明工具也在发生着巨大的变化。普通电灯,白炽灯,LED灯,这也反映了人类社会的进步,科技的发展。目前的家居逐步朝着多功能化智能化的方向发展[12]。随着环境问问题的恶化,能源的减少。节能绿色环保的台灯,逐步走进了人们的生活。以前的台灯用途单一,而现在的人们需要一种多功能智能化的台灯。因此利用所学知识设计一种多功能绿色环保的台灯是一种很好的方向。本文介绍了一种基于PWM调光的智能台灯设计。把单片机技术和PWM调光技术结合起来实现台灯光强的调节。利用软件来改变占空比从而来改变电压的大小实现调光。利用DS1302时钟芯片和单片机结合来产生时间日历。利用DS18B20温度检测芯片来检测环境温度。用1602字符型液晶显示芯片来显示时间,日历,星期,温度,以及台灯的光强等级。利用蜂鸣器和时钟芯片产生定时闹钟。从而使台灯拥有多项功能。文章对总体设计思想进行了论述,分析了系统主要功能并以系统硬件设计框图的形式体现,进行了方案选择与方案论证。完成了硬件电路的设计,描述了各模块电路的组成,其中包括单片机最小系统、液晶显示电路、时钟电路、蜂鸣器电路,温度检测电路,照明电路等,分析了电路中所用芯片的主要功能及各部分电路的工作原理。本设计通过对各模块的硬件和软件的设计,基本能够达到设计要求,满足人们日常对台灯的功能使用。关键词:台灯;多功能;单片机;PWM调光 THEDESIGNOFSMARTMULTIFUNCTIONALTABLELAMPBASEDONPWMAbstractWiththedevelopmentofelectronictechnology,peoplelivinginthelightingtoolisalsoundergoingtremendouschanges.Ordinarylamp,incandescent,LEDlights.Italsoreflectstheprogressanddevelopmentofhumansocietyandtechnology.Thecurrentdomesticindustrygraduallytowardsmulti-functionalintelligentdirection.Withthedeteriorationoftheenvironmenttoaskquestions,theenergyreduction.Greenenergy-savinglamp,gettingintopeople'slives.Previoususeofasinglelamp,andnowpeopleneedaversatileintelligentlamp.Sotakeadvantageoftheknowledgetodesignamulti-purposegreenlampisagooddirection.Thispaperdescribesthedesignofalamp-basedintelligentPWMdimming.ThemicrocontrollertechnologyandPWMdimmingtechnologycombinetoachieveastrongregulatorstationlights.Makeuseofsoftwaretochangethedutycycleandthustochangethesizeofthevoltagedimming.UsingDS1302clockchipandsingle-chipcombinationtogeneratetimecalendar.UsingDS18B20temperaturedetectionchiptodetecttheambienttemperature.CharacterLCDwitha1602chiptodisplaythetime,calendar,week,temperature,andlightintensitylamplevel.Makeuseofthebuzzerandthealarmclockchiptogeneratetiming.Sothatthelamphasanumberoffunctions.Articlesontheoveralldesignideaswerediscussed,analyzedthemainfunctionsofthesystemandthesystemhardwaredesignembodiedinblockdiagramform,carriedoutaprogramofselectionanddemonstrationprogram.Completedthehardwaredesign,describesthecompositionofeachmoduleofthecircuit,includingthesmallestsingle-chipsystems,liquidcrystaldisplaycircuit,clockcircuit,buzzercircuit,thetemperaturedetectioncircuit,lightingcircuits,analysisofthemainfunctionsofthechipusedinthecircuitworkseachpartofthecircuit.Thedesignofthehardwareandsoftwarethroughthedesignofeachmodule,andcanbasicallymeetthedesignrequirements,tomeetpeople'sdailyuseoflampfunction. Keywords:lamps;multi-function;single-chip;PWMdimming前言 随着人类社会的发展能源的消耗,人们和环境资源的矛盾变的越来越尖锐。全球气候变暖日益严峻。如何减少照明用电就作为一个重要的问题提到日程上来。因为照明用电占总能耗的20%.电子技术的发展,更加节能环保的LED的出现,让节能减排变成一种实际行动。LED比白炽灯节,荧光灯,节能灯还要节约更多的电力。并且环保无污染。能够根据亮度来调节灯光的亮度将会更加节能。但过去所有光源都很不容易实现调光,LED却能够轻易实现调光。有的时候人们需要照明时并不一定需要很亮的亮度,可是又无法去改变,反而浪费了能源。许多的场合都需要能够智能调光的光控系统。像路灯、家庭照明,办公室、商场、学校、工厂这些地方需要进行灯光的亮度的调光,可以预见调光技术的发展必将带来很大的节能减排的效应。而台灯作为家庭必备物品如果也能实现调光,采用LED照明技术,根据环境亮度来调节亮度,将会达到节能的效果。而且同时拥有闹钟功能,日历功能,温度检测功能,将会给人们的生活带来更大的便利。论文的主要原理和制作是根据所学的理论知识和在学习期间的电子电路制作过程中所积累的经验,从而进行创作。在查阅大量相关资料的前提下结合任务书以及老师提出的要求和需要达到的效果进行设计。首先利用Proteus软件进行电路图的设计,画出电路原理图。利用单片机编程软件用C语言进行编程。将调试好的源程序下载到Proteus软件单片机中进行仿真。经过一系列的调试仿真。最终达到任务书中的要求。在进行实物的焊接。在实物调试完成后在进行论文的整理,一切按照要求进行。本论文主要的方法就是利用计算机软件进行辅助设计,利用计算机编程软件进行软件设计。 1设计的总体要求及方案选择本次设计制作一基于PWM的智能多功能台灯的控制系统,能够通过STC89C52单片机编程实现台灯亮度的调节,并通过显示装置显示出时间,日期,星期,台灯亮度,并且能够进行闹钟定时,能够进行环境温度的检测。功能要求:台灯能够自动调整光强亮度,检测环境温度,显示日历等。硬件要求:整个系统的硬件部分包括单片机,键盘、显示和信号输出等。1.1调光技术的选择目前常见的调光技术主要有:1采用直流电源LED的调光技术。2采用脉宽调制(PWM)来调光。3用可控硅对LED调光[2]。按照常规技术的应用有以下三种方案可供选择。方案一:采用直流电源LED的调光技术如果需要要改变LED的亮度,实现起来相对来说比较容易。发光二极管具有单向导电性是由电流驱动的器件,因为LED的亮度是取决于通过它的电流,在一定范围内电流越大其亮度越亮,反之则越小。调节LED的亮度只需要调节电流大小,而LED工作电流很小通常需要串接限流电阻,所以当我们改变其限流检测电阻就能实现改变其电流大小从而改变LED的亮度。但是通常限流检测电阻阻值非常小,用一个很小阻值的电位器来调节电流,操作起来很难实现电流调节。所以一般不采用调节电阻大小来实现调节电流。因此为了实现电流调节,有些芯片提供一个控制电压接口,通过改变输入的控制电压就可以改变其输出恒流值。这样实现起来就比较容易。然而用调正向电流的方法来调亮度会产生一些问题,那就是在调亮度的同时也会改变它的光谱和色温。调电流会产生使恒流源无法工作的严重问题。长时间工作于低亮度有可能会使降压型恒流源效率降低温升增高而无法工作。调节正向电流无法得到精确调光。方案二:采用脉宽调制(PWM)来调光LED是一个发光二极管,它可以快速实现开关。这一特点是其他的发光器件所无法比拟的。因此,我们需要把供电源改成脉冲恒流源,改变电源脉冲宽度的方法,就可以改变其亮度[1]。种方法称为脉宽调制(PWM)调光法。假如脉冲的周期为tpwm,脉冲宽度为ton,那么其工作比D(或称为孔度比)就是 ton/tpwm.改变恒流源脉冲的工作比就可以改变LED的亮度。简而言之,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的[5]。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。脉宽调制调光的优点:1、不会产生任何色谱偏移。2、PWM调光具有极高的调光精确度。3、可以和数字控制技术相结合来进行控制。因为任何数字都可以很容易变换成为一个PWM信号。4、PWM调光能够通过软件的方式比较容易实现,使用范围广阔。方案三:可控硅调光普通的照明灯具通常采用可控硅来调光,例如白炽灯和卤素灯。因为他们基本是一个纯阻器件,以这样纯阻器件为照明工具的灯光系统对输入电压没有要求,输入电压是否是正弦波交流电对其没有任何影响。通过纯阻器件的电流和电压波形是完全一致的,所以不管电压波形如何偏离正弦波,所以改变输入纯阻器件电压的有效值,就可以调光。但是可控硅却不能对以LED为照明器件的照明系统进行调光。因为LED并不是一个纯阻性的器件。综述来说LED调光最好采用的技术是PWM调光。采用PWM调光时,可以运用微控系统,例如单片机,通过程序可以预先设置好灯光的亮度等级,然后通过调节等级就能实现对灯光的亮度的调节。PWM调光是可以直接应用于调光型台灯的[5]。因此最终选择PWM调光。1.2主要集成芯片的选择单片机是整个电路的控核心,因此单片机的选择对于整个电路来说是至关重要的。结合本论文的实际情况选择STC89C52单片机[15]。52单片机比51单片机内存大,可以串口下载程序,指令执行速度快。经济方便[18]。时钟芯片主要在DS12C887和DS1302之间进行选择。由于DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决了“千年”问题;DS12C887 中自带有锂电池,外部掉电时,其内部时间信息还能够保持10年之久;对于一天内的时间记录,有12小时制和24小时制两种模式。在12小时制模式中,用AM和PM区分上午和下午;但是DS12C887引脚比较多,从而造成硬件电路比较复杂,而DS1302也能够自动产生世纪、年、月、日、时、分、秒等时间信息,但是内部没有内部电源需要外接备用电源。和单片机相连的引脚只有三个,硬件电路比较简单。因此选择DS1302作为时钟芯片。显示芯片采用1602液晶显示芯片。可以显示字符,数字等,该液晶可显示两行,每行显示16个字符;且体积小、能耗低、操作简单;适合于本设计所需数字、英文字母以及特殊符号的显示要求。通过单片机控制1602液晶实现首行年、月、日、星期显示,第二行时、分、秒以及环境温度显示。温度检测芯片采用数字温度传感器DS18B20,该传感器具有微型化、低功耗、高性能等优点。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使其应用范围广阔,DS18B20可直接将温度转化成串行数字信号处理,测温范围为-55~125℃,最高分辨率可达0.0625℃。 2硬件系统电路设计2.1整体电路系统模块该多功能LED台灯系统采用20只5mm高亮白光LED灯珠为光源,以STC89C52单片机为主控芯片[15],由LED恒流驱动系统、时钟系统、测温系统、液晶显示系统、蜂鸣系统、按键系统、电源系统组成。系统结构框图如图2.1所示。该台灯系统可具体实现LED台灯的10级PWM调光控制;液晶屏实时显示时钟、日历与环境温度信息;闹钟功能采用声音报警方式,即一旦到达闹钟时间,LED台灯能够出蜂鸣声报警,以唤醒用户;用户则可以通过按键系统实现对时钟日历与闹钟参数的设置、LED亮度的调节以及闹钟报警的解除。DS130时钟系统  STC89C521602显示系统DS18B20测温系统按键系统Pt4115恒流驱动蜂鸣系统电源系统图2.1系统结构框图2.2单片机主控系统本设计主控系统采用高性能STC89C52芯片实现,其P0口外接10K的上拉电阻,P0.0~P0.7连接液晶1602的数据接口[17]。P2.6~P2.7则需要分别连接液晶1602的使能端EN、数据/命令选择端RS。P2.4作为蜂鸣器控制端。P3.0作为DS18B20的信号输入端。P3.1、P3.4、P3.5、P3.6与P3.7作为S2~S6按键系统。单片机的P1.1作为PWM信号的输出端并连接PT4115芯片DIM端,用于PWM调光控制[8]。系统晶振电路由12MHZ晶振与两个30PF电容组成;复位电路则由S1按键、1K电阻与20uF电解电容构成。单片机最小系统电路如图2.2所示。 图2.2单片机最小系统2.3恒流驱动系统本台灯设计LED光源采用相互并联方式,共由20只高亮度小功率LED组成;每只LED灯珠的压降约3.1V,工作电流约20mA.由白光LED的正向伏安特性可知,当LED端电压超过其正向导通电压后,较小的电压波动都会导致工作电流的的剧烈变化,从而影响LED的正常使用,固LED宜采用恒流驱动方式。因此,本设计LED采用高性能PT4115恒流芯片驱动。PT4115是一款连续电感电流导通模式的降压恒流源IC,能将直流电压直接转换成稳定的恒流输出[4]。该芯片适合用于绿色照明LED灯的驱动电路,能够驱动一颗或者多颗串并联的LED,且具有应用电路非常简洁的优点。根据不同的外部电压和器件PT4115可以驱动数十瓦的LED灯。PT4115采用抖频(FrequencyJitter)技术,能有效降低EMI。频率抖动技术是一种从分散谐波干扰能量着手解决EMI问题的新方法。频率抖动技术是指开关电源的工作频率并非固定不变,而是周期性地由窄带变为宽带的方式来降低EMI,以减小电磁干扰。当没有采用频率抖动技术时,各次谐波较窄而且离散,幅值在谐波频率较高处,EMI集中在峰尖。采用频率抖动技术时,谐波幅值降低并变得平滑,高次谐波接近连续响应,抑制EMI的效果十分显著。 PT4115输入电压范围为6V-30V,芯片被击穿的电压大于45V,最大的输出的电流为1.2A,其转换的效率较高,达到97%,PT4115恒流驱动芯片的输出的电流精度达±5%。该芯片具有过压、过流、LED断路保护等多种功能。其封装模式,有利于驱动电路的快速散热,从而对电路进行保护。PT4115的应用电路简洁,仅需四个元器件,DIM引脚的调光功能采用由高向低的调光方法,安全可靠。PWM和模拟电压均可控制调光。DIM内部有一个1MΩ的上拉电阻(Rup)接到内部5V电源。由于有些灯具需要实施过温保护,可在DIM端外加一个热敏电阻、NTC或温度二极管。DIM端的电压由Rup和NTC分压决定,利用模拟调光的原理以及温度对PN结电流的负反馈实现动态温度控制,可实现LED灯具的动态过温保护。PT4115内置功率开关,采用高端电流采样设置LED电流,并通过DIM引脚可以接受模拟调光和很宽范围的PWM调光[10]。PT4115在DIM管脚加PWM信号进行调光,DIM管脚电压低于0.3V关断LED电流,高于2.5V全部打开LED电流,PWM调光的频率范围从100Hz到20KHz以上。当高电平在0.5V到2.5V之间,也可以调光,当DIM的电压低于0.3伏时,功率开关关断,PT4115进入极低工作电流的待机状态。LED恒流驱动电路如图2.3所示  图2.3LED恒流驱动系统电路图PT4115恒流驱动输出的电流值计算公式为:  IOUT=(0.1×D)/Rs(D为方波信号占空比,Rs为限流电阻。) 由于本设计LED光源采用20只小功率白光LED灯珠并联方式,且每只LED灯珠额定电流为20mA,则PT4115恒流驱动输出最大电流IOUT应为400mA,因此Rs选取0.25欧电阻。L1为镇流电感,选取68μH,用于稳定通过LED的电流。D1是续流二极管,当芯片内部MOS管截止状态时为储存在电感L1中的电流提供放电回路;由于工作在高频状态,D1选用正向压降小且恢复速度快的肖特基二极管SS24。PWM脉冲调光信号由单片机P1.1产生,单片机P1.1口的输出的高电平和低电平决定LED是否通断。将定时器T0溢出中断定为1/2500秒(即400μS),每10个脉冲信号作为一个周期,即频率为250HZ.这样,在每1/250秒的周期中,通过改变方波的高低电平的个数,即改变占空比从而实现LED灯的10级亮度调节,即LED亮度等级是由每个周期内的高电平脉冲的数目所决定的。当高电平脉冲个数为1时,占空比为1/10,亮度最低,当在一个周期中10个脉冲全为高电平时,占空比为1,LED亮度最高。其调光原理如图2.4所示;  图2.4PWM调光原理图2.4时钟系统时钟系统采用DS1302时钟芯片。此芯片通过程序的读写提供年月日,时间,星期,达到显示时间日历的目的。此芯片引脚,X1,X2接32.768KHZ的晶振。VCC1接备用电源以保证系统电源断电时,能够正常的进行计时。VCC2接主电源。DS1302的工作电压在3.5V到5.5V之间。复位引脚RST接单片机的P1.5引脚,时钟引脚SCLK接单片机的P1.6引脚,I/O接口接单片机的P1.7引脚[9]。时钟系统和单片机系统连接图如图2.5。 图2.5时钟系统电路图2.5液晶显示系统液晶显示器在我们平时的生活中运用的地方非常多,像最简单的计算器,电子表,数字万用表等等。液晶显示能够显示数字特殊符号和图形。而其他的显示有:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,这些显示所使用的软件都比较简单,但是硬件电路比较复杂,从而使硬件电路的设计变得更加复杂,同时也会产生一些其他诸如成本,设计思路等方面的问题。相比较而言液晶显示成本低运用广,且硬件电路相对比较简单,所以本次设计的显示模块选择使用LCD液晶显示器[11]。显示系统采用1602字符型液晶。该液晶可显示两行,每行显示16个字符;且体积小、能耗低、操作简单;适合于本设计所需数字、英文字母以及特殊符号的显示要求。通过单片机控制1602液晶实现首行年、月、日、星期显示,第二行时、分、秒以及环境温度显示。液晶显示的优点: (1)显示质量好,可视面积大。液晶显示器每一个点在收到信号后会一直保持色彩和亮度,恒定发光,而不需要像阴极射线管显示器(CRT)那样需要不断刷新亮点。因此,液晶显示器画质高且不会闪烁。 (2)数字式接口。液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,不需要把数字信号转化为模拟信号在进行输出,操作更加方便。 (3)体积小、重量轻。液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,所以在实际电路的焊接中能够更好的进行电路的排版焊接,简化了在硬件电路中设计的工作量。 (4)功耗低。相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。因此该硬件系统的显示电路采用LCD1602液晶显示,可以显示时间、日历,星期,灯光亮度和温度等。用单片机一组I/O口作为数据口向LCD1602发送数据信息。从而实现所需功能。液晶显示器各种图形的显示原理: (1)线段的显示 点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行有16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,…(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。 (2)字符的显示 用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。 (3)汉字的显示  汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5…右边为2、4、6…根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节…直到32B显示完LCD就可以得到一个完整的汉字。本系统1602液晶采用并行操作方式,P0.0~P0.7通过借助10K的上拉电阻连接其数据端口DB0~DB7,这样就能保证单片机和液晶显示1602之间进行数据通信,进行数据读写[14]。由于各自片选信号不同,选中时操作对应芯片将不会造成操作冲突。P2.5连接1602液晶的使能端E,P2.7连接1602液晶的数据/命令选择端RS,液晶显示1602的数据读写RW接地。第3引脚为液晶显示对比度调节端,通过10K滑动变阻器接地,用于调节液晶的显示亮度。第15管脚背光源正极BLA通过10欧电阻接地,第16管脚背光源负极BLK接地。该液晶接口电路如图2.6所示。    图2.6液晶系统电路图2.6温度检测系统  系统的温度检测选用DALLAS公司“一线总线”数字温度传感器DS18B20,该传感器具有微型化、低功耗、高性能等优点,可直接将温度转化成串行数字信号处理,测温范围为-55-125℃,最高分辨率可达0.0625℃[3]。DS18B20共有三个引脚电源正VCC、电源负GND和信号输入输出口DQ.R3为4.7K的上拉电阻,用于保证单片机与DS18B20 通讯时高低电平准确的被单片机机和DS18B20识别[6]。单片机P3.0口通过R3连接DQ端口实现温度数据的采集处理,并通过液晶屏实时显示。温度检测电路如图2.7所示。  图2.7温度检测电路图DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。在使用DS18B20温度传感器并且需要进行编程来实现其温度测试的功能时,必须知道DS18B20内部储器。明白他是怎么样工作的。这样才能进行编程。DS18B20共有2种形态的存储器资源,它们分别是:  (1)ROM 只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20共64位ROM。  (2)RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1,2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。 由于DS18B20温度检测传感器使用范围比较广,电路设计和软件编程都比较成熟。所以本电路系统采用DS18B20温度检测传感器不管是从硬件电路设计还是软件编程方面都具有很好的优势,能够起到简化电路设计节约成本的作用。2.7蜂鸣系统  蜂鸣系统用于产生闹钟报警声以及按键提示音。由单片机P2.4口控制PNP三极管9012的通断实现对蜂鸣器声音控制;通过延迟函数实现蜂鸣报警声的长短音控制,长音‘滴’用于闹钟铃声,短音‘滴’用于按键提示音。蜂鸣系统电路如图2.8所示。    图2.8蜂鸣系统电路图2.8按键系统按键控制系统由S2~S6五个按键组成,分别为S2时间设置键、S3数值增大键、S4数值减小键、S5闹钟设置键以及S6亮度调节键。S2用于选择需要调整的时间日历以及闹钟参数,并作为时间日历参数的存储确认键。S3与S4用于调整被选参数值的大小。S5用于闹钟查看与存储确认键。S6用于LED灯光10级亮度的调节键。按键系统电路如图2.9所示。图2.9按键系统电路图 2.9电源系统本系统设计最大功率约1.6W,可采用电池或稳压电源多种方式供电。由于系统光源采用20只LED灯珠并联组成,所以LED恒流驱动芯片PT4115供电电源在6~30V电压范围内均可使LED灯正常使用。但单片机供电需要恒压供电。系统采用三端稳压芯片7805,来稳定给单片机供电的电源。该线性稳压芯片正常工作输入电压与输出电压差值应至少高于2V,若差值过大会增加额外功耗。因此,本系统宜选用稳压电源方式供电。同时,本文LED恒流驱动系统设计简洁灵活,可根据用户需求适当调整驱动电路参数,即可扩展LED照明功率,最大可至10W左右。集成直流稳压电源的要求是比较基本的设计,设计要求电源输出5V直流电压。设计中包括电源变压器、整流电路、滤波电路、稳压电路四个部分。通过四部分的组合将220V交流电压转变为设计要求直流电压。由于稳压电路发生波动、负载和温度发生变化,滤波电路输出的直流电压会随着变化。因此,需要维持电源输出的电压稳定不变,需要加一级稳压电路。系统中稳压电路的作用是当外界因素(电网电压、负载、环境温度)等发生变化时,使输出的直流电压不受外界因素的影响,从而维持稳定的电压输出。保护各个芯片的正常工作。稳压电路一般采用集成稳压器和一些外围元件组成。采用集成稳压器设计的电源具有很好稳定性能、电路结构比较简单等优点。从而保证稳定给各个芯片供电,并提供整个系统的供电。图2.10直流稳压电源 3系统软件设计  该系统控制程序主要包含系统初始化程序、实时时钟芯片处理程序、温度传感器芯片处理程序、液晶显示程序、键盘检测与处理程序、闹钟中断以及定时器产生PWM程序构成。3.1系统主程序系统主程序主要包括系统初始化程序(包括I/O口初始化、DS1302时钟芯片初始化、液晶1602的初始化、外部中断0与定时器T0设置)、按键检测和处理程序、时钟数据的读取与处理程序、温度数据的读取与处理程序、液晶显示程序、闹钟报警的判断和处理程序、PWM调光处理程序等。程序中设置闹钟标志位Flag_ri,一旦闹钟时间到达,时钟芯片IRQ引脚触发外部中断0,进入中断程序则置Flag_ri=1,用于主程序中闹钟报警的判断与处理。系统主程序流程图如图3.1所示。图3.1主程序流程图 3.2按键检测和处理程序  按键控制系统由S2~S6五个按键组成,分别为S2时间设置键、S3数值增大键、S4数值减小键、S5闹钟设置键以及S6亮度调节键。S2用于选择需要调整的时钟以及闹钟参数,根据S2按下次数,依次选择秒、分、时、星期、日、月、年,液晶屏上被选参数下方以光标闪烁状态提示,再通过按下S3或S4调整被选参数值的大小,S2按下累积8次时,则退出选择功能并保存当前数据至时钟芯片。S5用于闹钟时间的查看与设置;首次按下S5,1602液晶屏第二行显示已设置的闹钟时间;可通过S2、S3与S4重新设置闹钟时间;再次按下,则退出闹钟查看功能并保存当前设置的闹钟参数至时钟芯片。同时,S3与S4还可独立作为闹钟产生时的取消键与LED灯光的关闭键。S6实现LED灯光亮度的10级调节,每按一次,LED亮度增大一级;当达到亮度最大时,再次按下则关闭LED灯光。每次有按键按下,蜂鸣器都以短‘滴’声提示。按键检测与处理流程图如图3.2所示。  图3.2按键检测与处理流程图 3.3外部中断程序  系统到达设置的闹钟时间,DS1302时钟芯片SCLK引脚输出由高电平变为低电平,作为单片机P3.2口INT0中断的申请输入,并可通过读取DS1302芯片的C寄存器来清除SCLK引脚输出。因此,将外部中断INT0设置为负跳变沿触发中断,并设置闹钟标志位Flag_ri,闹钟时刻到达时设置Flag_ri=1,用于主程序中的闹钟报警处理。闹钟中断程序如图3.3所示。   图3.3外部中断流程图3.4定时器中断程序  为产生调节LED灯光亮度的PWM信号,定时器T0设置为工作方式0,即13位计数器定时,最多装载数值为8192个。因为系统晶振采用12MHz,赋值使TH0=(8192-400)/32与TL0=(8192-400)%32,即可实现400μS的定时中断。10次中断(即4mS)作为一个周期,通过调节每个周期内单片机P1.1(该控制口名称定义为LED_PWM)输出的占空比来产生PWM脉冲信号,以控制PT4115恒流驱动芯片实现LED灯的10级亮度调节。程序设置对T0中断次数(即定义为T0_num)进行计数,以便判断一个周期到否;同时判断比较高电平脉冲个数(即定义为scale值,由调光键S6按下次数设置)用于实现不同亮度等级的调节。在定时器T0中断服务程序中,首先T0重新装入定时为400μS的初值;定时器中断次数T0_num加1,判断一个方波周期到否,若到达,令T0_num归零,并将P1.1口输出电平置高(即LED_PWM=1);如果一个方波周期还没到,则与亮度等级scale 值作比较,判断高电平脉冲个数scale到否,若到达,令P1.1口输出电平置低(即LED_PWM=0),否则继续保持P1.1口输出高电平(即LED_PWM=1);而后中断返回,等待下一次定时中断。  这样,P1.1口就产生了所需的PWM调光信号。定时器生成PWM流程图如图3.4所示。  图3.4定时器生成PWM流程图3.5C语言程序编写和ISP软件程序下载C语言是国际社会广泛流行的计算机高级语言。语言简洁,紧凑,使用方便灵活,是完全模块化和结构化的语言,语法设计不太严格,程序设计自由度大,用C语言编写的程序可移植性好。C语言的这些特点和电路的设计比较吻合。全局性和局部性,模块化可以简便编程过程。因此选择C 语言进行程序设计,要比汇编语言好。在程序编写的过程中需要做到认真仔细,程序的编写是个比较大的一个工程。在这个过程中会遇到许多的问题,需要一一解决。程序编写也是论文设计过程中最重要的一个环节,因为硬件和软件是不可能脱离的。两者都能成功并且结合到一起才能实现论文的要求。SP(In-SystemProgramming)是当今流行的单片机编程模式。可在线系统编程的意思是指电路板上的可编程下载的空白元器件可以直接编程写入最终用户代码,而不需要从电路板上取下可重复编程逻辑器件[7]。已经编程的器件也可以用ISP方式擦除或再编程。在完成编写程序的编译通过之后,把可以烧写STC89C52的ISP编程器并与电脑主机硬件连接后,打开相应下载软件按步骤即可对STC89C52芯片进行程序烧录下载。烧录完成成功后会有提示。重新通电即可测试和运行电路。 4软件的调试和仿真当完成电路图的设计和程序的编写,我们的实验并不能马上进行实物焊接,还需要进行最重要的一步那就是实验的仿真,只有通过仿真才能先发现问题和不足,有利于改正错误,改进实验。从而达到比较好的一种实验要求和实验效果。所选用的Proteus仿真软件不仅能进行单片机电路的设计也能进行单片机的仿真。Proteus仿真软件功能强大能满足多数任务的要求,将编写好的C语言程序下载到软件当中。调试好电路图就可以进行仿真。在仿真的过程中并不会一次性的就能够取得成功。需要在不断的调试过程中去改进。从而达到实验要求。控制电路的安装与测试在整个系统研制中占有重要位置,它是把理论付诸实践的过程,也是把纸面电路设计转变为实际产品的必经阶段。Proteus仿真如图4.1图4.1电路仿真图由此仿真图可以看到电路设计满足设计要求。能够显示温度,时间,日期,灯光亮度能够进行闹钟定时,能够形成PWM脉宽调制波形进行台灯亮度调节。此仿真结果说明电路和程序是可行的。 5硬件的组装与调试5.1元器件的选择与测量本次设计的元器件主要有:电阻、电容、PNP9012型三极管、STC89C52单片机、蜂鸣器,DS18B20温度检测芯片.DS1302时钟芯片,1602液晶显示芯片,PT4115恒流驱动芯片[13]。这些元器件的引脚需要我们认真查找资料,了解每个器件的特性去进行焊接。其中,这些元器件直接根据型号到电子元器件市场就很容易买到。但电阻我们要测量出它的真实值是否准确,这用万用表直接测量就行,也可以根据色环来读数。电容上面直接就标着数示,二极管和三极管需要我们正负极性。三极管需要我们判断出它的基极、集电极、发射极。5.2电子元器件的焊接与组装组装电路通常采用焊接和在面包板上插接两种方法,无论采用哪种方法均应注意以下几方面。(1)所有元器件在组装前应尽可能全部测试一遍,以保证所用元器件均合格。(2)所有集成电路的组装方向要保持一致,以便于正确进行焊接合理安排布线。(3)分立元件时应仔细辨明器件的正反向,标志应处于比较容易观察的位置方便检查和调试。对于有正负极性的元件,例如电解电容器、晶体二极管等,组装时一定要特别注意极性,否则将会造成实验失败。(4)为了便于焊接查线以及后期的检查电路,可根据电路中接线的不同作用选择不同颜色的导线。一般习惯是正电源用红色线、负电源用蓝色线、地线用黑色线、信号线用黄色线等。(5)在实际焊接中连线需要尽量做到排版简洁连线方便。连线不跨接集成电路芯片上,必须从其周围通过。同时应尽可能做到连线不相互穿插重叠、尽量不从电路中元器件上方通过。(6)为使电路能够正常工作与调测,所有地线必须连接在一起,形成一个公共参考点。 正确的组装方法和合理的布局,不仅可使电路整齐美观、工作可靠,而且便于检查、调试和排除故障。如果能在组装前先拟订出组装草图,则可获得事半功倍之效果,使组装既快又好。5.3电子电路的调试调试是指系统的调整、改进与测试。测试是在电路组装后对电路的参数与工作状态进行测量,调整则是在测试的基础上对电路的某些参数进行修正,使满足设计要求。在进行调试前应拟订出测试项目、测试步骤、调试方法和所用仪器等,做到心中有数,保证调试工作圆满完成。5.3.1调试方法调试方法原则有两种。第一种是边安装边调试的方法。它是把复杂的电路按原理框图上的功能分成单元进行安装和调试,在单元调试的基础上逐步扩大安装和调试的范围,最后完成整机调试。这种方法在新设计的电路中比较常用。第二种方法是在整个电路系统全部焊接完毕后,实行一次性调试。这种方法比较适用于电路相对来说比较简单,系统不复杂的电路调试。5.3.2调试步骤(1)通电前检查电路焊接完毕后,不要急于通电,首先要根据原理电路认真对照检查电路中的接接线是否正确,包括错线(连线一端正确、另一端错误),少线(安装时漏掉的线),多线(连线的两端在电路图上都是不存在的)和短路(特别是间距很小的引脚及焊点间),并且还要检查每个元件引脚的使用端数是否与图纸相符。查线时最好用指针式万用表“Ω×1”档进行检查,或是用数字万用表“Ω”档的蜂鸣器来测量,而且要尽可能直接测量元器件引脚,这样同时可以发现接触不良的地方。(2)通电观察 在电路安装没有错误的情况下接通电源(先关断电源开关,待接通电源连线之后再打开电路的电源开关)。但接通电源后不要立即进行电路功能的测试,首先要充观察整个电路有无异常现象,电路中元器件是否有发热烧坏等现象,是否有漏电现象,电源是否有短路和开路现象等。如果电路在测试过程中出现异常,首先应该立即关闭电源,检查后排除故障再重新通电测试。然后再按要求测量各元器件引脚电源的电压,而不只是测量各路总电源电压,以保证元器件正常工作。(3)单元电路调试在调试单元电路时应明确本部分的调试要求。调试顺序应按照电路原理图中信号流向进行,这样可以把整个电路进行分步调试,把前面调试好的电路的输出信号作为后一级电路的输入信号。从而保证电路的调试更加顺利方便。单元调试包括静态和动态调试。静态调试一般是指在没有外加信号的条件下测试电路各点的电位,特别是有源器件的静态工作点。通过它可以及时发现已经损坏和处于临界状态的元器件。动态调试是用前级的输出信号或自身的信号测试单元的各种指标是否符合设计要求,包括信号幅值、波形形状、相位关系、放大倍数和频率等。对于信号产生电路一般只看动态指标。把静态和动态测试的结果与设计的指标加以比较,经深入分析后对电路与参数提出合理的修正。在调试过程中应有详尽记录。(4)整机联调各单元电路调试好以后,并不见得由它们组成的整体电路性能一定会好,因此还要进行整体电路调试。整体电路调试主要是观察和测量动态性能,把测量的结果与设计指标逐一对比,找出问题及解决办法,然后对电路及其参数进行修正,直到全部电路的性能完全符合设计要求为止。单片机是本设计的核心控制器,只有保证单片机的正常工作才能完成程序的运行才能对显示电路、PWM调光电路,测温电路,蜂鸣器电路的控制。保证单片机最小系统能够正常工作是前提。判断办法就是用万用表测量单片机时钟引脚(18、19脚)的对地电压,以正常工作的单片机用数字万用表测量为例:18脚对地约2.24V,19脚对地约2.09V。对于怀疑是复位电路故障而不能正常工作的单片机也可以采用模拟复位的方法来判断,单片机正常工作时第9脚对地电压为零,可以用导线短时间和+5V连接一下,模拟一下上电复位,如果单片机能正常工作了,说明这个复位电路有问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件上出现的问题。或者在软件测试过程中采用模块化的测试方法,使整个系统测试显得更加有条理性。通过RS232和PC机进行连接,利用PC测试助手进行测试。测试过程中把单片机和PC 机的波特率设置为相同值(如9600bit/s)。验证上位机和下位机接收正常。我们把测好的软件导入连接好的硬件中,在把所出现的问题都调整解决过来,因而整个系统就测试通过。在焊接好电路板进行测试的时候。我们的实验电路不能输出正常的信号。于是我们按照正常的检查步骤进行检查,首先检查线路是否有问题,当检查过后我们发现线路没有问题。于是检查是否是焊接的问题,焊接也没有问题,最后检查元器件在焊接过程中是否损坏。在数字实验室我们对所有使用的元器件进行检查一步一步测试。发现元器件没有任何问题,能够正常的表现逻辑功能。但是最后的功能还是不能够实现,这就是说明了我设计的电路还是有问题的,由于自己焊接的电路,或许是自己的思维模式已经定格了。不能够检查到问题的存在。最后让焊接的电路板让同学帮忙检查。在同学的检查下还是不能发现问题的所在。电路设计和连接都是没有问题的。可是问题出现在哪个部分呢。最后同学发现我的单片机最小系统的晶振电路有问题,晶振电路的两个30PF的电容出现饿了问题。原来我自己在焊接的过程中把电容用错了。本来是该用30PF的电容但是我用成0.01UF的电容了,最后导致了电路功能不能实现。当我把电路中焊接错误的电容换掉以后通过不断的调试最后电路能正常表达。实现功能要求。可以看到在电子电路焊接的过程中,是不允许有一点粗心大意的,否则一个小小的电容也能导致整个实验的失败。 总结毕业设计是学生即将完成学业的最后一个重要环节,它既是对学校所学知识的全面总结和综合应用,又为今后走向社会的实际操作应用铸就了一个良好的开端。所以我们在此有必要对这次的毕业设计作一个系统的总结。做毕业设计,这对于自己来说是一个全新的学习内容。也是一个非常大的挑战。在这次的毕业设计中,自己学到了许多知识。不仅温习了理论知识并使其有了很大的升华,而且也锻炼了自己的动手能力和综合问题的分析能力,自己也成长了许多,这将为自己今后的工作积累很多宝贵的经验。当老师把课题布置下来之后,认真的查阅许多资料。认真了解课程设计的一切相关知识。本次毕业设计论文首先对整个系统的工作原理和实现方法进行了简单的介绍,给出了系统工作的整体原理框图。在此基础上,介绍了系统设计用到的各个模块的功能特性,并进性了方案论证,最后选择出了最优的设计方案。我在理论上对整个系统有一定了解的情况下,进行了系统模块的电路的设计,充分利用我所学过的模电、数电、单片机、C语言、传感器与检测技术等知识。在本次设计的过程中自己遇到了很多困难。过去几年所学知识有所生疏,首先把模电、数电、单片机、C语言、传感器与检测技术的教材从头到尾又认真地看了一遍。然后我去学校的图书馆和电子阅览室查阅关于本次毕业设计的资料,自己还不断地向老师、同学请教,以确保设计的电路系统完整,并能实现最完美的系统功能。用本次毕业设计来验证书本中所学习的内容,不仅能够让我们巩固以前所学习的知识,更能学习到许多课本以外的知识。论文设计需要综合考虑每种电路的优缺点,以及整体电路的需求。而关于电子元器件的选择我们更是查阅了许多资料。材料的选择参数的计算很重要,这直接关系到本次实验能否获得成功。对于电路的仿真实验,我做了许多摸索,仿真软件自己在以前接触的比较少,用的也不是很熟悉。经过一段时间的练习能够基本操作仿真软件了。并对Proteus仿真软件有了进一步的了解。 最后我设计出了各个部分模块的电路图,并实现了电路图的组合。经过不断地测试和调试,以及与指导老师和同学的沟通与交流,最终完善了硬件电路的设计,我所设计的电路在Proteus仿真软件上仿真成功。本次毕业设计经历了设计阶段、开发实现阶段以及最后的应用测试阶段。经过2个月的努力,核心问题已经全部解决,所有功能均已基本实现,能够显示日期,时间,星期,温度,灯光亮度,能够进行调光,进行闹钟定时。并基本上能够实现本次毕业设计的设计要求。 致谢在毕业设计论文即将完成之际,我首先向关心、帮助、指导我的导师曹卫锋教授,郑安平教授表示衷心的感谢并致以崇高的敬意!在这四年的大学生活中,自己学到了很多知识,动手、动脑能力以及综合问题的分析能力有了很大提高。这除了自己的努力外,还与电气工程学院辅导员和自动化办公室的各位老师的辛勤帮助、热心鼓舞、积极开导是分不开的。谨向各位老师们致以衷心的感谢和崇高的敬意!本课题在选题及设计过程中一直得到曹老师和郑老师给我的指导。当我在设计中遇到困难时我就及时向曹卫锋老师和郑安平老师询问。老师们以其渊博的学识、务实的工作作风和他们饱满的工作热情以及对我的耐心指导和严格要求给我留下了深刻的印象,使我的综合能力得到了很大提高。老师们待人诚恳,以及勤奋不辍的精神将使我终生受益,是我终生学习的榜样,在此向他们致以最诚挚的谢意。在此,还要感谢和我在一起设计讨论的同学,正是由他们的的帮助,我才能顺利完成毕业设计。感谢你们给予我的帮助并且对于我遇到的每个问题你们都给予热心、耐心的解答,使我受益匪浅。最后,我要向在百忙之中抽时间对本文进行审阅、评议的老师表示衷心的感谢! 参考文献[1]颜重光.LED灯具低压驱动技术[J].电子设计应用,2008.61页[2]徐延凤.浅谈LED室内照明光引擎及其调光方式[J].上海照明科技及应用趋势论坛,2012[3]朱丽丽.基于AVR单片机与温度传感器DS18B20的多点温度测量[J].电工电气,2010[4]颜重光.LED灯具低压驱动技术[J].电子质量,2009[5]郑永义.量像频移脉宽调制(F-PWM)调光[J].上海节能,2012[6]易丽华.基于AT89C51单片机与DS18B20的温度测量系统[J].电子与封装,2009[7]丁明亮,唐前.51单片机应用设计与仿真--基于KeilC与Proteus.北京:北京航空航天大学出版社,2009年[8]李华主编.MCS251系列单片机实用接口技术[M].北京:北京航天航空大学,2003年.19~37[9]袁新燕.关于“单片机原理与应用”教学的讨论[J].电脑开发与应用,1997,10(4):56~59 [10]程安宁,王晋.电子设计工程.白光LED的PWM驱动方式分析,2010(2)109-111页 [11]赵亮.液晶显示模块LCD1602应用[J].电子制作,2007,17(3):121[12]赵国强,智能台灯,科学启蒙,2007,第Z1期[13]黄继昌.电子元器件应用手册,北京:北京人民邮电出版社,2004[14]李朝青.单片机原理及接口技术(第三版).北京:北京航空航天大学出版社,2005[15]位永辉;杨威,基于BISS0001的智能台灯设计,电子元器件应用,2010,第7期[16]周航慈.单片机应用程序设计技术[M].北京:北京航空航天大学出版社,2011[17]张毅刚.MCS-51单片机应用设计[M].哈尔滨:哈尔滨工业大学出版社,2007[18]AT89C51DATASHEEPPhilipsSemiconductors1999.dec[19]王水平.PWM控制与驱动器使用指南及应用电路[M].西安:西安电子科技大学出版[20]Yang.Y.,Yi.J.,Woo,Y.Y.,andKim.B.:‘OptimumdesignforlinearityandefficiencyofmicrowaveDohertyamplifierusinganewloadmatchingtechnique’,Microw.J.,2001,44,(12),pp.20–36[21]Vizimuller,P.‘RFdesignguide-systems,circuits,andequations’(ArtechHouse,Boston,MA,1995)[22]R.Dye,“VisualObject-OrientatedProgramming,”Dr.DobbsMacintoshJournal,Sept.1st(1991). 附录1电路实物图 附录2电路原理总图 附录3电路程序清单#include#include//_nop_();延时函数用#defineuintunsignedint#defineucharunsignedcharucharhour_set=17,min_set=1;//设定的蜂鸣器提示时间bitalarmflag=1;//报警标志位ucharTHTIME0=(8192-400)/32;ucharTLTIME0=(8192-400)%32;//规定初始PWM高电平时间ucharset_pwmtime=5;//设定的PWM占空比ucharpwmtime;//当前的PWM的定时器值/****************************************************************//*延时程序/****************************************************************/voiddelayms(unsignedintms){unsignedintx;for(;ms;ms--)//ms=0则跳出for(x=1000;x;x--);}#include"intrins.h"//_nop_();延时函数用//*****************////以下是DS18B20驱动程序//*****************///****************************************************功能描述:DS18B20驱动程序,使用12M晶体**DQ占用引脚资源P1^7****************************************************/sbitDQ=P3^0;//温度输入口unsignedchardatatemper_data[2]={0x00,0x00};//读出温度暂放unsignedchardata_1820display[9]={0x00};//显示单元数据,共4个数据和一个运算暂用unsignedinttemper; //**************温度小数部分用查表法***********//unsignedcharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};/*****************11us延时函数*************************///void_18B20_delay(unsignedintt){for(;t>0;t--);}/****************DS18B20复位函数************************/_18B20_reset(void){charpresence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();//从高拉倒低DQ=0;_18B20_delay(50);//550usDQ=1;_18B20_delay(6);//66uspresence=DQ;//presence=0复位成功,继续下一步}_18B20_delay(45);//延时500uspresence=~DQ;}DQ=1;//拉高电平}/****************DS18B20写命令函数************************///向1-WIRE总线上写1个字节 void_18B20_write(unsignedcharval){unsignedchari;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();//从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_();//5usDQ=val&0x01;//最低位移出_18B20_delay(6);//66usval=val/2;//右移1位}DQ=1;_18B20_delay(1);}/****************DS18B20读1字节函数************************///从总线上取1个字节unsignedchar_18B20read_byte(void){unsignedchari;unsignedcharvalue=0;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();//从高拉倒低value>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_();//4usDQ=1;_nop_();_nop_();_nop_();_nop_();//4usif(DQ)value|=0x80;_18B20_delay(6);//66us}DQ=1;return(value);}_18B20_read()//读出温度函数 {_18B20_reset();//总线复位_18B20_delay(200);_18B20_write(0xcc);//发命令_18B20_write(0x44);//发转换命令_18B20_reset();_18B20_delay(1);_18B20_write(0xcc);//发命令_18B20_write(0xbe);temper_data[0]=_18B20read_byte();//读温度值的低字节temper_data[1]=_18B20read_byte();//读温度值的高字节temper=temper_data[1];temper<<=8;temper=temper|temper_data[0];//两字节合成一个整型变量。returntemper;//返回温度值}/****************温度数据处理函数************************///二进制高字节的低半字节和低字节的高半字节组成一字节,这个//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩//下的低字节的低半字节转化成十进制后,就是温度值的小数部分/********************************************************/_18B20_work(unsignedinttem){unsignedcharn=0;if(tem>6348)//温度值正负判断{tem=65536-tem;n=1;}//负温度求补码,标志位置1_1820display[4]=tem&0x0f;//取小数部分的值_1820display[0]=ditab[_1820display[4]];//存入小数部分显示值_1820display[4]=tem>>4;//取中间八位,即整数部分的值_1820display[3]=_1820display[4]/100;//取百位数据暂存_1820display[1]=_1820display[4]%100;//取后两位数据暂存_1820display[2]=_1820display[1]/10;//取十位数据暂存 _1820display[1]=_1820display[1]%10;/******************数码管符号位显示判断**************************/if(!_1820display[3]){_1820display[3]=''-'0';//最高位为0时不显示if(!_1820display[2])_1820display[2]=''-'0';//次高位为0时不显示}if(n)_1820display[3]='-'-'0';//负温度时最高位显示"-"}_18B20_init()//18B20初始化{_18B20_reset();//开机先转换一次_18B20_write(0xcc);//SkipROM_18B20_write(0x44);//发转换命令}//*****************////以下是LCM1602驱动程序//*****************///****************************************************功能描述:1602驱动程序,使用12M晶体**占用引脚资源数据口八位,命令控制两位****************************************************/sbitLCD_RS=P2^7;sbitLCD_E=P2^6;#defineLCD_DATAP0/****************************************************函数名称:delay**入口参数:h(unsignedint型)**出口参数:无**功能描述:短暂延时,使用11.0592晶体,约0.01MS****************************************************/voiddelay(unsignedintz)//1毫秒延时子函数{unsignedintx,y;for(x=z;x>0;x--) for(y=110;y>0;y--);}/****************************************************函数名称:WriteDataLcd**入口参数:wdata(unsignedchar型)**出口参数:无**功能描述:写数据到LCD****************************************************/voidWriteDataLcd(unsignedcharwdata){LCD_RS=1;LCD_DATA=wdata;delay(1);//短暂延时,代替检测忙状态LCD_E=1;delay(1);//短暂延时,代替检测忙状态LCD_E=0;}/****************************************************函数名称:WriteCommandLcd**入口参数:wdata(unsignedchar型)**出口参数:无**功能描述:写命令到LCD****************************************************/voidWriteCommandLcd(unsignedcharwdata){LCD_RS=0;LCD_DATA=wdata;delay(1);//短暂延时,代替检测忙状态LCD_E=1;delay(1);//短暂延时,代替检测忙状态LCD_E=0;}ucharcodehanzi[4][8]=//中文汉字库{0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,//日0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,//月 0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//年};voidwriteCG()//允许写入中文汉字{ucharx,y;WriteCommandLcd(0x40);for(y=0;y<3;y++){for(x=0;x<8;x++){WriteDataLcd(hanzi[y][x]);}}}//LCD初始化voidlcd_init(void){LCD_E=0;writeCG();//允许写入中文汉字WriteCommandLcd(0x38);WriteCommandLcd(0x38);//显示模式设置WriteCommandLcd(0x0c);//光标无WriteCommandLcd(0x06);//显示光标移动设置WriteCommandLcd(0x01);//显示清屏WriteCommandLcd(0x90);//显示开及光标移动设置}/****************************************************函数名称:display_xy**入口参数:x(unsignedchar型),y(unsignedchar型)**出口参数:无**功能描述:设置光标位置,x是列号,y是行号****************************************************/voiddisplay_xy(unsignedcharx,unsignedchary){if(y==1)x+=0x40;x+=0x80; WriteCommandLcd(x);}/**********************************************************************函数名称:display_char**入口参数:x(unsignedchar型),y(unsignedchar型),dat(unsignedchar型)**出口参数:无**功能描述:在具体位置显示单个字符,x是列号,y是行号/*********************************************************************/voiddisplay_char(unsignedcharx,unsignedchary,unsignedchardat){display_xy(x,y);WriteDataLcd(dat);}/***********************************************************************函数名称:display_string**入口参数:x(unsignedchar型),y(unsignedchar型),s(指针型)**出口参数:无**功能描述:在具体位置显示字符串,以/0结束,x是列号,y是行号**********************************************************************/voiddisplay_string(unsignedcharx,unsignedchary,unsignedchar*s){display_xy(x,y);while(*s){WriteDataLcd(*s);s++;}}#defineDS1302_SECOND0x80//时钟芯片的寄存器位置,存放时间#defineDS1302_MINUTE0x82#defineDS1302_HOUR0x84#defineDS1302_WEEK0x8A#defineDS1302_DAY0x86#defineDS1302_MONTH0x88#defineDS1302_YEAR0x8C#defineDS1302_YEARH0xC0#defineDS1302_WRITE0x8E #defineBCD2DEC(X)(((X&0x70)>>4)*10+(X&0x0F))//用于将BCD码转成十进制的宏#defineDEC2BCD(X)((X/10)<<4|(X%10))//用于将十进制转成BCD码的宏#defineBD(t)(t=t%16+t/16*10)//BCD码转十进制#defineDB(t)(t=t%10+t/10*16)//十进制转BCD码sbitACC0=ACC^0;sbitACC7=ACC^7;sbitDS1302_CLK=P1^6;//实时时钟时钟线引脚sbitDS1302_IO=P1^7;//实时时钟数据线引脚sbitDS1302_RST=P1^5;//实时时钟复位线引脚sbitUp=P3^4;//加法按钮!sbitDown=P3^5;//减法按钮sbitSet=P3^1;//模式切换键sbitout=P3^3;//立刻跳出调整模式按钮chardone,count,temp,up_flag,down_flag,hideflag=10,week_value[2];//done:1:进入调整模式,0:正常模式//count切换闪烁位(位置变量)//temp:闪烁位变量值//up,downflag:按键加减标志位。//hideflag,控制闪烁频率charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;//秒,分,时到日,月,年位闪的计数typedefstructSYSTEMTIME{unsignedcharSecond;unsignedcharMinute;unsignedcharHour;unsignedcharWeek;unsignedcharDay;unsignedcharMonth;unsignedcharYear;unsignedcharYearH;unsignedcharYearL;unsignedcharday;unsignedcharmonth;unsignedcharyear; unsignedcharDateString[14];unsignedcharTimeString[10];}SYSTEMTIME;//定义的时间类型SYSTEMTIMECurrentTime;//voidDS1302InputByte(unsignedchard)//实时时钟写入一字节(内部函数){uchari;ACC=d;for(i=8;i>0;i--){DS1302_IO=ACC0;//相当于汇编中的RRCDS1302_CLK=1;DS1302_CLK=0;ACC=ACC>>1;}}ucharDS1302OutputByte(void)//实时时钟读取一字节(内部函数){unsignedchari;for(i=8;i>0;i--){ACC=ACC>>1;//相当于汇编中的RRCACC7=DS1302_IO;DS1302_CLK=1;DS1302_CLK=0;}return(ACC);}voidWrite1302(ucharucAddr,ucharucDa)//ucAddr:DS1302地址,ucData:要写的数据{DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr);//地址,命令DS1302InputByte(ucDa);//写1Byte数据 DS1302_CLK=1;DS1302_RST=0;}ucharRead1302(ucharucAddr)//读取DS1302某地址的数据{unsignedcharucData;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr|0x01);//地址,命令ucData=DS1302OutputByte();//读1Byte数据DS1302_CLK=1;DS1302_RST=0;return(ucData);}voidDS1302_GetTime(SYSTEMTIME*Time)//获取时钟芯片的时钟数据到自定义的结构型数组{ucharReadValue;ReadValue=Read1302(DS1302_SECOND);Time->Second=BCD2DEC(ReadValue&0x7F);ReadValue=Read1302(DS1302_MINUTE);Time->Minute=BCD2DEC(ReadValue);ReadValue=Read1302(DS1302_HOUR);Time->Hour=BCD2DEC(ReadValue&0x7F);ReadValue=Read1302(DS1302_DAY);Time->Day=BCD2DEC(ReadValue);ReadValue=Read1302(DS1302_WEEK);Time->Week=BCD2DEC(ReadValue);ReadValue=Read1302(DS1302_MONTH);Time->Month=BCD2DEC(ReadValue);ReadValue=Read1302(DS1302_YEAR);Time->Year=BCD2DEC(ReadValue);ReadValue=Read1302(DS1302_YEARH);Time->YearH=BCD2DEC(ReadValue);}voidInitial_DS1302(void)//时钟芯片初始化{ ucharSecond=Read1302(DS1302_SECOND);if(Second&0x80)//判断时钟芯片是否关闭{Write1302(DS1302_WRITE,0x00);//写入允许Write1302(DS1302_YEARH,0x20);Write1302(DS1302_YEAR,0x12);//以下写入初始化时间!!!!!Write1302(DS1302_MONTH,0x03);Write1302(DS1302_DAY,0x24);Write1302(DS1302_WEEK,0x06);Write1302(DS1302_HOUR,0x11);Write1302(DS1302_MINUTE,0x25);Write1302(DS1302_SECOND,0x00);Write1302(DS1302_WRITE,0x80);//禁止写入}}voidDateToStr(SYSTEMTIME*Time)//将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]{if(hide_yearhideflag/2就不显示,输出字符串为2007/07/22{Time->DateString[0]='2';Time->DateString[1]='0';Time->DateString[2]=Time->Year/10+'0';Time->DateString[3]=Time->Year%10+'0';}else{Time->DateString[0]='';Time->DateString[1]='';Time->DateString[2]='';Time->DateString[3]='';}Time->DateString[4]=0x02;//年,'/'//------------------------------------------//if(hide_monthDateString[5]=Time->Month/10+'0';Time->DateString[6]=Time->Month%10+'0';}else{Time->DateString[5]='';Time->DateString[6]='';}Time->DateString[7]=0x01;//月'/';//------------------------------------------//if(hide_dayDateString[8]=Time->Day/10+'0';Time->DateString[9]=Time->Day%10+'0';}else{Time->DateString[8]='';Time->DateString[9]='';}Time->DateString[10]=0x00;//日Time->DateString[11]='';//字符串末尾加'',判断结束字符(1602显示结束)//------------------------------------------//if(hide_weekWeek%10+'0';//星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示}else{week_value[0]='';}week_value[1]='';}voidTimeToStr(SYSTEMTIME*Time)//将时,分,秒数据转换成液晶显示字符放到数组TimeString[];{if(hide_hourTimeString[0]=Time->Hour/10+'0';Time->TimeString[1]=Time->Hour%10+'0';}else{Time->TimeString[0]='';Time->TimeString[1]='';}Time->TimeString[2]=':';//------------------------------------------//if(hide_minTimeString[3]=Time->Minute/10+'0';Time->TimeString[4]=Time->Minute%10+'0';}else{Time->TimeString[3]='';Time->TimeString[4]='';}Time->TimeString[5]=':';//------------------------------------------//if(hide_secTimeString[6]=Time->Second/10+'0';Time->TimeString[7]=Time->Second%10+'0';}else{Time->TimeString[6]='';Time->TimeString[7]='';}//------------------------------------------//Time->DateString[8]='';//字符串末尾加'',判断结束字符(1602显示结束)}voidshow_time()//液晶显示程序{ DS1302_GetTime(&CurrentTime);//获取时钟芯片的时间数据TimeToStr(&CurrentTime);//时间数据转换液晶字符DateToStr(&CurrentTime);//日期数据转换液晶字符display_string(0,1,CurrentTime.TimeString);//显示时间display_string(0,0,CurrentTime.DateString);//显示日期display_char(10,0,0);//“日”display_char(11,0,'');//“”display_char(12,0,'');//“”display_char(13,0,'*');//显示*display_char(14,0,week_value[0]);//显示星期display_char(15,0,'*');//显示*}voidoutkey()//跳出调整模式,返回默认显示{ucharSecond;if(out==0){delay(8);count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;Second=Read1302(DS1302_SECOND);//读出秒Write1302(DS1302_WRITE,0x00);//写入允许Write1302(DS1302_SECOND,Second&0x7f);//将秒写回去Write1302(DS1302_WRITE,0x80);//禁止写入done=0;while(out==0);}}voidUpkey()//升序按键{Up=1;if(Up==0){delayms(8);switch(count) {case1:temp=Read1302(DS1302_SECOND);//读取秒数temp=0;//秒数归零up_flag=1;//数据调整后更新标志if((temp&0x7f)>0x59)//超过59秒,清零temp=0;break;case2:temp=Read1302(DS1302_MINUTE);//读取分数BD(temp);temp++;//分数加1DB(temp);up_flag=1;if(temp>0x59)//超过59分,清零temp=0;break;case3:temp=Read1302(DS1302_HOUR);//读取小时数BD(temp);temp++;//小时数加1DB(temp);up_flag=1;if(temp>0x23)//超过23小时,清零temp=0;break;case4:temp=Read1302(DS1302_WEEK);//读取星期数BD(temp);temp++;//星期数加1DB(temp);up_flag=1;if(temp>0x7)temp=1;break;case5:temp=Read1302(DS1302_DAY);//读取日数 BD(temp);temp++;//日数加1DB(temp);up_flag=1;if(temp>0x31)temp=1;break;case6:temp=Read1302(DS1302_MONTH);//读取月数BD(temp);temp++;//月数加1DB(temp);up_flag=1;if(temp>0x12)temp=1;break;case7:temp=Read1302(DS1302_YEAR);//读取年数BD(temp);temp++;//年数加1DB(temp);up_flag=1;if(temp>0x85)temp=0;break;default:break;}while(Up==0);}}voidDownkey()//降序按键{Down=1;if(Down==0){delayms(8);switch(count) {case1:temp=Read1302(DS1302_SECOND);//读取秒数BD(temp);temp=0;//秒数减1DB(temp);down_flag=1;//数据调整后更新标志if(temp==-1)//小于0秒,返回59秒temp=0x59;break;case2:temp=Read1302(DS1302_MINUTE);//读取分数BD(temp);temp--;//分数减1DB(temp);down_flag=1;if(temp==-1)temp=0x59;//小于0秒,返回59秒break;case3:temp=Read1302(DS1302_HOUR);//读取小时数BD(temp);temp--;//小时数减1DB(temp);down_flag=1;if(temp==-1)temp=0x23;break;case4:temp=Read1302(DS1302_WEEK);//读取星期数BD(temp);temp--;//星期数减1DB(temp);down_flag=1;if(temp==0)temp=0x7;;break;case5: temp=Read1302(DS1302_DAY);//读取日数BD(temp);temp--;//日数减1DB(temp);down_flag=1;if(temp==0)temp=0x31;break;case6:temp=Read1302(DS1302_MONTH);//读取月数BD(temp);temp--;//月数减1DB(temp);down_flag=1;if(temp==0)temp=0x12;break;case7:temp=Read1302(DS1302_YEAR);//读取年数BD(temp);temp--;//年数减1DB(temp);down_flag=1;if(temp==-1)temp=0x85;break;default:break;}while(Down==0);}}voidSetkey()//模式选择按键{Set=1;if(Set==0){ delayms(8);count++;//Setkey按一次,count就加1done=1;//进入调整模式while(Set==0);}}voidkeydone()//按键处理{unsignedcharSecond;do{Setkey();//扫描模式切换按键switch(count){case1:do//count=1,调整秒{outkey();//扫描跳出按钮Upkey();//扫描加按钮Downkey();//扫描减按钮if(up_flag==1||down_flag==1)//数据更新,重新写入新的数据{Write1302(DS1302_WRITE,0x00);//写入允许Write1302(DS1302_SECOND,temp|0x80);//写入新的秒数Write1302(DS1302_WRITE,0x80);//禁止写入up_flag=0;down_flag=0;}hide_sec++;//位闪计数if(hide_sec>hideflag)hide_sec=0;show_time();//液晶显示数据}while(count==2);break;case2:do//count=2,调整分{hide_sec=0;outkey();Upkey(); Downkey();if(temp>0x60)temp=0;if(up_flag==1||down_flag==1){Write1302(DS1302_WRITE,0x00);//写入允许Write1302(DS1302_MINUTE,temp);//写入新的分数Write1302(DS1302_WRITE,0x80);//禁止写入up_flag=0;down_flag=0;}hide_min++;if(hide_min>hideflag)hide_min=0;show_time();}while(count==3);break;case3:do//count=3,调整小时{hide_min=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00);//写入允许Write1302(0x84,temp);//写入新的小时数Write1302(0x8e,0x80);//禁止写入up_flag=0;down_flag=0;}hide_hour++;if(hide_hour>hideflag)hide_hour=0;show_time();}while(count==4);break;case4:do//count=4,调整星期{ hide_hour=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00);//写入允许Write1302(0x8a,temp);//写入新的星期数Write1302(0x8e,0x80);//禁止写入up_flag=0;down_flag=0;}hide_week++;if(hide_week>hideflag)hide_week=0;show_time();}while(count==5);break;case5:do//count=5,调整日{hide_week=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00);//写入允许Write1302(0x86,temp);//写入新的日数Write1302(0x8e,0x80);//禁止写入up_flag=0;down_flag=0;}hide_day++;if(hide_day>hideflag)hide_day=0;show_time();}while(count==6);break;case6:do//count=6,调整月 {hide_day=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00);//写入允许Write1302(0x88,temp);//写入新的月数Write1302(0x8e,0x80);//禁止写入up_flag=0;down_flag=0;}hide_month++;if(hide_month>hideflag)hide_month=0;show_time();}while(count==7);break;case7:do//count=7,调整年{hide_month=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00);//写入允许Write1302(0x8c,temp);//写入新的年数Write1302(0x8e,0x80);//禁止写入up_flag=0;down_flag=0;}hide_year++;if(hide_year>hideflag)hide_year=0;show_time();}while(count==8);break;case8:count=0;hide_year=0;//count8,跳出调整模式,返回默认显示状态 Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00);//写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80);//禁止写入done=0;break;default:break;}}while(done==1);}sbitKalarm=P3^6;//闹铃按键sbitKPWM=P3^7;//控制PWM占空比的按键sbitpwmpin=P1^1;//PWM输出口sbitbeep=P2^4;voiddis_settime()//显示设定闹铃时间{display_char(5,1,hour_set/10+'0');//显示录音播报小时display_char(6,1,hour_set%10+'0');display_char(7,1,':');display_char(8,1,min_set/10+'0');//显示录音播报分钟display_char(9,1,min_set%10+'0');}voidshow_temp()//显示温度{display_char(11,1,_1820display[3]+'0');//显示实际温度display_char(12,1,_1820display[2]+'0');display_char(13,1,_1820display[1]+'0');display_char(14,1,'.');display_char(15,1,_1820display[0]+'0');}voidtimerinit()//定时器初始化{TMOD=0x20;//定时0方式0,定时器1方式2TH0=THTIME0;//初始PWM时间装入T0TL0=TLTIME0;//ET0=1;//使能定时器0TR0=1;//定时器0开始计时 TH1=256-250;//初始蜂鸣器震动时间装入T1TL1=256-250;//ET1=1;//使能定时器1EA=1;//系统使能}voidmain(void){ucharscreen=0;//显示屏lcd_init();//液晶初始化_18B20_init();//18B20初始化Initial_DS1302();//时钟芯片初始化display_string(0,0,"Welcome!");//欢迎词timerinit();//定时器初始化while(1){if(!Kalarm)//如果按下闹铃按键{screen++;if(screen==2)screen=0;lcd_init();//液晶初始化while(!Kalarm);//等待按键释放}if(screen==0)//如果是正常显示时间日期模式{_18B20_work(_18B20_read());//处理温度数据show_time();//显示时间show_temp();//显示温度keydone();//按键调时子程序if(!Up)//设定,取消闹钟{alarmflag=~alarmflag;TR1=0;//暂停定时器(蜂鸣器)while(!Up);//等待按键释放 }if(alarmflag==1){display_char(9,1,'#');if((Read1302(DS1302_HOUR)==DEC2BCD(hour_set))&&(Read1302(DS1302_MINUTE)==DEC2BCD(min_set))){TR1=1;//开启定时器(蜂鸣器)}}elsedisplay_char(9,1,'');if(!KPWM)//如果按下设定PWM按键{set_pwmtime++;//改变占空比值if(set_pwmtime==10)set_pwmtime=0;//十级别亮度可调TR1=1;//蜂鸣器开始鸣响delay(200);//适当延迟TR1=0;//蜂鸣器停止鸣响}if(!Down){set_pwmtime=0;//恢复初始亮度}display_char(10,1,set_pwmtime+'0');//显示PWM值}elseif(screen==1)//如果是设定闹铃模式{display_string(0,0,"Alarm");//设定小时dis_settime();//显示设定闹铃时间子程序if(!Set)//如果按下了设定时间{display_string(0,0,"SetHour");//设定小时WriteCommandLcd(0x0f);//光标闪烁 delay(500);//适当延迟while(Set)//如果没有确认键盘被按下,则等待{if(!Up)//如果“加”按下{hour_set++;//设定小时加1if(hour_set>23)//如果小时大于23hour_set=0;//小时回0delay(300);//适当延迟dis_settime();//显示设定闹铃时间子程序}if(!Down)//如果“减”按下{hour_set--;//设定小时减1if(hour_set<0)//如果小时小于0hour_set=23;//小时回23delay(300);//适当延迟dis_settime();//显示设定闹铃时间子程序}display_xy(6,1);//设置日期调整光标}display_string(0,0,"SetMinute");//->delay(500);while(Set)//如果没有确认键盘被按下,则等待{if(!Up)//如果“加”按下{min_set++;//设定分钟加1if(min_set>59)min_set=0;delay(300);//适当延迟dis_settime();//显示设定闹铃时间子程序}if(!Down)//如果“减”按下 {min_set--;//设定分钟减1if(min_set<0)min_set=59;delay(300);//适当延迟dis_settime();//显示设定闹铃时间子程序}display_xy(9,1);//设置日期调整光标}delay(3000);screen=0;//回到正常显示时间lcd_init();//液晶初始化}}}}voidt0(void)interrupt1//定时器0溢出中断{THTIME0=(8192-400)/32;TLTIME0=(8192-400)%32;//规定初始PWM高电平时间pwmtime++;if(pwmtime==set_pwmtime)pwmpin=0;//置PWM引脚为低电平if(pwmtime==10)//十级亮度{pwmtime=0;pwmpin=1;//置PWM引脚为高电平}}voidt1(void)interrupt3//定时器1溢出中断{beep=~beep;//蜂鸣器鸣响} 附录4元器件清单标号标称值说明元器件数量C1,C230PF电容2C310uF电解电容1C4100uF电容1R11K金属膜电阻1R24.7K金属膜电阻1R310K金属膜电阻1R40.25金属膜电阻1RP110K排阻1SW按键6X112MHZ晶振1X232768HZ晶振1L168uH电感1D1-D20发光二极管20Q19012三极管1LS1蜂鸣器1DS18B20温度检测芯片1DS1302时钟芯片1PT4115恒流驱动芯片1LCD1602液晶显示模块1STC89C52单片机1

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭