基于单片机的电子闹钟设计
- 格式:doc
- 大小:60.00 KB
- 文档页数:13
摘要20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,在以AT89S51单片机为代表的电子技术有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
本课题基于单片机完成了音乐电子闹钟的设计与实现,通过软、硬件结合实现了设定时间、按时闹铃、数字显示等功能。
硬件部分是通过STC89C51实现音乐电子闹钟的基本框架。
软件设计利用C51单片机语言完成了时间显示、走时计数、判断时间及按时响铃等功能。
本电子闹钟系统结构简单、成本低,具有比较好的市场前景。
关键词:单片机闹钟设计2 I目录摘要 (I)目录 (II)前言 (1)第一章绪论 (2)1.1概述 (2)1.1.1 音乐电子闹钟发展趋势 (2)1.1.2 本课题研究的主要内容 (2)1.2音乐电子闹钟简介 (3)1.2.1 开发的目的和意义 (3)1.2.2 音乐电子闹钟的优点 (4)1.2.3 音乐电子闹钟的用途 (4)1.2.4 音乐电子闹钟的特点 (4)第二章 STC89C51单片机基础知识简介 (4)2.1单片机的特点及应用 (4)2.1.1 单片机的特点 (4)2.1.2 单片机的应用 (5)2.2 STC89C51芯片基本工作原理及其应用 (5)2.2.1 AT89S51简介 (6)2.2.2 电源 (9)2.2.3 应用 (10)第三章系统方案设计 (11)3.1 系统功能描述 (11)3.2系统设计思路与步骤 (11)第四章系统设计 (12)4.1系统硬件设计 (12)4.1.1 按键电路 (12)4.1.2 复位电路 (13)4.1.3 显示电路 (14)4.1.4 发音部分 (15)4.1.5 晶振电路 (16)4.1.6 电源电路 (17)4.2系统软件设计 (17)4.2.1 软件设计 (17)4.2.2系统软件部分总体设计 (19)第五章系统调试和性能分析 (20)5.1系统调试方法 (20)1II5.1.1 输入按键调试 (21)5.1.2 显示电路调试 (21)5.1.3 系统联调 (21)5.2系统性能分析 (21)结束语 (22)参考文献 (23)附录1 电路图 (24)附录2 实物图 (25)附录3 程序 (26)2 III音乐电子闹钟的设计前言自单片机问世以来,性能得到不断提高和完善,因其资源能够满足很多应用场合的需要,加之单片机具有集成度高、功能强、速度快、体积小、功耗低、使用方便、性能可靠、价格低廉等优点。
基于51单片机的多功能电子钟设计1. 本文概述随着现代科技的发展,电子时钟已成为日常生活中不可或缺的一部分。
本文旨在介绍一种基于51单片机的多功能电子钟的设计与实现。
51单片机因其结构简单、成本低廉、易于编程等特点,在工业控制和教学实验中得到了广泛应用。
本文将重点阐述如何利用51单片机的这些特性来设计和实现一个具有基本时间显示、闹钟设定、温度显示等功能的电子钟。
本文的结构安排如下:将详细介绍51单片机的基本原理和特点,为后续的设计提供理论基础。
接着,将分析电子钟的功能需求,包括时间显示、闹钟设定、温度显示等,并基于这些需求进行系统设计。
将详细讨论电子钟的硬件设计,包括51单片机的选型、时钟电路、显示电路、温度传感器电路等。
软件设计部分将介绍如何通过编程实现电子钟的各项功能,包括时间管理、闹钟控制、温度读取等。
本文将通过实验验证所设计的电子钟的功能和性能,并对实验结果进行分析讨论。
通过本文的研究,旨在为电子钟的设计提供一种实用、经济、可靠的方法,同时也为51单片机的应用提供一个新的实践案例。
2. 51单片机概述51单片机,作为一种经典的微控制器,因其高性能、低功耗和易编程的特性而被广泛应用于工业控制、智能仪器和家用电器等领域。
它基于Intel 8051微处理器的架构,具备基本的算术逻辑单元(ALU)、程序计数器(PC)、累加器(ACC)和寄存器组等核心部件。
51单片机的核心是其8位CPU,能够处理8位数据和执行相应的指令集。
51单片机的内部结构主要包括中央处理单元(CPU)、存储器、定时器计数器、并行IO口、串行通信口等。
其存储器分为程序存储器(ROM)和数据存储器(RAM)。
程序存储器通常用于存放程序代码,而数据存储器则用于存放运行中的数据和临时变量。
51单片机还包含特殊功能寄存器(SFR),用于控制IO端口、定时器计数器和串行通信等。
51单片机的工作原理基于冯诺伊曼体系结构,即程序指令和数据存储在同一块存储器中,通过总线系统进行传输。
目录目录 (I)一设计题目 (1)二设计要求 (1)三作用与目的 (1)四设备及软件 (2)1.AT89C51单片机 (2)2. Proteus仿真软件 (2)3.Keil软件 (3)五系统设计方案 (4)1 电路的总体原理框图 (4)2 工作原理 (5)六系统硬件设计 (5)1.系统总体设计 (5)2.系统时钟电路设计 (6)3.系统复位电路的设计 (6)4.闹钟指示电路设计 (6)5.电子闹钟的显示电路设计 (6)七系统软件设计 (7)1.主模块的设计 (7)2.基本显示模块设计 (8)3. 时间设定模块设计 (9)4. 闹铃功能的实现 (10)八 Proteus软件仿真 (11)1.本次试验的效果图 (12)2.性能及误差分析: (12)九设计中的问题及解决方法 (13)十设计心得 (14)参考文献 (15)致谢 (16)附录1 系统整体结构电路原理图 (17)附录2 程序清单 (18)基于单片机的定时闹钟设计一设计题目基于单片机的定时闹钟二设计要求1、能显示时时-分分-秒秒。
2、能够设定定时时间、修改定时时间。
3、定时时间到能发出报警声或者启动继电器,从而控制电器的启停。
三作用与目的以单片机为核心的数字时钟是很有社会意义和社会价值的。
钟表原先的报时功能已经原不能满足人们日益增长的要求,现代的电子时钟多带有类似自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等功能数字闹钟通过数字电路实现时、分、秒。
数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所成为人们日常生活中不可少的必需品。
由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。
多功能数字钟的应用非常普遍。
由单片机作为数字钟的核心控制器,通过它的时钟信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。
通过键盘可以进行校时、定时等功能。
基于单片机的定时闹铃设计摘要时间是现代社会中不可缺少的一项参数,无论是平时生活还是社会生产都需要对时间进行控制,有的场合对其精确性还有很高的要求.采用单片机进行计时,对于社会生产有着十分重要的作用。
本文首先在绪论中介绍了单片机和时钟的概念和现状,然后在对单片机系统、喇叭装置和显示电路做了深入的研究之后,提出了系统总体设计方案,并设计了各部分硬件模块和软件流程,在用汇编语言设计了具体软件程序后,用伟福软件进行了仿真和调试,结果证明了该设计系统的可行性。
由于AT89C51系列单片机的控制器运算能力强,处理速度快,可以精确计时,很好地解决了实际生产生活中对计时高精确度的要求,因此该设计在现代社会中具有广泛的适用性。
关键字:AT89C51,定时,LCD显示,仿真,调试AbstractModern society is indispensable to a parameter, whether in peacetime or in social production need to control the time, there are some occasions to its high accuracy requirements. Microcontroller used to time, the community has a production very important role.This paper first introduced in the introduction of the concept of SCM and clock and the status quo, then the SCM system, speakers and display circuit devices do an in-depth study, the overall design of the system proposed programme, all parts of the design of the hardware module And software processes used in the compilation of the specific language of the software design process, Fu Wei-use software simulation and debugging, the results proved the feasibility of the design.As the controller AT89C51 MCU computing capability and processing speed, precision timing, a good solution to the life of the actual production of high precision timing of the request, so the design in modern society has a broad applicability.Keyword: AT89C51, timing, LCD display, simulation, debugging目录第一章绪论 (1)第一节设计本电子定时闹钟的目的和意义 (1)第二节单片机和数字钟介绍 (1)一、单片机介绍 (1)二、数字钟介绍 (3)第三节本LCD电子闹钟的特点和功能介绍 (4)一、本电子钟设计特点 (4)二、本电子钟的主要功能 (4)第二章总体方案设计与硬件设计 (5)第一节总体设计方案 (5)第二节电路总体概念图设计 (5)第三节 MCS-51单片机硬件结构设计 (6)一、 MCS–51单片机内部总体结构 (6)二、 MCS-51单片机的引脚 (6)三、 MCS-51 的微处理器 (9)四、 MCS-51存储器的结构 (9)五、 MCS-51 的并行I/O口 (14)六、 MCS-51时钟电路与时序 (16)七、 MCS-51的复位和复位电路 (17)第四节主控芯片AT89C51的设计 (18)第五节时钟电路部分设计 (20)第六节 LCD显示电路部分 (21)一、 LCD介绍 (21)二、 LCD的选材 (25)第七节喇叭部分的电路 (26)第三章软件设计 (27)第一节软件设计概述 (27)第二节主函数的设计 (27)第三节部分设计思想的说明 (28)一、程序初始化 (28)二、闹钟的实现 (29)三、显示程序 (29)第四章软件仿真 (31)第一节仿真器介绍 (31)第二节仿真器编程 (33)第三节仿真器执行 (33)总结 (34)外文资料 (35)中文译文 (42)参考文献 (47)致谢 (48)附录 (49)附录1 源程序代码 (49)附件2 系统原理图 (78)第一章绪论第一节设计本电子定时闹钟的目的和意义一、复习和巩固所学过的知识,利用此毕业设计正好可以对所学过的知识进行系统的回顾和总结。
基于单片机定时闹钟的设计随着科技的快速发展,嵌入式系统已经深入到我们生活的各个角落。
其中,单片机以其高效性、灵活性和低成本性,广泛应用于各种设备的设计中。
本文将探讨如何基于单片机设计一个定时闹钟。
一、硬件需求1、单片机:选择一个适合你项目的单片机。
比如Arduino UNO,它具有丰富的IO口和易于使用的开发环境。
2、显示模块:为了能直观地展示时间,你需要一个LCD显示屏。
可以选择常见的16x2字符型LCD显示屏。
3、按键模块:用于设定时间和闹钟功能。
一般可以选择4个按键,分别代表功能设置、小时加、小时减和分钟加。
4、蜂鸣器:当到达设定时间时,蜂鸣器会发出声音提醒。
二、软件需求1、开发环境:你需要一个适用于你单片机的开发环境,例如Arduino IDE。
2、编程语言:一般使用C或C++进行编程。
3、程序设计:你需要编写一个程序来控制单片机,让其根据设定时间准时唤醒。
程序应包括初始化和设定时间的功能,以及到达设定时间后的闹钟提醒功能。
三、设计流程1、硬件连接:将单片机、显示模块、按键模块和蜂鸣器按照要求连接起来。
2、初始化:在程序中初始化所有的硬件设备。
3、时间设定:通过按键模块设定时间。
你需要编写一个函数来处理按键输入,并在LCD显示屏上显示当前时间。
4、闹钟提醒:在程序中加入一个计时器,当到达设定时间时,程序会唤醒并触发蜂鸣器发出声音。
5、循环检测:在主循环中不断检测时间是否到达设定时间,如果到达则触发闹钟提醒,然后继续检测。
四、注意事项1、时钟源:你需要一个稳定的时钟源来保证闹钟的准确性。
可以考虑使用网络时钟或者GPS模块。
2、功耗优化:如果你的设备需要长时间运行,那么需要考虑到功耗的问题,比如使用低功耗的单片机或者在不需要闹钟提醒的时候关闭蜂鸣器等。
3、人机交互:考虑增加更多的功能以满足用户的需求,如设置多个闹钟、调整闹钟的音量等。
4、安全性:保证设备的电源稳定,避免在突然断电的情况下数据丢失或设备损坏。
单片机实训——基于单片机的电子闹钟设计学院:电子与通信工程学院专业:电子信息工程技术班级:信息122姓名:冯健学号:22指导老师:邬志锋、香永辉实训时间:2013年6月30日-7月5日目录绪论 (3)第一章总体设计方案 (3)1.1 目的 (3)1.2 要求 (3)1.3 工作原理 (4)1.4 思路 (4)第二章系统硬件设计 (4)2.1 系统的硬件设计框 (4)2.2 主要单元的电路设计 (4)2.2.1 单片机最小系统 (4)2.2.2 DS1302时钟电路 (5)2.2.3 LCD1602液晶显示电路 (5)2.2.4 键盘电路 (6)第三章系统的软件设计 (6)3.1 主程序流程图 (6)3.2 时钟程序流程图 (7)第四章结束语 (7)附录 (8)绪论时钟的数字化,大力推动了计时的准确性和可靠性。
在单片机构成的装置中,实时时钟是必不可少的部件。
时钟芯片DS1302与单片机同步通信构成数字时钟电路。
DS1302的后背电源及对后背电源进行涓细电流充电功能保证电路断电后仍能保存时间和数据信息等。
该时钟电路强大的功能和优越的性能,在很多领域的应用中,尤其是某些自动化控制、长时间无人看守的测控系统等对时钟精确性和可靠性有较高的场合,具有很高的使用价值。
第一章总体设计方案1.1目的1)加深了对ds1302时钟芯片及其应用;2)了解了lcd1602液晶显示屏的工作原理和内部结构;3)能够熟练的应用lcd1602来做一些小制作。
1.2 要求1)根据系统设计的要求和设计思路,确定该系统的系统设计结构如图1所示。
电路整体上分为控制和显示部分,以单片机最小系统为核心电路,控制LCD显示,具体的显示内容和方式由软件来完成;图(1)2)由于有时钟和日期的调节功能需要校准电路和基本的复位电路,复位电路采用按键复位,调节键、加1键、确定键,闹钟调节键,共五键,计时功能由DS1302完成,显示功能则由LCD1602液晶完成。
摘要本设计是定时闹钟的设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。
电子钟设计可采用数字电路实现,也可以采用单片机来完成。
数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。
若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。
若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT89C51,它是低功耗、高性能的CMOS型8位单片机。
片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外, AT89C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
AT89C51单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进—步可以扩充控制电器的启停。
设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。
采用四个开关来控制定时闹钟的工作状态,分别为:K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。
课设准备中我根据具体的要求,查找资料,然后按要求根据已学过的时钟程序编写定时闹钟的程序,依据程序利用proteus软件进行了仿真试验,对出现的问题进行分析和反复修改源程序,最终得到正确并符合要求的结果。
设计完成的定时闹钟达到课程设计的要求,在到达定时的时间便立即发出蜂鸣声音,持续一分钟。
显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。
基于单片机电子闹钟的设计电子闹钟是一种基于单片机技术的智能设备,可以通过设置闹钟时间来提醒人们起床、上班或者进行其他活动。
本文将介绍基于单片机的电子闹钟的设计过程和实现功能。
首先,我们选择一款适合作为控制核心的单片机芯片。
常用的单片机有51系列和AVR系列,其中51系列的代表性芯片是STC89C52,AVR系列的代表性芯片是ATmega16、我们可以根据具体需求选择适合的芯片。
其次,我们需要设计电子闹钟的硬件电路。
主要包括时钟电路、显示电路、按键输入电路和报警电路。
时钟电路通过晶体振荡器产生准确的时钟信号,显示电路通过数码管或液晶屏显示时间等信息,按键输入电路用来设置闹钟和调整时间,报警电路则用来发出可听到的声音提醒。
在硬件设计完成之后,我们还需要编写单片机的软件程序。
首先,我们需要初始化各个硬件模块,包括时钟模块、IO口模块和定时器模块等。
然后,我们需要编写定时中断函数,用来更新显示时间。
接下来,我们需要编写按键处理函数,用来设置闹钟和调整时间。
最后,我们需要编写报警函数,通过发出蜂鸣器的声音来提醒。
设计的基本功能包括:设置时间、设置闹钟、调整时间、调整闹钟、报警功能等。
用户可以通过按键输入来设置时间和闹钟,并且可以通过按键调整时间和闹钟的设置。
当闹钟时间到达时,蜂鸣器会发出声音提醒用户。
同时,数码管或液晶屏会显示当前的时间。
为了提高闹钟的实用性,我们还可以添加一些其他功能。
例如,可以加入温湿度传感器来测量当前的环境温度和湿度,并在数码管或液晶屏上显示。
还可以加入闹铃音乐的选择功能,让用户可以选择自己喜欢的音乐作为报警铃声。
总之,基于单片机的电子闹钟设计涉及到硬件电路设计和软件程序编写两个方面。
通过合理设计硬件电路和编写完善的软件程序,可以实现各种实用的功能。
电子闹钟可以帮助人们准时起床、上班或进行其他活动,提高人们的时间管理能力和生活质量。
题目:基于MCS51单片机的闹钟提醒器设计报告目录一、设计方案选定: (3)1.1 前言 (3)1.2 实验目的 (3)1.3总体设计要求 (3)1.3.1、基本要求 (3)1.3.2、自由发挥部分 (4)1.4 方案选定 (4)二、硬件电路设计 (4)2.1 AT89C52 (4)2.2 复位电路 (5)2.3 晶振电路 (5)2.4 时钟显示 (6)2.4.1 LCD1602 (6)2.4.2 DS1302: (6)2.5 程序框图 (7)2.6 基本电路及工作原理 (8)三、软件设计和仿真 (8)3.1 软件设计 (9)3.2 Proteus仿真 (25)四、课程设计体会 (27)参考文献 (28)基于MCS51单片机的闹钟提醒器学生:陈浩敏指导教师:张水锋电气信息工程学院电子信息工程专业一、设计方案选定:1.1 前言:单片计算机即单片微型计算机,(Single-Chip Microcomputer)。
是集CPU ,RAM ,ROM,定时,计数和多种接口于一体的微控制器。
他体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。
而51单片机是各单片机中最为典型和最有代表性的一种。
这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
基于单片机的定时和控制装置在许多行业有着广泛的应用。
而数字定时闹钟是其中最基本,也是最有代表性的一个实例。
数字定时闹钟的设计方法有许多种,例如,可以用中小规模集成电路组成数字定时闹钟,也可以利用专用的时钟芯片配以显示电路及其所需要的外围电路组成数字定时闹钟,还可以利用单片机来实现数字定时闹钟。
这些方法都各有其特点,其中,利用单片机来实现数字定时闹钟具有编程灵活、精度高等特点,便于数字定时闹钟功能的扩充,同时还可以用该数字定时闹钟发出各种控制信号。
1.2 实验目的:1、熟悉集成电路的引脚安排。
2、掌握各芯片的逻辑功能及使用方法。
3、充分认识单片机设计。
基于单片机的智能电子钟设计————————————————————————————————作者:————————————————————————————————日期:基于单片机的智能电子钟系统设计摘要随着电子技术的快速发展,智能电子钟已经越来越受欢迎。
我们通过以MSC-51单片机为核心控制芯片,结合DS12887时钟芯片、DS18B20温度传感器,利用74LS138译码器及7段数码管进行动态显示时间和温度,在调时模块中利用按键进行控制调时调分(先调时再调分)、在设置闹钟模块中利用按键进行设置闹钟,当时间到点利用蜂鸣器发声,同时可通过按键取消响声,根据数码管显示的时间,利用两个LED灯指示上下午,同时利用两个LED灯每隔半秒闪烁进行半秒提示。
关键词MSC-51 DS12887 DS18B20 74LS138前言智能电子时钟是采用数字电路实现对时,分,秒及温度数字显示的装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可或缺的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,智能时钟的精度远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
例如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动启闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电器的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究智能时钟及扩大其应用,有着非常现实的意义电子时钟的设计方法有多种,可用中小规模集成电路组成电子钟,也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟,还可以利用对单片机编程来实现电子钟。
其中,利用单片机实现的电子时钟具有硬件结构简单、编程灵活、便于功能扩展等特点。
由单片机作为数字钟的核心控制器,可以通过它的时钟信号实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。
通过键盘可以进行定时、校时功能。
基于单片机的电子时钟的设计基于单片机的电子时钟是一种采用单片机作为主控芯片的数字显示时钟。
它能够准确显示时间,并可以通过编程实现其他功能,如闹钟、倒计时、温湿度显示等。
本文将介绍基于单片机的电子时钟的设计原理、硬件电路和软件编程等内容。
1.设计原理基于单片机的电子时钟的设计原理是通过单片机的计时器和定时器模块来实现时间的计数和显示。
单片机的计时器可以通过设定一个固定的时钟频率进行计数,而定时器可以设定一个固定的计数值,当计数到达设定值时,会触发一个中断,通过中断服务程序可以实现时间的更新和显示。
2.硬件电路基于单片机的电子时钟的硬件电路主要包括单片机、显示模块、按键模块和时钟模块。
其中,单片机作为主控芯片,负责控制整个电子时钟的运行;显示模块一般采用数字管或液晶屏,用于显示时间;按键模块用于设置和调整时间等功能;时钟模块用于提供稳定的时钟信号。
3.软件编程基于单片机的电子时钟的软件编程主要分为初始化和主程序两个部分。
初始化部分主要是对单片机进行相关寄存器的设置,包括计时器和定时器的初始化、中断的使能等;主程序部分是一个循环程序,不断地进行时间的计数和显示。
3.1初始化部分初始化部分首先要设置计时器模块的时钟源和计数模式,一般可以选择内部时钟或外部时钟作为时钟源,并设置计时器的计数模式,如自动重装载模式或单次模式;然后要设置定时器模块的计数值,一般可以通过设定一个固定的计数值和计数频率来计算出定时时间;最后要设置中断使能,使得当定时器计数器达到设定值时触发一个中断。
3.2主程序部分主程序部分主要是一个循环程序,通过不断地读取计时器的计数值,并计算得到对应的时间,然后将时间转换成显示的格式,并显示在显示模块上。
同时,还可以通过按键来实现时间的设置和调整功能,如增加和减少小时和分钟的值,并保存到相应的寄存器中。
4.功能扩展-闹钟功能:设置闹钟时间,并在设定的时间到达时触发报警;-温湿度显示:通过连接温湿度传感器,实时显示当前的温度和湿度数据;-倒计时功能:设置一个倒计时的时间,并在计时到达时触发相应的动作。
学号: 班级: 姓名:基于89C51单片机的电子闹钟设计一、设计要求(1)设计并实现一个具有计时功能的电子时钟系统,电子表的时间精确到秒,并可以显示年、月、日、时、分、秒。
(2)利用液晶显示器显示定时器的日期和时间。
(3)使用键盘进行设置时间和设置闹钟。
(4)定时时间到通过蜂鸣器报警和发光二极管闪烁通知,并持续60s 。
二、硬件设计(1)系统设计框图(2)选择硬件设备单片机:选择AT89C51;液晶显示器:具有16字符显示功能的1601 键盘:选择4行*4列的矩阵键盘 LED :选择红色的发光二极管 E 2PROM :X2545基本元件:蜂鸣器,电容,晶体振荡器 ,电阻,开关 电源:使用+5v 直流稳压源 基本模块的构成①时钟信号发生单元如右图2 利用晶振和电容以及单片机内部 电路,构成晶体并联振荡器,产 生12MHz 的时钟频率 ②复位电路如右图3利用一个简单的电容和按键实现*SI SO SCK CSR/S R/W E 单片机 89C51液晶显示蜂鸣器LED E 2PROM X2545 512*8bit键盘P2口P1口图1定时器系统框图数码管显示统P0口P3.0P3.6、P3.7基本模块图2时钟信号发生单元实现对系统的复位功能由此基本模块可以实现最小的单片机系统(3)电子时钟硬件原理图图4硬件电路原理电路(4)主要器件的原理①液晶显示原理液晶显示器种类繁多,按输出样式分为,图案式,数码式,点阵式。
本设计方案利用的是点阵式液晶显示器,而液晶驱动方式又和数码管驱动截然不同,虽然比数码管需要更小的工作电压,但是其结构所需要的扫描方式较数码管来说,是比较复杂的,而且输入输出数据速度慢,市场上是常用点阵式液晶驱动器的,常用的有1601、1602……,“16”代表显示字符共有几列,“01”、“02”代表输出字符共有几行。
下面是驱动1601的驱动方法。
驱动1601的一个很重要的方面就是液晶显示器的初始化,主要是利用控制、数据复用总线来输入指令,进行初始化。
基于单片机的电子时钟的设计与实现电子时钟是一种使用微处理器或单片机作为主控制器的数字时钟。
它不仅能够显示当前时间,还可以具备其他附加功能,如闹钟、日历、温度显示等。
一、设计目标设计一个基于单片机的电子时钟,实现以下功能:1.显示时间:小时、分钟和秒钟的显示,采用7段LED数码管来显示。
2.闹钟功能:设置闹钟时间,到达设定的时间时会发出提示音。
3.日历功能:显示日期、星期和月份。
4.温度显示:通过温度传感器获取当前环境温度,并显示在LED数码管上。
5.键盘输入和控制:通过外部键盘进行时间、日期、闹钟、温度等参数的设置和调整。
二、硬件设计1.单片机选择:选择一款适合的单片机作为主控制器,应具备足够的输入/输出引脚、中断和定时器等功能,如STC89C522.时钟电路:使用晶振为单片机提供稳定的时钟源。
3.7段LED数码管:选择合适的尺寸和颜色的数码管,用于显示小时、分钟和秒钟。
4.温度传感器:选择一款适合的温度传感器,如DS18B20,用于获取环境温度。
5.喇叭:用于发出闹钟提示音。
6.外部键盘:选择一款适合的键盘,用于设置和调整时间、日期、闹钟等参数。
三、软件设计1.初始化:设置单片机定时器、外部中断和其他必要的配置。
2.时间显示:通过定时器中断,更新时间,并将小时、分钟和秒钟分别显示在相应的LED数码管上。
3.闹钟功能:设置闹钟时间,定时器中断检测当前时间是否与闹钟时间一致,若一致则触发警报。
4.日历功能:使用定时器中断,更新日期、星期和月份,并将其显示在LED数码管上。
5.温度显示:通过定时器中断,读取温度传感器的数据,并将温度显示在LED数码管上。
6.键盘输入和控制:通过外部中断,读取键盘输入,并根据输入进行相应的操作,如设置时间、闹钟、日期等。
7.警报控制:根据设置的闹钟时间,触发警报功能,同时根据用户的设置进行控制。
四、测试与调试完成软件设计后,进行系统测试与调试,包括验证显示时间、日期、温度等功能的准确性,以及闹钟和警报功能的触发与控制。
基于单片机的智能电子时钟的设计及应用一、引言智能电子时钟是一种应用广泛的电子产品,它不仅能够准确显示时间,还具备了一系列智能化的功能,如闹钟、温湿度显示、定时开关等。
基于单片机的智能电子时钟设计是近年来电子技术领域中备受关注的研究方向。
本文将详细介绍基于单片机的智能电子时钟设计及其应用,并对其进行深入研究。
二、基于单片机的智能电子时钟设计原理1. 选取合适的单片机芯片在设计基于单片机的智能电子时钟之前,首先需要选取合适的单片机芯片。
常见选择包括51系列、AVR系列和ARM系列等。
根据具体需求和功能要求进行选择,并考虑到其性价比、易用性和扩展性。
2. 时钟模块设计在整个系统中,准确显示时间是最基本也是最关键的功能之一。
因此,需要设计一个稳定可靠且精度高的时钟模块。
常见选择包括RTC 芯片和GPS模块等。
3. 显示模块选择与驱动为了实现时间的直观显示,需要选择合适的显示模块。
常见选择包括LED数码管、LCD液晶显示屏和OLED显示屏等。
同时,还需要设计合适的驱动电路,以实现对显示模块的控制。
4. 功能模块设计除了基本的时间显示功能外,智能电子时钟还可以具备一系列智能化功能。
常见功能包括闹钟、温湿度显示、定时开关等。
这些功能需要通过相应的传感器和控制电路来实现。
三、基于单片机的智能电子时钟应用1. 家庭生活基于单片机的智能电子时钟在家庭生活中有着广泛应用。
它可以作为家庭闹钟,准确地唤醒人们起床;同时也可以作为温湿度监测器,在家中监测室内温湿度,并提供相应数据。
2. 办公场所在办公场所中,基于单片机的智能电子时钟可以作为时间提醒器,在工作时间结束时提醒人们休息;同时也可以作为定时开关,在指定时间自动打开或关闭相应设备。
3. 公共场所在公共场所中,基于单片机的智能电子时钟具备更多应用场景。
例如,在火车站、机场等候车室中,它可以作为候车时间显示器,为旅客提供准确的候车时间信息。
四、基于单片机的智能电子时钟设计案例以基于51系列单片机的智能电子时钟设计为例,具体设计方案如下:1. 硬件设计选用51系列单片机作为主控芯片,搭配RTC芯片作为时钟模块。
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define LED P0 // 数码管的段选#define LIGHT P1 // 时分秒位的指示灯#define WS P2 // 数码管的位选sbit key1=P3^0; // 时间暂停/开始sbit key2=P3^1; // 时间/闹钟设置sbit key3=P3^2; // 增加sbit key4=P3^3; // 减少sbit alarm=P3^6; // 闹铃uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0-9uchar tab_dp[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // 0.-9.(带小数点)uchar data1[]={0,0,0,0,0,0};uchar data2[]={0,0,0,0,0,0};uint t,k,kk,k1,flag;uint bbh,bbm,bbs,bbh1,bbm1,bbs1;uint sec,min,hour,sec1,min1,hour1; // 定义秒,分,时void init();void display();void display_bb();void delay( uint );void keyscan();void main(){init();while(1){keyscan();if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if((bbh==hour)&&(bbm==min)&&data1[4]==0&&data1[5]==5) // 5s报时{alarm=~alarm;delay(1);}if((bbs==sec)&&(bbm==min)&&(bbh==hour)) // 可调报时{alarm=~alarm;delay(1);}}}void init(){WS=LIGHT=flag=0;sec=min=hour=0; // 将0赋给时分秒TMOD=0x01; // 方式1 P129(见课本)TH0=0x3c; // 65536-50000=15536=0x3cb0(50ms) P128(见课本)TL0=0xb0;EA=1; // 开总中断P161(见课本)TR0=1; // 定时/计数器0开启ET0=1; // 定时器/计数器0溢出中断启动P161(见课本)}void delay( unsigned int t) // 延时函数{unsigned int i;while(t--)for(i=0;i<125;i++);}void display() // 显示时间函数{if(TF0==1) // 定时器/计数器溢出P130(见课本){TF0=0; // 清中断标志位t++;if(t==20) // (50ms*20=1s){t=0;sec++; // 秒加1if(sec==60) // 秒为60,则清零,分加1{sec=0;min++;}if(min==60) // 分为60,则清零,时加1{min=0;hour++;}if(hour==24)// 时为24,则清零{hour=0;}}}data1[5]=sec%10;data1[4]=sec/10;data1[3]=min%10;data1[2]=min/10;data1[1]=hour%10;data1[0]=hour/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data1[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data1[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data1[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data1[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data1[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data1[0]];delay(1);}void display_bb() // 显示闹钟函数{data2[5]=bbs%10;data2[4]=bbs/10;data2[3]=bbm%10;data2[2]=bbm/10;data2[1]=bbh%10;data2[0]=bbh/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data2[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data2[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data2[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data2[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data2[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data2[0]];delay(1);}void keyscan() // 键盘扫描{if(key1==0) // 暂停/开始{++kk;while(!key1){display();if(kk==1){TR0=0;if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if(key2==0) // 模式选择(调节时间/闹钟){k1++;while(!key2){if(k1==1) // 第1次按下{sec1=sec; // 保存秒的数值sec=88; // 显示88,表示可以调节秒的数值了display(); // 显示88sec=sec1; // 恢复前一刻秒的数值}if(k1==2){min1=min;min=88;display();delay(1);min=min1;}if(k1==3){hour1=hour;hour=88;delay(1);hour=hour1;}if(k1==4){sec1=bbs; // 保存秒的数值bbs=66; // 显示66,表示可以调节秒的数值了display_bb(); // 显示66bbs=sec1; // 恢复前一刻秒的数值}if(k1==5){min1=bbm;bbm=66;display_bb();delay(10);bbm=min1;}if(k1==6){hour1=bbh;bbh=66;display_bb();delay(10);bbh=hour1;}if(k1==7){k1=0;display();}}}if(key3==0) // 时间/闹钟增加设置{while(!key3){if(k1==1){sec++;// 秒加1if(sec==60)sec=0;display();}if(k1==2){min++;delay(60);if(min==60)min=0;display();}if(k1==3){hour++;delay(60);if(hour==24)hour=0;display();}if(k1==4){bbs++; // 秒加1delay(60);if(bbs==60)bbs=0;display_bb();}if(k1==5){bbm++;delay(60);if(bbm==60)bbm=0;display_bb();}if(k1==6){bbh++;delay(60);if(bbh==24)bbh=0;display_bb();if(k1==7){k1=0;display();}}}if(key4==0) // 时间/闹钟减少设置{while(!key4){if(k1==1){sec--; // 秒加1delay(60);if(sec==0)sec=60;display();}if(k1==2){min--;delay(60);if(min==0)min=60;display();}if(k1==3){hour--;delay(60);if(hour==0)hour=24;display();}if(k1==4){bbs--; // 秒减1delay(60);if(bbs==0)bbs=60;display_bb();if(k1==5){bbm--;delay(60);if(bbm==0)bbm=60;display_bb();}if(k1==6){bbh--;delay(60);if(bbh==0)bbh=24;display_bb();}if(k1==7){k1=0;display();}}}}}if(kk==2){kk=0;k1=0;TR0=1;}}}。
《单片机技术》课程设计说明书数字电子钟系、部:电气与信息工程学院学生姓名:指导教师:职称专业:班级:完成时间:2013-06-07摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用ATMEL公司的AT89S52单片机为核心,使用12MHz 晶振与单片机AT89S52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEU5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词电子钟;AT89S52;硬件设计;软件设计ABSTRACTClock is widely used in life, and a simple digital clock is more welcomed by people. So to design a simple digital electronic clock is necessary.The system use a single chip AT89S52 of ATMEL’s as its core to control The crystal oscillator clock,using of E-12MHZ is connected with the microcontroller AT89S52, through the software programming method to achieve a 24-hour cycle, and eight 7-segment LED digital tube (two four in one digital tube) displays hours, minutes and seconds requirements, and in the time course of a timing function, when the time arrived ahead of scheduled time to buzz a good timekeeping. The clock has four buttons KEY1, KEY2, KEY3,KEY4 and KEY5 key, and make the appropriate action can be achieved when the school, timing, reset. With a time display, alarm clock settings, timer function, corrective action. Accurate travel time, display and intuitive, precision, stability, and so on. With a high application value.Key words Electronic clock;;AT89S52;Hardware Design;Software Design目录1设计课题任务、功能要求说明及方案介绍 (1)1.1设计课题任务 (1)1.2功能要求说明 (1)1.3设计总体方案介绍及原理说明 (1)2设计课题硬件系统的设计 (2)2.1设计课题硬件系统各模块功能简要介绍 (2)2.2设计课题电路原理图、PCB图、元器件布局图 (2)2.3设计课题元器件清单 (5)3设计课题软件系统的设计 (6)3.1设计课题使用单片机资源的情况 (6)3.2设计课题软件系统各模块功能简要介绍 (6)3.3设计课题软件系统程序流程框图 (6)3.4设计课题软件系统程序清单 (10)4设计结论、仿真结果、误差分析、教学建议 (21)4.1设计课题的设计结论及使用说明 (21)4.2设计课题的仿真结果 (21)4.3设计课题的误差分析 (22)4.4设计体会 (22)4.5教学建议 (22)结束语 (23)参考文献 (24)致谢 (25)附录 (26)1 设计课题任务、功能要求说明及方案介绍1.1 设计课题任务设计一个具有特定功能的电子钟。
课程设计报告课程名称:单片机课程设计题目:多功能电子表学院:环境与化学工程系:过程装备与测控工程专业:测控技术与仪器班级:测仪111学号:5801211040学生姓名:白金成起讫日期:2012-12-28~2013-1-7指导教师:杨大勇、杨俊清、熊剑单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。
而51单片机是各单片机中最为典型和最有代表性的一种。
本设计以AT89C52芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的闹钟,它由5V直流电源供电。
在硬件方面,除了CPU外,使用1602液晶显示时钟的时间,并通过所写程序控制在某个时间点蜂鸣器的响应,即完成闹钟的功能,该闹钟设有4个独立按键,时间调整按键、闹钟调整按键和两个时间加减按键。
软件方面采用C语言编程。
整个闹钟系统能完成时间的显示、调时和定时闹钟的功能。
选用单片机最小系统应用程序,添加比较程序、时间调整程序及蜂鸣程序,通过时间比较程序触发蜂鸣,实现闹钟功能,完成设计所需求的软件环境。
介绍并使用KEIL单片机模拟调试软件,测试程序的可行性并用Proteus进行仿真。
关键词:AT89C52单片机定时器中断闹钟一、设计任务、要求 (4)1.1、设计任务: (4)1.2、设计要求: (4)二、方案总体设计 (5)2.1、显示模块 (5)2.2、实时时间计算模块 (5)2.3、按键控制模块 (5)2.4、声音报警模块 (5)2.5、总体设计: (5)三、硬件设计 (7)3.1、单片机最小系统 (7)3.1.1、时钟信号的产生 (7)3.1.2、复位电路 (7)3.2、液晶显示模块 (8)3.2.1、1602液晶引脚图及连线电路 (8)3.2.2、一般1602字符型液晶显示器实物图 (8)3.3、矩阵键盘 (8)3.4、蜂鸣器电路 (9)3.5、电源指示灯部分 (9)3.6、STC89C52芯片 (9)3.7、整体电路原理图 (10)3.8、Lockmaster硬件电路 (11)四、程序流程图 (13)五、系统仿真与调试 (15)5.1、Proteus仿真原理图 (15)5.2、实物图 (17)5.3、使用说明 (17)六、设计总结及心得体会 (18)附录: (19)一、设计任务、要求1.1、设计任务:利用单片机、4个独立按键、1602液晶显示器、无源蜂鸣器实现具有日期、时间、闹钟功能的多功能电子表。
基于单片机的电子闹钟设计摘要本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。
关键词:单片机;led;闹钟;定时器AbstractThis design, adopting AT89C51 chip as the core part with some necessary peripheral circuits, is a simple electronic clock which uses 5V DC as the power supply. Keywords:single chip machine ,in fixed time machine, alarm clock,LED1 引言1.1设计目的此次课程设计是在学习先修课程《单片机原理与系统设计》之后,为加强对学生系统设计和应用能力的培养而开设的综合设计训练环节。
本课程设计应结合《单片机原理与系统设计》课程的基础理论,重点强调实际应用技能训练,包括单片机系统设计的软件和硬件两部分。
其课程设计任务是使学生通过应用单片机系统设计的基本理论,基本知识与基本技能,掌握单片机应用系统各主要环节的设计、调试方法,初步掌握并具备应用单片机进行设备技术改造和产品开发的能力,培养学生的创新意识,提高学生的动手能力和分析问题、解决问题的能力。
1.2设计要求结合单片机知识,以AT89C51单片机为核心,利用七段LED数码管实现计时、校时及闹钟功能。
1.3设计方法以AT89C51单片机为核心,外加晶振电路,使用8个七段数码管显示,LED 采用动态扫描,用74ls245芯片作为驱动电路。
通过四个独立按键对时间进行定时、校时,从而实现闹钟提醒功能。
2 设计方案及原理2.1设计方案选AT89C51单片机作为系统核心,辅助外部产生时钟信号的晶振电路,再加上四个独立按键作为输入信号,使用8个七段数码管显示时间,芯片74ls245为数码管段选线的驱动,最后用蜂鸣器实现闹铃功能。
使用单片机的定时器T0计时时间为50ms,计时20次作为1s的时间基准。
第一部分,12MHz的晶振连接至单片机的时钟信号输入端;第二部分,四个独立按键加上四个上拉电阻连接至单片机的P1口的低四位;第三部分,单片机的P0口通过由芯片74ls245构成的驱动电路连接至数码管的段选线,单片机的P3口连接至数码管的位选线;第四部分,单片机的P2.1通过一个NPN型三极管连接至蜂鸣器。
8个七段数码管使用动态扫描显示时间,独立按键用软件编程实现对时间和闹钟时、分、秒的设置,再通过比较所设置的闹钟与时间是否相等,达到闹铃发出声响的效果。
2.2设计原理系统原理图如图2.1所示。
图2.1 系统原理图3 硬件设计硬件电路分四个模块:晶振电路、键盘电路、数码管显示电路、蜂鸣器驱动电路。
晶振电路使用12MHz晶体振荡器,经分频后供单片机工作。
键盘采用4个独立按键配以4个上拉电阻实现对时钟和闹钟的设定及修改。
由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片74ls245来驱动段码,用P3口作位码驱动。
发音部分是通过三极管放大驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。
系统硬件电路图如图3.1所示。
图3.1 系统硬件图4 软件设计源程序清单见附录。
主程序流程图如图4.1所示。
图4.1 主程序流程图5 系统仿真及调试硬件部分设置了的三个按键K1、K2、K3、K4。
当按键K1第一次按下时,停止计时进入闹钟1的秒设置,当按键K1第二、第三次按下时,分别进入闹钟1的分设置和时设置,当按K1第四、第五、第六次按下时分别进入闹钟2的秒、分、时设置,当按K1第七、第八、第九次按下时分别进入闹钟3的秒、分、时设置,当按K1第十、第二一、第十二次按下时分别进入时间的秒、分、时设置,在K1按下的各阶段,可用按键K2、K3进行时间和闹铃时间的时、分、秒进行加减设置;当按键K1第十三次按下时恢复到时间显示功能。
当显示的时间和定时设置的时间一致时,蜂鸣器发出等时间断蜂鸣声,闹铃时间设置为60秒。
在各个闹钟设置阶段,如果有K4按下,则相应闹钟功能关闭或开启;如在闹铃时有K4按下则提前停止闹铃。
系统仿真图如图5.1所示。
图5.1 系统仿真图6 总结通过两周的努力,完成了电子闹钟的设计目的,实现了时间的显示、校时、设置闹钟、闹铃等功能。
这期间,我复习了单片机的相关知识,并结合查阅相关资料,设计了整体电路以及各模块的电路,对照硬件电路编写对应模块的子程序,最后将各个子程序整合到一个主程序中,完成了设计所需功能。
在设计中,我发现选择合适的元器件很重要,比如数码管有共阳极和共阴极两种,不同的选择会导致程序的不同,经过多次调试最终选择了共阳极数码管。
另外,我觉得软件的设计比硬件设计更重要,而且难度更大。
比如写一个程序看其功能很少认为编写程序简单,但到编程的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。
我在这次设计中收获颇多。
我对所学的理论知识在实践中加深了认识,同时更加熟练掌握了Proteus、Keil等软件的使用。
做任何事都需要耐心和细心,一点小的疏忽和懈怠可能导致整个设计失败。
还有一点,自己的设计思路不可能凭空产生,只有借鉴别人已有的设计并充分消化吸收成为自己的东西,才能做出更好的设计作品。
参考文献[1] 王思明.单片机原理及应用系统设计[M].北京:科学出版社,2012.[2] 陈明荧. 89C51单片机课程设计实训教材[M].北京:清华大学出版社,2003.[3] 刘瑞新.单片机原理及应用教程[M].北京:机械工业出版社,2005.[4] 杨文龙.单片机原理及应用[M].西安:西安电子科技大学出版社,2002.附录源程序清单://****************************头文件******************************** #include<reg51.h>#include<intrins.h>//****************************宏定义******************************** #define uchar unsigned char#define uint unsigned int//****************************位声明******************************** sbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;sbit fmq=P2^1;//************************数码管显示的数值************************** uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,// 0 1 2 3 4 50x82,0xf8,0x80,0x90,0xbf,0x0ff};// 6 7 8 9 - 灭void jia(); //定义时间加函数void jian(); //定义时间减函数//********************数组定义,数组内含有8个数值****************** uchar table1[8],table2[8],table3[8],table4[8];//**************************时间显示初始值************************** uchar shi=12,fen=0,miao=0;//**************************定义全局变量**************************** uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;uchar shi4,fen4,miao4;uchar flag, flag1, wss, cnt, cnt1, alm1, alm2, alm3;// 1秒等时位闪次数校时闹1 闹2 闹3uint flag2;// 蜂鸣//*********************延时函数,用于动态扫描数码管***************** void delay(uchar i){ uchar x,y;for(x=i;x>0;x--)for(y=120;y>0;y--);}//*******************************初始化函数************************* void init(){ TMOD=0x01; //工作方式1TH0=0x3c; //定时时间为:50ms (65536-50000)/256TL0=0x0b0; //(65536-50000)%256ET0=1; //打开定时器EA=1; //开总中断TR0=1; //启动定时器}//********************显示子函数,用于显示时间数值***************** void display(){ uchar i,j;if(cnt!=10||wss==0){ table1[0]=miao%10; //分离秒的个位与十位table1[1]=miao/10;}else{ table1[0]=table1[1]=11;}if(cnt!=11||wss==0){ table1[3]=fen%10; //分离分的个位与十位table1[4]=fen/10;}else{ table1[3]=table1[4]=11;}if(cnt!=12||wss==0){ table1[6]=shi%10; //分离时的个位与十位table1[7]=shi/10;}else{ table1[6]=table1[7]=11;}table1[2]=table1[5]=10;j=0x7f;for(i=0;i<=7;i++) //从秒到时的扫描{ P3=j; //选通点亮八个数码管P0=table[table1[i]]; //显示数值delay(10); //调用延时程序j=_cror_(j,1); //循环右移}}//*******************显示子函数,用于显示定时1时间***************** void display1(){ uchar i,j;if(alm1==0){ if(cnt!=1||wss==0){ table2[0]=miao1%10; //分离秒的个位与十位table2[1]=miao1/10;}else{ table2[0]=table2[1]=11;}if(cnt!=2||wss==0){ table2[3]=fen1%10; //分离分的个位与十位table2[4]=fen1/10;}else{ table2[3]=table2[4]=11;}if(cnt!=3||wss==0){ table2[6]=shi1%10; //分离时的个位与十位table2[7]=shi1/10;}else{ table2[6]=table2[7]=11;}}elsetable2[0]=table2[1]=table2[3]=table2[4]=table2[6]=table2[7]=10;table2[2]= table2[5]=10;j=0x7f;for(i=0;i<=7;i++) //从秒到时的扫描{ P3=j; //选通点亮八个数码管P0=table[table2[i]]; //显示数值delay(10); //调用延时程序j=_cror_(j,1); //循环右移}}//********************显示子函数,用于显示定时2时间****************** void display2(){ uchar i,j;if(alm2==0){ if(cnt!=4||wss==0){ table3[0]=miao2%10; //分离秒的个位与十位table3[1]=miao2/10;}else{ table3[0]=table3[1]=11;}if(cnt!=5||wss==0){ table3[3]=fen2%10; //分离分的个位与十位table3[4]=fen2/10;}else{ table3[3]=table3[4]=11;}if(cnt!=6||wss==0){ table3[6]=shi2%10; //分离时的个位与十位table3[7]=shi2/10;}else{ table3[6]=table3[7]=11;}}elsetable3[0]=table3[1]=table3[3]=table3[4]=table3[6]=table3[7]=10;table3[2]= table3[5]=10;j=0x7f;for(i=0;i<=7;i++) //从秒到时的扫描{ P3=j; //选通点亮八个数码管P0=table[table3[i]]; /显示数值delay(10); //调用延时程序j=_cror_(j,1); //循环右移}}//***************显示子函数,用于显示定时3时间数值****************// void display3(){ uchar i,j;if(alm3==0){ if(cnt!=7||wss==0){ table4[0]=miao3%10; //分离秒的个位与十位table4[1]=miao3/10;}else{ table4[0]=table4[1]=11;}if(cnt!=8||wss==0){ table4[3]=fen3%10; //分离分的个位与十位table4[4]=fen3/10;}else{ table4[3]=table4[4]=11;}if(cnt!=9||wss==0){ table4[6]=shi3%10; //分离时的个位与十位table4[7]=shi3/10;}else{ table4[6]=table4[7]=11;}}elsetable4[0]=table4[1]=table4[3]=table4[4]=table4[6]=table4[7]=10;table4[2]= table4[5]=10;j=0x7f;for(i=0;i<=7;i++) //从秒到时的扫描{ P3=j; //选通点亮八个数码管P0=table[table4[i]]; //显示数值delay(10); //调用延时程序j=_cror_(j,1); //循环右移}}//***********************时间子函数*****************************// void shijian(){ if(flag>=20) //判断是否到一秒{ wss=~wss;flag=0; //到了,则标志位清零if(cnt1!=0){ miao4++; //秒加1if( miao4>59) //判断秒是否到60s{ miao4=0; //到了,则清零fen4++; //分加1if(fen4>59) //判断分是否到1min{ fen4=0; //到了,则清零shi4++; //时加1if(shi4>23) //判断时是否到24hshi4=0; //到了,则清零}}}else{ miao++; //秒加1if( miao>59) //判断秒是否到60s{ miao=0; //到了,则清零fen++; //分加1if(fen>59) //判断分是否到1min{ fen=0; // 到了,则清零shi++; //时加1if(shi>23) // 判断时是否到24hshi=0; //到了,则清零}}}}}//**************************键盘扫描子函数************************// void key_scan(){ if(key1==0){ while(!key1) //防止掉显{ if(cnt==1||cnt==2||cnt==3){ display1(); } //key1按了1、2、3次,调用闹钟1子程序if(cnt==4||cnt==5||cnt==6){ display2(); } // key1按了4、5、6次,调用闹钟2子程序if(cnt==7||cnt==8||cnt==9){ display3(); } // key1按了7、8、9次,调用闹钟3子程序if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){ display(); } // key1按了10、11、12、13次,调用计时子程序}cnt++; //记下按键key1按下的次数if(cnt==10&&cnt1==0){ miao4=miao;fen4=fen;shi4=shi;cnt1++;}if(cnt==13){ cnt=0;if(cnt1==1){ miao=miao4;fen=fen4;shi=shi4;}cnt1=0;}}if(key2==0) //判断key2是否按下{ while(!key2) //防止掉显{ if(cnt==1||cnt==2||cnt==3){ display1(); }if(cnt==4||cnt==5||cnt==6){ display2(); }if(cnt==7||cnt==8||cnt==9){ display3(); }if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){ display(); }}jia(); //调用加1子函数}if(key3==0) //判断key3是否按下{ while(!key3) //防止掉显{ if(cnt==1||cnt==2||cnt==3){ display1(); }if(cnt==4||cnt==5||cnt==6){ display2(); }if(cnt==7||cnt==8||cnt==9){ display3(); }if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){ display(); }}jian(); //调用减1子函数}if(key4==0) //判断key4是否按下{while(!key4) //防止掉显{ if(cnt==1||cnt==2||cnt==3){ alm1=~alm1;display1();}if(cnt==4||cnt==5||cnt==6){ alm2=~alm2;display2();}if(cnt==7||cnt==8||cnt==9){ alm3=~alm3;display3();}if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)display();}}}//****************************加1子函数*************************** void jia(){ if(cnt==1) //判断key1按下的次数是否为1{ miao1++; //是,则秒加1if(miao1>59) //判断秒是否大于60,是,则秒清零miao1=0;}if(cnt==2) //判断key1按下的次数是否为2{ fen1++; //是,则分加1if(fen1>59) //判断分是否大于60fen1=0; //是,则分清零}if(cnt==3) //判断key1按下的次数是否为3{ shi1++; //是,则时加1if(shi1>23) //判断时是否大于23shi1=0; //是,则时清零}if(cnt==4) //判断key1按下的次数是否为4{ miao2++; //是,则秒加1if(miao2>59) //判断秒是否大于60,是,则秒清零miao2=0;}if(cnt==5) //判断key1按下的次数是否为5{ fen2++; //是,则分加1if(fen2>59) //判断分是否大于60fen2=0; //是,则分清零}if(cnt==6) //判断key1按下的次数是否为6{ shi2++; //是,则时加1if(shi2>23) //判断时是否大于23shi2=0; //是,则时清零}if(cnt==7) //判断key1按下的次数是否为7{ miao3++; //是,则秒加1if(miao3>59) //判断秒是否大于60,是,则秒清零miao3=0;}if(cnt==8) //判断key1按下的次数是否为8{ fen3++; //是,则分加1if(fen3>59) //判断分是否大于60fen3=0; //是,则分清零}if(cnt==9) //判断key1按下的次数是否为9{ shi3++; //是,则时加1if(shi3>23) //判断时是否大于23shi3=0; //是,则时清零}if(cnt==10) //判断key1按下的次数是否为10{ miao++; //是,则秒加1if(miao>59) //判断秒是否大于60,是,则秒清零miao=0;cnt1++;}if(cnt==11) //判断key1按下的次数是否为11{ fen++; //是,则分加1if(fen>59) //判断分是否大于60fen=0; //是,则分清零cnt1++;}if(cnt==12) //判断key1按下的次数是否为12{ shi++; //是,则时加1if(shi>23) //判断时是否大于23shi=0; //是,则时清零cnt1++;}}//***************************减1子函数**************************// void jian(){ if(cnt==1) //判断key1按下的次数是否为1,是则秒减1 { miao1--;if(miao1==255) //判断秒是否减到255,是,则秒置59miao1=59;}if(cnt==2) //判断key1按下的次数是否为2,是则分减1{ fen1--;if(fen1==255) //判断分是否减到255,是,则分置59fen1=59;}if(cnt==3) //判断key1按下的次数是否为3,是则时减1{ shi1--;if(shi1==255) //判断时是否减到255,是,则时置23shi1=23;}if(cnt==4) //判断key1按下的次数是否为4,是则秒减1{ miao2--;if(miao2==255) //判断秒是否减到255,是,则秒置59miao2=59;}if(cnt==5) //判断key1按下的次数是否为5,是则分减1{ fen2--;if(fen2==255) //判断分是否减到255,是,则分置59fen2=59;}if(cnt==6) //判断key1按下的次数是否为6,是则时减1{ shi2--;if(shi2==255) //判断时是否减到255,是,则时置23shi2=23;}if(cnt==7) //判断key1按下的次数是否为7,是则秒减1{ miao3--;if(miao3==255) //判断秒是否减到255,是,则秒置59miao3=59;}if(cnt==8) //判断key1按下的次数是否为8,是则分减1{ fen3--;if(fen3==255) //判断分是否减到255,是,则分置59fen3=59;}if(cnt==9) //判断key1按下的次数是否为9,是则时减1{ shi3--;if(shi3==255) //判断时是否减到255,是,则时置23shi3=23;}if(cnt==10) //判断key1按下的次数是否为10,是则秒减1{ miao--;if(miao==255) //判断秒是否减到255,是,则秒置59miao=59;cnt1++;}if(cnt==11) //判断key1按下的次数是否为11,是则分减1{ fen--;if(fen==255) //判断分是否减到255,是,则分置59fen=59;cnt1++;}if(cnt==12) //判断key1按下的次数是否为12,是则时减1{ shi--;if(shi==255) //判断时是否减到255,是,则时置23shi=23;cnt1++;}}//***************************闹铃子函数***************************// void clock()//判断秒的数值是否相等{ if(miao==miao1&&alm1==0||miao==miao2&&alm2==0||miao==miao3&&alm3== 0)//是,在判断分是否相等if(fen==fen1&&alm1==0||fen==fen2&&alm2==0||fen==fen3&&alm3==0)//是,再判断时是否相等if(shi==shi1&&alm1==0||shi==shi2&&alm2==0||shi==shi3&&alm3==0){ flag2=0; //是,则标志位,flag2清零while(!(flag2==1200)&&(cnt==0)) //判断flag2是否到1200且不// 为调时状态{if(key4==0) //没有,则继续驱动蜂鸣器响{while(!key4)flag2=1200;}if(flag1>1) //等时方波驱动蜂鸣器{ fmq=~fmq;flag1=0;}shijian(); //调用时间子函数display(); //调用显示子函数}fmq=1; //关闭蜂鸣器}}//**************************主函数********************************// void main(){ init(); //调用初始化子函数while(1){ clock(); //闹钟子函数if(cnt==1||cnt==2||cnt==3) //显示子函数{ display1(); }if(cnt==4||cnt==5||cnt==6){ display2(); }if(cnt==7||cnt==8||cnt==9){ display3(); }if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){ display(); }shijian(); //调用时间子函数key_scan(); //调用键盘扫描子函数}}//**************************定时中断******************************// void time0() interrupt 1{ TH0=0x3c; //初值50ms (65536-50000)/256TL0=0x0b0; // (65536-50000)%256flag++; //标志位flag1++;flag2++;}。