推荐-单片机课程设计多功能定时器 精品 精品
基于单片机设计的多功能定时器

参考文献(3条) 1.李群芳.黄建 单片微型计算机与接口技术 2001 2.张培仁 基于C语言编程MCS-51单片机原理与应用 2002 3.赵秀珍.单永磊 单片微型计算机原理及其应用 2001
相似文献(10条) 1.学位论文 宋公明 基于高速单片机的加工中心数控系统的硬件研制 2007
数控系统是计算机技术在机械制造领域的一种典型应用,它集计算机、机械加工、微电子和自动控制多项技术于一体,是近年来应用领域中发展 十分迅速的一项高新技术。当今世界各国制造业都已广泛采用控制技术,以提高制造能力和水平;并且世界各工业发达国家将数控技术及数控装备列 为国家战略物资,不仅采取重大措施发展自己的数控技术及其产业? 精尖”的数控关键技术及装备进行封锁。因此在数控技术方面,我们要努力创新 ,研究开发具有自己知识产权的技术和产品。加工中心是一种功能齐全和性能强且性能价格比高,应用广泛的数控机床。随着数控技术的日益进步和 加工中心的广泛应用,加工中心已经成为世界数控机床市场中竞争的主流产品,也是我国众多的机械加工行业技术改造的首选产品之一。其应用量大 面广,市场需求日益旺盛。 如今,随着微电子技术和计算机技术的不断发展,数控系统性能也日臻完善;同时,数控系统的应用领域也日益扩 大。数控技术的关键因素是数控装置,即数控系统信息处理部分的功能、速度和可靠性,控制系统的好坏将直接关系到数控机床的整体性能。同时为 了满足社会经济发展和科技发展的需要,各种档次的数控系统都在朝着高精度、高速度和高可靠性等方向发展。为适应这一发展趋势,本文研制的是 一种基于8位高速SoC单片机的加工中心数控系统,该系统采用的是主、从双MCU进行前后台控制的框架结构。采用这一设计方案,主要是为了保证和满 足加工中心数控系统的实时性和高速、高可靠性的要求。 在论文中,以系统的硬件研制为主线,以高速单片机的相关电路、人机交互和双口 RAM实现双机通讯等有关电路设计和底层驱动软件实现为主要内容,全面、系统地介绍了控制系统研制的一般技术知识和要点。 本论文共有7章 ,按照技术内容主要有以下五个部分。各部分的具体内容和技术要点,以及所包含的章节如下: 第一部分简单地介绍了控制系统的总体结构 ,及其系统板的电路设计。这一部分位于论文的第2章,主要概括地说明了控制系统的设计思想,并对高速单片机这一控制核心作了简单的介绍。 第二部分,为论文的第3章。较详细的介绍和分析了控制系统设计中的各单元电路的要点。其中有高速单片机的电路设计、输入输出接口的电路设计 、液晶显示电路设计以及双口RAM的电路设计等(包括人机交互接口、串行通讯接口、在线编程接口以及I/O扩展接口等)。 第三部分,为论文的 第4章。重点介绍系统单元电路的相关底层驱动软件的设计:高速单片机外部存储器接口配置和低端口交叉开关译码器配置的方法及其程序实现、液晶 显示的有关程序设计、双口RAM实现数据共享的程序设计、I/O接口的程序设计及电机驱动程序设计。第四部分介绍的是一般数控系统的抗干扰技术。 分别说明了相关的硬件抗干扰技术和软件设计的抗干扰措施。位于论文的第5章。 最后这一部分介绍了系统电路的部分调试工作。其中有,人机 交互电路的调试,通讯及数据保持芯片的接口电路的调试,以及交流伺服电机的运于单片机设计的多功能定时器
基于51单片机的多功能定时器

用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。
3.在家用电器中的应用
可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。
摘要
本设计要求以单片机为核心主体,完成最小系统板的设计与制作(通过Protel软件,对电路进行设计,调试。生成PCB板,再对元器件进行排布,焊接。)之后要进行初调试,证实电路板无误后才能进行下面的内容。电路板完成后,在总程序基础上通过编程设计家用多路定时控制器。本课程设计目标:具有正常数字钟功能,包括时间校正,具有至少三路定时开关控制功能,每路定时时间可以任意设置。但重要的是要有一定的创新,因为此系统还有很多值得开发的功能,单纯的三路定时只是设计内容的基本要求。
图1-1MCS—51单片机片内总体结构框图
单片机的生存周期相对于普通CPU而言非常之长,如MCS8051已超过15年。以某类单片机(如8051/52)为核心,集成不同I/O功能模块的新单片机系列层出不穷;而某些单片机更是突出了以功能分类的特点(如Microchip公司的PIC单片机)。8位、16位、32位单片机共同发展也是当前单片机技术发展的另一特点。
1.1.2单片机在电子技术中的应用
单片机的应用领域
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录象机、摄象机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
基于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单片机的工作原理基于冯诺伊曼体系结构,即程序指令和数据存储在同一块存储器中,通过总线系统进行传输。
单片机课程设计报告-可编程作息时间控制器

