最新单片机课程设计多功能定时器
- 格式:doc
- 大小:139.50 KB
- 文档页数:36
基于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定时器的基本原理定时器是一种计时装置,可以用来测量时间间隔或定时一个事件的发生。
它由时钟源、计数器、定时器中断等组成。
通过控制计数器的计数频率和初始值,可以实现不同的计时功能。
1.2定时器的设计方法二、硬件设计2.1时钟源的选择定时器的计数频率由时钟源决定,常见的时钟源有晶体振荡器、RC振荡器和外部时钟等。
根据实际需求选择合适的时钟源。
2.2计数器的选择计数器是定时器的核心部件,根据需求选择适当的计数器。
常见的计数器有8位计数器和16位计数器。
一般情况下,16位计数器可以满足大部分的定时需求。
2.3定时器中断的设置通过设置定时器中断,可以使定时器达到指定的时间后触发中断,从而实现定时的功能。
根据产品需求选择合适的中断方式,如定时器溢出中断、定时器比较中断等。
三、软件设计3.1初始化定时器在软件设计中,首先需要初始化定时器,包括选择计数模式、设置计数频率等。
根据实际需求选择适当的计数模式,如定时模式或计数模式。
3.2设置计数频率和计数值通过设置计数频率和计数值,可以实现不同的定时功能。
根据需求选择适当的计数频率和计数值,例如,设置计数频率为1MHz,计数值为1000,可以实现1ms的定时功能。
单片机定时闹钟课程设计一、课程目标知识目标:1. 让学生掌握单片机的基本原理,理解定时器的功能和工作原理。
2. 使学生掌握定时闹钟程序编写的基本方法,了解中断处理的相关知识。
3. 帮助学生了解电子时钟的基本构成,掌握时间计算和显示的相关技巧。
技能目标:1. 培养学生动手实践能力,学会使用编程软件编写、调试程序,实现单片机定时闹钟功能。
2. 提高学生分析问题和解决问题的能力,能够独立完成定时闹钟课程的各项任务。
3. 培养学生团队协作能力,学会在项目过程中进行有效沟通和分工合作。
情感态度价值观目标:1. 培养学生对单片机编程的兴趣,激发他们探索未知、自主学习的精神。
2. 培养学生勇于尝试、不怕失败的品质,提高他们面对困难时的心理素质。
3. 增强学生的创新意识,鼓励他们发挥想象力和创造力,设计出具有个性的定时闹钟作品。
课程性质分析:本课程属于电子技术与应用领域的实践课程,旨在让学生通过动手实践,掌握单片机定时闹钟的设计与制作。
学生特点分析:学生处于中学阶段,具有一定的电子技术基础和编程能力,对新鲜事物充满好奇,喜欢动手实践。
教学要求:1. 结合课本知识,注重理论与实践相结合,提高学生的实际操作能力。
2. 注重培养学生的创新精神和团队协作能力,提高他们的综合素质。
3. 以学生为主体,关注个体差异,因材施教,使每个学生都能在课程中取得进步。
二、教学内容1. 单片机基础原理回顾:包括单片机的结构、工作原理、定时器/计数器功能。
2. 定时器编程技术:重点讲解定时器的初始化、中断处理程序编写,以及定时器应用实例。
- 教材章节:第三章《单片机定时器/计数器》3. 中断系统原理:介绍中断的概念、中断优先级、中断向量表,以及中断处理流程。
- 教材章节:第四章《中断系统》4. 显示技术:讲解数码管、LCD等显示器件的工作原理和编程方法。
- 教材章节:第五章《显示技术》5. 定时闹钟设计与实现:包括闹钟功能的整体设计、程序编写、调试与优化。
吉首大学《单片机技术》课程设计报告项目名称:家用多功能定时器设计与制作专业年级:物理机电工程工程2012级学号:学生姓名:指导教师:报告完成日期2015 年7 月 1 日评阅结果评阅教师第一章绪论 (1)1.1 系统背景 (1)1.1.1 单片机的电子技术 (1)1.1.2 定时器介绍 (1)1.2 设计要求 (2)第二章系统电路设计 (2)2.1 设计框架介绍 (2)2.2 系统硬件单元电路设计 (2)2.2.1 复位电路设计 (2)2.2.2 时钟电路设计 (3)2.2.3 按键电路设计 (4)2.3 系统硬件总电路 (4)第三章系统软件设计 (5)3.1 系统软件流程图 (5)3.2 系统程序设计 (5)3.2.1 主程序 (5)3.2.2 中断程序 (12)第四章实验结果和分析 (13)4.1 实验使用的仪器设备 (13) (13)结束语 (13)参考文献 (14)第一章绪论1.1 系统背景1.1.1 单片机的电子技术单片机是将CPU、RAM\ROM\定时器/计数器以及输入输出(I/O)接口等计算机的主要部件集成在一块的集成电路芯片,作为微机系统它还可以实现模/数转换、脉宽调制、计数器捕获/比较逻辑、高速I/O口和WDT各种控制功能。
通过在MCS-51系列的单片机中增设了全双工串行口I/O、片内数据存储器采用寻址范围为256kb的8位地址、均有四种工作方式的2个16位的定时/计数器、增加了中断系统、增设了颇具特色的布尔处理机、让单片机具有较强的指令寻址和运算功能这些技术,使单片机拥有了完善的外部并行总线(AB、DB、CB)具有多机识别功能的串行通信接口,规范了功能单元的特殊功能寄存器控制模式及适应控制器特点的布尔处理系统和指令系统,位发展具有良好兼容性的新一代单片机奠定了良好的基础。
单片机被广泛地应用在各种领域。
例如用来作家用电器中如洗衣机、电冰箱、微波炉、电饭煲、电视机、录像机以及其他视频音像设备的控制器;在办公室中用作大量通信、信息的承载体,比如磁盘驱动、打印机、复印机、电话等;它还可以来构成电子秤、收款机、仓储安全检测系统、空气调节系统等冷冻保鲜系统等的专用系统;在工业中,像工业过程控制、过程监制以及机电一体化控制等系统都是以单片机为核心火多网络系统;它还可以构成一些智能仪表与集成智能传感器传统的控制电路,实现一些像存储、数据处理、查找、判断、联网和语音功能等智能化功能,还可以构成一些电子系统中的集中显示系统、动力检测控制系统、自动驾驶系统、通信系统以及运行监视器等的冗余网络系统。
基于单片机的多用途定时器的设计与实现的研究随着科技的不断发展,单片机技术在现在的社会中得到了广泛的应用。
基于单片机的多用途定时器,可以实现按照设定的时间来控制某个设备的运行,使得设备能够更加智能化,提高工作效率。
本文将介绍基于单片机的多用途定时器的设计与实现。
一、方案设计本方案采用AT89C55单片机,能够实现按照设定的时间来控制某个设备的开关。
定时器可设置为分、秒和毫秒单位,可分别设定定时时间,通过按键调整时间,LED灯提示。
时钟源采用晶振,为12MHz。
检测到按键被按下时,单片机可以读取键盘值,判断出用户的操作,并可以作出相应的反应。
控制输出端口输出高低电平,进行定时器的开关控制。
二、硬件实现1、单片机的芯片采用AT89C55单片机,它是一个低功耗、高性能的CMOS8位微控制器,具有4K字节的闪存。
它有40个I/O口,可以与其它控制设备进行接口。
2、键盘模块用于调整定时时间,采用矩阵式键盘,通过单片机的输入口进行读取键值。
3、显示模块采用8位数码管,显示时间和程序状态,以及LED灯。
4、电源模块采用稳压电源,将输入电压稳定在5V左右,为单片机和其它模块提供稳定可靠的电源。
5、外部扩展模块如需要的话,可以根据具体需求外接扩展模块,如延时模块、LCD液晶显示屏等。
三、软件实现1、I/O口初始化由于单片机的I/O口只有高电平和低电平的状态,需要先将输出口初始化为输出状态,然后将其设为高电平或低电平。
2、按键检测通过检测按键的状态,读取键盘值并作出相应的反应,例如调整时间等。
3、定时器通过定时器的设置,可以实现按照设定的时间来控制某个设备的开关。
4、LED灯通过控制输出口输出高低电平,来控制LED灯的状态,提示程序状态。
通过以上的硬件和软件设计,基于单片机的多用途定时器的实现已经完成。
在实际应用中,可以通过具体需求,进行增加或修改,在不改变基本框架的情况下,实现更多的功能。
单片机课程设计多功能定时器一、设计目的: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. 学生能够理解多时间定时器的概念,掌握其基本原理和应用场景。
2. 学生能够描述多时间定时器的组成部分,包括时钟、计数器、触发器等。
3. 学生能够解释多时间定时器在日常生活和科技领域的作用和意义。
技能目标:1. 学生能够运用所学知识设计简单的多时间定时器电路,并进行调试与优化。
2. 学生能够运用多时间定时器实现特定的定时任务,如定时开关、倒计时等。
3. 学生能够运用多时间定时器解决实际问题,培养动手操作能力和团队协作能力。
情感态度价值观目标:1. 学生对电子技术产生兴趣,培养探究精神和创新意识。
2. 学生在课程学习过程中,树立正确的价值观,认识到科技发展对生活的影响。
3. 学生能够关注多时间定时器在生活中的应用,提高对时间的珍惜和利用意识。
课程性质:本课程属于电子技术领域,旨在让学生了解并掌握多时间定时器的原理和应用。
学生特点:五年级学生已具备一定的电子技术基础,对新鲜事物充满好奇,动手能力强。
教学要求:结合学生特点,注重理论与实践相结合,提高学生的实际操作能力,培养学生团队合作精神和创新能力。
通过本课程的学习,使学生在知识、技能和情感态度价值观方面取得具体的学习成果。
二、教学内容本课程依据课程目标,选取以下教学内容:1. 多时间定时器原理:介绍多时间定时器的基本概念、组成部分及其工作原理,涉及课本第3章“时序电路”相关内容。
2. 多时间定时器设计:讲解多时间定时器的设计方法,包括时钟、计数器、触发器等部分的设计,参照课本第4章“数字电路设计”相关内容。
3. 多时间定时器应用:分析多时间定时器在实际应用中的案例,如定时开关、倒计时等,结合课本第5章“数字电路应用”相关内容。
教学大纲安排如下:第一课时:多时间定时器原理1. 了解多时间定时器的概念2. 学习多时间定时器的组成部分3. 掌握多时间定时器的工作原理第二课时:多时间定时器设计1. 学习设计多时间定时器电路的方法2. 掌握时钟、计数器、触发器等部分的设计要点3. 分析并优化多时间定时器电路第三课时:多时间定时器应用1. 分析多时间定时器在实际应用中的案例2. 学生动手实践,设计并实现特定定时任务3. 交流与分享,提高团队合作能力教学内容注重科学性和系统性,结合课本章节内容,确保学生能够在理论学习与实践操作中掌握多时间定时器的相关知识。
基于51单片机多功能数字时钟1系统设计1.1设计要求设计制作一个24小时制多功能数字钟。
1.1.1主要性能指标1、数字显示年、月、周、日、时、分、秒。
1.1.2创意部分要求准确的进行年、月、周、日、时、分、秒的转换,切换两种显示模式。
1.2总体设计方案1.2.1概述及设计思路该设计方案是以MC51单片机为核心,采用LCD液晶屏幕显示系统,温度采集模块、日期提醒、键盘时间调整预设置等模块,所构建的数字时钟系统,能动态显示实时时钟的时、分、秒,数据显示(误差限制在30每天)。
1.2.2方案论证(1)时钟模块【方案一】采用单片机内置定时/计数器。
它的处理过程主要是先设定单片机内部定时/计数器的工作方式,对机器周期计数确定基准时间,然后用另外一个定时器软件计数的方法对基准时间形成秒,秒计60次形成分,分计60次形成小时。
依此类推,获取日期也是采用相同的方法。
该方案在具体实现过程中,计时存在较大的误差。
如果晶振受到其他外界信号干扰,或者基准时间计算不准确,都会导致时间显示错误。
【方案二】采用555多谐振荡器。
由555定时器组成一个多谐振荡器,产生周期为100HZ的脉冲,然后经过两个74LS160组成的分频器得到1HZ的秒脉冲。
多谐振荡器的稳定度及频率的准确度决定了数字钟计时的准确程度,通常选用成品晶振构成振荡器电路。
计时精度取决于振荡器的频率,振荡器频率越高计时精度越高。
【方案三】采用DS1302时钟芯片。
DS1302是一种高性能、超低功耗的实时时钟芯片,附加31字节静态RAM,可以通过串行接口与单片机进行通信。
实时时钟提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。
芯片内部集成备用电源,当外围电路电路有电源供应的时候,备用电源充电储能。
当外围电路掉电时,DS1302芯片工作在休眠状态,以备用电源供电。
当外围电路再次供电,即可唤醒休眠进入正常工作状态,显示时间无任何异常。
《单片机技术》课程设计报告项目名称:家用多功能定时器设计与制作第一章绪论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,若不是则结束。
课程设计课程名称:电子系统设计(单片机)设计题目:基于单片机控制的多路定时闹钟班级:学号:姓名:指导教师:完成时间:哈尔滨工程大学教务处制基于单片机控制的多路定时闹钟设计者:指导教师:一、课程设计方案1.设计要求使用AT89C52单片机结合字符型LCD显示器设计一个四路定时闹钟,LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可使用。
定时闹钟的基本功能如下:显示格式为“时时:分分”。
由LED闪动来表示工作状态。
每一路的时间到电路则做出反应提醒,反应可为蜂鸣器发出声响,继电器启动控制家电开启和关闭,LED灯亮起。
2.设计内容①程序执行后工作指示灯LED闪动,表示程序开始执行,按下操作键K1~K5动作如下:(1) 按下K1——设置现在的时间。
此时K2——光标选定的时间加1。
K3——光标选定的时间减1。
多次按下K1使光标循环一个周期,系统时间设定完成。
(2) 按下K5——显示时间选项,时间选项分别有系统时间(TIME),闹钟1(Alarm1),闹钟2(Alarm2),闹钟3(Alarm3),闹钟4(Alarm4)。
(3) 当显示为任意闹钟时,按下K4——设定所选闹钟,如设定闹钟1(SDAlarm1)。
设定时K2——分钟加1,K3——分钟减1。
再次按下K4键设定完成。
(4) K5——闹铃时间到时,系统做出任一反应,按下本键可以停止。
②当闹钟1到时,蜂鸣器以高频率响起;当闹钟2到时,发光二极管亮起;当闹钟3到时,蜂鸣器以低频率响起;当闹钟4到时,继电器控制的家电开启(此处以一个发光二极管代替)。
3.设计原理(a)AT89C52AT89C52为40 脚双列直插封装的8 位通用微处理器,采用工业标准的C51内核。
图1 AY89C52单片机的引脚图它的主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接11.0592MHz 晶振。
RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。
多功能定时器课程设计一、课程目标知识目标:1. 学生能够理解多功能定时器的基本概念和原理;2. 学生能够掌握多功能定时器的各个组成部分及其功能;3. 学生能够了解多功能定时器在日常生活和科技领域中的应用。
技能目标:1. 学生能够运用所学知识,正确组装和操作多功能定时器;2. 学生能够通过编程,实现多功能定时器的定时、延时等功能;3. 学生能够运用多功能定时器解决实际问题,提高创新实践能力。
情感态度价值观目标:1. 学生能够培养对多功能定时器及相关电子技术的兴趣和热情;2. 学生能够认识到多功能定时器在生活中的重要性,增强科技改变生活的意识;3. 学生能够在团队合作中,培养沟通、协作和解决问题的能力。
课程性质:本课程为实践性较强的电子技术课程,结合学生特点和教学要求,注重理论与实践相结合,提高学生的动手能力和创新能力。
学生特点:五年级学生具有一定的电子技术基础和动手能力,对新鲜事物充满好奇心,喜欢动手实践。
教学要求:结合课程内容和五年级学生的特点,采用启发式教学,引导学生主动探究,注重培养学生的实际操作能力和创新思维。
通过本课程的学习,使学生能够将所学知识应用于实际生活中,提高综合素养。
二、教学内容本课程教学内容围绕多功能定时器的原理、组装、编程和应用展开,分为以下四个部分:1. 多功能定时器原理:- 介绍定时器的基本工作原理;- 讲解时钟电路、计数器、触发器等核心部件的作用;- 分析定时器精度、稳定性等性能指标。
2. 多功能定时器组装:- 选用合适的集成芯片和元器件;- 指导学生进行电路搭建和调试;- 讲解组装过程中的注意事项,确保安全可靠。
3. 多功能定时器编程:- 介绍编程软件和编程语言;- 指导学生编写简单的定时、延时程序;- 分析编程过程中的常见问题及解决方法。
4. 多功能定时器应用:- 展示定时器在日常生活、工业生产、科技领域等方面的应用案例;- 引导学生思考定时器的创新应用;- 组织学生进行实际操作,将所学知识应用于解决实际问题。
基于单片机的多用途定时器设计1. 引言在现代电子技术领域,定时器在各种电子设备中起着至关重要的作用。
基于单片机的多用途定时器设计是一项重要的研究领域,它可以应用于各种领域,如工业自动化、家庭电器、通信设备等。
本文旨在探讨基于单片机的多用途定时器设计的原理、应用和优化方法。
2. 单片机定时器概述单片机是一种集成了处理器、存储器和输入/输出接口等功能于一体的微型计算机。
定时器是单片机中常见且重要的功能模块之一。
它可以通过计数来实现时间延迟、周期性任务和时间测量等功能。
3. 单片机定时器设计原理基于单片机的多用途定时器设计通常采用计数寄存器和控制寄存器来实现。
计数寄存器可以记录时间延迟或周期性任务所需的计数值,而控制寄存器则负责设置计数模式、预分频因子和中断使能等参数。
4. 定时模式基于单片机的多用途定时器设计通常包括多种不同类型的定时模式,如延迟定时、定时中断、PWM输出等。
延迟定时模式用于实现一段时间的延迟操作,定时中断模式用于周期性任务的实现,而PWM输出模式则可以生成脉冲宽度调制信号。
5. 应用案例基于单片机的多用途定时器设计可以应用于各种领域。
以工业自动化为例,它可以实现各种自动化控制任务,如时间触发控制、周期性任务调度等。
在家庭电器领域,它可以应用于电子钟、计时器等设备。
在通信设备中,它可以实现各种通信协议的定时要求。
6. 定时器优化方法为了提高基于单片机的多用途定时器设计的性能和可靠性,一些优化方法被提出。
例如,在设计中合理选择预分频因子和计数值范围以满足要求;合理设置中断优先级以确保关键任务能够及时响应;采用硬件加速技术来提高计数速度等。
7. 设计流程基于单片机的多用途定时器设计通常需要经过一系列步骤来完成。
首先确定需求和功能要求,然后选择合适的单片机型号和开发工具。
接下来,进行硬件电路设计和软件编程,最后进行调试和测试。
8. 结论基于单片机的多用途定时器设计是一项重要的研究领域,它在各种电子设备中起着至关重要的作用。
单片机课程设计多功能定时器一、设计目的: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_com(unsigned char com);LCD显示位置函数声明void write_data(unsigned char date);写数据函数声明void init();{RS=0;RW=0;EN=0;write_com(0x38);write_com(0x0f);write_com(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_com(unsigned char com) //{RS=0;RW=0;P0=com;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); //minute if(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; //weekTIME[4]=((TIME[4]&0x3f)>>4)*10+(TIME[4]&0x0f); //date TIME[5]=((TIME[5]&0x1f)>>4)*10+(TIME[5]&0x0f); //month TIME[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);//YearTimeTemp[5]=((TimeTemp[5]/10)<<4)+(TimeTemp[5]%10);//MonthTimeTemp[4]=((TimeTemp[4]/10)<<4)+(TimeTemp[4]%10);//DayTimeTemp[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);//SecondTimeTemp[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 charClock=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_com(0x82); //写冒号write_data(0x3A);write_com(0x85); //写冒号write_data(0x3A); write_com(0xc2);//写短横线write_data(0x2D); write_com(0xc5);//写短横线 write_data(0x2D); write_com(0xc8);//写短横线 write_data(0x2D); while(1) { stop();if(SetMode==0)ReadTime(CurrentTime); write_com(0x80); write_data(CurrentTime[2]/10+48);write_data(CurrentTime[2]%10+48); write_com(0x83); write_data(CurrentTime[1]/10+48); write_data(CurrentTime[1]%10+48); write_com(0x86); write_data(CurrentTime[0]/10+48); //Secondwrite_data(CurrentTime[0]%10+48); write_com(0xc0); write_data(CurrentTime[6]/10+48); //Yearwrite_data(CurrentTime[6]%10+48); write_com(0xc3); write_data(CurrentTime[5]/10%10+48); write_data(CurrentTime[5]%10+48); write_com(0xc6); write_data(CurrentTime[4]/10%10+48); //Day write_data(CurrentTime[4]%10+48); switch(CurrentTime[3]){case1:{write_com(0xc9);write_data(0x4D);write_data(0x6f);write_data(0x6e);break;}//显示Moncase2:{write_com(0xc9);write_data(0x54);write_data(0x75);write_data(0x65);break;}//显示Tuecase3:{write_com(0xc9);write_data(0x57);write_data(0x65);write_data(0x64);break;}//显示Wencase4:{write_com(0xc9);write_data(0x54);write_data(0x68);write_data(0x75);break;}//显示Thucase5:{write_com(0xc9);write_data(0x46);write_data(0x72);write_data(0x69);break;}//显示Fricase6:{write_com(0xc9);write_data(0x53);write_data(0x61);write_data(0x74);break;}//显示Satcase7:{write_com(0xc9);write_data(0x53);write_data(0x75);write_data(0x6e);break;}//显示Sundefault: break;}KeyProcess();if((CurrentTime[0]==ClockSetSave1[0]&&CurrentTime[1]==ClockSetSave1[ 1]&&CurrentTime[2]==ClockSetSave1[2])&&ClockEn1==1 ||(CurrentTime[0]==ClockSetSave2[0]&&CurrentTime[1]==ClockSetSave2[1]&&Cur rentTime[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_com(0x8c);write_data(0x43);write_data(0x31);}else //否则清显{write_com(0x8c);write_data(0x20);write_data(0x20);}if(ClockEn2==1) //如果闹铃2被设置则显示C1{write_com(0x8e);write_data(0x43);write_data(0x32);}else //否则清显{write_com(0x8e);write_data(0x20);write_data(0x20);}}void KeyProcess() //按键处理,启动按键扫描{KeyValue=GetKey();switch(KeyValue){case 0: //按键0进入设置模式{write_com(0xcf);write_data(table[SetMode]); //显示被设置项if(SetMode==0)SwitchRTC(0); //进入设置,则停止计时SetMode++;if(SetMode>7) //如果设置完了,则开始计时{SetMode=0;SetTime(CurrentTime);if(SetMode==0)SwitchRTC(1);write_com(0xcf);write_data(0x20);}}break;case 1: //按键1:加{switch(SetMode) //执行按键1是在进入设置的模式下case1:write_com(0xcf);write_data(0x53);CurrentTime[0]++;if(CurrentTime[0]>59)Curre ntTime[0]=0;break;//miaocase2:write_com(0xcf);write_data(0x4d);CurrentTime[1]++;if(CurrentTime[1]>59)Curre ntTime[1]=0;break;//fencase3:write_com(0xcf);write_data(0x48);CurrentTime[2]++;if(CurrentTime[2]>23)Curre ntTime[2]=0;break;//shicase4:write_com(0xcf);write_data(0x59);CurrentTime[6]++;if(CurrentTime[6]>99)Curre ntTime[6]=0;break;//yearcase5:write_com(0xcf);write_data(0x6d);CurrentTime[5]++;if(CurrentTime[5]>12)Curre ntTime[5]=1;break;//monthcase 6://day{write_com(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_com(0xcf);write_data(0x57);CurrentTime[3]++;if(CurrentTime[3]>7)Current Time[3]=1;break; //weekdefault:break;}}break;case 2: //按键2:减{switch(SetMode){case 1:CurrentTime[0]--;if(CurrentTime[0]>254)CurrentTime[0]=59;break;//miaocase 2:CurrentTime[1]--;if(CurrentTime[1]>254)CurrentTime[1]=59;break;//fencase 3:CurrentTime[2]--;if(CurrentTime[2]>254)CurrentTime[2]=23;break;//shicase 4:CurrentTime[6]--;if(CurrentTime[6]>254)CurrentTime[6]=99;break;//yearcase 5: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_com(0xcf);write_data(0x20);}}break;case 4: //按键4设置闹铃{write_com(0xcf);write_data(0x20);while(Clock!=0) //用Clock来进行判断闹铃设置完否{switch(Clock){case 1: {//****************闹铃1while(FinishClockSet1!=1){write_com(0x80);write_data(ClockSetSave1[2]/10+48);//Hourwrite_data(ClockSetSave1[2]%10+48);write_com(0x83);write_data(ClockSetSave1[1]/10+48);//Minutewrite_data(ClockSetSave1[1]%10+48);write_com(0x86);write_data(ClockSetSave1[0]/10+48);//Secondwrite_data(ClockSetSave1[0]%10+48);write_com(0x8a);//闹铃设置序号显示write_data(0x43);write_data(0x4c);write_data(0x4f);write_data(0x43);write_data(0x4b);write_data(0x31);if(ClockEn1==0){write_com(0x89);write_data(0x20);}else{write_com(0x89);write_data(0x2a);}ClockKeyValue=GetKey();switch(ClockKeyValue){case 0://按键0设置闹钟{ClockSet++;write_com(0xcf);write_data(table1[ClockSet]);if(ClockSet>3) //设置键按完三次自动进入下一个闹铃设置{ClockSet=0;FinishClockSet1=1;Clock++;write_com(0xcf);write_data(0x20);}}break;case 1://闹铃设置+{switch(ClockSet){case1:write_com(0xcf);write_data(0x53);ClockSetSave1[0]++;if(ClockSetSave1[0]>59)C lockSetSave1[0]=0;break;//miaocase2:write_com(0xcf);write_data(0x4d);ClockSetSave1[1]++;if(ClockSetSave1[1]>59)C lockSetSave1[1]=0;break;//fencase3:write_com(0xcf);write_data(0x48);ClockSetSave1[2]++;if(ClockSetSave1[2]>23)C lockSetSave1[2]=0;break;//shidefault:break;}}break;case 2: //闹铃设置2{switch(ClockSet){case1:write_com(0xcf);write_data(0x53);ClockSetSave1[0]--;if(ClockSetSave1[0]>254)ClockSetSave1[0]=59;break;//miaocase2:write_com(0xcf);write_data(0x4d);ClockSetSave1[1]--;if(ClockSetSave1[1]>254)ClockSetSave1[1]=59;break;//fencase3:write_com(0xcf);write_data(0x48);ClockSetSave1[2]--;if(ClockSetSave1[2]>254)ClockSetSave1[2]=23;break;//shidefault:break;}}break;case 3://中途退出闹铃设置{FinishClockSet1=1;Clock=0; write_com(0x89); //闹铃设置序号清除显示write_data(20);write_data(20);write_data(20);write_com(0x8e);write_data(20);write_data(20);write_com(0xcf);write_data(0x20);}break;case 5: {//是否开启闹钟,并予以显示if(ClockEn1==0){ ClockEn1=1;write_com(0x89);write_data(0x2a);}else{ ClockEn1=0;write_com(0x89);write_data(0x20);}}break;default:break;} //case4->case1 end}}break;case 2 :{//****************闹铃2while(FinishClockSet2!=1){write_com(0x80);write_data(ClockSetSave2[2]/10+48); //Hourwrite_data(ClockSetSave2[2]%10+48);write_com(0x83);write_data(ClockSetSave2[1]/10+48); //Minutewrite_data(ClockSetSave2[1]%10+48);write_com(0x86);write_data(ClockSetSave2[0]/10+48); //Secondwrite_data(ClockSetSave2[0]%10+48);write_com(0x8a);//闹铃设置序号显示write_data(0x43);write_data(0x4c);write_data(0x4f);write_data(0x43);write_data(0x4b);write_data(0x32);if(ClockEn2==0){write_com(0x89);write_data(0x20);}else{write_com(0x89);write_data(0x2a);}ClockKeyValue=GetKey();switch(ClockKeyValue){case 0:{ClockSet++;write_com(0xcf); write_data(table1[ClockSet]);if(ClockSet>3){ClockSet=0; FinishClockSet2=1;Clock=0; write_com(0x89); //闹铃设置序号清除显示write_data(20);write_data(20);write_data(20);write_com(0x8e);write_data(20);write_data(20);write_com(0xcf);write_data(0x20);}}break;case 1:{switch(ClockSet){case1:write_com(0xcf);write_data(0x53);ClockSetSave2[0]++;if(ClockSetSave2[0]>59)C lockSetSave2[0]=0;break;//miaocase2:write_com(0xcf);write_data(0x4d);ClockSetSave2[1]++;if(ClockSetSave2[1]>59)C lockSetSave2[1]=0;break;//fencase3:write_com(0xcf);write_data(0x48);ClockSetSave2[2]++;if(ClockSetSave2[2]>23)C lockSetSave2[2]=0;break;//shidefault:break;}}break;case 2:{switch(ClockSet){case1:write_com(0xcf);write_data(0x53);ClockSetSave2[0]--;if(ClockSetSave2[0]>254)ClockSetSave2[0]=59;break;//miaocase2:write_com(0xcf);write_data(0x4d);ClockSetSave2[1]--;if(ClockSetSave2[1]>254)ClockSetSave2[1]=59;break;//fencase3:write_com(0xcf);write_data(0x48);ClockSetSave2[2]--;if(ClockSetSave2[2]>254)ClockSetSave2[2]=23;break;//shidefault:break;}}break;case 3:{FinishClockSet2=1;Clock=0;write_com(0x89); //闹铃设置序号清除显示write_data(20);write_data(20);write_data(20);write_com(0x8e);write_data(20);write_data(20);write_com(0xcf);write_data(0x20);}break;case 5: { if(ClockEn2==0){ ClockEn2=1;write_com(0x89);write_data(0x2a);}else{ ClockEn2=0;write_com(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;}}七、心得体会经过两周的的课程设计,过程曲折可谓一语难尽。