智能电热水器控制器_第1页
智能电热水器控制器_第2页
智能电热水器控制器_第3页
智能电热水器控制器_第4页
智能电热水器控制器_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、-摘要热水器是一种可供浴室,洗手间及厨房使用的家用电器。目前市场上热水器主要品种有电热水器、太阳能热水器、燃气热水器。就中国的具体情况而言,由于太阳能热水器的使用受天气原因的限制,使用围狭窄;燃气热水器由于以石油、天然气为燃料,而燃料供给量又难以满足人们日益增长的需求,且不利于环境,因此电热水器越来越受到消费者的青睐。市场上传统的机械式电热水器控制功能不完善 ,而且精度低、可靠性差,生活质量的提高使得消费者对电热水器要求越来越趋向于智能化和数字化,因此智能家用电热水器出现满足了群众的需求。它采用智能控制器为控制中心,具有抗干扰能力强 ,工作可靠稳定,自带flash闪存等特点,完全满足高性能的电

2、热水器的控制要求能。智能家用电热水器控制器有对温度准确控制,可靠的水位采集电路,防止干烧,时间设定等等功能。我们考虑到家电业的剧烈竞争,节约生产本钱,智能家用电热水器控制器的设计主要采用简单的器件:如51单片机,液晶屏显示12864,ADC0809等配件构成,与C语言软件编程相结合;充分利用外围功能,以提高产品的性价比,稍加改良,便能以较低本钱应用于实际批量生产中。【关键词】智能控制器、功能、设计目录第一章设计方案1.1 设计思想61.2 实现功能6第二章硬件设计2.1 智能控制器的核心 72.2 矩阵式键盘按键功能92.3 液晶屏显示局部 10 2.4 A/D转换模块 102.5 水温及水位

3、检测电路 112.6 漏电检测及报警电路 112.7 加热及继电器失控保护电路 11第三章 软件设计3.1智能控制器子程序设计123.2主程序流程图13总结14参考文献14附录15第一章 设计方案1.1 设计思想智能电热水器控制器主体由51单片机组成。时间由单片机部的定时器计数器提供。由温度传感器ADC08098读取外部温度数据并传输到计算机部。由液晶屏12864显示温度、时间,联合控制开关输出想要的数据。输入由接口芯片和串并转换芯片74LS165从单片机的串口输入。1.主体局部由STC89C52单片机组成,单片机外接晶振。作为部定时器的输入脉冲。时钟由部的定时器构成。2 .AD转换由ADC0

4、8098实现,这是集AD转换和串行输出一身的芯片,它能将采集到的温度直接转换成串行信号输入到单片机。3 .输出通道使用电子开关配合光电二极管实现对加热器的控制。4.显示局部分两局部。一局部是由于显示时间一局部是用于显示温度。时间和温度显示当前时间和温度,可以通过转换开关实现当前时间和设定时间的转换。温度也是同理。显示器由七段数码管组成。四个用于显示时间,两个用于显示温度。六个数码管通过一个I/O口扩展芯片8255A与单片机连接。5. 输入设备采用一个I/O接口芯片。使用扫描的方法实现数据的输入。输出的并行数据通过一个并行/串行接口芯片实现串口的输入。6.控制开关,由外部的电子开关直接输入。硬件

5、上使用I/O引脚直接输入。在编程上由程序上直接扫描I/O引脚通过引脚电平的变化转入相应的中断子程序,实现相应的功能。7.输出控制,由电平控制的光电二极管实现。光电二极管直接接到单片机的输出引脚。1.2 实现功能设计的智能电热水器将要实现的功能: 1、对温度准确控制 .采用高性能的温敏电阻实时采集热水器水温 ,将温度信号转变为电压信号后送单片机处理 ,可用高清晰度的数码管进展实时显示 2、可靠的水位采集电路,实时采集水位供查询时进展显示,当水位过低时给出提示并停顿加热,防止干烧。3、开机方式有立即开机和定时开机两种 .24小时任意设定开机时间 .用省时节能的方式准时加热到特定温度,既可免去等待烧