单片机原理及应用课程设计报告目录目录 (1)1 设计任务书 (2)1.1 基本设计要求 (2)2 设计阐明 (2)12.1设计内容 (2)1.2设计要求 (2)1.3设备及工作环境 (3)3 系统方案整体设计 (3)3.1 设计思路 (4)3.2 系统整体框图 (4)4 硬件设计 (4)4.1 系统硬件设计 (4)4.1.1 键盘扫描 (5)4.1.2 LCD显示器 (5)4.2 系统工作原理论述 (5)5 软件设计 (5)5.1 分析论证 (5)5.1.1 显示模块 (6)5.1.2 运算模块 (6)5.1.3 校时模块 (6)3.1.4 启动/暂停,复位模块 (6)5.1.5 整体功效 (6)5.2程序清单 (7)6 调试过程及分析 (24)7 设计总结 (25)参考文献 (26)- 1 -单片机原理及应用课程设计报告1 设计任务书1.1 基本设计要求(1)在综合单片机实验箱的硬件结构上编写软件完成设计。
(2)程序的首地址应使目标机可以直接运行,即从0000H开端。
在主程序的开端部分必须设置一个合适的栈底。
程序放置的地址须持续且靠前,不要在中间留下大批的空间地址,以使目标机可以应用较少的硬件资源。
(3)2*16位LCD显示器从左到右分辨显示闹钟时间和现在时间,采用24小时标准计时制。
(4)在4个键控开关上选定2个键分辨作为小时. 分的调校键。
每按一次键,对应的显示值便加1。
分. 秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不产生转变)。
(5)软件设计应用片内定时器,采用定时中断结构,应用软件延时法。
2 设计阐明12.1设计内容用ZY15MCU12BD型综合单片机实验箱及串口电路设计实现显示现在时间和闹钟时间并能够调校现在时间和闹钟时间的时钟,还能够实现闹钟的复位功能以及广播和蜂鸣器的响应。
说明设计中包含的内容1.2设计要求(1)在ZY15MCU12BD型综合单片机实验箱的硬件结构上编写软件完成- 5 -单片机原理及应用课程设计报告设计。
(完整版)基于单片机的多功能定时器毕业设计论文

目录1 引言 ........................................................................................................................2 概述 ........................................................................................................................2.1 定时开关电源插座系统概述...........................................................................2.2 本设计方案思路...............................................................................................2.3 研发方向和技术关键.......................................................................................2.4 主要技术指标...................................................................................................3 总体设计 ....................................................................................................................3.1 可控开关设计的选择.......................................................................................3.2 时钟信号的实现...............................................................................................3.3 译码方案的选取...............................................................................................4 硬件设计 (1)4.1 可控开关电路 (1)4.2 电平转换电路 (1)4.3 单片机系统电路 (1)4.4 显示电路 (1)5 软件设计 (1)5.1 总体方案 (1)5.2 主程序流图 (1)5.3 中断模块说明 (1)6 制作与调试 (1)6.1 硬件电路的布线与焊接 (1)6.2 调试 (2)6.3 改进与扩展 (2)7 结论 (2)致谢 (2)参考文献 (2)附录 (2)1.引言随着电子技术和电源技术的发展,开关电源以体积小、重量轻、功率密度大、集成度高、输出组合便利等优点而成为电子电路电源的首选。
单片机课程设计——多功能定时器

