基于单片机的电子闹钟设计

合集下载

基于单片机的音乐闹钟毕业设计

基于单片机的音乐闹钟毕业设计

摘要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单片机的多功能电子钟设计

基于51单片机的多功能电子钟设计

基于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口模块和定时器模块等。

然后,我们需要编写定时中断函数,用来更新显示时间。

接下来,我们需要编写按键处理函数,用来设置闹钟和调整时间。

最后,我们需要编写报警函数,通过发出蜂鸣器的声音来提醒。

设计的基本功能包括:设置时间、设置闹钟、调整时间、调整闹钟、报警功能等。

用户可以通过按键输入来设置时间和闹钟,并且可以通过按键调整时间和闹钟的设置。

当闹钟时间到达时,蜂鸣器会发出声音提醒用户。

同时,数码管或液晶屏会显示当前的时间。

为了提高闹钟的实用性,我们还可以添加一些其他功能。

例如,可以加入温湿度传感器来测量当前的环境温度和湿度,并在数码管或液晶屏上显示。

还可以加入闹铃音乐的选择功能,让用户可以选择自己喜欢的音乐作为报警铃声。

总之,基于单片机的电子闹钟设计涉及到硬件电路设计和软件程序编写两个方面。

通过合理设计硬件电路和编写完善的软件程序,可以实现各种实用的功能。

电子闹钟可以帮助人们准时起床、上班或进行其他活动,提高人们的时间管理能力和生活质量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于单片机的电子闹钟设计摘要本设计以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++;}。

相关文档
最新文档