版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGEIV基于51单片机的智能台灯设计摘要台灯从其自身的结构和客观性的是实现性能上来看的话,我们不难发现,他不仅仅是能够实现较好的照明作用,同时也能够较好的发挥出良好的装饰作用,种类繁多,造型各异,在实现光源的管理和光源的实时性的配置过程中,功能也是较为强大的。在当前这样的一种电子产品高速发展,不断的呈现出较大程度的发展的时代背景之下,家用电器也逐渐的从过往的那种相对较为传统的层面上,逐渐的朝着一个更加的智能化的层面上,实现快速的发展,已经应用于实际中的有智能洗衣机,智能电饭锅,智能电磁炉等,但是从当前智能家电在具体的使用过程中,一个尤为核心的特点就是,他们都是以单片机作为最核心的管理元件和系统性的控制元件来发挥出系统高效的作用的。结合了单片机的智能家用电器和普通家用电器相比,不管是从功能上,还是从智能化的层面上,较之于从前,都是实现了较大程度的发展和有效的予以提升的态势的完成,其中表现的最为明显的就是能够更好的实现省电的设置和自动调节亮度管理,进而最终实现了家电的性能更加的优质。家用电器也是因为单片机这样的一个核心的控制元件的作用,最终呈现出智能化的实施和智能化的发展趋势的完成,并且由于人们的生活水平的较大程度的提升和系统性的加强,进而逐渐的使得过往的那种价格较为高昂的智能家用电器,逐渐的呈现出一种平民化的价格模式,也使得更多的人能够更加容易的接受他当前呈现出来的价格,人们的生活水平以及生活质量,也随着当前这样的一种智能家电的模式的大力的发展而呈现出较大程度的提升。在当前这样的一种家用电器具体的实施和系统性的发展过程中,作为家用电器当中的小台灯也是应该充分的契合当前的发展形势,逐渐的朝着一个更加的智能化的模式发展,进而为人们的生活以及具体的工作提供更大的便捷性。关键词:单片机;自动调节亮度;台灯
AbstractDesklampisadornmentsexoflampsandlanterns,awiderangeofdifferentshapes,withthelightsourceismorealso.Withtherapiddevelopmentofelectronicproducts,householdelectricalappliancesalsomoreandmoretowardintelligent,hasappliedtotheactualofintelligentwashingmachine,intelligentelectricricecooker,intelligentinductioncooker,etc.,andusedinintelligenthomeapplianceswithacommonfeature,isusingthesinglechipmicrocomputerasthecentralcontrolunit.Combinedwiththesinglechipmicrocomputerintelligenthouseholdappliancescomparedwithordinaryhouseholdelectricalappliances,moreonthefunction,usemoreconvenient,highersafetyandreliability,themostimportantthingisthatmoreelectricalenergysaving,improvethequalityofhouseholdappliances.Householdappliancesforsinglechipmicrocomputertojoinandbecomesmarter,andaspeoplelivingstandardriseincreasinglycommon,ourlifealsowiththedevelopmentofhouseholdelectricalappliancesmoreconvenientandcomfortable.Withthedevelopmentofhouseholdappliances,asasmalldesklampofhouseholdelectricalappliancestopacewiththedevelopmentofscienceandtechnologytotheintelligent.
Keywords:singlechipmicrocomputer;Automaticallyadjustthebrightness;DesklampKeywords:singlechipmicrocomputer;Automaticallyadjustthebrightness;Desklamp
目录摘要 IAbstract II1绪论 11.1课题的研究背景 11.2课题的研究意义 错误!未定义书签。1.3设计方案 12硬件系统电路设计 32.1整体电路系统模块 32.2单片机主控系统 32.3恒流驱动系统 42.4时钟系统 52.5液晶显示系统 62.6温度检测系统 82.7蜂鸣系统 92.8按键系统 102.9电源系统 103系统软件设计 123.1系统主程序 123.2按键检测和处理程序 123.3外部中断程序 133.4定时器中断程序 143.5C语言程序编写和ISP软件程序下载 144软件的调试和仿真 16总结 错误!未定义书签。致谢 17参考文献 20附录1电路原理总图 21附录2电路程序清单 22附录3元器件清单 57PAGE57第1章绪论1.1课题的研究背景台灯在具体的作用过程中,发挥出来的主要作用,是一种照明的作用。它一般分为两种,一种是立柱式的,一种是有夹子的。他在具体的工作过程中,最为核心的原理就是将灯光集中到一个相对较小的区域内,集中光线,进而最终为人们的具体的生活和学习,提供良好的便捷性的发展措施。一般台灯用的灯泡是白炽灯或者节能灯泡,有的台灯还存在有应急功能,在停电的过程中,是能够较好的发挥出其良好的照明作用的。在当前这样的一种系统性的实施阶段和客观性的发展阶段来看的话,我们不难发现,灯具市场出售的灯具,不管是从数量的层面上,还是从种类的层面上,都是非常繁多的,一般台灯均采用220V交流电源供电,日光灯管、白炽灯泡为光源,手动开关或触摸感应式开光来控制。但是这样的一类台灯,在具体的使用过程中,是存在着较多的弊端的,一是电压,从其具体的实施形势上来看的话,是一种不稳定,不安全的发展形势的,给人们的生活带来了较大的不安全的发展因素和客观性的实施因素的建立;二是日光灯还具有频闪效应,如果人在长时间使用的过程中,是会对人眼造成较大程度的伤害的;三是耗电量大、台灯通常都是以日光灯为主,在几瓦到几十瓦之间;四是人工化,如果只是单纯的通过人工操作的话,通常会忘记关灯,最终导致电能发生较大程度的浪费现象,到目前为止,在灯具市场上,很少见到采用+5V的直流电源供电的一种人体智能台灯,他在具体的运行过程中,是不会发生较大程度的触电现象的,使用寿命长、无辐射、又不污染等优点,有许多普通按键台灯所无法比及的优势,智能化台灯一方面可以更节省电能,有利于环保,另一方面可以纠正使用者的坐姿,预防脊椎变形和眼睛近视。同时,智能台灯在黑暗的时候自动开关灯的功能也让使用者使用起来更方便,省去黑暗摸灯的麻烦。1.2设计方案LED是一个发光二极管,它可以快速实现开关。这一特点是其他的发光器件所无法比拟的。因此,我们需要把供电源改成脉冲恒流源,改变电源脉冲宽度的方法,就可以改变其亮度。种方法称为脉宽调制(PWM)调光法。假如脉冲的周期为tpwm,脉冲宽度为ton,那么其工作比D(或称为孔度比)就是ton/tpwm.改变恒流源脉冲的工作比就可以改变LED的亮度。简而言之,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。第2章硬件系统电路设计2.1整体电路系统模块该台灯系统可具体实现LED台灯的10级PWM调光控制;液晶屏实时显示时钟、日历与环境温度信息;闹钟功能采用声音报警方式,即一旦到达闹钟时间,LED台灯能够出蜂鸣声报警,以唤醒用户;用户则可以通过按键系统实现对时钟日历与闹钟参数的设置、LED亮度的调节以及闹钟报警的解除。图2.1系统结构框图2.2单片机主控系统STC89系列单片机具有ISP/IAP功能,无需专用编程器,无需将单片机从目标板上取下,即可通过PC机串口,对单片机进行编程。STC89系列单片机的Flash存储器被分成Block1(BootROM,即引导区)和Block0(用户程序区)两个区,在物理结构上,Block0在前,Block1在后,在出厂时,Block1区内已经烧录有ISP引导码,并设置为从Block1启动。单片机启动时,首先执行ISP引导码,如果是程序下载,ISP引导码就会引导单片机将用户程序下载到Flash存储器的Block0用户程序区,然后,开始用户程序;否则,如果启动时ISP未检测到程序下载,则直接执行Block0中的用户程序。本次采用的STC89C52的主要特点:增强型6时钟/机器周期,12时钟/机器周期8051CPU工作电压:5.5–3.4V(5V单片机)/3.8-2.0V(3V单片机)工作频率范围:0–40MHz,相当于普通8051的0~80MHz.实际实际工作频率可达48MHz.用户应用程序空间4K/8K/13K/16K/20K/32K/64K字节片上集成1280字节/512字节RAM通用I/O口(32/36个),复位后为:P1/P2/P3/P4是准双向口/弱上拉(普通8051传统I/O口)。P0口是开漏输出,作为总线扩展用时,不用加上上拉电阻,作为I/O口用时,需加上拉上电阻。ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器。可通过串口(P3.0/P3.1)直接下载到用户编程,8K程序3秒即可完成一片。单片机最小系统电路如图2.2所示。图2.2单片机最小系统2.3恒流驱动系统本台灯设计LED光源采用相互并联方式,共由20只高亮度小功率LED组成;每只LED灯珠的压降约3.1V,工作电流约20mA.由白光LED的正向伏安特性可知,当LED端电压超过其正向导通电压后,较小的电压波动都会导致工作电流的的剧烈变化,从而影响LED的正常使用,固LED宜采用恒流驱动方式。因此,本设计LED采用高性能PT4115恒流芯片驱动。LED恒流驱动电路如图2.3所示图2.3LED恒流驱动系统电路图PT4115恒流驱动输出的电流值计算公式为:IOUT=(0.1×D)/Rs(D为方波信号占空比,Rs为限流电阻。)图2.4PWM调光原理图2.4时钟系统时钟系统和单片机系统连接图如图2.5。图2.5时钟系统电路图2.5液晶显示系统液晶显示在具体的实施和使用的过程中,不管是从宏观的层面上,还是从微观的层面上,其具体的使用范围都是较为广泛的,而且综合的使用量也是较为普及的。除此之外,根据搭载设备在具体的使用过程中的用途上的较大程度的差异,最终显示出来的画面大小和具体的像素质量也是存在着较大的差异化的。从手用型到电视用数十种,根据其实际的使用过程中的较大的差异性,液晶面板最终呈现出来的性能也是大不相同的。但是,由于我国的液晶显示器的大范围的普及和广泛性的应用,其主要元器件液晶显示屏,在具体的使用过程中的故障问题也逐渐的显示出来,本论文从液晶显示器在具体的实施和执行的过程中的安全问题作为主要的切入点,对其之所以会大幅度的发生的综合原理做出重点的阐释和系统性的说明,并且对其实际的成象和具体的检测方式也是重点的予以研究和说明。在对于液晶显示屏的管理和系统性的控制过程中,对于其存在的诸多的不良的现象,是要加强控制和管理的,进而维持其较为和谐发展的态势,并且对于当前存在的这一系列的故障问题,已经采取怎样的执行方案和具体的管理措施,做出了详细的说明。进而最终实现成本的有效降低,进而在具体的工业发展和实际的工业生产的过程中,最大程度的实现工业生产效率和具体的生产质量的大幅度的提升和加强。通过单片机控制1602液晶实现首行年、月、日、星期显示,第二行时、分、秒以及环境温度显示。液晶显示屏,从其本质上来看,其主要的性质是一种电光源的性质和系统性的发展装置,在实际的方向上,也是存在着较大的极化方向上的差异性的,不同极化方向的光在经过液晶的作用之下,最终呈现出来的成效也是存在着不一致的态势的,光经过一系列的作用之后,再进行有序的发展和客观性的予以组合,最终对其实际的极化方式也是会产生较大程度的改变的,配合偏光板,对来自于某个方向的极化光予以及时的阻挡,通过这样的方式实现光的穿透率的客观的管理和高效的计算的。在对光的相关特性做出了系统性的了解和有序的发展之后,那么电是如何与光结合呢?在电压呈现出较大的差异性的发展形势之下,液晶呈现出来的排列方式也是存在着较大的不同的,不同的液晶排列方式最终使得其具体的光程差也是不一致的,进而光源在具体的穿透过程中,光源的穿透率大幅度的降低。在将光与电进行系统的管理和有效的结合的情况之下,就可将电信号(电)转换成亮暗显示(光)。液晶显示的优点:(1)显示质量好,可视面积大。液晶显示器每一个点在收到信号后会一直保持色彩和亮度,恒定发光,而不需要像阴极射线管显示器(CRT)那样需要不断刷新亮点。因此,液晶显示器画质高且不会闪烁。(2)数字式接口。液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,不需要把数字信号转化为模拟信号在进行输出,操作更加方便。液晶显示器各种图形的显示原理:(1)线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行有16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。(2)字符的显示用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。(3)汉字的显示汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5…右边为2、4、6…根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节…直到32B显示完LCD就可以得到一个完整的汉字。图2.6液晶系统电路图2.6温度检测系统系统的温度检测选用DALLAS公司“一线总线”数字温度传感器DS18B20,该传感器具有微型化、低功耗、高性能等优点,可直接将温度转化成串行数字信号处理,测温范围为-55-125℃,最高分辨率可达0.0625℃。DS18B20共有三个引脚电源正VCC、电源负GND和信号输入输出口DQ.R3为4.7K的上拉电阻,用于保证单片机与DS18B20通讯时高低电平准确的被单片机机和DS18B20识别。单片机P3.0口通过R3连接DQ端口实现温度数据的采集处理,并通过液晶屏实时显示。温度检测电路如图2.7所示。图2.7温度检测电路图DS18B20共有2种形态的存储器资源,它们分别是:(1)ROM只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20共64位ROM。(2)RAM数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。由于DS18B20温度检测传感器使用范围比较广,电路设计和软件编程都比较成熟。所以本电路系统采用DS18B20温度检测传感器不管是从硬件电路设计还是软件编程方面都具有很好的优势,能够起到简化电路设计节约成本的作用。2.7蜂鸣系统蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,基于当前这样的一种原因的实施和存在的状况之下,是需要足够的电流的管理和系统性的驱动态势的完成的,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,所以在具体的电路实施和客观的管理过程中,是应该有一个较大的功率,实现对整个电路的高效的管理和系统性的放大事宜的完成和执行的。由单片机P3.7接口外接一个1K电阻和两个NPN型三极管来驱动蜂鸣器。其主要任务是实现功率的较大程度的管理和系统性的输出,对音频信号有效不失真的进行放大,进而最终导致声音在扬声器的作用之下,予以良好的管理和系统性的予以呈现的态势的完成。蜂鸣系统用于产生闹钟报警声以及按键提示音。由单片机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直流电压。恒流源是能够向需要电源的设备实现电源的及时管理和系统性的供应态势的完成的,一次恒流源,从其使用的深度上,以及使用的广度上来看,都是非常广泛的,并且也是逐渐的得到了更多的人的关注和系统性的认可,这样的一种态势,不管是从哪个层面上,都是需要重点的明确的问题。例如在通用的充电器对蓄电池充电时,由于整个蓄电池的电压的提升,充电电源能够充进去的电量,也呈现出较大程度的降低和减少的态势的完成,为了实现其在一种相对较为恒定的范围内予以有效的管理和系统性的执行,对于其最终输出的电压数值,是应该大幅度的予以降低的,但是如果采用恒压的电源来实现整个电路的系统性的实施和客观的予以管理的话,对于其最终输出的电压数值,就不需要做出过多的体艾欧整和管理,进而使得人们的工作强度以及劳动强度实现了较大程度的降低,从而从根本上,实现整个生产效率的大幅度的提升和加强,进而最终,不管是从社会效益的层面上,还是从其最终呈现出来的经济效益,都是会得到大幅度的提升。恒流源在实现电源的有效的管理和系统性的测量过程中,也是得到了大力的关注和广泛性的应用。图2.10直流稳压电源第3章系统软件设计该系统控制程序主要包含系统初始化程序、实时时钟芯片处理程序、温度传感器芯片处理程序、液晶显示程序、键盘检测与处理程序、闹钟中断以及定时器产生PWM程序构成。3.1系统主程序系统主程序流程图如图3.1所示。图3.1主程序流程图3.2按键检测和处理程序按键控制系统由S2~S6五个按键组成,分别为S2时间设置键、S3数值增大键、S4数值减小键、S5闹钟设置键以及S6亮度调节键。S2用于选择需要调整的时钟以及闹钟参数,根据S2按下次数,依次选择秒、分、时、星期、日、月、年,液晶屏上被选参数下方以光标闪烁状态提示,再通过按下S3或S4调整被选参数值的大小,S2按下累积8次时,则退出选择功能并保存当前数据至时钟芯片。按键检测与处理流程图如图3.2所示。图3.2按键检测与处理流程图3.3外部中断程序闹钟中断程序如图3.3所示。图3.3外部中断流程图3.4定时器中断程序这样,P1.1口就产生了所需的PWM调光信号。定时器生成PWM流程图如图3.4所示。图3.4定时器生成PWM流程图3.5C语言程序编写和ISP软件程序下载C语言是国际社会广泛流行的计算机高级语言。语言简洁,紧凑,使用方便灵活,是完全模块化和结构化的语言,语法设计不太严格,程序设计自由度大,用C语言编写的程序可移植性好。C语言的这些特点和电路的设计比较吻合。全局性和局部性,模块化可以简便编程过程。因此选择C语言进行程序设计,要比汇编语言好。在程序编写的过程中需要做到认真仔细,程序的编写是个比较大的一个工程。在这个过程中会遇到许多的问题,需要一一解决。程序编写也是论文设计过程中最重要的一个环节,因为硬件和软件是不可能脱离的。两者都能成功并且结合到一起才能实现论文的要求。SP(In-SystemProgramming)是当今流行的单片机编程模式。可在线系统编程的意思是指电路板上的可编程下载的空白元器件可以直接编程写入最终用户代码,而不需要从电路板上取下可重复编程逻辑器件。已经编程的器件也可以用ISP方式擦除或再编程。在完成编写程序的编译通过之后,把可以烧写STC89C51的ISP编程器并与电脑主机硬件连接后,打开相应下载软件按步骤即可对STC89C51芯片进行程序烧录下载。烧录完成成功后会有提示。重新通电即可测试和运行电路。本系统采用汇编语言和C51混合编程的方法。为了使得整个程序在具体的实施和系统性的操作过程中,更加的简便易行,而且在实际的调试过程中,能够最大程度的发挥出其较好的作用,当前采用的最为广泛和普及的方式就是结构编程的方式来予以完成和执行的。第4章软件的调试和仿真Proteus仿真如图4.1图4.1电路仿真图由此仿真图可以看到电路设计满足设计要求。能够显示温度,时间,日期,灯光亮度能够进行闹钟定时,能够形成PWM脉宽调制波形进行台灯亮度调节。此仿真结果说明电路和程序是可行的。用本次毕业设计来验证书本中所学习的内容,不仅能够让我们巩固以前所学习的知识,更能学习到许多课本以外的知识。论文设计需要综合考虑每种电路的优缺点,以及整体电路的需求。而关于电子元器件的选择是查阅了许多资料。材料的选择参数的计算很重要,这直接关系到本次实验能否获得成功。对于电路的仿真实验,我做了许多摸索,仿真软件自己在以前接触的比较少,用的也不是很熟悉。经过一段时间的练习能够基本操作仿真软件了。并对Proteus仿真软件有了进一步的了解。最后我设计出了各个部分模块的电路图,并实现了电路图的组合。经过不断地测试和调试,以及与指导老师和同学的沟通与交流,最终完善了硬件电路的设计,我所设计的电路在Proteus仿真软件上仿真成功。本次毕业设计经历了设计阶段、开发实现阶段以及最后的应用测试阶段。经过几个月的努力,核心问题已经全部解决,所有功能均已基本实现,能够显示日期,时间,星期,温度,灯光亮度,能够进行调光,进行闹钟定时。并基本上能够实现本次毕业设计的设计要求。毕业设计这个环节是对从前所学知识的一个很好的巩固。之前对模拟电路和数字电路还有C语言都知识掌握了一定的理论知识,没有真正的联系起来的运用一个系统中。通过这次毕业设计,不管理论知识还是运用的实际操作能力都有了很大的提高。但是由于本人水平和时间有限,不能非常深入的掌握,相关知识在实际中的应用,对C语言编程更是只通皮毛而已,很多地方都没有考虑周全,还有很多不足之处有待改进。下面就是我对这次毕业设计的一些总结。经过两个多月的努力,我的毕业设计终于完成了,但是现在回想起来做毕业设计的整个过程,颇有心得,其中有苦也有甜,艰辛的同时又充满乐趣!通过本次毕业设计,没有接受任务以前觉得毕业设计只是对这几年来所学知识的单纯总结,但是通过这次做毕业设计发现毕业设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。下面我对整个毕业设计的过程做一下简单的总结。第一,在选择毕业设计的选题时,我就选择自己比较感兴趣的数字控制方面的,这样做起来动力很大。第二,确定好毕业设计选题后就是找资料了。查资料是做毕业设计的前期准备工作,图书馆去借了相关方面的书籍,同时也在网上大量搜索相关内容。总之,不管通过哪种方式查的资料都是有利用价值的,要一一记录下来以备后用。第三,综合已有的资料来更透彻的分析本次设计题目。首先,我们要阅读大量的资料,能够是自己对毕业设计课题有更深入的理解,然后基于此,展开自己的设计,第一步要完成的是系统总体方案的设计。这一步是关键,因为以后的工作都是在此基础上做的!第四,有了研究方向,就要动手实现。为了更好的编写程序,先利用Proteus仿真。编写源代码的时候是编写一个小模块就进行调试,这样可以避免设计的最后出现太多的错误而乱成一团糟。一步步地做下去之后,你会发现要做出来并不难,只不过每每做一会儿会发现一处错误要修改,就这样在不断的修改调试,再修改再调试。第五,软件仿真成功以后,才开始写论文和实物电路的焊接,Word虽然是人人都知道的文字编辑软件,但真要用它来写论文,才发现自己懂得的一点点Word知识不够用,还好有网络,能够在线学习Word的使用技巧,以完成论文的编辑和排版。电路的焊接,我们也不敢轻易妄动,毕竟时间有限,并且有些芯片数量有限,烧坏就很麻烦,所以也只能在别人的指导和帮助下一步一步完成,是一个动手学习的过程!我们只有对自己有了更高的要求,才能作为动力不断取得新的成绩!在整个设计过程中,使我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。总体来说,通过本次毕业设计,我的文献检索能力提高了,综合分析问题的能力也有所提高,同时提高了运用所学知识解决实际问题的能力,提高了独立获得新知识的能力,提高了自己技术文件的编写能力。致谢本论文从选题、构思到定稿无不渗透着导师的心血和汗水;导师渊博的知识和严谨的学风使我受益终身,在此表示深深的敬意和感谢。我还要感谢含辛茹苦、任劳任怨、望子成龙、不图回报的父母的养育之恩,他们给予我的爱和支持让我顺利地完成了自己的学业。最后,因本人水平有限,在文中难免有不足之处,恳请各位老师批评指正。参考文献[1]孙育才.ATMEL新型AT89C5X系列单片机及其应用[M].清华大学出版社,2005[2]陈桂友,柴远斌.单片机应用技术[M].北京机械工业出版社,2008.[3]刘健,徐炜,伊均萍,刘良成.电路分析[M].北京:电子工业出版社,2005[4]谢望.烟雾传感器技术的现状和发展趋势[J].仪器仪表用,2006,(5):1~2[5]余小平,奚大顺.电子系统设计[M].北京:航空航天大学出版社,2007[6]谢自美.电子线路设计、实验、测试[M].北京:华中科技大学出版社,2006[7]李全利,仲伟峰,徐军.单片机原理及应用[M].北京:清华大学出版社,2006[8]康光华,邹寿彬.电子技术基础数字部分(第五版)[M].北京:高等教育出版社,2006[9]谢维成,刘勇.微机原理与接口技术[M].华中科技大学出版社,2009[10]高玲,尹立强.基于单片机的LCD显示系统设计与Proteus仿真实现[J].办公自动化.2011,(18):10[11]鲁捷,焦振宇.PROTEL2004电路设计[M].北京:清华大学出版社,2006[12]李春葆,金晶.C语言程序设计辅导[M].北京:清华大学出版社,2007[13]杨将新,李华军.单片机程序设计及应用(第三版)[M].北京:电子工业出版社,2006[14]马忠梅.单片机的C语言应用程序设计(第3版)[M].北京:北京航空航天大学出版社,2003[15]陈晓莉,张俊涛.KEILC51单片机仿真器的设计[J].微计算机信息(嵌入式与SOC),2006,(02):19~20附录1电路原理总图附录2电路程序清单#include<STC89C51.h>#include<intrins.h>//_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={0x00,0x00};//读出温度暂放unsignedchardata_1820display={0x00};//显示单元数据,共4个数据和一个运算暂用unsignedinttemper;//**************温度小数部分用查表法***********//unsignedcharcodeditab={ 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);//550us DQ=1; _18B20_delay(6);//66us presence=DQ;//presence=0复位成功,继续下一步 } _18B20_delay(45);//延时500us presence=~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_();//5us DQ=val&0x01;//最低位移出 _18B20_delay(6);//66us val=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_();//4us DQ=1; _nop_();_nop_();_nop_();_nop_();//4us if(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=_18B20read_byte();//读温度值的低字节 temper_data=_18B20read_byte();//读温度值的高字节 temper=temper_data; temper<<=8; temper=temper|temper_data;//两字节合成一个整型变量。 returntemper;//返回温度值}/****************温度数据处理函数************************///二进制高字节的低半字节和低字节的高半字节组成一字节,这个//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩//下的低字节的低半字节转化成十进制后,就是温度值的小数部分/********************************************************/_18B20_work(unsignedinttem){ unsignedcharn=0; if(tem>6348)//温度值正负判断 { tem=65536-tem; n=1; }//负温度求补码,标志位置1 _1820display=tem&0x0f;//取小数部分的值 _1820display=ditab[_1820display];//存入小数部分显示值 _1820display=tem>>4;//取中间八位,即整数部分的值 _1820display=_1820display/100;//取百位数据暂存 _1820display=_1820display%100;//取后两位数据暂存 _1820display=_1820display/10;//取十位数据暂存 _1820display=_1820display%10;/******************数码管符号位显示判断**************************/ if(!_1820display) { _1820display=''-'0';//最高位为0时不显示 if(!_1820display) _1820display=''-'0';//次高位为0时不显示 } if(n) _1820display='-'-'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[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_SECOND 0x80//时钟芯片的寄存器位置,存放时间#defineDS1302_MINUTE 0x82#defineDS1302_HOUR 0x84#defineDS1302_WEEK 0x8A#defineDS1302_DAY 0x86#defineDS1302_MONTH 0x88#defineDS1302_YEAR 0x8C#defineDS1302_YEARH0xC0#defineDS1302_WRITE 0x8E#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码sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit DS1302_CLK=P1^6; //实时时钟时钟线引脚sbit DS1302_IO=P1^7;//实时时钟数据线引脚sbit DS1302_RST=P1^5; //实时时钟复位线引脚 sbit Up = P3^4;//加法按钮!sbit Down= P3^5;//减法按钮sbit Set= P3^1;//模式切换键sbit out= P3^3;//立刻跳出调整模式按钮chardone,count,temp,up_flag,down_flag,hideflag=10,week_value;//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; unsignedcharTimeString;}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_year<hideflag/2)//这里的if,else语句都是判断位闪烁,<hideflag/2显示数据,>hideflag/2就不显示,输出字符串为2007/07/22 { Time->DateString='2'; Time->DateString='0'; Time->DateString=Time->Year/10+'0'; Time->DateString=Time->Year%10+'0'; } else { Time->DateString=''; Time->DateString=''; Time->DateString=''; Time->DateString=''; } Time->DateString=0x02; //年,'/'//// if(hide_month<hideflag/2) { Time->DateString=Time->Month/10+'0'; Time->DateString=Time->Month%10+'0'; } else { Time->DateString=''; Time->DateString=''; } Time->DateString=0x01;//月'/';//// if(hide_day<hideflag/2) { Time->DateString=Time->Day/10+'0'; Time->DateString=Time->Day%10+'0'; } else { Time->DateString=''; Time->DateString=''; } Time->DateString=0x00;//日 Time->DateString='\0';//字符串末尾加'\0',判断结束字符(1602显示结束)//// if(hide_week<hideflag/2) { week_value=Time->Week%10+'0';//星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示 } else { week_value=''; } week_value='\0';}voidTimeToStr(SYSTEMTIME*Time)//将时,分,秒数据转换成液晶显示字符放到数组TimeString[];{ if(hide_hour<hideflag/2){ Time->TimeString=Time->Hour/10+'0'; Time->TimeString=Time->Hour%10+'0'; } else { Time->TimeString=''; Time->TimeString=''; } Time->TimeString=':';////if(hide_min<hideflag/2) { Time->TimeString=Time->Minute/10+'0'; Time->TimeString=Time->Minute%10+'0'; } else { Time->TimeString=''; Time->TimeString=''; } Time->TimeString=':';////if(hide_sec<hideflag/2){ Time->TimeString=Time->Second/10+'0'; Time->TimeString=Time->Second%10+'0';} else { Time->TimeString=''; Time->TimeString=''; }//// Time->DateString='\0';//字符串末尾加'\0',判断结束字符(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);//显示星期 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++;//分数加1 DB(temp); up_flag=1; if(temp>0x59)//超过59分,清零 temp=0; break; case3:temp=Read1302(DS1302_HOUR);//读取小时数 BD(temp); temp++;//小时数加1 DB(temp);up_flag=1; if(temp>0x23)//超过23小时,清零 temp=0; break; case4:temp=Read1302(DS1302_WEEK);//读取星期数 BD(temp); temp++;//星期数加1 DB(temp);up_flag=1; if(temp>0x7) temp=1; break; case5:temp=Read1302(DS1302_DAY);//读取日数 BD(temp); temp++;//日数加1 DB(temp);up_flag=1; if(temp>0x31) temp=1; break; case6:temp=Read1302(DS1302_MONTH);//读取月数 BD(temp); temp++;//月数加1 DB(temp);up_flag=1; if(temp>0x12) temp=1; break; case7:temp=Read1302(DS1302_YEAR);//读取年数 BD(temp); temp++;//年数加1 DB(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; //秒数减1 DB(temp);down_flag=1;//数据调整后更新标志 if(temp==-1)//小于0秒,返回59秒 temp=0x59; break; case2:temp=Read1302(DS1302_MINUTE);//读取分数 BD(temp); temp--;//分数减1 DB(temp);down_flag=1; if(temp==-1) temp=0x59;//小于0秒,返回59秒 break; case3:temp=Read1302(DS1302_HOUR);//读取小时数 BD(temp); temp--;//小时数减1 DB(temp);down_flag=1; if(temp==-1) temp=0x23; break; case4:temp=Read1302(DS1302_WEEK);//读取星期数 BD(temp); temp--;//星期数减1 DB(temp);down_flag=1; if(temp==0) temp=0x7;; break; case5:temp=Read1302(DS1302_DAY);//读取日数 BD(temp); temp--;//日数减1 DB(temp);down_flag=1; if(temp==0) temp=0x31; break; case
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房产劳动用工合同范本
- 建筑工程合同付款协议
- 客户促销协议合同模板
- 异地承包工厂合同范本
- 教案第三节踏上信息高速公路(2025-2026学年)
- 导学小组合作实施方案教案
- 漫画课教案(2025-2026学年)
- 专题十极坐标参数方程理教案
- 《十五从军征》共修改版教案(2025-2026学年)
- 一轮复习经济生活第一单元教案
- 2025 九年级语文下册诗歌情感表达多样性训练课件
- DB54T 0541-2025 森林火险气象因子评定规范
- 2025年安徽省普通高中学业水平合格性考试化学试卷(含答案)
- 2025年宁波市公共交通集团有限公司下属分子公司招聘备考题库及答案详解参考
- 大型电子显示屏安装施工规范
- 中职中医教师面试题库及答案
- 2026年关于汽车销售工作计划书
- 2025年汕头市金平区教师招聘笔试参考试题及答案解析
- T∕ACEF 235-2025 企业环境社会治理(ESG)评价机构要求
- 拆迁工程安全监测方案
- 视频会议系统施工质量控制方案
评论
0/150
提交评论