一、设计目的:1、在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用;2、能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,在软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高;3、使学生增进对单片机的感性认识,加深对单片机理论方面的理解。
使学生掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通信等;4、使学生了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。
二、设计功能说明数字钟是采用数字电路实现对时,分,秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。
数字钟已成为人们日常生活中的必需品,本设计可实现如下功能:1、使用实时时钟芯片写入及读取时间2、用LCD显示,可显示年、月、日、时、分、秒、星期、农历日期、节日3、选择蜂鸣器电路,实现两个闹钟设置和事件提示功能4、实现时钟校正功能,12小时/24小时切换功能5、显示当前时间为上午时间或下午时间6、整点报时功能按键功能如下:1、对显示时间的设置按键0:进入设置模式,实现秒(S)、分(M)、时(H)、年(Y)、月(m)、日(D)、星期(W)设置的切换,并在LCD右下角显示所设置的项目,当各项目设置完毕后,再按下按键0则返回主界面正常显示时间;按键1:每按一次按键1,对所设置的时间加1,当设置的时间超过它的最大值时,该项自动为0,例如:当设置秒为59时,秒自动清零;按键2:每按一次按键:2,对所设置的时间减1,当设置的时间小于0时,该项自动为它的最大值;按键3:设置完成后的确认键并可按此键中途退出设置,时间按用户设置值正常计时;按键7:实现时钟校正功能,12小时/24小时切换功能。
单片机课程设计(家用多功能定时器设计与制作)
《单片机技术》课程设计报告项目名称:家用多功能定时器设计与制作第一章绪论1.1设计任务及目标本次课程设计的任务如下:1,完成单片机最小系统板设计与制作。
2,编程设计家用多路定时控制器目标:1,具有正常数字钟功能,包括时间校正,具有至少三路定时开关控制功能,每路定时时间可以任意设置2,自主创新的功能。
第二章系统电路设计2.1 系统总体设计框架结构2.2 系统硬件单元电路设计2.2.1 时钟电路设计该电路为时钟电路,主要功能为:与单片机内部振荡器构成振荡电路,为单片机工作提供时序。
晶体是12MHz,电容选用33pf,时钟周期为1/12us,机器周期为1/12*12=1us2.2.2 复位电路设计电阻为10k,电容为0.1uf,由于电容的阻抗对直流而言比较大,当复位开关未按下时,通过电容和电阻分压使得RESET端为低电平,当按下复位键时,通过两个电阻分压在RESET为高电平,从而实现复位.电阻的作用不是限制电流的大小,而是控制复位时间.电容充电时间与R C的值成正比.2.2.3 按键电路设计按键电路为2行6列式矩阵键盘,例如,Shift键将Y0与Line1连接起来,当Y0口为低电平时,如果此时检测到Line1为低电平,则唯一说明Shift键按下,此时记录当前按键键值为1.2.3 系统硬件总电路系统总体电路图第三章 系统软件设计3.1 系统软件流程图主程序流程图主程序在初始化参数后进入while 循环,不断调用子程序进行刷新缓冲区,刷新显示LED ,定时时间检测,按键处理等操作。
定时器0中断计时子程序流程图:定时器0中断主要用于计时,首先设定一次中断所需的时间,这里为50MS,故初始值为TH0=0x3C; TL0=0xB0;检测50ms计数单元是否加满10次,若是,则LED取反闪烁,若不是则跳过。
检测50ms计数单元是否加满20次,若是,则秒计数单元+1,若不是则结束。
检测秒计数单元是否加满60次,若是,则分计数单元+1,若不是则结束。
51单片机的课程设计
51单片机的课程设计一、课程目标知识目标:1. 理解51单片机的硬件结构,掌握其工作原理;2. 学会使用51单片机的开发环境,掌握基本的编程语法和技巧;3. 掌握51单片机中断、定时器、串行通信等模块的应用;4. 了解51单片机在嵌入式系统中的应用,培养对单片机应用场景的认识。
技能目标:1. 能够独立设计简单的51单片机程序,完成基础的控制任务;2. 能够运用51单片机解决实际问题,具备一定的编程调试能力;3. 能够阅读和分析51单片机的相关资料,提高自学能力和技术文献阅读能力。
情感态度价值观目标:1. 培养学生对单片机技术的兴趣,激发学生探索嵌入式领域的热情;2. 培养学生的团队合作意识,提高沟通与协作能力;3. 引导学生关注我国单片机技术的发展,增强学生的民族自豪感;4. 培养学生严谨、细致、负责的学习态度,养成良好的编程习惯。
课程性质:本课程为实践性较强的学科,旨在通过51单片机的学习,让学生掌握基本的单片机原理和编程技能,培养实际操作和解决问题的能力。
学生特点:学生具备一定的电子基础和编程基础,对单片机有一定了解,但实践经验不足。
教学要求:结合学生特点和课程性质,注重理论与实践相结合,以实例教学为主,培养学生动手实践能力。
同时,关注学生的情感态度价值观培养,激发学生的学习兴趣和探究欲望。
在教学过程中,将课程目标分解为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. 51单片机硬件结构:介绍51单片机的内部结构、引脚功能、工作原理等,结合教材第二章内容进行讲解。
- 微控制器原理- 51单片机引脚功能- 时钟与复位电路2. 开发环境与编程工具:学习51单片机的开发环境搭建,掌握编程工具的使用。
- Keil C51集成开发环境安装与配置- 51单片机程序编写、编译与下载3. 51单片机编程语言:学习单片机C语言编程基础,掌握基本语法和编程技巧。
- C语言基础语法- 特定寄存器的操作与编程4. 中断与定时器:学习中断系统、定时器的工作原理和应用实例。
51单片机秒表课程设计
51单片机秒表课程设计一、课程目标知识目标:1. 学生能理解51单片机的基本原理,掌握其编程方法。
2. 学生能掌握秒表功能的基本组成部分,如计时、暂停、复位等。
3. 学生能理解并应用中断、定时器等51单片机的相关知识。
技能目标:1. 学生能运用C语言编写51单片机程序,实现秒表功能。
2. 学生能通过实验操作,调试并优化程序,解决实际问题。
3. 学生能熟练使用相关开发工具和调试设备,如编译器、仿真器等。
情感态度价值观目标:1. 学生培养对单片机编程的兴趣,激发创新意识和实践欲望。
2. 学生培养良好的团队合作意识,学会互相交流、协作解决问题。
3. 学生培养严谨的科学态度,注重实验数据的真实性,勇于面对和克服困难。
课程性质:本课程为实践性课程,以项目为导向,结合理论知识与实际操作,培养学生的动手能力和编程思维。
学生特点:学生具备一定的电子基础和编程基础,对51单片机有一定了解,但对中断、定时器等高级功能尚不熟悉。
教学要求:教师需引导学生运用已学知识,通过实际操作,逐步掌握51单片机的编程和应用。
在教学过程中,注重培养学生的实际操作能力、问题解决能力和团队协作能力。
课程目标的设定旨在使学生在完成本项目后,能够独立设计并实现简单的单片机应用系统。
二、教学内容1. 理论知识:- 51单片机结构及工作原理- C语言编程基础:数据类型、运算符、控制语句等- 中断和定时器的原理与应用- 键盘输入与数码管显示原理2. 实践操作:- 使用Keil软件编写和编译程序- 使用STC89C52RC单片机进行程序下载和调试- 设计并实现秒表功能,包括计时、暂停、复位等3. 教学大纲:- 第一周:回顾51单片机基本原理,学习C语言编程基础- 第二周:学习中断和定时器知识,分析秒表功能需求- 第三周:设计程序框架,编写中断处理程序和定时器程序- 第四周:编写键盘输入和数码管显示程序,实现秒表功能- 第五周:项目调试、优化和展示4. 教材章节及内容:- 第一章:51单片机概述,了解单片机的发展及其应用- 第二章:C语言编程基础,掌握基本语法和数据类型- 第三章:中断和定时器,学习中断处理和定时器编程方法- 第四章:输入输出接口,学习键盘输入和数码管显示技术教学内容的选择和组织旨在保证学生能够系统地掌握51单片机编程及应用,注重理论与实践相结合,培养学生的实际操作能力。
单片机课程设计
《单片机原理及应用》课程设计报告课题名称频率计的设计学院自机学院专业电气工程及其自动化班级学号姓名时间2014/6/23-2014/7/04前言单片机原理及应用课程设计,是针对自动化、电气工程及其自动化、机械设计制造及其自动化等专业的学生学习单片机原理及应用课程,配套开设的课程设计。
作为嵌入式系统低端的单片机已成为电子系统中最普遍的应用手段,已经深入到国民经济与人民生活的各个领域。
近年来,采用单片机系统已成为解决各类电子技术和控制问题主要方法之一。
《单片机原理及应用》课程已被几乎所有工科院校中自动化、电气、仪器仪表、测控技术、机电一体化、电子、通信、计算机等类专业列为本科主干专业课程,是培养现代电子技术应用类专业人才的重要技术课程之一。
单片机课程设计是学习单片机理论的重要实践环节。
在单片机实验课程基础上,通过本课程设计的学习,使学生增进对单片机的感性认识,加深对单片机理论方面的理解;使学生掌握单片机的内部功能模块的应用,掌握单片机接口功能和扩展应用,掌握一些特殊器件及常用器件的使用方法,学习编制综合程序;使学生了解和掌握单片机应用系统的软硬件设计方法及调试过程。
充分发挥学生的主观能动性,激发学生的学习兴趣,培养学生主动利用单片机解决工程实际问题的意识。
培养学生的工程实践能力、实际动手能力和自我学习能力。
使学生完成从实际项目立题、调研、方案论证、方案实施、系统调试、编写使用说明书等科研全过程的基本训练,为今后在相关领域中从事与单片机有关的设计、开发、应用等工作打下良好的基础。
目录一、摘要 (2)二、项目的意义与目的 (2)三、频率计设计任务及要求 (2)1.设计任务 (2)2.设计要求 (2)四、方案设计 (3)3.方案论证 (4)4.方案选择 (4)五、芯片的选择与控制 (5)5.单片机AT89C51的介绍 (5)(1)AT89C51引脚图 (5)(2)引脚说明 (5)6.74LS245芯片的介绍 (8)(1) 74LS245引脚图 (8)7.LED数码管显示器介绍 (9)(1)LED引脚图 (9)(2)LED的静动态显示驱动 (9)六、各模块电路设计 (10)8.电路原理图 (10)9.电路流程图 (11)10.控制电路 (12)11.复位电路 (12)12.显示电路 (13)七、仿真与调试 (13)13.电路仿真图 (13)14.矩形波仿真 (14)15.三角波仿真 (14)16.正弦波仿真 (15)八、心得体会 (16)九、参考文献 (17)附录 0一. 电路原理图 0二.源程序 0一、摘要设计以单片机为核心,被测信号先进入信号放大电路进行放大,再被送到波形整形电路整形,把被测的正弦波或者三角波整形为方波。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计多功能定时器一、设计目的:1、在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用;2、能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,在软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高;3、使学生增进对单片机的感性认识,加深对单片机理论方面的理解。
使学生掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通信等;4、使学生了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。
二、设计功能说明数字钟是采用数字电路实现对时,分,秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。
数字钟已成为人们日常生活中的必需品,本设计可实现如下功能:1、使用实时时钟芯片写入及读取时间2、用LCD显示,可显示年、月、日、时、分、秒、星期、农历日期、节日3、选择蜂鸣器电路,实现两个闹钟设置和事件提示功能4、实现时钟校正功能,12小时/24小时切换功能5、显示当前时间为上午时间或下午时间6、整点报时功能按键功能如下:1、对显示时间的设置按键0:进入设置模式,实现秒(S)、分(M)、时(H)、年(Y)、月(m)、日(D)、星期(W)设置的切换,并在LCD右下角显示所设置的项目,当各项目设置完毕后,再按下按键0则返回主界面正常显示时间;按键1:每按一次按键1,对所设置的时间加1,当设置的时间超过它的最大值时,该项自动为0,例如:当设置秒为59时,秒自动清零;按键2:每按一次按键:2,对所设置的时间减1,当设置的时间小于0时,该项自动为它的最大值;按键3:设置完成后的确认键并可按此键中途退出设置,时间按用户设置值正常计时;按键7:实现时钟校正功能,12小时/24小时切换功能。
2、对闹钟的设置按键4:进入闹钟1的设置,并在LCD右上方显示“CLOCK1”并通过按键0、1、2设置用户所需闹钟时间,完成闹钟1的设置后,通过按键0进入闹钟2的设置,并在LCD右上方显示“CLOCK2”,若无需设置闹钟2,则通过按键3退出闹钟设置,返回主界面正常显示时间;按键5:设置闹钟是否开启,例如:当设置闹钟1为开启状态时,在LCD右上方显示“*CLOCK1”当闹钟,并在返回主界面后显示“C1”表示闹钟1开启;三、整体设计思路这部分主要介绍工作安排和整体设计的思想。
工作过程规划如下:四、主程序流程图五、电气原理图(见附图)六、实验程序1、键盘程序(Keyprocess)键盘与848相连接,采用矩阵键盘的方式P2用于列扫描,P1用于行扫描,经过消抖及等待键释放的程序,将最终正确的结果置于getkey();程序实现如下:#include"aduc848.h"void KeyDelay(unsigned int KeyJsTime); //键盘扫描延时函数声明unsigned char GetKey(); //扫描后获取键值unsigned char GetKey(){static unsigned char KeyHaveFree=1;static unsigned int KeyJs=0;unsigned char temp,KeyTemp=0xff;P1&=0xf0;P2&=0xf0; // 将低四位置零做I/O口temp=P1&0x0f;if(KeyHaveFree){if(temp!=0x0f){KeyDelay(1000); //延时消除抖动if(temp==(P1&0x0f)) //延时后确认是否有键按下,并获取具体键值{P2|=0x0e;switch(P1&0x0f){case 0x0e:KeyTemp=3;break;case 0x0d:KeyTemp=7;break;case 0x0b:KeyTemp=11;break;case 0x07:KeyTemp=15;break;case 0x0f:break;default:KeyTemp= 0x80;break;}P2&=0xf0;P2|=0x0d;switch(P1&0x0f){case 0x0e:KeyTemp= 2;break;case 0x0d:KeyTemp= 6;break;case 0x0b:KeyTemp= 10;break;case 0x07:KeyTemp= 14;break;case 0x0f:break;default:KeyTemp= 0x81;break;}P2&=0xf0;P2|=0x0b;switch(P1&0x0f){case 0x0e:KeyTemp= 1;break;case 0x0d:KeyTemp= 5;break;case 0x0b:KeyTemp= 9;break;case 0x07:KeyTemp= 13;break;case 0x0f:break;default:KeyTemp= 0x82;break;}P2&=0xf0;P2|=0x07;switch(P1&0x0f){case 0x0e:KeyTemp= 0;break;case 0x0d:KeyTemp= 4;break;case 0x0b:KeyTemp= 8;break;case 0x07:KeyTemp= 12;break;case 0x0f:break;default:KeyTemp= 0x83;break;}KeyHaveFree=0; //LCDPrintNumber(6,11,5,KeyTemp);}}}else{KeyJs++;if(KeyJs>70){KeyHaveFree=1;KeyJs=66;}if(temp==0x0f){KeyHaveFree=1;KeyJs=0;}KeyTemp=0xf0;}return KeyTemp;}void KeyDelay(unsigned int KeyJsTime){unsigned char temp;unsigned int JsKeyDelay;for(JsKeyDelay=0;JsKeyDelay<KeyJsTime;JsKeyDelay++)temp++; }2、Lcd程序(1602)#include "aduc848.h"sbit RS=P3^6;sbit RW=P3^5;//位定义sbit EN=P3^3;void delay(unsigned int z);延时函数声明void write_(unsigned char );LCD显示位置函数声明void write_data(unsigned char date);写数据函数声明void init();{RS=0;RW=0;EN=0;write_(0x38);write_(0x0f);write_(0x06);}void delay(unsigned int z) //延时函数延时时间=Z*110{unsigned int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_(unsigned char ) //{RS=0;RW=0;P0=;delay(5);EN=1;delay(5);EN=0;}void write_data(unsigned char date){RS=1;RW=0;P0=date;delay(5);EN=1;delay(5);EN=0;}3、iic程序(RTC)//实时时钟#include"aduc848.h"void iic_start(void);void iic_stop(void);void iic_ack(void);bit read_ack(void);void iic_nack();unsigned char get_byte(void);void out_byte(unsigned char dd);void IIC_Delay_us(unsigned int times);void ReadTime(unsigned char TIME[7]); void SetTime(unsigned char TIME[7]);void SwitchRTC(unsigned char SWITCH);void ReadTime(unsigned char TIME[7]) {bit EATemp;unsigned char temp;EATemp=EA;iic_start();out_byte(0xd0);read_ack();out_byte(0x00);read_ack();iic_stop();IIC_Delay_us(1);iic_start();out_byte(0xd1);read_ack();TIME[0]=get_byte();iic_ack();TIME[1]=get_byte();iic_ack();TIME[2]=get_byte();iic_ack();TIME[3]=get_byte();iic_ack();TIME[4]=get_byte();iic_ack();TIME[5]=get_byte();iic_ack();TIME[6]=get_byte();iic_nack();iic_stop();IIC_Delay_us(1);TIME[0]=((TIME[0]&0x7f)>>4)*10+(TIME[0]&0x0f); //second TIME[1]=((TIME[1]&0x7f)>>4)*10+(TIME[1]&0x0f); //minuteif(TIME[2]&0x40){if(TIME[2]&0x20)temp=0x80;else temp=0x40;TIME[2]=((TIME[2]&0x1f)>>4)*10+(TIME[2]&0x0f); //hour TIME[2]|=temp;}else{TIME[2]=((TIME[2]&0x3f)>>4)*10+(TIME[2]&0x0f);}TIME[3]=TIME[3]&0x07; //week TIME[4]=((TIME[4]&0x3f)>>4)*10+(TIME[4]&0x0f); //dateTIME[5]=((TIME[5]&0x1f)>>4)*10+(TIME[5]&0x0f); //monthTIME[6]=(TIME[6]>>4)*10+(TIME[6]&0x0f); //yearEA=EATemp;}void SetTime(unsigned char TIME[7]){bit EATemp;unsigned char temp=0;unsigned char TimeTemp[7];EATemp=EA;for(temp=0;temp<7;temp++)TimeTemp[temp]=TIME[temp];temp=0;TimeTemp[6]=((TimeTemp[6]/10)<<4)+(TimeTemp[6]%10); //Year TimeTemp[5]=((TimeTemp[5]/10)<<4)+(TimeTemp[5]%10); //Month TimeTemp[4]=((TimeTemp[4]/10)<<4)+(TimeTemp[4]%10); //Day TimeTemp[3]=((TimeTemp[3]/10)<<4)+(TimeTemp[3]%10); //Weekif((TimeTemp[2]&0xc0)==0x00) //Hour{TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10);}else{if((TimeTemp[2]&0xc0)==0x01)temp=0x40;else temp=0x60;TimeTemp[2]&=0x3f;TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10);TimeTemp[2]|=temp;}TimeTemp[1]=((TimeTemp[1]/10)<<4)+(TimeTemp[1]%10); //Minute TimeTemp[0]=((TimeTemp[0]/10)<<4)+(TimeTemp[0]%10); //Second TimeTemp[0]&=0x7f;iic_start();out_byte(0xd0);read_ack();out_byte(0x00);read_ack();out_byte(TimeTemp[0]);read_ack();out_byte(TimeTemp[1]);read_ack();out_byte(TimeTemp[2]);read_ack();out_byte(TimeTemp[3]);read_ack();out_byte(TimeTemp[4]);read_ack();out_byte(TimeTemp[5]);read_ack();out_byte(TimeTemp[6]);read_ack();iic_stop();IIC_Delay_us(1);EA=EATemp;}void SwitchRTC(unsigned char SWITCH) {unsigned char temp;bit EATemp;EATemp=EA;iic_start();out_byte(0xd0);read_ack();out_byte(0x00);read_ack();iic_stop();//IIC_Delay_us(1);iic_start();out_byte(0xd1);read_ack();temp=get_byte();iic_nack();iic_stop();//IIC_Delay_us(1);if(SWITCH)temp&=0x7f;else temp|=0x80;iic_start();out_byte(0xd0);read_ack();out_byte(0x00);read_ack();out_byte(temp);read_ack();iic_stop();//IIC_Delay_us(1);EA=EATemp;}void iic_start(void){MDE=1;MDO=1;//IIC_Delay_us(2);MCO=1;//IIC_Delay_us(2);MDO=0;//IIC_Delay_us(2); }void iic_stop(void){MDE=1;MDO=0;//IIC_Delay_us(2);MCO=1;//IIC_Delay_us(2);MDO=1;}void iic_ack(void){MDE=1;MCO = 0;MDO = 0;//IIC_Delay_us(2);MCO = 1;//IIC_Delay_us(2);MCO = 0;//IIC_Delay_us(1);MDO = 1;}bit read_ack(void){bit flag;MCO = 0;//IIC_Delay_us(2);MDE=1;MDO = 1;MCO = 1;//IIC_Delay_us(2);MDE=0;flag = MDI;MCO = 0;return flag;}void iic_nack(){MDE=1;MDO = 1;//IIC_Delay_us(2);MCO = 1;//IIC_Delay_us(2);MCO = 0;}/************************************************************************** ********** 函数名: get_byte;* 描述: 从IIC总线获取一个字节;* 输入: none;* 返回值: 一字节数据;* 注释: none;*************************************************************************** *********/unsigned char get_byte(void) //输入一个字节{unsigned char dd;int i;dd=0;MDE=1;MDO = 1;MDE=0;for (i=0;i<8;i++){MCO = 0;IIC_Delay_us(1);MCO = 1;//IIC_Delay_us(1);dd<<=1;if (MDI)dd|=0x01;}MCO = 0;return(dd);}/************************************************************************** ********** 函数名: out_byte;* 描述: 向IIC总线输出一个字节;* 输入: 一字节数据* 返回值: none;* 注释: none;*************************************************************************** *********/void out_byte(unsigned char dd) //输出一个字节{unsigned char i;MDE=1;for(i=0;i<8;i++){MCO = 0;//IIC_Delay_us(0);MDO = (dd & 0x80)>>7;IIC_Delay_us(1);MCO = 1;//IIC_Delay_us(3);dd <<= 1;}MCO = 0;}/************************************************************************** ********** 函数名: IIC_Delay_us;* 描述: IIC总线延时函数;* 输入: 延时参数* 返回值: none;* 注释: none;*************************************************************************** *********/void IIC_Delay_us(unsigned int times){unsigned int i;unsigned char DelayJs;for (i=0; i<times; i++)DelayJs++;}4、主程序(Prj6)#include"aduc848.h"#include"KeyProcess.h"#include"rtc.h"#include"LCD1602.h"unsigned char CurrentTime[7]={55,59,21,6,23,04,11};unsigned char ClockSetSave1[3]={10,00,22},ClockSetSave2[3]={20,00,22};unsigned char code table[7]={0x53,0x4d,0x48,0x59,0x6d,0x44,0x57};unsigned char code table1[4]={0x20,0x53,0x4d,0x48};unsigned char KeyValue,ClockKeyValue,shijianzhi=0;unsigned char SetMode=0;unsigned char ShowMode=0;unsigned char Clock=1,ClockSet=0,FinishClockSet1=0,FinishClockSet2=0,ClockEn1=0,ClockEn2=0; unsigned int i=0;void KeyProcess();void stop(){P1&=0xf0;P2|=0x0f;P2&=0xfe;if((P1&0x08)==0){P2&=0xfe;}}void main(){PLLCON&=0xf8;//设置频率为12.58MHzCFG848|=0x01;//使用片内xraminit();I2CCON=0xE8;//配置IIC 为软件主发送模式SetTime(CurrentTime);SwitchRTC(1);write_(0x82); //写冒号write_data(0x3A);write_(0x85); //写冒号write_data(0x3A);write_(0xc2); //写短横线write_data(0x2D);write_(0xc5); //写短横线write_data(0x2D);write_(0xc8); //写短横线write_data(0x2D);while(1){stop();if(SetMode==0)ReadTime(CurrentTime);write_(0x80);write_data(CurrentTime[2]/10+48); //Hourwrite_data(CurrentTime[2]%10+48);write_(0x83);write_data(CurrentTime[1]/10+48); //Minutewrite_data(CurrentTime[1]%10+48);write_(0x86);write_data(CurrentTime[0]/10+48); //Secondwrite_data(CurrentTime[0]%10+48);write_(0xc0);write_data(CurrentTime[6]/10+48); //Yearwrite_data(CurrentTime[6]%10+48);write_(0xc3);write_data(CurrentTime[5]/10%10+48); //Monthwrite_data(CurrentTime[5]%10+48); write_(0xc6); write_data(CurrentTime[4]/10%10+48); //Day write_data(CurrentTime[4]%10+48);switch(CurrentTime[3]) //Week{case1:{write_(0xc9);write_data(0x4D);write_data(0x6f);write_data(0x6e);break;}//显示Moncase2:{write_(0xc9);write_data(0x54);write_data(0x75);write_data(0x65);break;}//显示Tuecase3:{write_(0xc9);write_data(0x57);write_data(0x65);write_data(0x64);break;}//显示Wencase4:{write_(0xc9);write_data(0x54);write_data(0x68);write_data(0x75);break;}//显示Thucase5:{write_(0xc9);write_data(0x46);write_data(0x72);write_data(0x69);break;}//显示Fricase6:{write_(0xc9);write_data(0x53);write_data(0x61);write_data(0x74);break;}//显示Satcase7:{write_(0xc9);write_data(0x53);write_data(0x75);write_data(0x6e);break;}//显示Sundefault: break;}KeyProcess();if((CurrentTime[0]==ClockSetSave1[0]&&CurrentTime[1]==ClockSetSave1[1]&&CurrentT ime[2]==ClockSetSave1[2])&&ClockEn1==1 || (CurrentTime[0]==ClockSetSave2[0]&&CurrentTime[1]==ClockSetSave2[1]&&CurrentTime[2] ==ClockSetSave2[2])&&ClockEn2==1) //与闹铃时间相同则闹铃响{PWM1H=62;PWM1L=100;PWMCON=0x31;KeyDelay(333);PWM1H=0;PWM1L=0;PWMCON=0x00;KeyDelay(333);}if(CurrentTime[0]==0&&CurrentTime[1]==0) //整点报时{PWM1H=62;PWM1L=100;PWMCON=0x21; //对闹铃响铃时长和音调等的设定KeyDelay(333);PWM1H=0;PWM1L=0;PWMCON=0x00;KeyDelay(333);}if(ClockEn1==1) //如果闹铃1被设置则显示C1 {write_(0x8c);write_data(0x43);write_data(0x31);}else //否则清显{write_(0x8c);write_data(0x20);write_data(0x20);}if(ClockEn2==1) //如果闹铃2被设置则显示C1 {write_(0x8e);write_data(0x43);write_data(0x32);}else //否则清显{write_(0x8e);write_data(0x20);write_data(0x20);}}}void KeyProcess() //按键处理,启动按键扫描{KeyValue=GetKey();switch(KeyValue){case 0: //按键0进入设置模式{write_(0xcf);write_data(table[SetMode]); //显示被设置项if(SetMode==0)SwitchRTC(0); //进入设置,则停止计时SetMode++;if(SetMode>7) //如果设置完了,则开始计时{SetMode=0;SetTime(CurrentTime);if(SetMode==0)SwitchRTC(1);write_(0xcf);write_data(0x20);}}break;case 1: //按键1:加{switch(SetMode) //执行按键1是在进入设置的模式下{case1:write_(0xcf);write_data(0x53);CurrentTime[0]++;if(CurrentTime[0]>59)CurrentTime[0]=0;brea k;//miaocase2:write_(0xcf);write_data(0x4d);CurrentTime[1]++;if(CurrentTime[1]>59)CurrentTime[1]=0;brea k;//fencase3:write_(0xcf);write_data(0x48);CurrentTime[2]++;if(CurrentTime[2]>23)CurrentTime[2]=0;brea k;//shicase4:write_(0xcf);write_data(0x59);CurrentTime[6]++;if(CurrentTime[6]>99)CurrentTime[6]=0;brea k;//yearcase5:write_(0xcf);write_data(0x6d);CurrentTime[5]++;if(CurrentTime[5]>12)CurrentTime[5]=1;brea k;//monthcase 6://day{write_(0xcf);write_data(0x44);CurrentTime[4]++;switch(CurrentTime[5]){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(CurrentTime[4]>31)CurrentTime[4]=1;break;case 4:case 6:case 9:case 11:if(CurrentTime[4]>30)CurrentTime[4]=1;break;case 2: if(CurrentTime[6]%4)if(CurrentTime[4]>28)CurrentTime[4]=1;else if(CurrentTime[4]>29)CurrentTime[4]=1;break;default:break;}}break;case7:write_(0xcf);write_data(0x57);CurrentTime[3]++;if(CurrentTime[3]>7)CurrentTime[3]=1;break; //weekdefault:break;}}break;case 2: //按键2:减{switch(SetMode){case1:CurrentTime[0]--;if(CurrentTime[0]>254)CurrentTime[0]=59;break;//miaocase2:CurrentTime[1]--;if(CurrentTime[1]>254)CurrentTime[1]=59;break;//fencase3:CurrentTime[2]--;if(CurrentTime[2]>254)CurrentTime[2]=23;break;//shicase4:CurrentTime[6]--;if(CurrentTime[6]>254)CurrentTime[6]=99;break;//yearcase5:CurrentTime[5]--;if(CurrentTime[5]>254)CurrentTime[5]=12;break;//monthcase 6://day{CurrentTime[4]--;switch(CurrentTime[5]){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(CurrentTime[4]>254)CurrentTime[4]=31;break;case 4:case 6:case 9:case 11:if(CurrentTime[4]>254)CurrentTime[4]=30;break;case 2: if(CurrentTime[6]%4)if(CurrentTime[4]>254)CurrentTime[4]=28;else if(CurrentTime[4]>254)CurrentTime[4]=29;break;default:break;}}break;case 7:CurrentTime[3]--;if(CurrentTime[3]>7)CurrentTime[3]=1;break; //weekdefault:break;}}break;case 3: //按键3中途退出设置模式{if(SetMode!=0) //在设置模式中中途退出{SetTime(CurrentTime);SetMode=0;SwitchRTC(1); //开计时write_(0xcf);write_data(0x20);}}break;case 4: //按键4设置闹铃{write_(0xcf);write_data(0x20);while(Clock!=0) //用Clock来进行判断闹铃设置完否{switch(Clock){case 1: { //****************闹铃1while(FinishClockSet1!=1){write_(0x80);write_data(ClockSetSave1[2]/10+48); //Hourwrite_data(ClockSetSave1[2]%10+48);write_(0x83);write_data(ClockSetSave1[1]/10+48); //Minutewrite_data(ClockSetSave1[1]%10+48);write_(0x86);write_data(ClockSetSave1[0]/10+48); //Secondwrite_data(ClockSetSave1[0]%10+48);write_(0x8a); //闹铃设置序号显示write_data(0x43);write_data(0x4c);write_data(0x4f);write_data(0x43);write_data(0x4b);write_data(0x31);if(ClockEn1==0){write_(0x89);write_data(0x20);}else{write_(0x89);write_data(0x2a);}ClockKeyValue=GetKey();switch(ClockKeyValue){case 0: //按键0设置闹钟{ClockSet++;write_(0xcf);write_data(table1[ClockSet]);if(ClockSet>3) //设置键按完三次自动进入下一个闹铃设置{ClockSet=0;FinishClockSet1=1;Clock++;write_(0xcf);write_data(0x20);}}break;case 1: //闹铃设置+{switch(ClockSet){case1:write_(0xcf);write_data(0x53);ClockSetSave1[0]++;if(ClockSetSave1[0]>59)ClockSetSave1[0] =0;break;//miaocase2:write_(0xcf);write_data(0x4d);ClockSetSave1[1]++;if(ClockSetSave1[1]>59)ClockSetSave1[1] =0;break;//fencase3:write_(0xcf);write_data(0x48);ClockSetSave1[2]++;if(ClockSetSave1[2]>23)ClockSetSave1[2] =0;break;//shidefault:break;}}break;case 2: //闹铃设置2{switch(ClockSet){case1:write_(0xcf);write_data(0x53);ClockSetSave1[0]--;if(ClockSetSave1[0]>254)ClockSetSave1[0] =59;break;//miaocase2:write_(0xcf);write_data(0x4d);ClockSetSave1[1]--;if(ClockSetSave1[1]>254)ClockSetSave1[1] =59;break;//fencase3:write_(0xcf);write_data(0x48);ClockSetSave1[2]--;if(ClockSetSave1[2]>254)ClockSetSave1[2] =23;break;//shidefault:break;}}break;case 3: //中途退出闹铃设置{FinishClockSet1=1;Clock=0;write_(0x89); //闹铃设置序号清除显示write_data(20);write_data(20);write_data(20);write_(0x8e);write_data(20);write_data(20);write_(0xcf);write_data(0x20);}break;case 5: { //是否开启闹钟,并予以显示if(ClockEn1==0){ClockEn1=1;write_(0x89);write_data(0x2a);}else{ClockEn1=0;write_(0x89);write_data(0x20);}}break;default:break;} //case4->case1 end}}break;case 2 :{ //****************闹铃2 while(FinishClockSet2!=1){write_(0x80);write_data(ClockSetSave2[2]/10+48); //Hourwrite_data(ClockSetSave2[2]%10+48);write_(0x83);write_data(ClockSetSave2[1]/10+48); //Minutewrite_data(ClockSetSave2[1]%10+48);write_(0x86);write_data(ClockSetSave2[0]/10+48); //Secondwrite_data(ClockSetSave2[0]%10+48);write_(0x8a); //闹铃设置序号显示write_data(0x43);write_data(0x4c);write_data(0x4f);write_data(0x43);write_data(0x4b);write_data(0x32);if(ClockEn2==0){write_(0x89);write_data(0x20);}else{write_(0x89);write_data(0x2a);}ClockKeyValue=GetKey();switch(ClockKeyValue){case 0:{ClockSet++;write_(0xcf);write_data(table1[ClockSet]);if(ClockSet>3){ClockSet=0;FinishClockSet2=1;Clock=0;write_(0x89); //闹铃设置序号清除显示write_data(20);write_data(20);write_data(20);write_(0x8e);write_data(20);write_data(20);write_(0xcf);write_data(0x20);}}break;case 1:{switch(ClockSet){case1:write_(0xcf);write_data(0x53);ClockSetSave2[0]++;if(ClockSetSave2[0]>59)ClockSetSave2[0] =0;break;//miaocase2:write_(0xcf);write_data(0x4d);ClockSetSave2[1]++;if(ClockSetSave2[1]>59)ClockSetSave2[1] =0;break;//fencase3:write_(0xcf);write_data(0x48);ClockSetSave2[2]++;if(ClockSetSave2[2]>23)ClockSetSave2[2] =0;break;//shidefault:break;}}break;case 2:{switch(ClockSet){case1:write_(0xcf);write_data(0x53);ClockSetSave2[0]--;if(ClockSetSave2[0]>254)ClockSetSave2[0] =59;break;//miaocase2:write_(0xcf);write_data(0x4d);ClockSetSave2[1]--;if(ClockSetSave2[1]>254)ClockSetSave2[1] =59;break;//fencase3:write_(0xcf);write_data(0x48);ClockSetSave2[2]--;if(ClockSetSave2[2]>254)ClockSetSave2[2] =23;break;//shidefault:break;}}break;case 3:{FinishClockSet2=1;Clock=0;write_(0x89); //闹铃设置序号清除显示write_data(20);write_data(20);write_data(20);write_(0x8e);write_data(20);write_data(20);write_(0xcf);write_data(0x20);}break;case 5: {if(ClockEn2==0){ClockEn2=1;write_(0x89);write_data(0x2a);}else{ClockEn2=0;write_(0x89);write_data(0x20);}}break;default:break;} //case4->case2 end}}break;default:break;}}}break;case 7: { //12小时与24小时进制进行转换if((CurrentTime[2]>12)){CurrentTime[2]=CurrentTime[2]-12;SetTime(CurrentTime);}else{CurrentTime[2]=CurrentTime[2]+12;SetTime(CurrentTime);}}break;default:break;}}七、心得体会经过两周的的课程设计,过程曲折可谓一语难尽。