6、水的时间,又避开用电顶峰,节约电费. 4、自动检测热水器是否处于正常工作状态,并具有调温、恒温、防干烧、防超高温、防漏电等多项自检功能,使用户在使用过程中平安更有保障。第二章 硬件设计 2.1 智能控制器的核心我们采用了单片机STC89RC52为智能控制器的控制核心。STC89C52RC单片机:它具有抗干扰能力强 ,工作可靠稳定 ,自带 flash闪存等特点 ,完全满足高性能的电热水器的控制要求 .同时考虑到家电业的剧烈竞争,节约生产本钱,我们用尽量简单的器件实现这些功能,并充分利用外围功能,以提高产品的性价比,稍加改良,便能以较低本钱应用于实际批量生产中。STC89C52RC单片机功能介绍:

7、STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,置4KB EEPROM,MA*810复位电路,三个16 位 定时器/计数器,一个6向量2级中断构造,全双工串行口。另外 STC89*52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停顿工作,允许RAM、定时器/计数器、串口、中断继

8、续工作。掉电保护方式下,RAM容被保存,振荡器被冻结,单片机一切工作停顿,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。 和atmel的比照 ,STC89C52RC单片机有: 8K字节程序存储空间; 512字节数据存储空间; 带4K字节EEPROM存储空间; 可直接使用串口下载; STC89C52RC引脚功能:p0 口:p0口是一个8位漏极开路的双向i/o口。作为输出口,每位能驱动8个ttl逻辑电平。对p0端口写"1”时,引脚用作高阻抗输入。当外部程序和数据存储器时,p0口也被作为低8位地址/数据复用。在这种模式下, p0具有部上拉电阻。在flash编程时,

9、p0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。p1 口:p1 口是一个具有部上拉电阻的8 位双向i/o 口,p1 输出缓冲器能驱动4 个 ttl 逻辑电平。对p1 端口写"1时,部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于部电阻的原因,将输出电流iil。此外,p1.0和p1.2分别作定时器/计数器2的外部计数输入p1.0/t2和时器/计数器2 的触发输入p1.1/t2e*,具体如下表所示。 在flash编程和校验时,p1口接收低8位地址字节。引脚号第二功能p1.0 t2定时器/计数器t2的外部计数输入,时钟输

10、出p1.1 t2e*定时器/计数器t2的捕捉/重载触发信号和方向控制p1.5 mosi在线系统编程用p1.6 miso在线系统编程用p1.7 sck在线系统编程用p2 口:p2 口是一个具有部上拉电阻的8 位双向i/o 口,p2 输出缓冲器能驱动4 个 ttl 逻辑电平。对p2 端口写"1时,部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于部电阻的原因,将输出电流iil。在外部程序存储器或用16位地址读取外部数据存储器例如执行mov* dptr 时,p2 口送出高八位地址。在这种应用中,p2 口使用很强的部上拉发送1。在使用 8位地址如mov* ri

11、外部数据存储器时,p2口输出p2锁存器的容。在flash编程和校验时,p2口也接收高8位地址字节和一些控制信号。p3 口:p3 口是一个具有部上拉电阻的8 位双向i/o 口,p2 输出缓冲器能驱动4 个 ttl 逻辑电平。对p3 端口写"1时,部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于部电阻的原因,将输出电流iil。 p3口亦作为stc89c52特殊功能第二功能使用,如下表所示。在flash编程和校验时,p3口也接收一些控制信号。端口引脚 第二功能p3.0 r*d(串行输入口)p3.1 t*d(串行输出口)p3.2 into(外中断0)p3.3

12、 int1(外中断1)p3.4 to(定时/计数器0)p3.5 t1(定时/计数器1)p3.6 wr(外部数据存储器写选通)p3.7 rd(外部数据存储器读选通)此外,p3口还接收一些用于flash闪存编程和程序校验的控制信号。rst复位输入。当振荡器工作时,rst引脚出现两个机器周期以上高电平将是单片机复位。ale/prog当外部程序存储器或数据存储器时,ale地址锁存允许输出脉冲用于锁存地址的低8位字节。一般情况下,ale仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当外部数据存储器时将跳过一个ale脉冲。对flash存储器编程期间,该引脚还

