常见问题
您的位置: 主页 > 常见问题 >

乐橙国际lc8智能调光面板图标智能调光面板原理


发布时间:2020-07-06 18:19


  1.本站不保证该用户上传的文档完整性,不预览、乐橙国际lc8不比对内容而直接下载产生的反悔问题本站不予受理。

  本科毕业设计 题 目 基于PWM的智能多功能台灯设计 姓 名 韦 洋 专 业 自 动 化 学 号 201042004 指导老师 曹 卫 锋 郑州科技学院电气工程学院 二○一四年五月 郑州科技学院毕业设计(论文)任务书 题目 基于PWM的智能多功能台灯设计 专业 自动化 学号 201042004 姓名 韦洋 主要内容、基本要求、主要参考资料等: 主要内容: (1)功能要求:台灯能够自动调整光强亮度,检测环境温度,显示日历等。 (2)硬件要求:整个系统的硬件部分包括单片机,键盘、显示和信号输出等。 上述内容为基本要求,可按照自己的理解增加功能使之更完善。 基本要求: (1)明确毕业设计任务,复习与查阅有关资料。 (2)对设计进行简要说明,总体设计方案,设计电路,使用计算机绘图,画出详细的电路接线图,列出元器件清单。电路图要求工整、清楚、正确,并标明管脚。 (3)软件编程必须有流程图,程序必须加注释,各程序段的开始要注明该段功能和作用。 (4)要求使用A4打印稿,不少于2万字。格式遵照学校规定。 主要参考资料: (1)周航慈.单片机应用程序设计技术[M].北京航空航天大学出版社 (2)中国期刊全文数据库。 (3)“电子技术应用”、“电子设计应用”、“单片机与嵌入式系统应用”等期刊。 (4)张毅刚.MCS-51单片机应用设计[M].哈尔滨工业大学出版社 (5)/a/zuopinzhanshi/diqijiedasaizuopin/ (6)/forum/357/1 完 成 期 限: 指导教师签名: 专业负责人签名: 年 月 日 郑州科技学院毕业设计(论文)开题报告 课题名称 基于PWM的智能多功能台灯设计 课题来源 教师拟定 课题类型 AX 指导教师 曹卫峰 学生姓名 韦 洋 学 号 201042004 专 业 自动化 开题报告内容:(调研资料的准备,设计的目的、要求、思路与预期成果;任务完成的阶段内容及时间安排;完成设计(论文)所具备的条件因素等。) 1. 调研资料的准备 毕业设计是对我们在大学所学知识的一次系统而全面的总结,要求有一定的深度和广度,只有这样才能把所学知识融会贯通,将知识转化为能力。为了为我们的老师、家长和我们自己画下一个完美的句号,调研资料准备如下: (1) 在图书馆查阅与单片机、传感器、PWM脉宽调制相关电路等有关的文字书籍; (2) 通过互连网查阅所使用芯片相关的电子资料,以及国内外相关技术; (3) 通过老师的指导与解惑,对设计内容有基本的了解,确定所使用的单片机类型和芯片型号,掌握各种硬件原理。避免设计误区,争取高效率。 2. 设计的目的与要求 目的:利用单片机微控系统和各个集成电子模块设计出一款能够调节台灯亮度,能够显示时间,万年历,能够检测室内温度,拥有闹钟功能,有硬件设计图和软件设计流程图。 要求: (1)设计显示模块以及恒流驱动模块,时钟模块,按键系统,蜂鸣系统,温度检测等硬件电路; (2)设计PWM调光系统能够对LED进行调节。 (3)对设计的电路进行分析。 (4)设计软件程序流程图及软件主控制程序。 (5)设计调试程序与硬件电路相匹配完成智能控制。 3. 设计思路 为了达到设计的目的,经过反复查阅资料,设计出电路原理,熟悉为实现其功能所需要的各种元器件,集成模块,软件设计,软硬件结合。 (1)选用STC51单片机利用PWM脉宽调制原理通过程序改变脉宽参数用单片机来控制每个周期内高低电平数从而实现电压的调节,改变台灯的亮度。 (2)时钟系统 时钟系统采用高性能的时钟芯片,该芯片功能丰富,使用简单,是一款高精度实时时钟芯片;其可以自动产生、年、月、日、时、分、秒等时间信息 注:课题来源要填写明确(如教师拟定、学生建议、某企事业单位项目等) 课题类型:(1)A—工程设计;B—技术开发;C—软件工程;D—理论研究;E—调研报告 (2)X—真实课题;Y—模拟课题;Z—虚拟课题; 要求(1)、(2)均要填,如AY,BY等。 目 录 中文摘要 I 英文摘要 II 前 言 IV 1 设计的总体要求及方案选择 1 1.1 调光技术的选择 1 1.2 主要集成芯片的选择 2 2 硬件系统电路设计 4 2.1 整体电路系统模块 4 2.2 单片机主控系统 4 2.3 恒流驱动系统 5 2.4 时钟系统 7 2.5 液晶显示系统 8 2.6 温度检测系统 10 2.7 蜂鸣系统 12 2.8 按键系统 12 2.9 电源系统 13 3 系统软件设计 14 3.1 系统主程序 14 3.2 按键检测和处理程序 15 3.3 外部中断程序 16 3.4 定时器中断程序 16 3.5 C语言程序编写和ISP软件程序下载 17 4软件的调试和仿线 5.2电子元器件的焊接与组装 20 5.3电子电路的调试 21 5.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 字符型液晶 THE DESIGN OF SMART MULTIFUNCTIONAL TABLE LAMP BASED ON PWM Abstract With the development of electronic technology, people living in the lighting tool is also undergoing tremendous changes . Ordinary lamp , incandescent , LED lights. It also reflects the progress and development of human society and technology. The current domestic industry gradually towards multi-functional intelligent direction . With the deterioration of the environment to ask questions , the energy reduction . Green energy-saving lamp , getting into peoples lives . Previous use of a single lamp , and now people need a versatile intelligent lamp. So take advantage of the knowledge to design a multi-purpose green lamp is a good direction. This paper describes the design of a lamp -based intelligent PWM dimming . The microcontroller technology and PWM dimming technology combine to achieve a strong regulator station lights . Make use of software to change the duty cycle and thus to change the size of the voltage dimming . Using DS1302 clock chip and single-chip combination to generate time calendar. Using DS18B20 temperature detection chip to detect the ambient temperature. Character LCD with a 1602 chip to display the time , calendar , week, temperature, and light intensity lamp level .Make use of the buzzer and the alarm clock chip to generate timing . So that the lamp has a number of functions. Articles on the overall design ideas were discussed, analyzed the main functions of the system and the system hardware design embodied in block diagram form , carried out a program of selection and demonstration program . Completed the hardware design , describes the composition of each module of the circuit, including the smallest single-chip systems, liquid crystal display circuit , clock circuit , buzzer circuit, the temperature detection circuit , lighting circuits , analysis of the main functions of the chip used in the circuit works each part of the circuit. The design of the hardware and software through the design of each module , and can basically meet the design requirements , to meet peoples daily use of lamp function . Keywords : lamps;multi-function;single-chip;PWM dimming 前 言 随着人类社会的发展能源的消耗,人们和环境资源的矛盾变的越来越尖锐。全球气候变暖日益严峻。如何减少照明用电就作为一个重要的问题提到日程上来。因为照明用电占总能耗的20%.电子技术的发展,更加节能环保的LED的出现,让节能减排变成一种实际行动。LED 比白炽灯节,荧光灯,节能灯还要节约更多的电力。并且环保无污染。能够根据亮度来调节灯光的亮度将会更加节能。但过去所有光源都很不容易实现调光,LED却能够轻易实现调光。有的时候人们需要照明时并不一定需要很亮的亮度,可是又无法去改变,反而浪费了能源。许多的场合都需要能够智能调光的光控系统。像路灯、家庭照明,办公室、商场、学校、工厂这些地方需要进行灯光的亮度的调光,可以预见调光技术的发展必将带来很大的节能减排的效应。 而台灯作为家庭必备物品如果也能实现调光,采用LED照明技术,根据环境亮度来调节亮度,将会达到节能的效果。而且同时拥有闹钟功能,日历功能,温度检测功能,将会给人们的生活带来更大的便利。 论文的主要原理和制作是根据所学的理论知识和在学习期间的电子电路制作过程中所积累的经验,从而进行创作。在查阅大量相关资料的前提下结合任务书以及老师提出的要求和需要达到的效果进行设计。首先利用Proteus软件进行电路图的设计,画出电路原理图。利用单片机编程软件用C语言进行编程。将调试好的源程序下载到Proteus软件单片机中进行仿真。经过一系列的调试仿真。最终达到任务书中的要求。在进行实物的焊接。在实物调试完成后在进行论文的整理,一切按照要求进行。本论文主要的方法就是利用计算机软件进行辅助设计,利用计算机编程软件进行软件设计。 1 设计的总体要求及方案选择 本次设计制作一基于PWM的智能多功能台灯的控制系统,能够通过STC89C52单片机编程实现台灯亮度的调节,并通过显示装置显示出时间,日期,星期,台灯亮度,并且能够进行闹钟定时,能够进行环境温度的检测。功能要求:台灯能够自动调整光强亮度,检测环境温度,显示日历等。硬件要求:整个系统的硬件部分包括单片机,键盘、显示和信号输出等。 1.1 调光技术的选择 目前常见的按照常规技术的应用有以下三种方案可供选择 方案一:采用直流电源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℃。 该多功能 LED 台灯系统采用20 只5mm 高亮白光LED 灯珠为光源,以 单片机为主控芯片,由LED 恒流驱动系统、时钟系统、测温系统、液晶显示系统、蜂鸣系统、按键系统组成。系统结构框图如图.1 所示。 该系统可具体实现LED 台灯的10 级PWM 调光控制;液晶屏实时显示时钟、日历与环境温度信息;闹钟功能采用声报警方式,即一旦到达闹钟时间,LED 台灯出蜂鸣声报警,以唤醒用户;用户通过按键系统实现对时钟日历与闹钟参数的设置、LED 亮度的调节以及闹钟报警的解除。 图2.1 系统结构框图 2.2 单片机主控系统 本设计主控系统采用高性能 芯片实现,其P0 口外接10K 的上拉电阻,P0.0~P0.7 液晶1602 的数据接口P2.6~P2.7 则需要分别连接液晶1602 的使能端EN、数据/命令选择端RSP2.4 作为蜂鸣器控制端。P3.0 作为DS18B20 的信号输入端。P3.1、P3.4、P3.5、P3.6 与P3.7 作为S2~S6 按键系统。P1.1 作为PWM 信号的输出端并连接PT4115 芯片DIM 端,用于PWM 调光控制。系统晶振电路由12MHZ 晶振与两个30PF 电容组成;复位电路则由S1 按键、1K 电阻与0uF 电解电容构成。电路如图所示。 2.3 恒流驱动系统 本LED 光源采用相互并联方式,共由20只高亮度小功率LED 组成;每只LED 灯珠的压降约3.1V,工作电流约20mA.由白光LED 的正向伏安特性可知,当LED 端电压超过其正向导通电压后,较小的电压波动都会导致工作电流的的剧烈变化,从而影响LED 的正常使用,固LED 宜采用恒流驱动方式。因此,本设计LED 采用高性能PT4115 恒流芯片驱动Ω的上拉电阻(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 恒流驱动电路如图23 所示 图.3 LED 恒流驱动系统电路图 PT4115 恒流驱动输出的电流值计算公式为: I =(0.1×D)/ Rs (D 为方波信号占空比,Rs 为限流电阻。 由于本设计LED 光源采20只小功率白光LED 灯珠并联方式,且每只LED 灯珠额定电流为20mA,则PT4115 恒流驱动输出最大电流I 应为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亮度最高。其调光原理如图4 所示; 图.4 PWM 调光原理图 2.4DS1302时钟芯片。此芯片通过程序的读写提供年月日,时间,星期,达到显示时间日历的目的。此芯片引脚,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时,则屏幕的左上角显示一条短亮线FFH)=FFH时,则屏幕的右下角显示一条短亮线EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由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,由于各自片选信号不同,选中时操作对应芯片将不会造成操作冲突。P2.51602液晶的使能端EP2.7 连接1602液晶的数据/命令选择端RSRW接地。第3 引脚为液晶显示对比度调节端,通过10K 滑动变阻器接地,用于调节液晶的显示亮度。第15 管脚背光源正极BLA通过10 欧电阻接地,第16 管脚背光源负极BLK 接地。该液晶接口电路如图6 所示。 图.6 液晶系统电路图 2.6 温度检测系统 温度检测选用DALLAS 公司“一线,该传感器具有微型化、低功耗、高性能等优点,可直接将温度转化成串行数字信号处理,测温范围为-55125℃,最高分辨率可达0.0625℃。DS18B20 共有三个引脚电源正VCC、电源负GND 和信号输入输出口DQ.R3 为4.7K 的上拉电阻,用于保证单片机与DS18B20 通讯时高低电平准确的被单片机机和DS18B20 识别。单片机P3.0 口通过R3 连接DQ 端口实现温度数据的采集处理,并通过液晶屏实时显示。温度检测电路如图所示。 图.7 温度检测电路图 DS18B201)ROM? 只读存储器,智能调光面板原理用于存放 DS18B20ID 编码,其前 8 位是单线 位是芯片唯一的序列号,最后 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的通断实现对蜂鸣器声音控制;通过延迟函数实现蜂鸣报警声的长短音控制,长音‘滴’用于闹钟铃声,短音‘滴’用于按键提示音。蜂鸣系统电路如图8所示。 图蜂鸣系统电路图 2.8 按键系统 按键控制系统由S2~S 五个按键组成,分别为S2 时间设置键、S3 数值增大键、S4 数值减小键、S5 闹钟设置键以及S6 亮度调节键。S2 用于选择需要调整的时间日历以及闹钟参数,并作为时间日历参数的存储确认键。S3 与S4 用于调整被选参数值的大小。S5 用于闹钟查看与存储确认键。S6 用于LED 灯光10 级亮度的调节键。按键系统电路如图 图 按键系统电路图 2.9本系统设计最大功率约1.6W,可采用电池或稳压电源多种方式供电。由于系统光源采用20 只LED 灯珠并联组成,所以LED 恒流驱动芯片PT4115 供电电源在6~30V 电压范围内均可使LED 灯正常使用。但单片机供电系统采用三端稳压芯片7805,该线性稳压芯片正常工作输入电压与输出电压差值应至少高于2V,若差值过大会增加额外功耗。因此,本系统宜选用稳压电源方式供电。同时,本文LED 恒流驱动系统设计简洁灵活,可根据用户需求适当调整驱动电路参数,即可扩展LED 照明功率,最大可至10W左右。 图2.10 直流稳压电源 3 系统软件设计 该系统控制程序主要包含系统初始化程序、实时时钟芯片处理程序、度传感器芯片处理程序、液晶显示程序、键盘检测与处理程序、闹钟中断以及定时器产生PWM 程序构成。 3.1 系统主程序 PWM调光处理程序等。程序中设置闹钟标志位Flag_ri,一旦闹钟时间到达,时钟芯片IRQ引脚触发外部中断0,进入中断程序则置Flag_ri=1,用于主程序中闹钟报警的判断与处理。系统主程序流程图如图3.1 所示。 图主程序流程图 3.2 按键检测和处理程序 图按键检测与处理流程图 3.3中断程序 DS1302 时钟芯片SCLK引脚输出由高电平变为低电平,作为单片机P3.2 口INT0 中断的申请输入,并可通过读取DS1302 芯片的C 寄存器来清除SCLK引脚输出。因此,将外部中断INT0 设置为负跳变沿触发中断,并设置闹钟标志位Flag_ri,闹钟时刻到达时设置Flag_ri=1,用于主程序中的闹钟报警处理。闹钟中断程序如图3.3所示。 图中断流程图 3.4μ S 的定时中断。乐橙国际lc8,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所示。 图 定时器生成PWM流程图 3.5C语言进行程序设计,要比汇编语言好。在程序编写的过程中需要做到认真仔细,程序的编写是个比较大的一个工程。在这个过程中会遇到许多的问题,需要一一解决。程序编写也是论文设计过程中最重要的一个环节,因为硬件和软件是不可能脱离的。两者都能成功并且结合到一起才能实现论文的要求。SP(In-System Programming)是当今流行的单片机编程模式。可在线系统编程的意思是指电路板上的可编程下载的空白元器件可以直接编程写入最终用户代码,而不需要从电路板上取下可重复编程逻辑器件[7]。已经编程的器件也可以用ISP方式擦除或再编程。在完成编写程序的编译通过之后,把可以烧写STC89C52的ISP编程器并与电脑主机硬件连接后,打开相应下载软件按步骤即可对STC89C52芯片进行程序烧录下载。烧录完成成功后会有提示。重新通电即可测试和运行电路。 4软件的调试和仿真 当完成电路图的设计和程序的编写,我们的实验并不能马上进行实物焊接,还需要进行最重要的一步那就是实验的仿真,只有通过仿真才能先发现问题和不足,有利于改正错误,改进实验。从而达到比较好的一种实验要求和实验效果。所选用的Proteus仿真软件不仅能进行单片机电路的设计也能进行单片机的仿真。Proteus仿真软件功能强大能满足多数任务的要求,将编写好的C语言程序下载到软件当中。调试好电路图就可以进行仿真。在仿真的过程中并不会一次性的就能够取得成功。需要在不断的调试过程中去改进。从而达到实验要求。控制电路的安装与测试在整个系统研制中占有重要位置,它是把理论付诸实践的过程,也是把纸面电路设计转变为实际产品的必经阶段。Proteus仿线 电路仿真图 由此仿真图可以看到电路设计满足设计要求。能够显示温度,时间,日期,灯光亮度能够进行闹钟定时,能够形成PWM脉宽调制波形进行台灯亮度调节。此仿真结果说明电路和程序是可行的。 5 硬件的组装与调试 5.1元器件的选择与测量 本次设计的元器件主要有:电阻、电容、PNP9012型三极管、STC89C52单片机、蜂鸣器,DS18B20温度检测芯片.DS1302时钟芯片,1602液晶显示芯片,PT4115恒流驱动芯片[13]。这些元器件的引脚需要我们认真查找资料,了解每个器件的特性去进行焊接。其中,这些元器件直接根据型号到电子元器件市场就很容易买到。但电阻我们要测量出它的真实值是否准确,这用万用表直接测量就行,也可以根据色环来读数。电容上面直接就标着数示,二极管和三极管需要我们正负极性。三极管需要我们判断出它的基极、集电极、发射极。 5.2 电子元器件的焊接与组装 组装电路通常采用焊接和在面包板上插接两种方法,无论采用哪种方法均应注意以下几方面。 所有元器件在组装前应尽可能全部测试一遍,以保证所用元器件均合格。 所有集成电路的组装方向要保持一致,以便于正确进行焊接合理安排布线) 分立元件时应仔细辨明器件的正反向,标志应处于比较容易观察的位置方便检查和调试。对于有正负极性的元件,例如电解电容器、晶体二极管等,组装时一定要特别注意极性,否则将会造成实验失败。 (4) 为了便于焊接查线以及后期的检查电路,可根据电路中接线的不同作用选择不同颜色的导线。一般习惯是正电源用红色线、负电源用蓝色线、地线用黑色线、信号线) 在实际焊接中连线需要尽量做到排版简洁连线方便。连线不跨接集成电路芯片上,必须从其周围通过。同时应尽可能做到连线不相互穿插重叠、尽量不从电路中元器件上方通过。 (6) 为使电路能够正常工作与调测,所有地线必须连接在一起,形成一个公共参考点。 正确的组装方法和合理的布局,不仅可使电路整齐美观、工作可靠,而且便于检查、调试和排除故障。如果能在组装前先拟订出组装草图,则可获得事半功倍之效果,使组装既快又好。 5.3电子电路的调试 调试是指系统的调整、改进与测试。测试是在电路组装后对电路的参数与工作状态进行测量,调整则是在测试的基础上对电路的某些参数进行修正,使满足设计要求。在进行调试前应拟订出测试项目、测试步骤、调试方法和所用仪器等,做到心中有数,保证调试工作圆满完成。 5.3.1 调试方法 调试方法原则有两种。第一种是边安装边调试的方法。它是把复杂的电路按原理框图上的功能分成单元进行安装和调试,在单元调试的基础上逐步扩大安装和调试的范围,最后完成整机调试。这种方法在新设计的电路中比较常用。第二种方法是在整个电路系统全部焊接完毕后,实行一次性调试。这种方法比较适用于电路相对来说比较简单,系统不复杂的电路调试。 5.3.2 调试步骤 (1)通电前检查 电路焊接完毕后, 不要急于通电,首先要根据原理电路认真对照检查电路中的接接线是否正确,包括错线(连线一端正确、另一端错误),智能调光面板图标少线(安装时漏掉的线),多线(连线的两端在电路图上都是不存在的)和短路(特别是间距很小的引脚及焊点间),并且还要检查每个元件引脚的使用端数是否与图纸相符。查线时最好用指针式万用表“Ω×1”档进行检查, 或是用数字万用表“Ω”档的蜂鸣器来测量,而且要尽可能直接测量元器件引脚,这样同时可以发现接触不良的地方。 (2)通电观察 在电路安装没有错误的情况下接通电源(先关断电源开关,待接通电源连线之后再打开电路的电源开关)。但接通电源后不要立即进行电路功能的测试,首先要充观察整个电路有无异常现象,电路中元器件是否有发热烧坏等现象,是否有漏电现象,电源是否有短路和开路现象等。如果电路在测试过程中出现异常,首先应该立即关闭电源,检查后排除故障再重新通电测试。然后再按要求测量各元器件引脚电源的电压,而不只是测量各路总电源电压,以保证元器件正常工作。 (3)单元电路调试 在调试单元电路时应明确本部分的调试要求。调试顺序应按照电路原理图中信号流向进行,这样可以把整个电路进行分步调试,把前面调试好的电路的输出信号作为后一级电路的输入信号。从而保证电路的调试更加顺利方便。 单元调试包括静态和动态调试。静态调试一般是指在没有外加信号的条件下测试电路各点的电位,特别是有源器件的静态工作点。通过它可以及时发现已经损坏和处于临界状态的元器件。动态调试是用前级的输出信号或自身的信号测试单元的各种指标是否符合设计要求,包括信号幅值、波形形状、相位关系、放大倍数和频率等。对于信号产生电路一般只看动态指标。把静态和动态测试的结果与设计的指标加以比较,经深入分析后对电路与参数提出合理的修正。在调试过程中应有详尽记录。 (4)整机联调 各单元电路调试好以后,并不见得由它们组成的整体电路性能一定会好,因此还要进行整体电路调试。整体电路调试主要是观察和测量动态性能,把测量的结果与设计指标逐一对比,找出问题及解决办法,然后对电路及其参数进行修正,直到全部电路的性能完全符合设计要求为止。 单片机是本设计的核心控制器,只有保证单片机的正常工作才能完成程序的运行才能对显示电路、PWM调光电路,测温电路,蜂鸣器电路的控制。保证单片机最小系统能够正常工作是前提。判断办法就是用万用表测量单片机时钟引脚(18、19脚)的对地电压,以正常工作的单片机用数字万用表测量为例:18脚对地约2.24V,19脚对地约2.09V。对于怀疑是复位电路故障而不能正常工作的单片机也可以采用模拟复位的方法来判断,单片机正常工作时第9脚对地电压为零,可以用导线V连接一下,模拟一下上电复位,如果单片机能正常工作了,说明这个复位电路有问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件上出现的问题。或者在软件测试过程中采用模块化的测试方法,使整个系统测试显得更加有条理性。通过RS232和PC机进行连接,利用PC测试助手进行测试。测试过程中把单片机和PC机的波特率设置为相同值(如9600bit/s)。验证上位机和下位机接收正常。我们把测好的软件导入连接好的硬件中,在把所出现的问题都调整解决过来,因而整个系统就测试通过。 在焊接好电路板进行测试的时候。我们的实验电路不能输出正常的信号。于是我们按照正常的检查步骤进行检查,首先检查线路是否有问题,当检查过后我们发现线路没有问题。于是检查是否是焊接的问题,焊接也没有问题,最后检查元器件在焊接过程中是否损坏。在数字实验室我们对所有使用的元器件进行检查一步一步测试。发现元器件没有任何问题,能够正常的表现逻辑功能。但是最后的功能还是不能够实现,这就是说明了我设计的电路还是有问题的,由于自己焊接的电路,或许是自己的思维模式已经定格了。不能够检查到问题的存在。最后让焊接的电路板让同学帮忙检查。在同学的检查下还是不能发现问题的所在。电路设计和连接都是没有问题的。可是问题出现在哪个部分呢。最后同学发现我的单片机最小系统的晶振电路有问题,晶振电路的两个30PF的电容出现饿了问题。原来我自己在焊接的过程中把电容用错了。本来是该用30PF的电容但是我用成0.01UF的电容了,最后导致了电路功能不能实现。当我把电路中焊接错误的电容换掉以后通过不断的调试最后电路能正常表达。实现功能要求。 可以看到在电子电路焊接的过程中,是不允许有一点粗心大意的,否则一个小小的电容也能导致整个实验的失败。 总 结 毕业设计是学生即将完成学业的最后一个重要环节,它既是对学校所学知识的全面总结和综合应用,又为今后走向社会的实际操作应用铸就了一个良好的开端。所以我们在此有必要对这次的毕业设计作一个系统的总结。 做毕业设计,这对于自己来说是一个全新的学习内容。也是一个非常大的挑战。在这次的毕业设计中,自己学到了许多知识。不仅温习了理论知识并使其有了很大的升华,而且也锻炼了自己的动手能力和综合问题的分析能力,自己也成长了许多,这将为自己今后的工作积累很多宝贵的经验。当老师把课题布置下来之后,认真的查阅许多资料。认真了解课程设计的一切相关知识。本次毕业设计论文首先对整个系统的工作原理和实现方法进行了简单的介绍,给出了系统工作的整体原理框图。在此基础上,介绍了系统设计用到的各个模块的功能特性,并进性了方案论证,最后选择出了最优的设计方案。我在理论上对整个系统有一定了解的情况下,进行了系统模块的电路的设计,充分利用我所学过的模电、数电、单片机、C语言、传感器与检测技术等知识。在本次设计的过程中自己遇到了很多困难。过去几年所学知识有所生疏,首先把模电、数电、单片机、C语言、传感器与检测技术的教材从头到尾又认真地看了一遍。然后我去学校的图书馆和电子阅览室查阅关于本次毕业设计的资料,自己还不断地向老师、同学请教,以确保设计的电路系统完整,并能实现最完美的系统功能。 用本次毕业设计来验证书本中所学习的内容,不仅能够让我们巩固以前所学习的知识,更能学习到许多课本以外的知识。论文设计需要综合考虑每种电路的优缺点,以及整体电路的需求。而关于电子元器件的选择我们更是查阅了许多资料。材料的选择参数的计算很重要,这直接关系到本次实验能否获得成功。对于电路的仿真实验,我做了许多摸索,仿真软件自己在以前接触的比较少,用的也不是很熟悉。经过一段时间的练习能够基本操作仿真软件了。并对 Proteus仿真软件有了进一步的了解。最后我设计出了各个部分模块的电路图,并实现了电路图的组合。经过不断地测试和调试,以及与指导老师和同学的沟通与交流,最终完善了硬件电路的设计,我所设计的电路在Proteus仿真软件上仿真成功。本次毕业设计经历了设计阶段、开发实现阶段以及最后的应用测试阶段。经过2个月的努力,核心问题已经全部解决,所有功能均已基本实现,能够显示日期,时间,星期,温度,灯光亮度,能够进行调光,进行闹钟定时。并基本上能够实现本次毕业设计的设计要求。 致 谢 在毕业设计论文即将完成之际,我首先向关心、帮助、指导我的导师曹卫锋教授,郑安平教授表示衷心的感谢并致以崇高的敬意! 在这四年的大学生活中,自己学到了很多知识,动手、动脑能力以及综合问题的分析能力有了很大提高。这除了自己的努力外,还与电气工程学院辅导员和自动化办公室的各位老师的辛勤帮助、热心鼓舞、积极开导是分不开的。谨向各位老师们致以衷心的感谢和崇高的敬意!本课题在选题及设计过程中一直得到曹老师和郑老师给我的指导。当我在设计中遇到困难时我就及时向曹卫锋老师和郑安平老师询问。老师们以其渊博的学识、务实的工作作风和他们饱满的工作热情以及对我的耐心指导和严格要求给我留下了深刻的印象,使我的综合能力得到了很大提高。老师们待人诚恳,以及勤奋不辍的精神将使我终生受益,是我终生学习的榜样,在此向他们致以最诚挚的谢意。 在此,还要感谢和我在一起设计讨论的同学,正是由他们的的帮助,我才能顺利完成毕业设计。感谢你们给予我的帮助并且对于我遇到的每个问题你们都给予热心、耐心的解答,使我受益匪浅。 最后,我要向在百忙之中抽时间对本文进行审阅、评议的老师表示衷心的感谢! 参考文献 [1] 颜重光.LED灯具低压驱动技术[J].电子设计应用,2008 [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单片机应用设计与仿真--基于Keil C与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] AT89C51 DATA SHEEP Philips Semiconductors 1999.dec [19] 王水平. PWM 控制与驱动器使用指南及应用电路[M].西安:西安电子科技大学出版[20]Yang. Y., Yi. J., Woo, Y.Y., and Kim. B.: ‘Optimum design for linearityand efficiency of microwave Doherty amplifier using a new loadmatching technique’, Microw. J., 2001, 44, (12), pp. 20–36 [21] Vizimuller,P.‘RF design guide-systems, circuits, and equations’ (ArtechHouse, Boston, MA, 1995) [22] R. Dye, “Visual Object-Orientated Programming,” Dr. Dobbs Macintosh Journal, Sept. 1st ( 1991). 附录1 电路实物图 附录2 电路原理总图 附录3 电路程序清单 #include STC89C52.h #include intrins.h //_nop_();延时函数用 #define uint unsigned int #define uchar unsigned char uchar hour_set=17,min_set=1;//设定的蜂鸣器提示时间 bit alarmflag=1;//报警标志位 uchar THTIME0=(8192-400)/32; uchar TLTIME0=(8192-400)%32;//规定初始PWM高电平时间 uchar set_pwmtime=5;//设定的PWM占空比 uchar pwmtime;//当前的PWM的定时器值 /****************************************************************/ /*延时程序 /****************************************************************/ void delayms(unsigned int ms) { unsigned int x; for(;ms;ms--) //ms=0 则跳出 for(x = 1000;x;x--); } #include intrins.h //_nop_();延时函数用 //*****************// //以下是DS18B20驱动程序 //*****************// /************************************************** ** 功能描述: DS18B20驱动程序,使用12M晶体 ** DQ占用引脚资源P1^7 ****************************************************/ sbit DQ=P3^0; //温度输入口 unsigned char data temper_data[2]={0x00,0x00}; //读出温度暂放 unsigned char data _1820display[9]={0x00}; //显示单元数据,共4个数据和一个运算暂用 unsigned int temper; //**************温度小数部分用查表法***********// unsigned char code ditab[16]= { 0x00,0x01,0x01,0x02, 0x03,0x03,0x04,0x04, 0x05,0x06,0x06,0x07, 0x08,0x08,0x09,0x09 }; /*****************11us延时函数*************************/ // void _18B20_delay(unsigned int t) { for (;t0;t--); } /****************DS18B20复位函数************************/ _18B20_reset(void) { char presence=1; while(presence) { while(presence) { DQ=1; _nop_();_nop_();//从高拉倒低 DQ=0; _18B20_delay(50); //550 us DQ=1; _18B20_delay(6); //66 us presence=DQ; //presence=0 复位成功,继续下一步 } _18B20_delay(45); //延时500 us presence=~DQ; } DQ=1; //拉高电平 } /****************DS18B20写命令函数************************/ //向1-WIRE 总线_write(unsigned char val) { unsigned char i; for(i=8;i0;i--) { DQ=1; _nop_();_nop_(); //从高拉倒低 DQ=0; _nop_();_nop_();_nop_();_nop_(); //5 us DQ=val //最低位移出 _18B20_delay(6); //66 us val=val/2; //右移1位 } DQ=1; _18B20_delay(1); } /****************DS18B20读1字节函数************************/ //从总线个字节 unsigned char _18B20read_byte(void) { unsigned char i; unsigned char value=0; for(i=8;i0;i--) { DQ=1; _nop_();_nop_(); //从高拉倒低 value=1; DQ=0; _nop_();_nop_();_nop_();_nop_(); //4 us DQ=1; _nop_();_nop_();_nop_();_nop_(); //4 us if(DQ)value=0x80; _18B20_delay(6); //66 us } DQ=1; return(value); } _18B20_read() //读出温度函数 { _18B20_reset(); //总线xcc); //发命令 _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=tempertemper_data[0]; // 两字节合成一个整型变量。 return temper; //返回温度值 } /****************温度数据处理函数************************/ //二进制高字节的低半字节和低字节的高半字节组成一字节,这个 //字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩 //下的低字节的低半字节转化成十进制后,就是温度值的小数部分 /********************************************************/ _18B20_work(unsigned int tem) { unsigned char n=0; if(tem6348) // 温度值正负判断 { tem=65536-tem; n=1; } // 负温度求补码,标志位置1 _1820display[4]=tem // 取小数部分的值 _1820display[0]=ditab[_1820display[4]]; // 存入小数部分显示值 _1820display[4]=tem4; // 取中间八位,即整数部分的值 _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); //Skip ROM _18B20_write(0x44); //发转换命令 } //*****************// //以下是LCM1602驱动程序 //*****************// /************************************************** ** 功能描述: 1602驱动程序,使用12M晶体 ** 占用引脚资源数据口八位,命令控制两位 ****************************************************/ sbit LCD_RS = P2^7; sbit LCD_E = P2^6; #define LCD_DATA P0 /************************************************** ** 函数名称: delay ** 入口参数:h(unsigned int型) ** 出口参数:无 ** 功能描述: 短暂延时,使用11.0592晶体,约0.01MS ****************************************************/ void delay(unsigned int z)//1毫秒延时子函数 { unsigned int x,y; for(x=z;x0;x--) for(y=110;y0;y--); } /************************************************** ** 函数名称: WriteDataLcd ** 入口参数:wdata(unsigned char型) ** 出口参数:无 ** 功能描述: 写数据到LCD ****************************************************/ void WriteDataLcd(unsigned char wdata) { LCD_RS=1; LCD_DATA=wdata; delay(1); //短暂延时,代替检测忙状态 LCD_E=1; delay(1); //短暂延时,代替检测忙状态 LCD_E=0; } /************************************************** ** 函数名称: WriteCommandLcd ** 入口参数:wdata(unsigned char型) ** 出口参数:无 ** 功能描述: 写命令到LCD ****************************************************/ void WriteCommandLcd(unsigned char wdata) { LCD_RS=0; LCD_DATA=wdata; delay(1); //短暂延时,代替检测忙状态 LCD_E=1; delay(1); //短暂延时,代替检测忙状态 LCD_E=0; } uchar code hanzi[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, //年 }; void writeCG() //允许写入中文汉字 { uchar x,y; WriteCommandLcd(0x40); for(y=0;y3;y++) { for(x=0;x8;x++) { WriteDataLcd(hanzi[y][x]); } } } //LCD初始化 void lcd_init(void) { LCD_E=0; writeCG(); //允许写入中文汉字 WriteCommandLcd(0x38); WriteCommandLcd(0x38); //显示模式设置 WriteCommandLcd(0x0c); //光标无 WriteCommandLcd(0x06); //显示光标移动设置 WriteCommandLcd(0x01); //显示清屏 WriteCommandLcd(0x90); //显示开及光标移动设置 } /************************************************** ** 函数名称: display_xy ** 入口参数:x(unsigned char型),y(unsigned char型) ** 出口参数:无 ** 功能描述: 设置光标位置, x是列号,y是行号 ****************************************************/ void display_xy(unsigned char x,unsigned char y) { if(y==1) x+=0x40; x+=0x80; WriteCommandLcd(x); } /******************************************************************** ** 函数名称: display_char ** 入口参数:x(unsigned char型),y(unsigned char型),dat(unsigned char型) ** 出口参数:无 ** 功能描述: 在具体位置显示单个字符,x是列号,y是行号 /*********************************************************************/ void display_char(unsigned char x,unsigned char y,unsigned char dat) { display_xy(x,y); WriteDataLcd(dat); } /********************************************************************* ** 函数名称: display_string ** 入口参数:x(unsigned char型),y(unsigned char型),s(指针型) ** 出口参数:无 ** 功能描述: 在具体位置显示字符串,以/0结束,x是列号,y是行号 **********************************************************************/ void display_string(unsigned char x,unsigned char y,unsigned char *s) { display_xy(x,y); while(*s) { WriteDataLcd(*s); s++; } } #define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C #define DS1302_YEARH 0xC0 #define DS1302_WRITE 0x8E #define BCD2DEC(X) (((X&0x70)4)*10 + (X&0x0F)) //用于将BCD码转成十进制的宏 #define DEC2BCD(X) ((X/10)4 (X%10)) //用于将十进制转成BCD码的宏 #define BD(t) (t = t%16+t/16*10) //BCD码转十进制 #define DB(t) (t = t%10+t/10*16) //十进制转BCD码 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; sbit DS1302_CLK = P1^6; //实时时钟时钟线; //实时时钟数据线; //实时时钟复位线引脚 sbit Up = P3^4; //加法按钮 ! sbit Down= P3^5; //减法按钮 sbit Set = P3^1; //模式切换键 sbit out = P3^3; //立刻跳出调整模式按钮 char done,count,temp,up_flag,down_flag,hideflag=10,week_value[2]; //done:1:进入调整模式,0:正常模式 //count 切换闪烁位(位置变量) //temp: 闪烁位变量值 //up,downflag: 按键加减标志位。 //hideflag,控制闪烁频率 char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数 typedef struct SYSTEMTIME { unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char YearH; unsigned char YearL; unsigned char day; unsigned char month; unsigned char year; unsigned char DateString[14]; unsigned char TimeString[10]; } SYSTEMTIME; //定义的时间类型 SYSTEMTIME CurrentTime; // void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数) { uchar i; ACC = d; for(i=8; i0; i--) { DS1302_IO = ACC0; //相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; } } uchar DS1302OutputByte(void) //实时时钟读取一字节(内部函数)

  请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。用户名:验证码:匿名?发表评论

返回顶部