推荐-单片机课程设计多功能定时器 精品 精品
基于单片机设计的多功能定时器
参考文献(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. 学生能够了解多功能定时器在日常生活和科技领域中的应用。
技能目标:1. 学生能够运用所学知识,正确组装和操作多功能定时器;2. 学生能够通过编程,实现多功能定时器的定时、延时等功能;3. 学生能够运用多功能定时器解决实际问题,提高创新实践能力。
情感态度价值观目标:1. 学生能够培养对多功能定时器及相关电子技术的兴趣和热情;2. 学生能够认识到多功能定时器在生活中的重要性,增强科技改变生活的意识;3. 学生能够在团队合作中,培养沟通、协作和解决问题的能力。
课程性质:本课程为实践性较强的电子技术课程,结合学生特点和教学要求,注重理论与实践相结合,提高学生的动手能力和创新能力。
学生特点:五年级学生具有一定的电子技术基础和动手能力,对新鲜事物充满好奇心,喜欢动手实践。
教学要求:结合课程内容和五年级学生的特点,采用启发式教学,引导学生主动探究,注重培养学生的实际操作能力和创新思维。
通过本课程的学习,使学生能够将所学知识应用于实际生活中,提高综合素养。
二、教学内容本课程教学内容围绕多功能定时器的原理、组装、编程和应用展开,分为以下四个部分:1. 多功能定时器原理:- 介绍定时器的基本工作原理;- 讲解时钟电路、计数器、触发器等核心部件的作用;- 分析定时器精度、稳定性等性能指标。
2. 多功能定时器组装:- 选用合适的集成芯片和元器件;- 指导学生进行电路搭建和调试;- 讲解组装过程中的注意事项,确保安全可靠。
3. 多功能定时器编程:- 介绍编程软件和编程语言;- 指导学生编写简单的定时、延时程序;- 分析编程过程中的常见问题及解决方法。
4. 多功能定时器应用:- 展示定时器在日常生活、工业生产、科技领域等方面的应用案例;- 引导学生思考定时器的创新应用;- 组织学生进行实际操作,将所学知识应用于解决实际问题。
单片机课程设计pdf
单片机课程设计pdf一、课程目标知识目标:1. 让学生掌握单片机的基本原理和结构,理解其工作流程。
2. 使学生熟悉单片机编程语言,能运用C语言或汇编语言编写简单的单片机程序。
3. 让学生了解单片机在日常生活和工业控制中的应用。
技能目标:1. 培养学生运用单片机解决实际问题的能力,学会设计简单的电路控制系统。
2. 提高学生编程能力,能对单片机程序进行调试和优化。
3. 培养学生团队协作和沟通能力,能在项目中进行有效分工与合作。
情感态度价值观目标:1. 激发学生对单片机及电子技术的兴趣,培养其探索精神和创新能力。
2. 培养学生严谨的科学态度,注重实践操作,养成良好的学习习惯。
3. 增强学生的环保意识,使其关注单片机在节能减排领域的应用。
课程性质:本课程为实践性较强的课程,结合理论教学,注重培养学生的动手能力和实际操作技能。
学生特点:学生具备一定的电子基础和编程知识,对单片机有一定了解,但实践操作能力有待提高。
教学要求:教师应结合课本内容,采用项目驱动的教学方法,引导学生通过实践操作掌握单片机相关知识,将理论知识与实际应用相结合,提高学生的综合素养。
在教学过程中,关注学生的学习进度,及时调整教学策略,确保课程目标的实现。
通过课程学习,使学生能够具备解决实际问题的能力,为未来的学习和工作打下坚实基础。
二、教学内容根据课程目标,本章节教学内容主要包括以下几部分:1. 单片机原理与结构:介绍单片机的基本组成、工作原理和性能指标,涉及课本第一章内容。
2. 单片机编程语言:讲解C语言和汇编语言在单片机编程中的应用,包括语法、语句和编程规范,对应课本第二章。
3. 单片机程序设计:通过实例讲解单片机程序设计方法,涵盖输入/输出、中断、定时器等应用,涉及课本第三章。
4. 单片机外围设备:介绍常见外围设备的使用方法,如键盘、显示、传感器等,对应课本第四章。
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)具有多机识别功能的串行通信接口,规范了功能单元的特殊功能寄存器控制模式及适应控制器特点的布尔处理系统和指令系统,位发展具有良好兼容性的新一代单片机奠定了良好的基础。
单片机被广泛地应用在各种领域。
例如用来作家用电器中如洗衣机、电冰箱、微波炉、电饭煲、电视机、录像机以及其他视频音像设备的控制器;在办公室中用作大量通信、信息的承载体,比如磁盘驱动、打印机、复印机、电话等;它还可以来构成电子秤、收款机、仓储安全检测系统、空气调节系统等冷冻保鲜系统等的专用系统;在工业中,像工业过程控制、过程监制以及机电一体化控制等系统都是以单片机为核心火多网络系统;它还可以构成一些智能仪表与集成智能传感器传统的控制电路,实现一些像存储、数据处理、查找、判断、联网和语音功能等智能化功能,还可以构成一些电子系统中的集中显示系统、动力检测控制系统、自动驾驶系统、通信系统以及运行监视器等的冗余网络系统。
多功能定时器课程设计讲解
摘要在日常生活照,555定时器的应用非常广泛,我们常常用到定时控制。
在早期运用的是模拟电路设计的,它的准确性和精度都不是很理想。
然而现在基本上都是运用数字技术。
定时器可以控制一些常用电器,也可以构成复杂的工业过程控制系统。
它的功能强大,体积小且灵活,配以适当的芯片可以实现许多功能。
随着电子技术的飞速发展,家用电器逐渐增多,不同的设备需要实现不同的功能,需要自己的控制器,设计十分不便。
根据这种情况,本设计设计了一个多功能定时器,可以对许多电器进行定时。
这种具有智能化的产品有效的减轻了人们的劳动,带人们走进智能化的时代,为家庭数字化的实现提供了可能。
关键词:555定时器;多功能;电器目录1方案论证 (1)1.1方案的比较环节 (1)1.2实验方案 (1)2原理及技术指标 (2)2.1实验原理 (2)2.2实验技术指标 (2)3单元电路设计及参数计算 (3)3.1单元电路设计 (3)3.1.1控制电路 (3)3.1.2可控脉冲发生电路 (3)3.1.3延时控制电路 (5)3.1.4电源电路 (6)3.2实验的连接与处理 (7)3.2.1各部件实现功能 (7)3.2.2实验处理 (8)4电路图 (9)4.1电路图 (9)5设计小结 (10)5.1个人感悟 (10)5.2遇到问题及解决途径 (10)参考文献 (11)附录 (12)1方案论证1.1 方案的比较环节方案一:通过51单片机进行编程设计一个电路系统方案二:采用555定时器组成的多谐振荡器产生时钟脉冲。
方案三:采用晶振产生时钟脉冲。
晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定、精确的单频振荡。
比较分析:三种方案相比较,方案一需要进行编程,而我们无法在短时间内编写好完整的程序,可实现性不强。
方案二:555定时器芯片是一种广泛应用的中规模集成电路,只要外围配以几个适当的阻容元件,就可以构成无稳态触发器、单稳态触发器以及双稳态触发器等应用电路,以此为基础可设计各种实用的电路形式。
基于单片机的多用途定时器的设计与实现
基于单片机的多用途定时器的设计与实现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 引 言“定时器”总的来说有两种类型。
其一是基于模拟技术的传统产品,这种定时器功能简单,尽管曾被广泛应用过,但已进入淘汰之列。
另一种就是基于数字技术的新一代产品,这种产品功能强,是前者的换代之物。
然而,此类产品大多是较大型的设备,真正实用、携带方便、功能齐全的“大路”商品则就不多见了。
- 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;}}七、心得体会经过两周的的课程设计,过程曲折可谓一语难尽。