13、用于输入编程脉冲prog。如有必要,可通过对特殊功能存放器sfr区中的8eh单元的d0位置位,可制止ale操作。该位置位后,只有一条mov*和movc指令才能将ale激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ale制止位无效。psen程序储存允许psen输出是外部程序存储器的读选通信号,当stc89c52由外部程序存储器取指令或数据时,每个机器周期两次psen有效,即输出两个脉冲,在此期间,当外部数据存储器,将跳过两次psen信号。ea/vpp外部允许,欲使cpu仅外部程序存储器地址为0000h-ffffh,ea端必须保持低电平接地。需注意的是:如果加密位lb1被编程,复位时

14、部会锁存ea端状态。如ea端为高电平接vcc端,cpu则执行部程序存储器的指令。flash存储器编程时,该引脚加上+12v的编程允许电源vpp,当然这必须是该器件是使用12v编程电压vpp。 2.2 矩阵式键盘按键功能为了方便智能热水器控制器功能的选择,我们采用矩阵式键盘,矩阵式键盘的工作原理: 按键设置在行、列线交点上,行、列线分别连接到按键开关的 两端。行线通过上拉电阻接到+5V 电源上。无按键按下时,行线处 于高电平的状态, 而当有按键按下时, 行线电平与此行线相连的列 线电平决定。 2行列扫描法原理: 第一步, 使行线为编程的输入线,列线是输出线,拉低所有的列线, 判断行线的变化,如果

15、有按键按下,按键按下的对应行线被拉低,否则 所有的行线都为高电平。 第二步, 在第一步判断有键按下后, 延时 10ms 消除机械抖动,再次读取行值,如果此行线还处于低电平状态则进入下 一步,否则返回第一步重新判断。第三步,开场扫描按键位置,采用逐 行扫描,每间隔 1ms 的时间,分别拉低第一列,第二列,第三列,第四 列,无论拉低哪一列其他三列都为高电平,读取行值找到按键的位置, 分别把行值和列值储存在存放器里。第四步,从存放器中找到行值和列 值并把其合并,得到按键值,对此按键值进展编码,按照从第一行第一 个一直到第四行第四个逐行进展编码,编码值从"0000” 至"1111”

16、 , 再进展译码,最后显示按键。 2.3 液晶屏显示12864液晶一、概述 带中文字库的128*64是一种具有4位/8位并行、2线或3线串行多种接口方式,部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不管硬件电路构造或显示程序都要简洁

17、得多,且该模块的价格也略低于一样点阵的图形液晶模块。 根本特性: l 低电源电压VDD:+3.0-+5.5V l 显示分辨率:128×64点 l 置汉字字库,提供8192个16×16点阵汉字(简繁体可选) l 置 128个16×8点阵字符 l 2MHZ时钟频率 l 显示方式:STN、半透、正显 l 驱动方式:1/32DUTY,1/5BIAS l 视角方向:6点 l 背光方式:侧部高亮白色LED,功耗仅为普通LED的1/51/10 l 通讯方式:串行、并口可选 l 置DC-DC转换电路,无需外加负压 l 无需片选信号,简化软件设计 l 工作温度: 0 - +55 ,

18、存储温度: -20 - +60 模块接口说明*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和"GND用焊锡短接。*注释2:模块部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。2.2并行接口管脚号管脚名称电平管脚功能描述1VSS0V电源地2VCC3.0+5V电源正3V0-比照度亮度调整4RS(CSH/LRS="H,表示DB7DB0为显示数据RS="L,表示DB7DB0为显示指令数据5R/W(SID)H/LR/W="H,E="

