单片机课程设计多功能定时器
单片机定时器设计
单片机定时器设计
一、设计原理
单片机定时器是通过计时寄存器来实现定时功能的。
一般来说,计时寄存器是一个16位的寄存器,存放的值从0x0000到0xFFFF之间。
定时器通过不断地递增计时寄存器的值,来实现定时的功能。
当计时寄存器达到预设的值时,会产生一个定时器中断信号,可以通过该中断信号来触发其他相关操作。
定时器工作的基本原理是通过外部晶振提供一个基准时钟,利用该时钟周期性地对计时寄存器进行递增。
根据外部晶振的频率,定时器的精度也会不同。
定时器的工作模式主要分为两种:定时工作模式和计数工作模式。
定时工作模式是指定时器在达到预设的值后产生中断,并重新开始计时。
计数工作模式是指定时器不断地计数,直到外部触发一个事件,产生中断并清零计时寄存器。
二、设计实例分析
1.设计一个1秒的定时器
2.设计一个毫秒级的定时器
3.设计一个按键消抖定时器
在按键输入中,为了避免按键的抖动,常常需要使用定时器来进行按键的消抖处理。
假设按键抖动时间为10ms,我们可以设置一个10ms的定时器,在定时器中断时检测按键状态,若按键状态稳定一致,则认定按键有效。
结语
单片机定时器是一种非常实用的功能模块,可以实现各种定时、测定、控制等功能。
本文通过给出了几个常见的定时器设计实例,并提供了相应
的计算公式,希望对读者有所帮助。
通过进一步学习和实践,读者可以更
加深入地理解和应用单片机定时器。
基于单片机设计的多功能定时器
参考文献(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单片机的多功能电子钟设计
基于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. 理解单片机定时器的工作原理,掌握定时器的编程方法;2. 学会使用单片机实现闹钟功能,了解时间计算与时间显示的基本方法;3. 掌握相关电子元器件的原理和功能,如晶振、电容、数码管等。
技能目标:1. 能够运用C语言编写单片机程序,实现闹钟的定时与显示功能;2. 学会使用调试工具对单片机程序进行调试,解决常见问题;3. 提高动手能力,能够独立完成单片机定时闹钟的硬件电路搭建与程序编写。
情感态度价值观目标:1. 培养学生对电子技术的兴趣,激发创新意识;2. 培养学生团队协作精神,学会共同解决问题;3. 增强学生实践操作能力,树立实践出真知的观念。
课程性质:本课程为实践性课程,结合理论教学,注重培养学生的动手能力与实际应用能力。
学生特点:学生具备一定的单片机基础知识,对编程有一定了解,但对实际应用尚缺乏经验。
教学要求:结合学生特点,注重理论与实践相结合,以学生为主体,引导学生主动参与,提高学生的实践操作能力。
在教学过程中,将课程目标分解为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. 理论知识:- 单片机定时器/计数器的工作原理与编程方法;- 时间计算与时间显示技术;- 硬件电路设计原理,包括晶振、电容、数码管等元器件的应用。
2. 实践操作:- 搭建单片机定时闹钟的硬件电路;- 编写单片机程序,实现定时与显示功能;- 使用调试工具对程序进行调试,解决常见问题。
3. 教学大纲:- 第一阶段:回顾单片机基础知识,介绍定时器/计数器原理,分析闹钟功能需求;- 第二阶段:学习时间计算与显示技术,讲解硬件电路设计方法;- 第三阶段:动手实践,分组进行硬件电路搭建与程序编写;- 第四阶段:程序调试与优化,展示成果,总结经验。
4. 教材关联:- 教材第3章:单片机定时器/计数器的原理与应用;- 教材第4章:C语言编程基础,涉及闹钟程序编写;- 教材第5章:电子元器件及其应用,用于硬件电路设计。
基于PIC12F675单片机的可编程多功能时间继电器的设计
基于PIC12F675单片机的可编程多功能时间继电器的设计摘要:定时控制是最基本的自动控制方式,由单片机制作的定时控制,具有定时精确,电路简单等诸多优点,能够实现多种定时模式,利用MCU内部的多个TMR模块,可以设计成多个集成的时间继电器,利用MCU内部的多路ADC转换模块通过各自的电位器独立调整延时时间,而且各定时模块可以级联控制,实现电动机控制电路的简化,如果通过IO口连接外部信号,便于实现多种简单的自动控制。
关键词:MCU、定时器、AD转换、级联控制1、引言常用的电子时间继电器普遍使用CD4060振荡计数分频CMOS集成电流构成,一般采用外部RC振荡器,定时精度低、控制功能单一。
由于这种电子时间继电器内部带有小功率稳压电源模块,用引脚较少的单片机取代原数字电路芯片,可以实现多个定时器集成在一起,或者多个定时级联控制。
如果用较少引脚的单片机构成时间继电器,则提高定时精度,而且实现多个时间继电器的集成,通过编程可以实现多个时间继电器的级联控制。
从而可以大大简化控制电路,节省了线材。
2、单片机及选型单片机又称微控器MCU,生产厂家和品牌很多。
众所周知proteus是开发单片机产品最好用的仿真软件,不但能够进行单片机仿真,而且能够进行电路仿真和PCB电路设计,因此选型时首先考虑容易购置且在proteus中有仿真模型的MCU产品。
经典的普林斯顿构架的51单片机,内部资源少,引脚多,不适合单片机产品的开发。
PIC单片机虽然品种繁多,但是一个IDE软件可以通吃,而且在proteus仿真软件有丰富的仿真模型,这样便于电路研发设计。
其中有PIC12F675[1]单片机是PICF12系列单片机中内部资源较为丰富的品种。
其内部有两个可编程定时器模块TMR0和TMR1,还具有4路10位ADC转换模块和比较器模块,比较适合制作时间继电器的控制电路。
选用PIC单片机的另一个好处是有廉价的替代品,台湾的麦肯单片机质优价廉,可以直接取代。
基于单片机的多功能定时器设计与实现
基于单片机的多功能定时器设计与实现摘要:随着科技的发展,人们对于计时和定时的需求日益增长。
本文基于单片机设计了一个多功能定时器,能够实现多种定时功能。
文中首先介绍了定时器的基本原理和设计方法,然后详细阐述了硬件和软件的实现过程。
最后,通过实验验证了设计的正确性和实用性。
关键词:单片机,多功能定时器,硬件设计,软件设计,实验验证引言:定时器是现代生活中不可或缺的一部分,它广泛应用于家电、工业设备、交通工具等领域。
传统的机械式定时器虽然可以满足简单的定时需求,但其功能有限,并且不够灵活方便。
基于单片机的定时器不仅可以实现更多的定时功能,而且可以灵活地调整参数,满足不同的需求。
因此,研究和设计基于单片机的多功能定时器具有重要的实际意义。
一、定时器的基本原理和设计方法1.1定时器的基本原理定时器是一种计时装置,可以用来测量时间间隔或定时一个事件的发生。
它由时钟源、计数器、定时器中断等组成。
通过控制计数器的计数频率和初始值,可以实现不同的计时功能。
1.2定时器的设计方法二、硬件设计2.1时钟源的选择定时器的计数频率由时钟源决定,常见的时钟源有晶体振荡器、RC振荡器和外部时钟等。
根据实际需求选择合适的时钟源。
2.2计数器的选择计数器是定时器的核心部件,根据需求选择适当的计数器。
常见的计数器有8位计数器和16位计数器。
一般情况下,16位计数器可以满足大部分的定时需求。
2.3定时器中断的设置通过设置定时器中断,可以使定时器达到指定的时间后触发中断,从而实现定时的功能。
根据产品需求选择合适的中断方式,如定时器溢出中断、定时器比较中断等。
三、软件设计3.1初始化定时器在软件设计中,首先需要初始化定时器,包括选择计数模式、设置计数频率等。
根据实际需求选择适当的计数模式,如定时模式或计数模式。
3.2设置计数频率和计数值通过设置计数频率和计数值,可以实现不同的定时功能。
根据需求选择适当的计数频率和计数值,例如,设置计数频率为1MHz,计数值为1000,可以实现1ms的定时功能。
单片机定时器毕业设计(论文)
毕业设计毕业设计题目:学生学号:学生姓名:所在系(部):专业及班级:指导教师:完成日期:《电气自动化》专业毕业设计任务书课题名称:定时系统课题类型:模拟课题设计的目的:(1)定时设定由按键部分控制(2)实现定时时间的显示数码管显示:分(十位)分(个位)∶秒(十位)秒(个位)(3)到点响铃(4)系统运行中可重新设定定时值(5)最大实现99分59秒的定时设计的任务及主要内容::第一章概述1 任务设计(1)定时设定由按键部分控制(2)实现定时时间的显示数码管显示:分(十位)分(个位)∶秒(十位)秒(个位)(3)到点响铃(4)系统运行中可重新设定定时值(5)最大实现99分59秒的定时2 总体方案(1)设计框图系统框图如图1(2)设计思路利用89C51单片机作为本系统的中控模块。
上电后,按下功能键进入调时状态,通过各单元电路将按键部分设定的时间通过定时时间显示部分中的LED数码管显示出来,当时间设定完毕后再次按下按键部分的功能键,闹铃模块的蜂鸣器鸣叫0.5S以示定时器开始工作,到点实现响铃,再由按键部分关闹铃。
中途可重新设置定时数值。
复位部分除上电初实现复位外,其余任何时候可按键实现复位。
注:按键部分一共有4个按键,分别为功能键P3.0,秒设定键P3.1(增),分设定键P3.2(增)分设定键P3.3(减)。
3、方案论证(1)定时部分定时部分是本设计的核心部分。
方案:本方案完全用软件实现定时。
原理为:在单片机内部存储器设两个字节分别存放时钟的分、秒信息。
利用键盘部分对定时时间进行设定,由定时显示部分数码管显示,同时定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒个位减1;若秒个位减到0,则判秒十位值是否为0,若不是,则秒个位赋9,秒十位减1;分同理。
该方案具有硬件电路简单的特点。
(2)闹铃器件的选择方案:采用蜂鸣器闹铃,当到设定时间时,单片机向蜂鸣器送出高电平,蜂鸣器发生。
采用蜂鸣器闹铃结构简单,控制方便。
(完整word版)基于51单片机多功能电子时钟报告
单片机课程设计报告多功能电子数字钟姓名:学号:班级:指导教师:目录一课程设计题目—-—-———--—--—-—--------—-——---—- 3二电路设计--------——-——---—--——---——--————-——--—- 4三程序总体设计思路概述——-------———-——--——5四各模块程序设计及流程图——--—---------——6五程序及程序说明见附录-—-——————-—-—---—-- **六课程设计心得及体会-----————-————--——--—- 11七参考资料—-—-—---—--———-———--————-—-----—----—-—12一题目及要求本次单片机课程设计在Proteus软件仿真平台下实现,完成电路设计连接,编程、调试,仿真出实验结果。
具体要如下:用8051单片机设计扩展6位数码管的静态或动态显示电路,再连接几个按键和一个蜂鸣器报警电路,设计出一个多功能电子钟,实现以下功能: (1)走时(能实现时分秒,年月日的计时)(2)显示(分屏切换显示时分秒和年月日,修改时能定位闪烁显示)(3)校时(能用按键修改和校准时钟)(4)定时报警(能定点报时)本次课程设计要求每个学生使用Proteus仿真软件独立设计制作出电路图、完成程序设计和系统仿真调试,验收时能操作演示.最后验收检查结果,评定成绩分为:(1)完成“走时+显示+秒闪”功能—-——及格(2)完成“校时修改”功能---—中等(3)完成“校时修改位闪"---—良好(4)完成“定点报警”功能,且使用资源少----优秀二电路设计(电路设计图见附件电路图)(1)采用89C51型号单片机(2)采用8位共阴数码管(3)因为单片机输出高电平时输出的电流不足以驱动数码管,所以在P0口与8位数码管之间加74LS373来驱动数码管(4)P2口与数码管选择位直接加74LS138译码器(5)蜂鸣器接P3。
7口。
单片机定时闹钟课程设计
单片机定时闹钟课程设计一、课程目标知识目标:1. 让学生掌握单片机的基本原理,理解定时器的功能和工作原理。
2. 使学生掌握定时闹钟程序编写的基本方法,了解中断处理的相关知识。
3. 帮助学生了解电子时钟的基本构成,掌握时间计算和显示的相关技巧。
技能目标:1. 培养学生动手实践能力,学会使用编程软件编写、调试程序,实现单片机定时闹钟功能。
2. 提高学生分析问题和解决问题的能力,能够独立完成定时闹钟课程的各项任务。
3. 培养学生团队协作能力,学会在项目过程中进行有效沟通和分工合作。
情感态度价值观目标:1. 培养学生对单片机编程的兴趣,激发他们探索未知、自主学习的精神。
2. 培养学生勇于尝试、不怕失败的品质,提高他们面对困难时的心理素质。
3. 增强学生的创新意识,鼓励他们发挥想象力和创造力,设计出具有个性的定时闹钟作品。
课程性质分析:本课程属于电子技术与应用领域的实践课程,旨在让学生通过动手实践,掌握单片机定时闹钟的设计与制作。
学生特点分析:学生处于中学阶段,具有一定的电子技术基础和编程能力,对新鲜事物充满好奇,喜欢动手实践。
教学要求:1. 结合课本知识,注重理论与实践相结合,提高学生的实际操作能力。
2. 注重培养学生的创新精神和团队协作能力,提高他们的综合素质。
3. 以学生为主体,关注个体差异,因材施教,使每个学生都能在课程中取得进步。
二、教学内容1. 单片机基础原理回顾:包括单片机的结构、工作原理、定时器/计数器功能。
2. 定时器编程技术:重点讲解定时器的初始化、中断处理程序编写,以及定时器应用实例。
- 教材章节:第三章《单片机定时器/计数器》3. 中断系统原理:介绍中断的概念、中断优先级、中断向量表,以及中断处理流程。
- 教材章节:第四章《中断系统》4. 显示技术:讲解数码管、LCD等显示器件的工作原理和编程方法。
- 教材章节:第五章《显示技术》5. 定时闹钟设计与实现:包括闹钟功能的整体设计、程序编写、调试与优化。
单片机多功能电子数字钟课程设计报告
多功能电子数字钟设计数字钟在日常生活中最常见, 应用也最广泛。
本文主要就是设计一款数字钟, 以89C52单片机为核心, 配备液晶显示模块、时钟芯片、等功能模块。
数字钟采用24小时制方式显示时间, 定时信息以及年月日显示等功能。
文章的核心主要从硬件设计和软件编程两个大的方面。
硬件电路设计主要包括中央处理单元电路、时钟电路、人机接口电路、信号处理电路、执行电路等几部分组成。
软件用C语言来实现, 主要包括主程序、键盘扫描子程序、时间设置子程序等软件模块。
关键词单片机液晶显示器模块数字钟一硬件电路设计及描述;1.MCS-51单片机单片机是在一块硅片上集成了各种部件的微型计算机。
这些部件包括中央处理器CPU、数据存储器RAM、程序存储器ROM、定时器/计数器和多种I/O接口电路。
8051单片机的结构特点有以下几点: 8位CPU;片内振荡器及时钟电路; 32根I/O线;外部存储器ROM和RAM;寻址范围各64KB;两个16位的定时器/计数器; 5个中断源, 2个中断优先级;全双工串行口。
定时器/计数器8051内部有两个16位可编程定时器/计数器, 记为T0和T1。
16位是指他们都是由16个触发器构成, 故最大计数模值为2 -1。
可编程是指他们的工作方式由指令来设定, 或者当计数器来用, 或者当定时起来用, 并且计数(定时)的范围也可以由指令来设置。
这种控制功能是通过定时器方式控制寄存器TMOD来完成的。
在定时工作时, 时钟由单片机内部提供, 即系统时钟经过12分频后作为定时器的时钟。
技术工作时, 时钟脉冲由TO和T1输入。
中断系统8051的中断系统允许接受五个独立的中断源, 即两个外部中断申请, 两个定时器/计数器中断以及一个串行口中断。
外部中断申请通过INTO和INT1(即P3.2和P3.3)输入, 输入方式可以使电平触发(低电平有效), 也可以使边沿触发(下降沿有效)。
2.8051的芯片引脚如图1-2所示VCC: 供电电压。
单片机定时器的设计
单片机定时器的设计一、单片机定时器的基本原理单片机定时器是通过内部或外部时钟源产生固定时间间隔触发中断来实现的。
在单片机中,通常采用计数器的方式来实现定时器功能。
计数器在一次计数结束之后会自动从初始化值重新开始计数,并且触发中断。
因此,我们可以通过设置计数器的计数值和时钟源的频率来实现所需的定时功能。
二、单片机定时器的设计步骤要设计一个有效的单片机定时器,我们需要按照以下步骤进行操作。
1.确定所需的定时时长首先需要确定所需的定时时长,以便后续的计数器设置。
可以根据具体应用场景来确定定时时长,比如几毫秒、几十毫秒、几百毫秒等。
2.选择合适的计数器位宽计数器位宽决定了定时器能够计数的最大值。
通常,单片机提供的计数器位宽有8位、16位、32位等多种选择。
要根据所需的定时时长来选择合适的计数器位宽,确保可以覆盖所需的最大计数值。
3.设置计数器初始值计数器的初始值决定了定时器的倒计时开始值。
根据所需的定时时长和计数器的位宽,可以通过简单的计算得出计数器初始值。
同时,还需要考虑时钟源的频率是否与计数器的位宽匹配,以避免定时器溢出或计数不准确的问题。
4.配置定时器中断定时器中断是实现定时功能的核心部分。
在单片机中,定时器溢出时会产生中断,通过中断服务函数来处理定时器事件。
可以根据具体需求选择在时间到达时产生中断,还是定时一段时间后再产生中断。
三、单片机定时器的实现方法根据单片机的不同型号和架构,实现定时器的方法有所不同。
下面以常见的基于8051单片机的定时器实现为例进行说明。
1.选择定时器模式8051单片机中,定时器可以工作在16位定时器(Timer0和Timer1)和8位定时器(Timer2)两种模式下。
根据实际需求选择合适的定时器模式。
2.配置定时器控制寄存器定时器控制寄存器用于设置定时器的工作模式和时钟源。
根据实际需求,设置定时器模式、计数器位宽、时钟源等参数。
3.设置计数器初始值设置计数器初始值,使定时器开始倒计时。
基于单片机的多用途定时器的设计与实现
基于单片机的多用途定时器的设计与实现The Design&Implementation of All-Purpose TimerBased on Monolithic Processor淄博大学计算机科学与工程系(淄博255000) 张景元 【摘要】 设计了一种以AT89C51为核心、结构紧凑和功能齐全的多用途定时器。
它可通过小键盘输入任意定时时间,最大可定时10h,能满足各种层次答辩、各种赛事以及某些特殊定时需要。
文章对其结构作了介绍。
关键词:AT89C51,定时器,Intel8279,Intel 8253【Abstract】 T his paper dev ises a all-purpose timer bases on the AT89C51,it has advantages of the com pact configuration and complete functio n, besides it is capable o f tim ing10hour,and adapts oneself to div er sified need.It has functio n of the displaying count dow n and can provide function of so und-lig ht w arning.T he paper presents its co nfiguratio n.Key words:AT89C51,Timer,Intel8279,Intel 82531 引 言“定时器”总的来说有两种类型。
其一是基于模拟技术的传统产品,这种定时器功能简单,尽管曾被广泛应用过,但已进入淘汰之列。
另一种就是基于数字技术的新一代产品,这种产品功能强,是前者的换代之物。
然而,此类产品大多是较大型的设备,真正实用、携带方便、功能齐全的“大路”商品则就不多见了。
基于单片机实现的定时器设计
基于单片机实现的定时器设计一、定时器的基本原理定时器的核心思想是通过对时钟信号进行计数来实现定时功能。
在单片机中,通常使用内部的计数器来完成这一任务。
计数器会在每个时钟周期内递增或递减,当计数值达到预设值时,就会产生定时中断或触发相应的输出。
为了实现准确的定时,需要考虑时钟源的精度和稳定性。
单片机的时钟源可以是内部振荡器,也可以是外部晶振。
外部晶振通常能够提供更高的精度和稳定性,但会增加硬件成本和设计复杂度。
二、单片机的选择在选择用于实现定时器的单片机时,需要考虑多个因素。
首先是单片机的性能,包括处理速度、存储容量和接口资源等。
其次是成本和开发难度,对于一些简单的定时应用,可以选择成本较低、开发容易的单片机;而对于复杂的系统,则可能需要性能更强的单片机。
常见的单片机系列如 51 单片机、STM32 单片机等都具备实现定时器的能力。
51 单片机是经典的 8 位单片机,具有简单易用的特点;STM32 单片机则是 32 位单片机,功能更为强大,适用于更复杂的应用场景。
三、硬件设计硬件设计主要包括单片机最小系统的搭建和定时器相关的外围电路。
单片机最小系统通常包括电源电路、复位电路和时钟电路。
电源电路为单片机提供稳定的工作电压,复位电路用于在系统启动时将单片机初始化到一个已知状态,时钟电路则为单片机提供时钟信号。
对于定时器的外围电路,如果需要输出定时信号来控制外部设备,可以添加驱动电路和接口电路。
例如,如果要控制一个电机的转动时间,可以使用继电器或晶体管来驱动电机,并通过单片机的 GPIO 口与驱动电路连接。
四、软件设计软件设计是实现定时器功能的关键部分。
首先需要对单片机进行初始化,包括设置时钟源、配置定时器的工作模式和预分频系数等。
定时器的工作模式通常有多种选择,如定时模式、计数模式等。
在定时模式下,可以设置定时器的定时周期;在计数模式下,可以通过外部脉冲来控制计数值。
预分频系数用于对时钟信号进行分频,以实现不同精度的定时。
单片机课程设计_定时器控制4只LED滚动闪烁_任务书及成绩评语表格
指导教师:
年月日
专业负责人:
年月日
学院教学副院长:
年月日
成绩评定表
学生姓名
班级学号
专业
课程设计题目
定器控制4只LED滚动闪烁
评
语
组长签字:
成绩
日期
年月日
课程设计任务书
学院
专业
学生姓名
班级学号
课程设计题目
定时器控制4只LED滚动闪烁
实践教学要求与任务:
利用51单片机,定时器控制4只LED滚动闪烁。完成以下设计环节:
1)使用Altium Desinger开发工具,设计电路原理图与PCB制板图。
2)使用Uvision2开发平台,采用C语言或汇编语言设计软件程序。
3)使用PROTEUS仿真软件,设计仿真原理图并运行软件程序,完成系统仿真。
工作计划与进度安排:
第一阶段(1~2天):分析题目、建立电路模型;
第二阶段(2~3天):系统设计和详细过程设计;
第三阶段(3~4天):编写程序;
第四阶段(2~3天):程序测试和调试;
多功能定时器课程设计
多功能定时器课程设计一、课程目标知识目标:1. 学生能够理解多功能定时器的基本概念和原理;2. 学生能够掌握多功能定时器的各个组成部分及其功能;3. 学生能够了解多功能定时器在日常生活和科技领域中的应用。
技能目标:1. 学生能够运用所学知识,正确组装和操作多功能定时器;2. 学生能够通过编程,实现多功能定时器的定时、延时等功能;3. 学生能够运用多功能定时器解决实际问题,提高创新实践能力。
情感态度价值观目标:1. 学生能够培养对多功能定时器及相关电子技术的兴趣和热情;2. 学生能够认识到多功能定时器在生活中的重要性,增强科技改变生活的意识;3. 学生能够在团队合作中,培养沟通、协作和解决问题的能力。
课程性质:本课程为实践性较强的电子技术课程,结合学生特点和教学要求,注重理论与实践相结合,提高学生的动手能力和创新能力。
学生特点:五年级学生具有一定的电子技术基础和动手能力,对新鲜事物充满好奇心,喜欢动手实践。
教学要求:结合课程内容和五年级学生的特点,采用启发式教学,引导学生主动探究,注重培养学生的实际操作能力和创新思维。
通过本课程的学习,使学生能够将所学知识应用于实际生活中,提高综合素养。
二、教学内容本课程教学内容围绕多功能定时器的原理、组装、编程和应用展开,分为以下四个部分:1. 多功能定时器原理:- 介绍定时器的基本工作原理;- 讲解时钟电路、计数器、触发器等核心部件的作用;- 分析定时器精度、稳定性等性能指标。
2. 多功能定时器组装:- 选用合适的集成芯片和元器件;- 指导学生进行电路搭建和调试;- 讲解组装过程中的注意事项,确保安全可靠。
3. 多功能定时器编程:- 介绍编程软件和编程语言;- 指导学生编写简单的定时、延时程序;- 分析编程过程中的常见问题及解决方法。
4. 多功能定时器应用:- 展示定时器在日常生活、工业生产、科技领域等方面的应用案例;- 引导学生思考定时器的创新应用;- 组织学生进行实际操作,将所学知识应用于解决实际问题。
(完整版)基于单片机的多功能定时器毕业设计论文
目录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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 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){u nsigned char temp;u nsigned int JsKeyDelay;f or(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();{R S=0;R W=0;E N=0;w rite_com(0x38);w rite_com(0x0f);w rite_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); //secondTIME[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); //hourTIME[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); //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)+(TimeTe mp[6]%10); //YearTimeTemp[5]=((TimeTemp[5]/10)<<4)+(TimeTe mp[5]%10); //MonthTimeTemp[4]=((TimeTemp[4]/10)<<4)+(TimeTemp[4]%10); //DayTimeTemp[3]=((TimeTemp[3]/10)<<4)+(TimeTe mp[3]%10); //Weekif((TimeTemp[2]&0xc0)==0x00)//Hour{TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTe mp[2]%10);}else{if((TimeTemp[2]&0xc0)==0x01)temp=0x40;else temp=0x60;TimeTemp[2]&=0x3f;TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTe mp[2]%10);TimeTemp[2]|=temp;}TimeTemp[1]=((TimeTemp[1]/10)<<4)+(TimeTe mp[1]%10); //MinuteTimeTemp[0]=((TimeTemp[0]/10)<<4)+(TimeTe mp[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;f or (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;r eturn(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;}M CO = 0;}/************************************ ***************************************** ******* 函数名: IIC_Delay_us;* 描述: IIC总线延时函数;* 输入: 延时参数* 返回值: none;* 注释: none;************************************* ***************************************** ******/void IIC_Delay_us(unsigned int times){unsigned int i;unsigned char DelayJs;f or (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,FinishC lockSet2=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.58MHz CFG848|=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){ Arraystop();write_com(0x80);write_data(CurrentTime[2]/10+48); //Hourwrite_data(CurrentTime[2]%10+48);write_com(0x83);write_data(CurrentTime[1]/10+48); //Minutewrite_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); //Monthwrite_com(0xc6);//Daywrite_data(CurrentTime[4]%10+48);switch(CurrentTime[3]) //Week{case1:{write_com(0xc9);write_data(0x4D);write_dat a(0x6f);write_data(0x6e);break;}//显示Mon case2:{write_com(0xc9);write_data(0x54);write_dat a(0x75);write_data(0x65);break;}//显示Tue case3:{write_com(0xc9);write_data(0x57);write_dat a(0x65);write_data(0x64);break;}//显示Wen case4:{write_com(0xc9);write_data(0x54);write_data(0x68);write_data(0x75);break;}//显示Thu case5:{write_com(0xc9);write_data(0x46);write_dat a(0x72);write_data(0x69);break;}//显示Fricase6:{write_com(0xc9);write_data(0x53);write_dat a(0x61);write_data(0x74);break;}//显示Satcase7:{write_com(0xc9);write_data(0x53);write_dat a(0x75);write_data(0x6e);break;}//显示Sun default: break;}KeyProcess();if((CurrentTime[0]==ClockSetSave1[0]&&Cu rrentTime[1]==ClockSetSave1[1]&&CurrentTi me[2]==ClockSetSave1[2])&&ClockEn1==1 || (CurrentTime[0]==ClockSetSave2[0]&&Curren tTime[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_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);CurrentTi me[0]++;if(CurrentTime[0]>59)CurrentTime[0] =0;break;//miao2:write_com(0xcf);write_data(0x4d);CurrentTi me[1]++;if(CurrentTime[1]>59)CurrentTime[1] =0;break;//fencase3:write_com(0xcf);write_data(0x48);CurrentTi me[2]++;if(CurrentTime[2]>23)CurrentTime[2] =0;break;//shicase4:write_com(0xcf);write_data(0x59);CurrentTi me[6]++;if(CurrentTime[6]>99)CurrentTime[6] =0;break;//yearcase5:write_com(0xcf);write_data(0x6d);CurrentTi me[5]++;if(CurrentTime[5]>12)CurrentTime[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:case12:if(CurrentTime[4]>31)CurrentTime[4]=1;bre ak;case 4:case 6:case 9:case11:if(CurrentTime[4]>30)CurrentTime[4]=1;bre ak;case 2: if(CurrentTime[6]%4)if(CurrentTime[4]>28)Cu rrentTime[4]=1;elseif(CurrentTime[4]>29)CurrentTime[4]=1;break;default:break;}}break;case7:write_com(0xcf);write_data(0x57);CurrentTi me[3]++;if(CurrentTime[3]>7)CurrentTime[3]= 1;break; //weekdefault:break;}}break;case 2: //按键2:减{switch(SetMode){case1:CurrentTime[0]--;if(CurrentTime[0]>254)Cur rentTime[0]=59;break;//miaocase2:CurrentTime[1]--;if(CurrentTime[1]>254)Cur rentTime[1]=59;break;//fencase3:CurrentTime[2]--;if(CurrentTime[2]>254)Cur rentTime[2]=23;break;//shicase4:CurrentTime[6]--;if(CurrentTime[6]>254)Cur rentTime[6]=99;break;//yearcase5:CurrentTime[5]--;if(CurrentTime[5]>254)Cur rentTime[5]=12;break;//monthcase 6://day{CurrentTime[4]--;switch(CurrentTime[5]){case 1:case 3:case 5:case 7:case 8:case 10:case12:if(CurrentTime[4]>254)CurrentTime[4]=31;break;case 4:case 6:case 9:case11:if(CurrentTime[4]>254)CurrentTime[4]=30; break;case 2: if(CurrentTime[6]%4)if(CurrentTime[4]>254)C urrentTime[4]=28;elseif(CurrentTime[4]>254)CurrentTime[4]=29;break;default:break;}}break;case7:CurrentTime[3]--;if(CurrentTime[3]>7)Curre ntTime[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);ClockSetSa ve1[0]++;if(ClockSetSave1[0]>59)ClockSetSave1 [0]=0;break;//miaocase2:write_com(0xcf);write_data(0x4d);ClockSetSa ve1[1]++;if(ClockSetSave1[1]>59)ClockSetSave1 [1]=0;break;//fencase3:write_com(0xcf);write_data(0x48);ClockSetSa ve1[2]++;if(ClockSetSave1[2]>23)ClockSetSave1 [2]=0;break;//shidefault:break;}}break;case 2://闹铃设置2{switch(ClockSet){case1:write_com(0xcf);write_data(0x53);ClockSetSa ve1[0]--;if(ClockSetSave1[0]>254)ClockSetSave 1[0]=59;break;//miaocase2:write_com(0xcf);write_data(0x4d);ClockSetSa ve1[1]--;if(ClockSetSave1[1]>254)ClockSetSave 1[1]=59;break;//fencase3:write_com(0xcf);write_data(0x48);ClockSetSa ve1[2]--;if(ClockSetSave1[2]>254)ClockSetSave 1[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);。