首页 多功能数字钟(A题)

多功能数字钟(A题)

举报
开通vip

多功能数字钟(A题)多功能数字钟(A题) 多功能数字钟(A题) 摘要: 本系统以单片机P89C58为核心控制部件。设计电路由实时时钟日历模块、环境温度采集模块、人机接口模块、电源模块等部分组成。其中实时时钟芯片采用串行通讯的DS1302,可实现年月日星期时分秒等时间信息的采集和闹钟功能。温度采集模块采用DS18B20集成温度传感器,可对现场环境温度进行实时采集。人机接口模块中,键盘只由简单的5个按键组成,利用中断扩展的方法实现。操做非常简便和人性化。显示部分则由KXM1602C实现两行16个字符的液晶显示。电源模块自制电源供电(220...

多功能数字钟(A题)
多功能数字钟(A题) 多功能数字钟(A题) 摘要: 本系统以单片机P89C58为核心控制部件。设计电路由实时时钟日历模块、环境温度采集模块、人机接口模块、电源模块等部分组成。其中实时时钟芯片采用串行通讯的DS1302,可实现年月日星期时分秒等时间信息的采集和闹钟功能。温度采集模块采用DS18B20集成温度传感器,可对现场环境温度进行实时采集。人机接口模块中,键盘只由简单的5个按键组成,利用中断扩展的方法实现。操做非常简便和人性化。显示部分则由KXM1602C实现两行16个字符的液晶显示。电源模块自制电源供电(220V),同时还有智能充电装置。 设计能支持年、月、日、星期、时、分、秒的时钟,时钟有时间调整功能,能够每天提供2个以上时间点的闹钟功能。时钟及闹钟具有装卸电池时掉电保护功能,保护时间为永久。时钟附带有一个温度计功能,温度 检测 工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训 精度为0.5度,显示精度为0.1度。设计有自制电源供电(220V)。 除上述基本要求及发挥部分外,又新增以下功能:(1)时间显示可实现12/24显示切换(2)秒表功能,显示精度为0.01(3)倒计时功能 (4)纪念日提醒(5)生日闹钟 (6)闹钟播放音乐 (7)自制电源有全自动充电保护功能 (8)温度过限音乐报警功能 关键字:单片机 人机接口 DS1302 DS18B20 KXM1602C 中断扩展 掉电保护 智能充电保护 目录 TOC \o "1-3" \h \z \u 一、设计任务与要求 3 1、任务 3 2、要求 3 (1)、基本要求 3 (2)、发挥部分 3 二、总体 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 比较与论证 3 三、模块电路 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 与比较 4 1、 时钟方案选择 4 2、 温度采集方案选择 5 3、 显示模块的选择 5 四、各模块电路原理分析及原理图 5 1、 单片机最小系统 5 2、智能充电电路原理及电路图 6 3、时钟模块原理及电路图 7 4、温度采集模块原理及电路图 8 5、显示模块电路原理及电路图 9 6、键盘模块原理及电路图 10 7、闹钟响及报警模块 11 五、软件设计 12 六、系统调试 13 1.硬件调试 14 (1).单片机及外围电路部分 14 (2).充电电路部分 14 2 .软件调试 14 3.软硬联调 15 七、指标测试 15 1.温度采集测试 15 2.时间显示测试 16 八、总结 17 九、参考文献 18 多功能数字钟设计 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 一、设计任务与要求 1、任务 设计制作一个多功能数字钟。 2、要求 (1)、基本要求 (1)设计能支持年、月、日、星期、时、分、秒的时钟。 (2)时钟有时间调整功能。 (3)时钟具有闹钟功能。 (4)时钟及闹钟具有装卸电池时掉电保护功能,保护时间大于5分钟。 (2)、发挥部分 (1)时钟附带有一个温度计功能,温度检测精度高于2度,显示精度为1度 (2)自制电源供电(220V)。 (3)能够每天提供2个时间点的闹钟功能。 (4)其它发挥。 二、总体方案比较与论证  方案一:采用 CPLD作为主控制器控制外围电路进行,时钟控制、温度测量、键盘和LED控制、闹钟实现。此方案逻辑电路复杂,功耗高,灵活性较低。而且采用CPLD价格较贵。 方案二:采用中小规模集成电路实现组合逻辑与时序逻辑电路设计,用振荡器产生的稳定的高频脉冲信号,作为数字钟的时间基准,再经分频器输出标准秒脉冲。进而得到分和小时,计数器的输出经译码器送显示器。此方案能实现数字钟的基本功能,但其他扩展功能的实现非常有限。 方案三:基于51系列单片机来实现。目前单片机技术比较成熟,功能也比较强大,时钟芯片采用DS1302,温度传感器采用DS18B20。显示采用1602液晶显示。此方案基本原理框图如图1所示 图2-1 原理框图 此系统硬件简洁,将复杂的硬件功能用软件实现,控制多个硬件电路的执行因此系统控制灵活,能很好地满足本题的基本要求和扩展要求。而且编程灵活、调试方便。 从这三种电路设计方案的比较而言,利用单片微型计算机及外围电路编写软件程序来设计数字钟,简单灵活,而且可扩展各种功能,能完全达到设计要求,体现了现代计算机工具的方便、简捷、准确性。故采用第三种方案。 三、模块电路分析与比较 1、 时钟方案选择 方案一:使用通过单片机内部的定时/计数器,采用软件实现,可以降低系统成本,缺点是误差较大。一般用在对时间精度 要求不高的场合,而且当出现断电等情况程序重新运行时,需要对时间用按键进行校正。 方案二:在系统中扩展外部时钟芯片DS1302。DS1302时钟芯片内含一个实时时钟/日历电路和32字节静态RAM,可提供秒、分、时、日、日期月、年的信息,每月和闰年的信息可自动调整。通过简单的SPI串行接口,与单片机仅需用复位、数据和时钟三根I/O口线进行通信,同时DS1302可外接备用电源。在主电源关闭的情况下,也能保持时钟的连续运行。完全能满足题目掉电保护功能的要求。 基于以上分析,我们决定采用串行通讯的DS1302。,电路结构简单,程序容易编制,时钟精高,容易调整,具有掉电保护功能。 2、 温度采集方案选择  方案一:使用热敏电阻或温度传感器AD590,把测得的模拟量送入ADC0809的其中一个通道进行A/D转换,将转换后所得数字量送入单片机进行温度值变换之后显示。电路比较复杂。且精度难以保证。 方案二:采用单线数字温度传感器DS18B20,DS18B20具有许多优点,该传感器结构简单,不需外接电路,数据传输采用 one-wire总线,可用一根 I/O数据线即供电又传输数据,在-10 ℃ --+85℃范围内精度为±0.5℃,完全能满足题目±1℃的要求,且分辨率较高,重复性和可靠性好。 经比较方案二完全符合电路设计故在本设计中采用方案二。 3、 显示模块的选择  方案一:采用数码管显示。数码管亮度高、体积小、重量轻,但其显示信息简单、有限,并且需要较高的驱动能力,功耗高,人机交互功能差,较难控制,在本题目中应用受到很大的限制。 方案二:采用液晶显示。液晶显示功耗低,轻便防震。由于本题显示信息比较复杂,采用液晶显示界面友好清晰,操作方便,显示信息丰富。 综合以上两方案,由于系统要显示的信息较多,故本设计中采用方案二。 综上所述,经方案对比,我们采取方案二,在实际设计应用中时钟芯片DS18B20,单线数字温度传感器DS18B20,及液晶显示等,使电路整体结构简单,功能齐全,性能稳定、可靠,设计合理。 四、各模块电路原理分析及原理图 1、 单片机最小系统 单片机系统是整个硬件系统的核心,它即协调整机工作,又是数据处理器,是软硬件系统连接的桥梁,P89C58单片机性能好,价格便宜,其片内含有32KB程序存储器的8位微控制器,P1.0和P1.1还可以分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.0/T2EX),存储器可循环写入/擦除10000次,具有256位内部RAM,32条可编程I/O口线,2个定时器/计数器,具有6个中断源和2个优先级的中断结构,可编程全双工串行通道等功能,因此,我们选用P89C58单片机来满足程序容量大,控制较为复杂的特点,以完成题目的基本要求和发挥部分的要求。具体原理图如图4-1所示。 图4-1 单片机最小系统 2、智能充电电路原理及电路图 充电电路是各部分电路工作的前提,做为发挥部分,我们不仅自己制作电源供电,而且电路为全自动充电保护电路。 利用555时基集成电路,设计一个简单、可靠、实用的全自动充电电路。将555集成时基电路2脚的电压调为5.5V,这样当蓄电池电压低于5.5V时,充电器开始对蓄电池电充电,此时3脚输出电压高于6V;将555集成时基电路6脚 的电压调为6.6V,这样当蓄电池电压高于6.6V时,此时3脚电压输出为零伏,充电器停止对蓄电池电充电。 其中的D1为二极管,型号是IN4007,相当于开关的功能,在电路中起到充电保护的作用。当蓄电池电压低于5.5V时,D1导通,充电器开始对蓄电池电充电;反之,当蓄电池电压高于6.6V时,D1截止,该器件还实现了对蓄电池防过充电的保护功能。其具体的充电电路如图4-2所示。 图4-2 全自动充电保护 3、时钟模块原理及电路图 时钟模块采用时钟芯片DS1302,DS1302是美国 Dallas公司推出的一种高性能、 低功耗、带RAM 的实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达 2.5~5.5V。采用三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节 的时钟信号或 RAM 数据。DS1302内部有一个 31~8 的用于临时性存放数据的 RAM 寄存器。DS1202具有主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。DS1302的引脚如图 4-3: 图4-3 DS1302引脚图 VCC1为后备电源VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由 VCC1或 VCC2两者中的较大者供电。当VCC2大于VCCI+0.2V时,VCC2给 DS1302供电。当 VCC2小于VCC1时,DS1302由VCC1供电。X1、X2为振荡源,外接 32.768Hz晶振。RST是复位/片选线,上电运行时,在 VCC≥2.5V之前RST必须保持低电平。只有在 SCLK为低 电平时,才能将 RST置为高电平。I/O为串行数据输入输出端(双向),SCLK为时钟输入端。DS1302与单片机接口原理图如图4-4: 图4-4 DS1302与单片机接口原理图 4、温度采集模块原理及电路图 DS18B20采用 3脚 PR-35封装 ,其引脚图如图4-5所示。 图4-5 DS18B20引脚图 智能温度传感器 DS18B20将温度传感器 、A/D传感器、寄存器、接口电路集成在一个芯片中,可实现直接数字化输出和测试 ,它的测温范围从-55℃~+l25℃ ,且在-l0℃~+85℃之间温度精度为±0.5℃,并且转换精度可编程控制。 芯片出厂时为默认12位转换精度。DS18B20工作在9位、10位、11位 和 12位模式时的温度分辨依次为0.5℃、0.25℃、0.125℃、0.0625℃。和 DS18B20线连接的微控制器的 l/O 口如无内部上拉电阻,必须在总线上加一个上拉电阻。阻值以5K为佳,DS18B20接收到温度转换命令(44H)后开始转换,转换完成后温度 以16位带符号扩展的二进制补码形式,存储在 scratchpad RAM中的第 0、1字节。在执行读 scratchpad RAM命令(OBEH)后,可将这两字节的温度值通过单总线传给主 CPU。DS18B20的接口原理图如图4-6: 图4-6 DS18B20与单片机接口原理图 5、显示模块电路原理及电路图 KXM1602C是可以显示两行每行显示l6个字符的液晶显示器 。KXM1602C采用8位数据传送,通过单片机的并行接口与液晶显示模块直接连接,单片机通过对这些接口的操作,实现对液晶显示模块的控制,完成相应的显示。使用 LCD做数据显示,一旦数据写入 LCD,数据就会一直显示在液晶屏上,不必像数码管显示那样要定时扫描才能将数据显示,其显示效果远远超过数码管显示。KXM有 16个引 脚可与外界相连,各引脚功能如下: 1脚 Vss:接地; 2脚 Vdd:接+5v电源; 3脚Vo:对比度调整端,LCD驱动电压范围为Vdd~Vo。当Vo接地时,对比度最强; 4脚 RS:寄存器选择端,RS为0时,选择命令寄存器 IR;RS为1时选择数据寄存器DR; 5脚 R/W:读写控制端,R/W 为 1时,选择读出;R/W 为 0时,则选择写入 ; 6脚 Enable:使能控制端,Enable为 1时,使能 ; Enable为 0,禁止 ; 7脚~14脚 DO~D7:数据总线; 15脚 LED+:背景光源,接 +5V; 16脚 LED-:背景光源,接地; KXM1602C与单片机接口原理图如图4-7: 图4-7 KXM1602C与单片机接口原理图  6、键盘模块原理及电路图 本系统只有五个按键,操作非常简单人性化,为了提高CPU的工作效率,采用中断工作方式,同时采用中断也有一部分防抖功能,键盘设计方案原理图如图4-8所示,当无键按下时,5个口线均为高电平,中断入口INT0为高电平,因而不会产生中断,当其中任何一键按下时,INT0变为低电平,向单片机产生中断,单片机响应中断后便进入中断服务程序,用扫描的方法寻找到申请中断的功能键并执行相应键并执行相应键功能处理程序。在键盘上并联0.1uf的电容可以有效的对键盘消抖。 图 4-8 键盘模块原理图 7、闹钟响及报警模块 闹铃响和温度过限报警采用单片机编程以音乐的方式实现,并最终以扬声器播放出。扬声器驱动电路如图4-9: 闹钟采用音乐报警方式,其中音乐播放是本设计的重要创新部分,音乐播放功能没有使用任何音乐芯片,而是采用模拟音乐的频率,产生频率表,用单片机的一个口线输出,驱动扩音器,输出音乐。 闹钟不仅实现每天两个的功能,而且还增加了生日纪念日的功能,采用与实际相近的音乐提醒,跟使我们的实际贴近生活。 在温度模块中,不仅能够实现温度的高精度采集和显示,而且还增加了温度报警功能,能够实时的检测环境温度,当温度超过一定植(通过键盘调整,可以改变,初试值为33 )也会播放音乐提示报警。 图4-9 扬声器驱动电路 五、软件设计 为实现系统功能,系统软件共设六个运行状态、各部分功能描述如下:日期模式能够准确显示年月日星期时分秒,并具有12小时和24小时两种模式切换功能。闹钟模式分为三种,分别为日闹钟、周闹钟、年闹钟(纪念日提醒),其中每种模式都有四组闹钟可以随意设置。闹钟以播放音乐的形式实现。秒表模式最多可准确定时到99小时。并有毫秒显示,可是随时暂停和清零,使用方便,适合于精确定时的场合。倒计时模式可精确倒计时99秒。温度可以显示在任何一种模式下,当温度超过33(初始值)播放乐报警。软件整体 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 图如图下 图表5-1 程序流程图 具体程序见附件1 六、系统调试 系统调试分为硬件调试、软件调试和软硬件联调。电路按模块调试,各模块逐个调试通过后再联调。 1.硬件调试 (1).单片机及外围电路部分 此部分硬件调试主要是以检查焊接是否正确,是否有虚焊等情况。调试时采用数字外用表来检查。 (2).充电电路部分 对于这部分电路我们在multisim上先进行了仿真,仿真图如图6-1,采用全自动充电装置,将555集成时基电路2脚的电压调为5.5V,4.7v的蓄电池接入,充电器开始对蓄电池电充电,此时3脚输出电压6.2V;将555集成电路6脚的电压调为6.6V,4.7v的蓄电池持续充电,直到6.6v时,此时3脚输出电压为0,停止充电。由测试可知实现了全自动的充电保护功能。 图6-1 充电电路mutisim仿真图 2 .软件调试 本系统的软件系统很大,全部用C51来编写,软件调试比较复杂。除了语法差错和逻辑差错外,当确认程序没问题时,我们通过PROTES仿真软件来进行仿真和调试。软件仿真调试无误后,再直接下载到单片机来调试。采取的是白下到上的调试方法.即单独调试好每—个模块,然后再连接成一个完整的系统调试。PROTES仿真图如图6-2 图6-1 PROTES仿真总图 3.软硬联调 该系统的软件和硬件之间的联系不是十分紧密,一般是软件计算完毕之后,将程序烧入单片机,从而进行显示。因此在软硬件都基本调通的情况下系统的软硬件联调难度不是很大。 七、指标测试  1.温度采集测试 测试方法:把液晶显示的温度与TM—6801A温度表测得的数值相比较,看是否在误差允许范围内。  测试用的仪器:TM—6801A温度表 测试数据:选取四个特定温度点进行测量:0℃、室温、体温和100℃。将温度传感器DS18B20放入分别放入冰水混合物和沸水中测量标定,显示示数分别为0℃和99.1℃。将传感器置于手掌中和实验室环境中进行测量,显示值分别为35.6℃和26.6℃(空调设定温度为27℃)。 测试结果:在实际测量中,我们发现DS18B20在低温时变化比较缓慢,误差相对较大一些,在室温时测量比较正常。经过测试,温度显示正常。检测精度大月为0.5℃,显示精度为0.1℃。 2.时间显示测试 测试方法:把液晶显示的时间调整至与时间显示精度很高的卡西欧手表完全相同,然后两者开始走时,接着对两者时间比较一个小时,看误差情况。 测试用的仪器:卡西欧手表 测试数据:如表7-1 系统液晶时间 卡西欧手表时间 系统液晶时间 卡西欧手表时间 00:00:00 00:00:00 00:15:00 00:15:00 00:00:30 00:00:30 00:20:00 00:20:00 00:01:00 00:01:00 00:25:00 00:25:00 00:02:00 00:02:00 00:30:00 00:30:00 00:03:00 00:03:00 00:40:00 00:40:00 00:05:00 00:05:00 00:50:00 00:50:00 00:10:00 00:10:00 01:00:00 01:00:00 表7-1 系统显示时间和卡西欧手表时间对比 测试结果:由测试数据可得,系统显示时间和卡西欧手表的误差在一个小时内为0,所以系统时钟的显示精度是非常高的。 八、总结 本系统以P89C58为核心部件,利用软件编程,通过键盘控制和液晶显示实现不仅完成了题目的基本功能、基本指标,而且有了很大的发挥.现将题目 要求指标及系统实际性能列表如下: 基本要求 发挥要求 实际性能 设计能支持年、月、日、星期、时、分、秒的时钟 实现 时钟有时间调整功能。 实现 时钟具有闹钟功能 能够每天提供2个时间点的闹钟功能。 实现,还可提供两个以上闹钟,闹钟播放音乐 时钟及闹钟具有装卸电池时掉电保护功能,保护时间大于5分钟 实现,而且掉电保护时间为永久 时钟附带有一个温度计功能,温度检测精度高于2度,显示精度为1度 实现,而且温度检测精度为0.5,显示精度为0.1 自制电源供电(220V) 实现,而且具有全自动充电保护功能 其他发挥 秒表功能,显示精度为0.01 倒记时功能 纪念日提醒 生日闹钟提醒 闹钟播放音乐 提供全自动充电电源 温度过限音乐报警功能 时间显示有12小时和24小时模式切换 我们尽量做到硬件电路简单稳定,减小电磁干扰和其他环境干扰,充分发挥软件编程的优点,减小因元器件精度不够引起的误差。由于时间有限和本身知识水平的发挥,我们认为本系统还有需要改进和提高的地方,例如选用更高精度的元器件,硬件电路更加精确稳定,软件测量算法进一步的改进与完善等。 表8-1 题目要求指标及系统实际性能表 九、参考文献 1. 赵茂泰.智能仪器原理及应用[M].北京: 电子工业出版社,2006 2. 戴佳,戴卫.51单片机C语言应用程序设计实例精讲[M].北京: 电子工业出版社,2007 3. 张毅刚.单片机原理及应用[M].北京:高等教育出版社,2003 4. 薛永毅,王淑英 何希才.新型电源电路应用实例[M].北京: 电子工业出版社,2001 5. 楼然苗 ,李光飞.51系列单片机设计实例[M].北京:航空航天大学出版社,2006 6. 李光飞 ,李良儿.楼然苗单片机C程序设计实例指导[M].北京:航空航天大学出版社,2006 7.柯节成.简明电子元件器件手册[M}.北京:高等教育出版社,1991 8.赵继文.传感器与应用电路设计[M].北京科学出版社,2002 9.李华.MCS-51系列单片机实用接口技术[M].北京:航空航天大学,1993 10. 孙涵芳.MCS-51 196系列单片机原理及应用[M].北京:航空航天大学出版社,1988 11.何希才.传感器及其应用[M].北京:电子工业出版社,2001 12.维普中文期刊 [J],收录年限1992 至今 13电子期刊论文数据库[J],收录年限1992 至今 14.电子系统设计[J],月刊杂志 15.电子设计应用[J] ,月刊杂志 16.电子世界[J],2006年第04期 附件1: #include #include "LCD1602.h" #include "DS1302.h" #include "ds18b20.h" #include "SoundPlay.h" #include "week.h" //时钟设定 闹钟 秒表 倒记数 显示状态 #define MODEL 0x1d //模式切换 模式切换 无效 无效 进入设定时间 #define UP 0x17 //加 加 开始 加 无效 #define DOWN 0x0f //减 减 停止 减 无效 #define OK 0x1b //确定 闹铃模式 清零 停 无效 SYSTEMTIME CurrentTime; //显示缓存 unsigned char status=0; //当前态 unsigned char keywords; //上一次按键键值 unsigned char Enmodel=0; //设定时间有效 unsigned char unticount=15; //倒记数初值 bit a=1; //音乐 sbit b=P3^3; unsigned char idata * settime1[7]={&CurrentTime.Year,&CurrentTime.Month,&CurrentTime.Day,&temphao,&CurrentTime.Minute,&CurrentTime.Second,&CurrentTime.Week}; //显示缓冲区指针数组 unsigned char code fine[6]={'u',10,12,31,23,59}; unsigned char code fine1[8]={'u',10,12,31,23,59,59,7}; unsigned char ig=0; //秒表 unsigned char temp=6; //倒记数 void Delay1ms(unsigned char count) //延时1MS { unsigned char i,j; for(i=0;i>4)*10 + (f&0x0F); } void warn() {unsigned int aa=(TempBuffer[0]-'0')*10+TempBuffer[1]-'0'; if( (aa>33) && (aa!=85 )) { GotoXY(0,0); Print("Temperatur:"); GotoXY(0,1); Print("too high !"); playMusic_Two(); } else _nop_();} key()interrupt 0 using 3 //键盘程序 { SoundLength=0; ET0= 0; keywords=P1&0x1f; if(keywords==0x1e){status=status+1;} if(keywords==MODEL&&status==0)Enmodel=1; } /*void setdatatime() //设定1302初始时间 { DS1302_SetTime(DS1302_SECOND, 0); DS1302_SetTime(DS1302_MINUTE, 0); DS1302_SetTime(DS1302_HOUR, 0); //时间设定 DS1302_SetTime(DS1302_WEEK, 1); //星期设定 DS1302_SetTime(DS1302_DAY, 0); DS1302_SetTime(DS1302_MONTH, 0); DS1302_SetTime(DS1302_YEAR, 1); } */ void alarm(SYSTEMTIME *Time) //闹钟判断 {unsigned char alarm[7]; char k; for(k=0;k<5;k++) { alarm[7]=(Read1302(DS1302_RAM(6*k))&0xf0)>>4; alarm[6]=Read1302(DS1302_RAM(6*k))&0x0f; alarm[5]=Read1302(DS1302_RAM(5+6*k)); alarm[4]=Read1302(DS1302_RAM(4+6*k)); alarm[3]=Read1302(DS1302_RAM(3+6*k)); alarm[2]=Read1302(DS1302_RAM(2+6*k)); alarm[1]=Read1302(DS1302_RAM(1+6*k)); switch(alarm[6]) { case 1: if(Time->Minute==hand(alarm[5])&& //日闹钟 temphao==hand(alarm[4])) a=1; break; case 2: if(Time->Minute==hand(alarm[5])&& //周闹钟 temphao==hand(alarm[4])&& Time->Week==hand(alarm[7])) a=1; break; case 3: if(Time->Minute==hand(alarm[5])&& //生日和纪念日 temphao==hand(alarm[4])&& Time->Day==hand(alarm[3])&& Time->Month==hand(alarm[2]) ) a=1; break; case 4: if(Time->Minute==hand(alarm[5])&& //生日和纪念日 temphao==hand(alarm[4])&& Time->Day==hand(1)&& Time->Month==hand(6) ) a=1; //备用 default: break; } }} unsigned char dstr[2]={0,0}; unsigned char chstr[3]={0,0}; void chToStr(unsigned int i) { chstr[0] = i/10 +'0'; chstr[1] = i%10+'0'; chstr[2] = '\0'; dstr[0] = i/10 +'0'; dstr[1] = i%10+'0'; dstr[2] = '\0'; } display(unsigned char *str1,unsigned char *str2,unsigned char *str3)//显示程序 { GotoXY(0,0); Print(str1); GotoXY(0,1); Print(str2); GotoXY(11,1); Print(str3); tmpt(); GotoXY(11,0); Print(TempBuffer); Delay1ms(200); warn(); } flash(char i) //闪烁程序 { switch(i) { case 1: GotoXY(2,0);break; case 2: GotoXY(2+3,0);break; case 3: GotoXY(2+3+3,0);break; case 4: GotoXY(2,1);break; case 5: GotoXY(2+3,1);break; case 6: GotoXY(2+3+3,1);break; case 7: GotoXY(2+3+3+3,1);break; default: break; } Print(" ");Delay1ms(200); //闪烁 } frontseting(char x,char *i,char *k) //错误恢复 {if(*i>7)*i=1; if(x) //闹钟 { if(CurrentTime.Year>10)Write1302(DS1302_RAM(1+6**k),0); if(CurrentTime.Month<1)Write1302(DS1302_RAM(2+6**k),12); if(CurrentTime.Day>31)Write1302(DS1302_RAM(3+6**k),1); if(CurrentTime.Day<1)Write1302(DS1302_RAM(3+6**k),31); if(CurrentTime.Hour>23)Write1302(DS1302_RAM(4+6**k),0); if(CurrentTime.Minute>59)Write1302(DS1302_RAM(5+6**k),0); if(CurrentTime.Second<1)Write1302(DS1302_RAM(6**k),0x70|g); //if(CurrentTime.Second>7)Write1302(DS1302_RAM(6**k),g|0x70); if(*k>4||*k<1)*k=1; if(g>4)Write1302(DS1302_RAM(6**k),0xf0&Read1302(DS1302_RAM(6**k))); if(g<0)Write1302(DS1302_RAM(6**k),0xf0&Read1302(DS1302_RAM(6**k))+1); } else //时间显示 { if(CurrentTime.Year>10)DS1302_SetTime(DS1302_YEAR,0); if(CurrentTime.Month>12)DS1302_SetTime(DS1302_MONTH,1); if(CurrentTime.Month<1)DS1302_SetTime(DS1302_MONTH,1); if(CurrentTime.Day>31)DS1302_SetTime(DS1302_DAY,1); if(CurrentTime.Day<1)DS1302_SetTime(DS1302_DAY,1); if(temphao>23)DS1302_SetTime(DS1302_HOUR,0); if(CurrentTime.Minute>59)DS1302_SetTime(DS1302_MINUTE,0); if(CurrentTime.Second>59)DS1302_SetTime(DS1302_SECOND,0); if(CurrentTime.Week<1)DS1302_SetTime(DS1302_WEEK,7); if(CurrentTime.Week>7)DS1302_SetTime(DS1302_WEEK,1); } } main() {bit t=1; LCD_Initial(); Initial_DS1302(); Initial_DS1302(); EA=1; EX0=1; IT0=1; PX0=1; ig=unticount; //setdatatime(); a=0; while(1){ switch(status) { case 0://显示日期 {char i; Enmodel=0; //setdatatime(); while(1) {// if(keywords==OK&&Enmodel==0)if(t==0){t=1;keywords=0;}else {t=0;keywords=0;} if(i>7)i=1; DS1302_GetTime(&CurrentTime); frontseting(status,&i,0); alarm(&CurrentTime); if(a){GotoXY(0,0);a=0; Print("clock! :"); playMusic_Girl();} if(t){ if(CurrentTime.Hour>=12)g=7;else g=6; if(CurrentTime.Hour==0)CurrentTime.Hour=12; if(temphao>12)CurrentTime.Hour=CurrentTime.Hour-12; } else g=0; DateToStr(&CurrentTime); TimeToStr(&CurrentTime); WeekToStr(&CurrentTime); display(CurrentTime.DateString,CurrentTime.TIMEString,CurrentTime.WEEKString); if(Enmodel) { flash(i); switch(keywords) { case MODEL: i++;keywords=0;break; case UP: DS1302_SetTime(settime[i-1],*settime1[i-1]+1); keywords=0;break; case DOWN: //DS1302_SetTime(settime[i-1],*settime1[i-1]-1); if(*settime1[i-1]!=0)DS1302_SetTime(settime[i-1],*settime1[i-1]-1);else DS1302_SetTime(settime[i-1],fine1[i]); keywords=0;break; case OK: keywords=0;Enmodel=0;break; default: break; } } if(status!=0)break; } Enmodel=0;} g=0; break; case 1://设定闹钟 {char k=1,i; frontseting(status,&i,&k); while(1) { frontseting(status,&i,&k); CurrentTime.Minute=Read1302(DS1302_RAM(5+6*k)); CurrentTime.Hour=Read1302(DS1302_RAM(4+6*k)); CurrentTime.Second=(0x70&Read1302(DS1302_RAM(6*k)))>>4; g=0x0f&Read1302(DS1302_RAM(6*k)); CurrentTime.Week=8+k; CurrentTime.Day=Read1302(DS1302_RAM(3+6*k)); CurrentTime.Month=Read1302(DS1302_RAM(2+6*k)); CurrentTime.Year=Read1302(DS1302_RAM(1+6*k)); DateToStr(&CurrentTime); CurrentTime.DateString[0] = ' '; CurrentTime.DateString[1] = ' '; CurrentTime.DateString[2] = ' '; CurrentTime.DateString[3] = ' '; CurrentTime.DateString[4] = ' '; CurrentTime.TIMEString[0] ='T'; CurrentTime.TIMEString[1] = ':'; CurrentTime.TIMEString[2] = CurrentTime.Hour/10 + '0'; CurrentTime.TIMEString[3] = CurrentTime.Hour%10 + '0'; CurrentTime.TIMEString[4] = ':'; CurrentTime.TIMEString[5] = CurrentTime.Minute/10 + '0'; CurrentTime.TIMEString[6] = CurrentTime.Minute%10 + '0'; CurrentTime.TIMEString[7] = ' '; CurrentTime.TIMEString[8] = weekctr[CurrentTime.Second][0]; CurrentTime.TIMEString[9] = weekctr[CurrentTime.Second][1]; CurrentTime.TIMEString[10] = '\0'; WeekToStr(&CurrentTime); display(CurrentTime.DateString,CurrentTime.TIMEString,CurrentTime.WEEKString); if(i==1)i=2; flash(i); switch(keywords) { case MODEL: i++;keywords=0;break; case UP: if(i==7)k=k+1;else {if(i==6)Write1302(DS1302_RAM(6*k),Read1302(DS1302_RAM(6*k))+16); else Write1302(DS1302_RAM(i+6*k),Read1302(DS1302_RAM(i+6*k))+1);} keywords=0;break; case DOWN: if(i==7)k=k-1;else {if(i==6)Write1302(DS1302_RAM(6*k),Read1302(DS1302_RAM(6*k))-16);else //Write1302(DS1302_RAM(i+6*k),Read1302(DS1302_RAM(i+6*k))-1);} {if(Read1302(DS1302_RAM(i+6*k))!=0)Write1302(DS1302_RAM(i+6*k),Read1302(DS1302_RAM(i+6*k))-1);else Write1302(DS1302_RAM(i+6*k),fine[i]);}} keywords=0;break; case OK: keywords=0;Write1302(DS1302_RAM(6*k),Read1302(DS1302_RAM(6*k))+1);break; default: break; } if(status!=1)break; } g=0; break;} case 2://秒表 a: {unsigned char miaoh=0; unsigned char miaol=0; unsigned char fenh=0; unsigned char fenl=0; unsigned char shih=0; unsigned char shil=0; unsigned char t=0; unsigned char judge=0; unsigned char i=0; while(1) { switch(keywords) { case UP: judge=1;keywords=0;break; case DOWN: judge=0;keywords=0;break; case OK: keywords=0 ; goto a; break; default: break; } DS1302_GetTime(&CurrentTime); if(t!=CurrentTime.Second&&judge) {t=CurrentTime.Second; miaol++; } if(miaol==10) {miaoh++; miaol=0;} if(miaoh==6 && miaol==0) {fenl++; miaoh=0; miaol=0;} //fen+1 if(fenl==10) {fenh++; fenl=0;} if(fenh==6 && fenl==0) {shil++; fenh=0; fenl=0;} if(shil==10) shih++; CurrentTime.TIMEString[0] ='T'; CurrentTime.TIMEString[1] = ':'; CurrentTime.TIMEString[2] = shih+'0'; CurrentTime.TIMEString[3] = shil+'0'; CurrentTime.TIMEString[4] = ':'; CurrentTime.TIMEString[5] = fenh+'0'; CurrentTime.TIMEString[6] = fenl+'0'; CurrentTime.TIMEString[7] = ':'; CurrentTime.TIMEString[8] = miaoh+'0'; CurrentTime.TIMEString[9] = miaol+'0'; CurrentTime.TIMEString[10] = '\0'; if(i==0){ if(judge) {chToStr(i); i=i+7; if(i==91) i=0; } display(" ",CurrentTime.TIMEString,"00");} else { if(judge) {chToStr(i); i=i+7; if(i==91) i=0; } display(" ",CurrentTime.TIMEString,dstr); } GotoXY(13,1); Print("ms "); if(status!=2)break; } } break; case 3://倒计时 { bit bi=0; b=0; while(1) { if(keywords==DOWN)b=1; switch(keywords) { case OK: bi=1;keywords=0;break; case UP: if(!bi) ig++; keywords=0;break; case DOWN: if(!bi) ig--;keywords=0;break; default: break; } DS1302_GetTime(&CurrentTime); DateToStr(&CurrentTime); TimeToStr(&CurrentTime); WeekToStr(&CurrentTime); alarm(&CurrentTime); if(temp!=CurrentTime.Second) {temp=CurrentTime.Second; if(ig!=0&&bi) ig--; chToStr(ig); display(" "," daojishi:",chstr); } Delay1ms(100); chToStr(ig); GotoXY(11,1); Print(chstr); Delay1ms(100); if(ig==0) { } GotoXY(13,1); Print(" "); if(status!=3) break; } } break; case 4: while(1) { GotoXY(0,0); Print(" made in china "); Delay1ms(100); GotoXY(0,1); Print(" zscas dianxin "); Delay1ms(100); if(status!=4) break;} LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); break; default: status=0; break;} } }
本文档为【多功能数字钟(A题)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_900340
暂无简介~
格式:doc
大小:384KB
软件:Word
页数:30
分类:互联网
上传时间:2011-06-14
浏览量:25