19、;H,数据被读到DB7DB0R/W="L,E="HL, DB7DB0的数据被写到IR或DR6E(SCLK)H/L使能信号7DB0H/L三态数据线8DB1H/L三态数据线9DB2H/L三态数据线10DB3H/L三态数据线11DB4H/L三态数据线12DB5H/L三态数据线13DB6H/L三态数据线14DB7H/L三态数据线15PSBH/LH:8位或4位并口方式,L:串口方式见注释116NC-空脚17/RESETH/L复位端,低电平有效见注释218VOUT-LCD驱动电压输出端19AVDD背光源正端+5V见注释320KVSS背光源负端见注释3*注释1:如在实际应用中仅使用并口通

20、讯模式,可将PSB接固定高电平,也可以将模块上的J8和"VCC用焊锡短接。*注释2:模块部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。 *注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。2.4 A/D转换模块A/D转换器。 ADC0809是 8位逐次逼近型 A/D转换器。带 8个模拟量输入通道,芯片带通道地址译码锁存器,输出带三态数据锁存器,启动信号为脉冲启动方式。 C、B、A输入的通道地址在 ALE有效时被锁存。启动信号 START启动后开场转换,EOC信号在START的下降沿10S后才变无效的低电平,这要求查询程序待EOC无效后再开场查询,转换

21、完毕后由OE产生信号输出数据。ADC0809的部构造,由两大局部组成。一局部为输入通道,包括 8位模拟开关,三条地址线的锁存器和译码器,可以实现 8路模拟输入通道的选择。另一局部为一个 8位逐次逼近型 ADC0809的引脚排列:IN0IN7为 8个模拟通道输入端。 START为启动转换信号。EOC为转换完毕信号。 OE为输出允许信号。 CLOCK为外部时钟脉冲输入端,ADC0809的工作频率围 10KHz1280KHz,当频率为 500KHz时,转换速度为128S。ALE为地址锁存允许信号。 A、B、C为通道地址线,CBA的 8种组合状态 000111对应了 8个通道选择。 VREF+、VRE

22、F-为参考电压输入端。 Vcc为+5V电源。GND为接地。ADC0809进展模/数转换,而单片机 AT89C51则完成将 8通道数据转换处理并循环进展显示。 ADC0809的启动信号 START由单片机片选线 P2.7与写信号WR的或非产生,当一条向 ADC0809写操作指令运行后, ADC0809的 START脚产生启动脉冲,开场启动 ADC0809进展模/数转换。 ALE与START相连,即按打入的通道地址接通模拟量输入通道,并启动转换。转换完成后 EOC输出高电平。我们可以利用 EOC信号通知单片机查询法或中断法读入已转换的数据。也可以在启动 ADC0809转换后经适当的延时,再读入已转

23、换的数据。允许信号 OE由读信号 RD与片选线 P2.7或非产生,当一条 ADC0809的读操作指令运行后, ADC0809的 OE脚产生输出允许脉冲,使数据输出。 AT89C51的 ALE脚输出频率为晶振频率的 1/61MHz,AT89C51的 ALE脚与 ADC0809的 CLK脚相连,提供 ADC0809的工作时钟。按图 1接法,ADC0809的片选地址为7FFFH。输出的数据为: Dout=Vin*255/5=Vin*51 ,其中 Vin为输入的模拟电压, Dout为输出数据。2.5水温及水位检测电路热敏电阻将温度信息转换为电压信息,经 A/D转换模块中 PTB0输入 CPU,查表后得

24、到实时水温。水位检测为三个并联的不同阻值的电阻,电路的电极电流较小(几个微安 ),电腐蚀小,适用水电阻变化围大 (几 K一 100K欧)。*电阻所在水位未到达,电阻截止;水位到达,电阻导通,组成并联电路。将不同阻值所分得的电压经 PTB1转换后,可判断出水位信息高、中、低、干烧。 2.6 漏电检测及报警电路热水器工作环境潮湿,为了保证使用者平安,控制器应具备漏电检测功能。检测电路,在正常情况下,流过磁环的电流大小相等,方向相反,磁环检测线圈无感应电流信号,漏电检测集成电路输出低电平。当出现漏电电流时,由了流过磁环的电流不平衡,于是磁环检测线圈感应出漏电信号,经集成电路 M54123L放大输出高

25、电平,经三极管倒相后输出至 CPU。 CPU接收到漏电信号,则停顿加热保温及键盘操作,完毕工程程序并发出报警信号,电源指示灯闪烁警示,蜂鸣器连续呜响。正常情况下, CPU每隔 10ms就发出一个漏电保护可靠性自检脉冲,代替普通漏电开关的试验按钮,控制晶体管导通,于是磁环流过一个大于 10mA的电流,该电流作为模拟漏电信号被磁环检测,经 M54123L放大及三极管倒相后,输出至 CPU。CPU自动判断是否为自检信号以及自检是否合格,有信号则自检合格,继续执行程序;无信号则自检不合格,自动停顿加热保温及键盘操作,完毕工作程序并发出报警信号,电源指示灯闪烁警示,蜂鸣器连续呜响,从而确保电热水器的平安

26、使用。在漏电保护及自检不合格情况下,只有关闭电源及排除故障后,重新接通电源才能工作。 2.7加热及继电器失控保护电路在电热水器正常工作状态下,二继电器动作触点对加热管的电源能执行双极断开,可有效地保证当停顿加热时,加热系统可完全与外电隔离,两只单极继电器同时出现故障的几率是极低的,但在热水器正常寿命期间,单只继电器出现此故障却是极有可能的,而且,此时如不及时处理解决,另一继电器很有可能不久后也跟着产生此类故障而导致真正的危险。因此解决问题的关键是必须在有一继电器出现此故障后,系统可以及时检测到,并依靠另一暂时尚可以正常工作的继电器执行系统的平安保护措施采用如下图的电路,可以有效地检测到两个继电

27、器中任一个或同时两个触点出现粘死、不断开故障时的情况。第三章 软件设计3.1智能控制器子程序设计智能电热水器控制器的系统软件由主程序,中断效劳程序及假设干功能模块子程序组成。其中主控制器子程序包括:A/D转换子程序水位、水温,键盘处理及显示子程序,加热控制子程序使用输出比拟功能,漏电、干烧保护子程序, TBM模块日历钟子程序,数据保存子程序,延时子程序等组成。中断主要有定时中断,键盘输入中断, TIM输入捕捉中断, TBM模块中断等。按键选择子程序主要有按键处理子程序, LCD显示子程序, TBM模块日历钟子程序。终端有定时中断,按键中断, TBM模块中断等。 1主程序。主程序要先初始化系统的

28、工作参数,主要是 CPU 的定时器, COP模块、 A/D转换、端口、键中断等的工作模式参数设定。之后系统主程序循环调用各个功能模块子程序。对相关事件的处理依靠标志位和判断标志位实现。 3、加热控制子程序。判断标志位有否预约、加热标志。之后依流程进展处理。为防止加热丝频繁启动,加热控制采用回差控制,停顿加热后只有实时水温低于目标温度一定温度后,才会再次启动加热丝工作。为满足不同功率要求,加热方式有快速加热和普通两种,在一般情况下及预约状态下均采用普通方式,以控制用电功率。 4、按键按下,设置标志位,并通过动态扫描方式读取键号,之后按标志位及键号利用输出比拟进展编码发送。接收:利用输入捕捉功能获

29、得建好,承受成功后设标志位并读取键号供主程序进展处理。2键盘处理及显示子程序。此程序主要是判断 I/O口的上下电平进展的。有按键按下进入键中断置标志位,等松开后再进展相应的处理。在进展设置及查询操作时会闪烁显示设置及查询结果,否则显示实时水温。5、延时子程序。所有工作多处用到定时及延时子程序键盘判断消抖延时,闪烁显示时的显示及消隐延时,输入捕捉,日历钟等。 6、平安保护子程序。在正常情况下,漏电检测电路输出高电平。一旦出现漏电现象,漏电检测电路输出的电平,引起中断。并以最快速度使漏电保护电路切断整个电源电路,保证使用者平安。当温度过高或水位过低时,自动关加热并开启蜂鸣器向主人报警有异常情况发生

30、。3.2主程序流程图该控制器的功能实现是通过键盘扫描和温度传感器以及水位传感器探针式循环扫描,把信息传递给单片机。通过单片机中已编的程序来控制外部加热装置和进、出水装置的。该控制器的所有功能只需要在键盘上操作就可以完成。首先单片机一直在循环检测温度和水位以及在循环扫描键盘。循环检测温度和水位就是要适时地把当前的水温和水位反映出来。键盘扫描主要是便于适时的承受用户的操作信息,从而就可以到达我们控制和设置水温水位的目的。该控制电路的程序流程图如图17所示:图17 程序流程图设计的程序见附录总结经过几天的辛苦,终于完成了我的智能家用电热水器控制器的设计,虽然没有完全到达设计要求,但从心底里说,还是快

31、乐的,毕竟这次设计把实物都做了出来,快乐之余不得不深思呀!在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。在这次设计的工程中,我们围要题目的关键字着手,开场搜集资料。通过各种渠道开场准备工作,比方:从网络、图书馆搜集相关学术论文、核心期刊、书籍等。通过一个多月的深入学习和研究,搜集了一大堆与毕业设计相关的资料,在教师的指导下,摒弃了一些无关紧要的

32、容,保存了有参考价值的资料作为备用。在中国知网上,我们搜索了一些学术论文和期刊文章;在常见的搜索引擎中,我了解到一些相关的知识,同时,特意浏览了大量的外文,并将这些容列成提纲,便于以后查询,以减少后期工作量。从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。【参考文献】1胡乾斌, 光斌.单片微型计算机原理和应用 M .:华中科技大学,2001.2何立民.单片机应用技术选编M . :航空航天大学.20033光飞,良儿,楼然苗. 单片机C程序设计

33、实例指导M .:航空航天大学.20034郁有文, 常健, 程继红. 传感器原理及工程应用M .:电子科技大学出版.2003.附录智能电热水器控制器电路图智能电热水器控制器程序:*include<at89*52.h> /*包含库函数 */*七段数码,高电平有效,顺序为.gfedcba*/unsigned char led=0,0,0,0;/*将六个LED定义成一个数组,用来显示时、分和秒 */unsigned int counter;/*counter作为定时器中断次数的计数器*/unsigned char n,w=0,flag=0,flag1=0,flag2=0,start=0;

34、/*n为闪烁次数计数器,w为显示位计数器,flag为设置按键计数器,flag1和flag2均为延时消抖计数器,start为启动状态存放器*/unsigned char K1_on=1,K2_on=1; /*K1_on和K2_on分别为开关1和开关2的开启和关断状态存放器*/unsigned char h_data=0,m_data=0,s_data=0;/*时钟的时、分、秒计数器*/unsigned char hdata1_on=0,mdata1_on=3,hdata2_on=0,mdata2_on=7; /*开关1和开关2的开启时间存放器*/unsigned char hdata1_off=

35、0,mdata1_off=5,hdata2_off=0,mdata2_off=9;/*开关1和开关2的关断时间存放器*/void display(void); /*申明显示子程序*/ void delay(unsigned int j) /*定义可变延时子程序*/unsigned int i;for(i=0;i<j;i+);void load_LED(unsigned char H,unsigned char M) /*定义将实际时间代码装LED显示区的子程序,作用是将个位和十位别离开*/ led0=H/10;/*led0装时的十位*/led1=H%10;/*led1装时的个位*/ le

36、d2=M/10;/*led2装分的十位*/led3=M%10;/*led3装分的个位*/ unsigned char H1_set(unsigned char H1) H1=(H1/10+1)*10+H1%10;if(H1>23)H1=H1%10;return H1;/*定义时的十位加1函数*/unsigned char H0_set(unsigned char H0) if(H0%10=3&&H0/10=2) H0=H0/10*10;else H0=H0%10+1+H0/10*10;return H0; /*定义时的个位加1函数*/unsigned char M1_se

37、t(unsigned char M1) M1=(M1/10+1)*10+M1%10;if(M1>=60)M1=M1%10;return M1;/*定义分的十位加1函数*/unsigned char M0_set(unsigned char M0) if(M0%10=9) M0=M0/10*10;else M0=M0%10+1+M0/10*10;return M0; /*定义分的个位加1函数*/void display(void) /*定义显示子程序*/char code num=0*c0,0*f9,0*a4,0*b0,0*99,0*92,0*82,0*f8,0*80,0*90,0*ff;

38、/*定义09的LED显示段码数组,0*00为不显示消隐*/char code tv=0*7f,0*bf,0*df,0*ef,0*f7,0*fb; /*定义位码数组,用于控制显示码送到哪个LED*/unsigned char k,i;switch(flag) /*根据设置所处的模式显示时钟*/ case 0:load_LED(h_data, m_data);break; /*显示时钟*/case 1:load_LED(h_data, m_data);break; /*显示修改时钟设置*/case 2:load_LED(hdata1_on, mdata1_on);break;/*显示设置开关1开启

39、时间设置*/case 3:load_LED(hdata1_off, mdata1_off);break; /*显示设置开关1关断时间设置*/case 4:load_LED(hdata2_on, mdata2_on);break; /*显示设置开关2开启时间设置*/case 5:load_LED(hdata2_off, mdata2_off);break; /*显示设置开关2关断时间设置*/case 6:load_LED(hdata1_on, mdata1_on);break; /*显示设置开关1设置好的开启时间*/case 7:load_LED(hdata1_off, mdata1_off);

40、break;/*显示设置开关1设置好的关断时间*/case 8:load_LED(hdata2_on, mdata2_on);break;/*显示设置开关2设置好的开启时间*/case 9:load_LED(hdata2_off, mdata2_off);break;/*显示设置开关2设置好的关断时间*/default:P1=0*FF;load_LED(h_data, m_data);break;/*其它情况下,显示时钟*/ n+; /*n用来对显示的次数进展计数,以便控制对需要设置的位进展闪烁*/for(k=0;k<4;k+) /*以下为控制被设置位闪烁的程序语句*/if(flag)

41、/*如果处在设置模式,则对设置位进展闪烁显示*/if(n>180)/*每送显示180次则进展一次闪烁*/n=0; if(k=w)/*如果送显示的位是正准备调整的位,则需要闪烁显示,以下两句是控制闪烁显示*/if(n<90)/*以下语句是将LED的七段码送P0口,前90次显示*/ i=ledk; /*将该LED位需要显示的数存于i中*/P0=num10;/*该LED位不显示短时消隐,送消隐段码*/P2=tvk;/*送需要显示的LED位码*/delay(10);/*短时消隐延时,有利于显示位的切换*/ P0=numi; /*将要显示的数字i作为七段码表的序号段码数组下标),取出显示码送

42、显示*/if(k=1) /*如果送显示的LED为分的个位*/P0=numi | 0*80;/*则将分的个显示码附加小数点*/ delay(10); /*显示延时,让LED充分点亮*/ else/*后90次消隐*/ P0=num10;/*送LED消隐段码*/if(k=1) /*如果要消隐的是分的个位*/P0=num10 | 0*80;/*则将分的个位后的小数点点亮小数点不闪烁*/ P2=tvk; /*送消隐的位码即哪个LED需要闪烁*/ delay(10); /*消隐延时,让其充分消隐*/ else /*如果送显示的位不调整的位,则不需要闪烁显示*/i=ledk; /*将该LED位需要显示的数存

43、于i中*/P0=num10;/*该LED位不显示短时消隐,送消隐段码*/P2=tvk;/*送需要显示的LED位码*/delay(10);/*短时消隐延时,有利于显示位的切换*/ P0=numi;/*将要显示的数字i作为七段码表的序号段码数组下标),取出显示码送显示*/if(k=1)/*如果送显示的LED为分的个位*/ P0=numi | 0*80;/*则将分的个显示码附加小数点*/ delay(10); /*显示延时,让LED充分点亮*/else/*如果不是处在设置模式,则正常显示*/ load_LED(h_data, m_data); /*调用将实际时间代码装LED显示区的子程序,别离个位和

44、十位*/ i=ledk; /*将该LED位需要显示的数存于i中*/P0=num10; /*该LED位不显示短时消隐,送消隐段码*/P2=tvk; /*送需要显示的LED位码*/delay(10); /*短时消隐延时,有利于显示位的切换*/ P0=numi;/*将要显示的数字i作为七段码表的序号段码数组下标),取出显示码送显示*/if(k=1)/*如果送显示的LED为分的个位*/ P0=numi | 0*80;/*则将分的个显示码附加小数点*/ delay(10); /*显示延时,让LED充分点亮*/ /*/ void adjust(void)/*调整函数定义*/if(P3_0=0) delay

45、(100); while(P3_0=0) flag1+; display(); /*当调整键按下时,延时消抖,flag1控制延迟时间*/if(flag1>50)flag1=0;flag+; /*用flag对调整键按下次数计数,目的是通过一个按键实现多种功能 */ if(flag>=10)flag=0; switch(flag)/*调整模式选择,原理是通过调整键按下的次数来选择*/ case 0:P1=0*FF;TR0=1;break; /*上电复位时不调整,直接显示时钟,按10次调整键,退出设置模式,回到时钟显示模式 */ case 1:P1=0*FF;P1_0=0;TR0=0;b

46、reak; /*按1次调整键,修改时钟校准 */case 2:P1=0*FF;P1_1=0;P1_3=0;P1_5=0;TR0=1;break; /*按2次调整键,设置开关1开启时间 */case 3:P1=0*FF;P1_1=0;P1_3=0;P1_6=0;TR0=1;break; /*按3次调整键,设置开关1关断时间 */case 4:P1=0*FF;P1_1=0;P1_4=0;P1_5=0;TR0=1;break; /*按4次调整键,设置开关2开启时间 */case 5:P1=0*FF;P1_1=0;P1_4=0;P1_6=0;TR0=1;break; /*按5次调整键,设置开关2关断时

47、间 */case 6:P1=0*FF;P1_2=0;P1_3=0;P1_5=0;TR0=1;break; /*按6次调整键,显示开关1开启时间 */case 7:P1=0*FF;P1_2=0;P1_3=0;P1_6=0;TR0=1;break; /*按7次调整键,显示开关1关断时间 */case 8:P1=0*FF;P1_2=0;P1_4=0;P1_5=0;TR0=1;break; /*按8次调整键,显示开关2开启时间 */case 9:P1=0*FF;P1_2=0;P1_4=0;P1_6=0;TR0=1;break; /*按9次调整键,显示开关2关断时间 */default:P1=0*FF;

48、TR0=1;break; /*/ if(P3_1=0) /*移位控制键,在4个LED上来回移动,选择需要设置的LED位*/delay(100); /*消抖*/while(P3_1=0) display();if(flag)/*当flag不等于0时,说明处于调整状态,此时通过移位键选择调整哪一个LED*/w=w+1; /*移位键控制w加1,用于修改位码,w代表4个LED数码管的*一位*/if(w>=4) w=0; /*/if(P3_2=0) /*加1操作*/ delay(100); /*消抖*/while(P3_2=0)display();if(flag)/*当处于调整模式时,对所选择的LED进展加1*/switch(flag) case 1:if(w=0)h_data=H1_set(h_data);display(); /*校准时间的时、分*/ if(w=1)h_data=H0_set(h_data);display();if(w=2)m_data=M1_set(m_data);display(); if(w=3)m_data=M0_set(m_data);display();break; case 2:if(w=0)hdata1_on=H1_set(hdata1_on);display()

温馨提示

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

评论

0/150

提交评论