您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页余洪伟 基于单片机的数字电子时钟设计(LED显示)

余洪伟 基于单片机的数字电子时钟设计(LED显示)

来源:华佗健康网


沈阳航空航天大学

课 程 设 计

(论文)

题目 基于单片机的数字电子时钟设计

(LED显示)

班 级 34070102 学 号 ************* 学 生 姓 名 余洪伟 指 导 教 师 崔建国

沈阳航空航天大学

课 程 设 计 任 务 书

课 程 名 称 智能仪器课程设计 院(系) 自动化学院 专业 测控技术与仪器 班级 34070102 学号 2013040701060 姓名 余洪伟 课程设计题目 基于单片机的数字电子时钟的设计(LED显示) 课程设计时间: 2016 年 12 月 26 日至 2017 年 1 月 13 日 1. 课程设计的内容及要求:

深入学习研究单片机及其应用系统的相关知识。以单片机为核心部件,结合硬件电路完成数字电子时钟的设计,实现基于单片机的时间显示和调整控制功能。并撰写一篇7000字左右的课程设计报告。 2. 具体设计内容和要求如下:

(1)由8个LED数码管显示时-分-秒,能够随时对时间进行调整; (2)能够随时输入定时闹钟的初始时间,定时时间到,闹钟发声,发声10S后,停5秒,再发声10S,连续3次后,便一直发声; (3)在任何时刻均可用按键关闭发声;

(4)设计系统方案,绘出原理图,焊接电路板,编写程序,并进行系统调试,实现电子时钟功能;

指导教师 年 月 日 负责教师 年 月 日 学生签字 年 月 日

目 录

1 前言 ...................................................................... 1 2 总体方案设计 .............................................................. 2

2.1方案设计 ............................................................. 2 2.2 方案的论证与选择 .................................................... 3 3 硬件电路选择与设计 ....................................................... 3

3.1 微处理器选择 ........................................................ 3 3.2 DS1302简介 .......................................................... 5 3.3 硬件电路设计 ........................................................ 6 3.4 时钟电路设计 ........................................................ 7 3.5 复位电路 ............................................................ 8 3.6 蜂鸣器电路 .......................................................... 8 3.7 键盘电路 ............................................................ 9 3.8 LED数码管显示电路 .................................................. 10 4 软件设计 ................................................................ 11

4.1 主程序设计 ......................................................... 11 4.2 键盘扫描子程序 ..................................................... 13 4.3 蜂鸣器子程序 ....................................................... 14 4.4 显示子程序 ......................................................... 15 5 调试分析 ................................................................ 15 6 结论及进一步设想 ........................................................ 16 参考文献 ................................................................... 16

课设体会 ................................................................... 17 附录1 电路原理图 ......................................................... 18 附录2 程序清单 ........................................................... 19

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

基于单片机的数字电子时钟设计(LED显示)

余洪伟 沈阳航空航天大学自动化学院

摘要:本文设计了由单片机控制的数字电子时钟(LED显示),由单片机、DS1302时钟芯片、定时计数器、蜂鸣器、键盘和LED数码管组成,主要是利用单片机为主体设计一个由LED数码管显示实时时间的数字电子时钟。此数字电子时钟具有显示时间准确、时间可调、设定闹钟、操作简单明了、功耗较低等优点。

在选择设计方案时,除了要考虑能否实现实时时间的显示,还要考虑价格以及时间准确等问题,通过对有关数字电子时钟资料的查阅以及构思和设计,经过分析和比较,从实现难度、对器材的熟悉程度、器件用量和价格等方面进行综合考虑,最终确定方案。 关键词:单片机;DS1302时钟芯片;LED数码管

1 前言

单片微型计算机,简称单片机,是微型计算机的一个分支。采用超大规模技术把具有数据处理能力(如算术运算、逻辑运算、数据传送、中断处理)的微处理器,随机存取数据存储器,只读程序存储器,输入输出电路等电路集成到一块单块芯片上,构成一个体积小,然而功能较完善的计算机系统。这些电路能在软件的控制下准确、迅速、高效地完成程序设计者事先规定的任务。

人们对数字电子时钟在性能和准确度方面的要求是越来越高,传统的时钟正在慢慢被淘汰,因为在很多方面普通时钟已不能满足人们在某些方面的需求了,特别是在准确度方面,而多功能数字电子时钟它占了很大的优势,因为它采用数字电路来实现对时,分,秒的设计。不管在性能还是在款式样式上都发生了质的飞跃变化,电子闹钟,数字显示的计时装置,广泛用于个人家庭,公司,娱乐场所,码头,办公室等等公共场所,成为人们日常生活中必不可少的生活必需品。因为数字电子时钟从原理上讲是一种典型的数字电路,由于数字集成电路的不停发展和石英晶体振荡器的发展以及广泛应用,使得数字电子时钟的精度远远超过传统的钟表,钟表的数字化给人们的生产生活带来了极大的便利而且大大地扩展了钟表原先的功能。因此,研究多功能数字电子时钟及扩大其应用,有着非常现实的意义。本课题是基于单片机的信号发生器的设计。

多功能数字电子时钟系统的最基本功能就是时间的显示和闹钟,本设计的意义在于传统的时钟不能满足现代人们多元化快节奏的生活需求,此设计将单片机作为数字电子时钟的核心控制器,可以通过DS1302数字时钟芯片进行秒,分,时来计时实现计时校时功能,将其时间数据经单片机输出,利用LED数码管显示出来。通过键盘可以进行手动时间调整和定时、闹铃启动关闭,时间启动关闭等等。该系统较传统时钟不仅测量精确度高,工作稳定,而且功能可以扩展,使用起来方便,可以广泛用于人们日常生活中,所以具有较好的实用价值。

第 1 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

研究本课题可以熟悉Proteus、Keil C51及相关电子器件的功能和用法。通过对单片机硬件、软件的设计,及硬件与软件的联调后可以进一步熟悉相关的知识,提高利用所学知识解决实际问题的能力。

2 总体方案设计

2.1方案设计

针对本课题的设计任务,进行分析得到:本次设计用单片机最小系统,直接从DS1302时钟芯片读出当前时间并且输出数字信号,在LED数码管上显示时间,蜂鸣器报警也由单片机控制。

该多功能数字电子时钟的设计,在总体上大致可分为以下几个部分:单片机最小系统、蜂鸣器、键盘调节时间与设置闹钟、时间显示。

整个电路的工作原理是用单片机通过编程产生时,用键盘设定时间数值,最后用LED数码管显示。

根据设计要求,设计了如下五个方案:

方案一:首先构成一个CB555定时器产生震荡周期为一秒的标准秒脉冲,由74LS161采用清零法分别组成六十进制的秒计数器、六十进制分计数器、二十四进制时计数器和七进制的周计数器。使用CB555定时器的输出作为秒记数器的CP脉冲,把秒记数器地进位输出作为分记数器地CP脉冲,分记数器的进位输出作为时记数器的CP脉冲。使用74LS48为驱动器, BS201A数码管作为显示器。

方案二:首先构成一个由32768Hz的石英晶体振荡器和由CD4060构成的分频器构成的产生震荡周期为一秒的标准秒脉冲,由74LS161采用清零法分别组成六十进制的秒计数器、六十进制分计数器、二十四进制时计数器和七进制的周计数器。使用由32768Hz的石英晶体振荡器和由CD4060构成的分频器构成的产生震荡周期为一秒的标准秒脉冲,把秒计数器地进位输出作为分计数器的CP脉冲,分计数器的进位输出作为时计数器的CP脉冲,时计数器的进位输出作为周计数器的CP脉冲。使用74LS48为驱动器, BS201A数码管作为显示器。

方案三:用微机原理及接口技术的知识设计电路,使用软硬件结合的方式,用8253产生秒脉冲,送到8255的B口,采用查询方式计算秒脉冲的个数,把时、分、秒的个位和十位分别存到内存单元中,通过编程使秒满60清零,同时分加1,分满六十清零,同时时加1,时满24清零,重新开始计时。用8255的A口和C口分别驱动七段数码管的字码和位码,通过不断从内存单元中读取数据,动态显示出时、分、秒。

第 2 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

方案四:用微机原理及接口技术的知识设计电路,采用软硬件结合的方式,用8253产生秒脉冲,送到8259外部中断,每来一个上升沿中断一次,计一次数,存入内存,用8255的A口和C口分别驱动七段数码管的字码和位码,通过不断从内存单元中读取数据,动态显示出时、分、秒。

方案五:基于单片机ATS52设计电路,使用软硬件结合的方式实现对时间的控制。电脑数字钟的秒信号是利用单片机内部定时器T0产生的。由于开发机的晶振频率为12MHz ,使得最大定时时间远远小于1秒, 因此,在设计时采用了硬件计数与软件计数相结合的方式,即通过T0产生0.05s的时基信号,然后再利用软件进行计数,从而产生1秒钟的时间信号。在设计中,定时器T0采用了中断方式。当定时时间到时,定时器向CPU申请一次中断,响应中断后转入中断服务程序,在T0的中断服务程序中实现时、分、秒的累加,即每产生一次中断,时基单元的内容加1,当0.05s时基单元的内容等于20时,便产生1s信号,使秒计数单元的内容加1,并将0.05s时基单元的内容清0;当秒计数单元计满60后,向分计数单元进位,使分计数单元的内容加1,并将秒计数单元的内容清0;当分计数单元计满60后,向时计数单元进位,使时计数单元的内容加1,并将分计数单元的内容清0;时计数单元计满24后清0。 2.2 方案的论证与选择

方案一、方案二、方案三、方案四和方案五都很正确,但是方案一由555定时器构成的多谐振荡器和方案二中石英晶体振荡器都是硬件设备,人不能很好的控制,会产生一定的误差,方案三、方案四和方案五都是采用软硬件结合的方式,通过软件编程控制硬件设备,准确性高,,而方案三和方案四是基于微机原理的设计,方案五基于单片机方式设计。而电子时钟要求每天计时误差不超过1s,故方案三、方案四和方案五比方案一和方案二要好,显然用单片机这种事务性芯片设计要比用微机原理设计简单,故选择方案五。

3 硬件电路选择与设计

考虑单片机货源充足、价格低廉,可软硬件结合使用,能够较方便的实现 系统的多功能性,故采用单片机作为本设计的硬件基础。 3.1 微处理器选择

目前在单片机系统中,应用比较广泛的微处理器芯片主要为8XC5X系列单片机。该

系列单片机均采用标准MCS-52内核,硬件资源相互兼容,品类齐全,功能完善,性能稳定,体积小,价格低廉,货源充足,调试和编程方便,所以应用极为广泛。

第 3 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

例如比较常用的ATC2052单片机,带有2KB Flash可编程、可擦除只读存储器(E2PROM)的低压、高性能8位CMOS微型计算机。拥有15条可编程I/O引脚,2个16位定时器/计数器,6个中断源,可编程串行UART通道,并能直接驱动LED输出。 仅仅是为了完成时钟设计或者是环境温度采集设计,应用ATC2052单片机完全可以实现。但是将两种功能结合在一片单片机上,就需要更多的I/O引脚,故本设计采用具有32根I/O引脚的ATC52单片机。

ATC52单片机是一款低功耗,低电压,高性能CMOS 8位单片机,片内含4KB(可经受1000次擦写周期)的FLASH可编程可反复擦写的只读程序存储器(EPROM),器件采用CMOS工艺和ATMEI公司的高密度、非易失性存储器(NURAM)技术制造,其输出引脚和指令系统都与MCS-52兼容。片内的FLASH存储器允许在系统内可改编程序或用常规的非易失性存储器编程器来编程。因此,ATC52是一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域。 ATC52具有以下主要性能:

1.4KB可改编程序Flash存储器; 2.全静态工作:0—24Hz; 3.128×8字节内部RAM;

4.32个外部双向输入/输出(I/O)口;

5.6个中断优先级; 2个16位可编程定时计数器; 6.可编程串行通道; 7.片内时钟振荡器。

此外,ATC52是用静态逻辑来设计的,其工作频率可下降到0Hz,并提供两种可用软件来选择的省电方式——空闲方式(Idle Mode)和掉电方式(Power Down Mode)。在空闲方式中,CPU停止工作,而RAM、定时器/计数器、串行口和中断系统都继续工作。在掉电方式中,片内振荡器停止工作,由于时钟被“冻结”,使一切功能都暂停,只保存片内RAM中的内容,直到下一次硬件复位为止。 ATC52芯片PDIP封装引脚图如图1所示。

第 4 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA12345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7ATC52 图1 ATC52芯片PDIP封装引脚图

ATC52为适应不同的产品需求,采用PDIP、TQFP、PLCC三种封装形式,本系统采用双列直插PDIP封装形式。 3.2 DS1302简介

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加

31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)来替代。需要强调的是,DS1302需要使用32.768KHz的晶振。DS1302引脚说明如图2及表1所示。

第 5 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

DS1302引脚说明如图2所示。

U2821VCC1X1VCC257RST6SCLKI/OX23DS1302 图2 DS1302芯片引脚图 DS1302的引脚功能参照表1所示。 表1 DS1302引脚功能说明

引脚号 名称 功能 1 VCC1 备份电源输入 2 X1 32.768KHz晶振输入 3 X2 32.768KHz晶振输出 4 GND 地 5 RST 控制移位寄存器/复位 6 I/O 数据输入/输出 7 SCLK 串行时钟 8 VCC2 主电源输入 3.3 硬件电路设计

电子闹钟至少要包括秒信号发生器、时间显示电路、按键电路、供电电源、闹铃指示电路等几部分。数字时钟硬件电路框图如图3所示。

第 6 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

键盘模块 驱动 报警电路 C52 延时芯片 驱动 LED显示 电源模块 该系统使用ATC51单片机作为核心,通过读取时钟日历芯片DS1302数据,完成此电子时钟的主要功能——时钟。使用比较通用的8段共阳数码管,做6位显示,分别显示时、分、秒。

键盘是为了完成时钟/日历的校对和日历/温度的显示功能。由于此电子时钟要求具

图3 数字时钟硬件连接框图

有闹铃功能,所以设计有闹铃电路,进行声音响铃。

整个电路使用了两种电源,+5V电源将为整个电路供电。而+3V电源仅作为DS1302的备用电源。当+5V电源被切断后,DS1302启用+3V电源,可以保持DS1302继续工作。当+5V电源恢复供电,LED依旧显示当前时间,而不会因为断电使系统复位到初始化时间,避免了重新校时的麻烦。 3.4 时钟电路设计

系统时钟应用了实时时钟日历芯片DS1302。该硬件电路设计简单,抗干扰能力强。

ATC52单片机P3.6直接接DS1302的RST端,上电后,ATC52的P3.6脚自动输出高电平。P3.4作为串行时钟接口,P3.5作为时钟数据的I/O。DS1302采用双电源供电,平时由+5V电源供电,当+5V掉电之后,由图中BT1(+3V备用电池)供电。

特别需要注意X1和X2两端连接的晶振Y1,该晶振频率为32.768KHz。其连接如图4。

图4 系统时钟电路

第 7 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

3.5 复位电路

复位电路,就是利用它把电路恢复到起始状态。就像计算器的清零按钮的作用一样,以便回到原始状态,重新进行计算。和计算器清零按钮有所不同的是,复位电路启动的手段有所不同。一是在给电路通电时马上进行复位操作;二是在必要时可以由手动操作;三是根据程序或者电路运行的需要自动地进行。复位电路都是比较简单的大都是只有电阻和电容组合就可以办到了。再复杂点就有三极管等等配合程序来进行了。

为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。一般微机电路正常工作需要供电电源为5V±5%,即4.75~5.25V。由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器稳定工作时,复位信号才会撤除,微机电路开始正常工作。复位电路连线图如下图5所示:

图5 复位电路连线图

3.6 蜂鸣器电路

电压式蜂鸣器 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。

多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。

压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。

该系统采用一个普通有源蜂鸣器组成来实现闹钟、当时间到达设定值,蜂鸣器响,蜂鸣器占用了1个I/O口P3.7。

蜂鸣器连线图如下图6所示:

第 8 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

图6 蜂鸣器连线图

3.7 键盘电路

键盘的工作方式有两种,分别为矩阵式键盘和式键盘。

矩阵式键盘:当键盘的数目最多为5~16个时, 采用矩阵式键盘是最好选择。矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处。当键盘上没有键闭合时,所有的行和列线都断开,行线都呈高电平。当某一个键闭合时,该键所对应的行线和列线被短路。

式键盘:当键盘的数目最多为4个时,采用式键盘是最好选择。式键盘的实现方法是利用单片机I/O口读取口的电平高低来判断是否有键按下。

本次课设使用三个按键,故采用式键盘,四个按键S1、S2和S3分别连接至单片机上的P1.3、P1.4和P1.5口上,短按S1,调节时间;长按S1,设置闹钟时间;调节时间状态和设置闹钟时间状态按下S2,增加一个单位;在未进行选择时按下S2,打开闹钟;调节时间状态和设置闹钟时间状态按下S3,减小一个单位;在未进行选择时按下S3,关闭闹钟。

键盘连线图如下图7所示:

第 9 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

图7 键盘连线图

3.8 LED数码管显示电路

单片机中通常使用7段LED,LED是发光二极管显示器的缩写。LED显示器由于结构简单,价格便宜,体积小,亮度高,电压低,可靠性高,寿命长,响应速度快,颜色鲜艳,配置灵活,与单片机接口方便而得到广泛应用。LED显示器是由若干个发光二极管组成显示字段的显示部件,当发光二极管导通时,相应的一个点或一个笔划发光,控制不同组合的二极管导通,就能显示出各种字符。

LED七段数码显示器由8个发光二极管组成显示字符,根据内部发光二极管的连接形式不同,LED有共阴极和共阳极两种,本系统采用共阴极。

LED的结构及连接如图8所示。

图8 LED的结构及连接图

LED显示原理

当选用共阴极的LED时,所有发光二极管阴极连在一起接地,当某个发光二极管的阳极加入高电平时,对应的二极管点亮。因此要显示某字形就应使此字形的相应段的二极管点亮,实际上就是送一个用不同电平组合代表的数据字来控制LED的显示,此数据为字

第 10 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

符的段码或称为字型码。字型码与LED显示器各段的关系如表2所示。

表2 字型码与LED显示器各段的关系

D7 dp D6 g D5 f D4 e D3 d D2 c D1 b D0 a dp为小数点,字符0、1、2……F的段码如表3所示。

表3 LED数码管段码表

字符 段码(共阴) 段码(共阳) 0 1 2 3 4 5 6 7 8 9 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH COH F9H A4H B0H 99H 92H 82H F8H 80H 90H 字符 A B C D E F - . 熄灭 A 段码(共阴) 段码(共阳) 77H 7CH 39H 5EH 79H 71H 40H 80H 00H 77H 88H 83H C6H A1H 86H 8EH BFH 7FH FFH 88H

本系统采用的共阳极LED七段数码显示器如图9所示。

图9 共阳极LED七段数码显示器 4 软件设计

4.1 主程序设计

软件在现代仪器中起到了至关重要的作用,在智能仪器设计中硬件与软件是紧密结合起来的,软件的设计减少了硬件设备的使用,既降低了成本,又提高了效率,

第 11 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

传统仪器的许多硬件设备已经被软件所取代,使现代仪器更加智能化。随着微电子技术的发展,微处理器的速度越来越快,价格越来越低,已被广泛应用于仪器仪表中,使得一些实时性要求很高,原本由硬件完成的功能,可以通过软件来实现。甚至许多原来用硬件电路难以解诀或根本无法解决的问题,也可以采用软件技术很好地加以解决。数字信号处理技术的发展和高速数字信号处理器的广泛采用,极大地增强了仪器的信号处理能力。数字滤波、FFT、相关、卷积等是信号处理的常用方法,其共同特点是,算法的主要运算都是由迭代式的乘和加组成,这些运算如果在通用微机上用软件完成,运算时间较长,而数字信号处理器通过硬件完成上述乘、加运算,大大提高了仪器性能,推动了数字信号处理技术在仪器仪表领域的广泛应用。软件的设计包括程序的总体设计和对程序的模块化设计。按整体功能分为多个不同的模块,单独设计,编程,调试,然后将各个模块装配联调,组成完整的软件。在本设计中软件起着决定性的作用,下面为本次课设总设计图和各部分软件设计。

主程序图如下图10所示:

开始

初始化 读取 DS1302 中的时间送往数码管显示

键盘扫描

短按S1 长按S1

调节时间 设置闹钟 闹钟时间比较 将调节的时间写入DS1302时钟芯片 报警 返回 图10 主程序流程图

第 12 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

4.2 键盘扫描子程序

键盘的分类主要有两种:式按键结构与行列式键盘结构。

式键盘:是指各个按键相互地连接到各自的单片机的I/O口,I/O口只需要做输入口就能读到所有的按键。

式键盘可以使用上拉电阻也可以使用下拉电阻,基本原理是一样的。 这种键盘虽然有电路简单、程序容易写的优点,但是也有缺点:当按键个数较多的时候,要占用较多的I/O口资源,所以适用于按键比较少的情况。

行列式键盘:为了减少键盘占用太多的单片机I/O口资源,当按键个数较多的时候,通常都使用行列式键盘。

行列式键盘的原理就是每一行线与每一列线的交叉地方不相通,而是接上一个按键,通过按键来接通。所以利用这种结构,a个I/O口可以接a个行线,另外的b个I/O可以接b个列线,总共可以组成a×b个按键的键盘。

对行列式的键盘进行扫描的时候,要先判断整个键盘是否有按键按下,有按键按下才对哪一个按键按下进行判别扫描。对按键的识别扫描通常有两种方法:一种是比较常用的逐行(或逐列)扫描法,另一种是线反转法。

键盘扫描子程序如下图11所示:

减一 结束 图11 键盘扫描子程序流程图

Y N S2键是否按下 加一 Y N S2键是否按下 开始

第 13 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

4.3 蜂鸣器子程序

由于自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动,只需对驱动口输出驱动电平并通过三极管放大驱动电流就能使蜂鸣器发出声音,很简单,这里就不对自激蜂鸣器进行说明了。这里只对必须用1/2duty 的方波信号进行驱动的他激蜂鸣器进行说明。

单片机驱动他激蜂鸣器的方式有两种:一种是PWM 输出口直接驱动,另一种是利用I/O 定时翻转电平产生驱动波形对蜂鸣器进行驱动。

PWM 输出口直接驱动是利用PWM 输出口本身可以输出一定的方波来直接驱动蜂鸣器。在单片机的软件设置中有几个系统寄存器是用来设置PWM 口的输出的,可以设置占空比、周期等等,通过设置这些寄存器产生符合蜂鸣器要求的频率的波形之后,只要打开PWM 输出,PWM 输出口就能输出该频率的方波,这个时候利用这个波形就可以驱动蜂鸣器了。比如频率为2000Hz 的蜂鸣器的驱动,可以知道周期为500μs,这样只需要把PWM 的周期设置为500μs,占空比电平设置为250μs,就能产生一个频率为2000Hz 的方波,通过这个方波再利用三极管就可以去驱动这个蜂鸣器了。

而利用I/O 定时翻转电平来产生驱动波形的方式会比较麻烦一点,必须利用定时器来做定时,通过定时翻转电平产生符合蜂鸣器要求的频率的波形,这个波形就可以用来驱动蜂鸣器了。比如为2500Hz 的蜂鸣器的驱动,可以知道周期为400μs,这样只需要驱动蜂鸣器的I/O 口每200μs 翻转一次电平就可以产生一个频率为2500Hz,占空比为1/2duty 的方波,再通过三极管放大就可以驱动这个蜂鸣器了。

蜂鸣器子程序如下图12所示:

比较闹钟时间 开始

结束

图12 蜂鸣器子程序流程图

蜂鸣器报警

第 14 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

4.4 显示子程序

本次课设采用共阳极LED数码管动态显示。共阳极数码管的8个发光二极管的阳极(二极管正端)连接在一起。通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮。根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。

显示子程序如下图13所示:

单片机从DS1302时钟芯片读取当前时间 开始

通过LED数码管驱动芯片74HC45 LED数码管 显示时间 返回

图13 显示子程序流程图

5 调试分析

由单片机产生的信号通过LED数码管显示时间,按键按下调试时间,蜂鸣器报警。 本设计在硬件选配、软件编程方面都出现过问题。

(1)在调试过程中出现了时间不稳定的情况,通过修改程序解决了问题。 (2)LED数码管无法显示,通过更改程序更换硬件来解决。

(3)颠倒LED数码管共阴极与共阳极的段码使显示乱码,通过更改程序段码解决问题。 (4)由于按键抖动是键盘显示的不稳定因素。通过加入延时消抖程序解决了此问题。 (5)当把程序生成的.HEX文件装入到STCC52后运行时,显示模块出现数字显示错误,但是软硬件都没有错误,经检查是它们不配套,在修改扫描显示控制字而且改变硬件布线

第 15 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

顺序后方显示正常。

(6)闹钟在定时时间到的时候没有出现报警声,但是经检查软硬件均没有出现错误,而且在这里也不会出现因为软硬件不配套而出现问题,并且把扬声器去掉换成发光二极管后,二极管可以根据要求明或者灭。在经过反复的检查以及实验后才知道应该使接扬声器的接口输出交流信号才可以使扬声器正常工作,经过反复比较决定运用软件产生一个交流的信号才解决了这个问题,但是还没有解决声音小的问题。

(7)在设计的初期把主程序设计成顺序结构,但是在运行的时候没有注意到这个问题,没有按照软件说明中的顺序操作,以至于闹钟闹时出现错误,在改变按下按键的顺序后闹钟工作正常。

6 结论及进一步设想

根据实验结果,本次实验基本完成了设计要求,实现了实时时间在LED数码管上的显示,并且能够通过蜂鸣器报警。不过本次实验只是要求了在显示时间等简单功能,并未结合到实地生产生活中进行应用,所以只能作为理论上的模拟。更需要从多角度出发,可以进一步进行真正的多功能数字电子时钟的设计,让设计真正的融入到实地的生产生活中。

参考文献

[1] 刘复华.单片机及其应用系统.北京:清华大学出版社,1992 [2] 康华光.电子技术基础(数字部分).高等教育出版社,2005

[3] 李斌,董慧颖.可重组机器人研究和发展现状.沈阳工业学院学报,2000 [4] 吴国经.单片机应用技术.中国电力出版社,2004

[5] 马忠梅.单片机C语言应用程序设计. 北京航空航天大学出版社,2003 [6] 周润景.基于proteus的电路及单片机设计与仿真(第二版).北京航空航天大学

出版社 ,2009

[7] 谭浩强.C程序设计.清华大学出版社,2005

[8] 付小宁,孔英会.C51基础与应用实例.电子工业出版社,2009

[9] 丁峰,郝立果,卢胜利.单片机原理与应用技术实践.机械工业出版社.2009 [10]冯建华,赵亮.单片机应用系统设计与产品开发.人民邮电出版社.2004

第 16 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

课设体会

单片机是一门应用性很强的学科,课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程,为自己今后从事与单片机控制系统有关的工作打下了基础。虽然在做课程设计以前已经系统的把单片机课本认真的学习了一下,但是在刚开始时还是有点一头雾水,不知道该从哪里下手。令人欣慰的是经过2周的学习,虽然过程很艰辛,问了很多朋友,但是总算实现了定时闹钟的功能,所有的努力都很值得。这几周的大部分时间都在研究程序怎么处理,在这个过程中加深了我对汇编语言命令的应用,而且也更加了解到软硬件配套的重要性。以下是我本次单片机课程设计的几点心得与体会:

1. 在设计程序之前,务必要对所学单片机课程的内容有一个系统的了解,知道单片机片内片外的内容及其功能。

2. 设计程序采用什么编程语言并不是非常重要,关键要有一个清晰的思路和一个完整的软件流程图。模块化的设计思想在程序设计中的作用是十分大的,它可以为你提供一个比较清晰的思路,并且很容易找到头绪,不至于在设想一个程序时感觉到无从下手。 3. 在设计程序时,不能妄想一次就将整个程序设计好,\"反复修改,不断改进\"是程序设计的必经之路。程序刚开始编好时,一般情况下会存在很多错误,要不断地修改,不断的改进才能达到预期的目的,编写程序的时间并不是很长,主要是修改程序会花很多时间。 4. 要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便。刚开始我在编写程序时,很不习惯于写注释,感觉很麻烦,而且没用,但是在修改的过程中我就遇到了较大的麻烦,以至于不得不重新的作了注释,以增加程序的易读性,从而使修改过程变得容易一些。 总之,通过这次课程设计不仅使我巩固了本课程所学的基本知识,还使我具有了撰写设计报告的初步训练能力,我相信这些能力在我以后的工作或者是再学习中一定会起到不小的作用,看到自己几周的小成果,感觉一切的辛苦和艰难都是值得的。

第 17 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

时RP1RESPACK-8分秒C130pF1234567X119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDP1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7ATC52/51212223242526272810111213141516171234567812MHZ18XTAL23938373635343332U1234567191U2A0A1A2A3A4A5A6A7CEAB/BA74HC245B0B1B2B3B4B5B6B71817161514131211附录1 电路原理图

C230pFR19RSTK4C32910uF3031PSENALEEA10KD1LED-GREENU781VCC1X1VCC22C522pfK1K2K3短按调节时间长按设置闹钟减一加一开启闹钟关闭闹钟576X2RSTSCLKX2I/ODS1302CRYSTAL3C922pfQ1PNP

第 18 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

附录2 程序清单

#include #include

#define uchar unsigned char //宏定义 #define uint unsigned int

uchar code a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80, 0x90,0xff}; //0-9,灭,段选(共阳)

uchar hour,min,sec; //保存DS1302读出时间数据变量 (BCD码)

uchar hour1,min1,sec1; // 保存调时状态时间变量 (BCD码转换十进制后数据) uchar alarm_h, alarm_m, alarm_s; // 保存调闹钟时间变量

uchar hour1_sw, hour1_gw, min1_sw, min1_gw, sec1_sw, sec1_gw; //调时状态 // 显示数据变量 uchar t; //定时器1中断函数计算器 (闪烁用) uchar k; //按键次数计数变量 (调时状态判断计数器) uchar RAM_alarm; //闹钟状态记忆变量

sbit d1=P2^6 ; //时与分之间的两只发光管 sbit d2=P2^7; //分与秒之间的两只发光管 sbit shi_sw=P2^5; //数码管位码控制脚 sbit shi_gw=P2^4; sbit fen_sw=P2^3; sbit fen_gw=P2^2; sbit miao_sw=P2^1; sbit miao_gw=P2^0;

sbit sck=P3^4; //DS1302 SCK控制脚 sbit io=P3^5; //DS1302 IO控制脚

sbit rst=P3^6; //DS1302 RST控制脚 sbit k1=P3^1; //按键1 (调时功能键,短按调时,长按调闹钟) sbit k2=P3^2; //按键2 (调时加1键;闹钟开启键) sbit k3=P3^3; //按键3 (调时减1键;闹钟关闭键) sbit speak=P3^7; sbit ACC7=ACC^7; sbit alarm_d=P1^0;

bit s=1;//调时闪烁标志位

bit xs; //正常显示/调时显示标志

bit alarm=0;//闹钟标志位(0为关闹钟,1为开闹钟)

bit alarm_on; //闹钟响玲状态标志位(1为响的状态,0为不响状态)

/* 延时函数 (X代表毫秒)*/ void delay(uchar x) {

第 19 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

uint i,z;

for(i=x;i>0;i--) for(z=100;z>0;z--); }

/* 延时函数 (y代表微秒)*/ void delayus(uchar y) {

uint i;

for(i=y;y>0;y--); }

/*显示函数*/ void display() {

if(xs==0) //xs为0显示DS1302读出时间 {

P0=a[hour/16]; shi_sw=0; delay(2); shi_sw=1;

P0=a[hour%16]; shi_gw=0; delay(2); shi_gw=1;

P0=a[min/16]; fen_sw=0; delay(2); fen_sw=1;

P0=a[min%16]; fen_gw=0; delay(2); fen_gw=1;

P0=a[sec/16]; miao_sw=0; delay(2); miao_sw=1; P0=a[sec%16]; miao_gw=0; delay(2); miao_gw=1; } else //xs=1显示调时状态的时间 {

P0=a[hour1_sw];

第 20 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

shi_sw=0; delay(2); shi_sw=1;

P0=a[hour1_gw]; shi_gw=0; delay(2); shi_gw=1;

P0=a[min1_sw]; fen_sw=0; delay(2); fen_sw=1;

P0=a[min1_gw]; fen_gw=0; delay(2); fen_gw=1;

P0=a[sec1_sw]; miao_sw=0; delay(2); miao_sw=1;

P0=a[sec1_gw]; miao_gw=0; delay(2); miao_gw=1; } }

/* 延时函数 (y代表约13毫秒)*/ void kdelay(uchar y) {

uchar i;

for(i=y;i>0;i--) display(); }

void dat_to(void) {

hour1_sw=hour1/10; hour1_gw=hour1%10; min1_sw=min1/10; min1_gw=min1%10; sec1_sw=sec1/10; sec1_gw=sec1%10;

第 21 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

}

/* void write_dat(void) {

new_hour=(hour1/10<<4)|(hour1%10); new_min=(min1/10<<4)|(min1%10); new_sec=(sec1/10<<4)|(sec1%10); } */

/*DS1302单字节写入*/

void write_ds1302_byte(uchar dat) {

uchar i; sck=0;

delayus(2);

for(i=0;i<8;i++) {

io=dat&0x01; delayus(1); sck=1;

delayus(1); dat=dat>>1; sck=0; } }

/*DS1302多字节[写入*/

void write_ds1302(uchar add,uchar dat) {

rst=0;

delayus(1); sck=0;

delayus(1); rst=1;

delayus(1);

write_ds1302_byte(add); write_ds1302_byte(dat); rst=0;

delayus(1);

第 22 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

io=1; sck=1; //rst=0; }

/*DS1302读取*/

uchar read_ds1302(uchar add) {

uchar i;uchar value; rst=0;

delayus(1); sck=0; delayus(1); rst=1; delayus(1);

write_ds1302_byte(add); for(i=0;i<8;i++) {

value=value>>1; sck=0;

if(io)value=value|0x80; sck=1;

delayus(1); sck=0;

delayus(1); }

rst=0;

delayus(1); sck=0;

delayus(1); sck=1; io=1;

return value; }

/*读取时间*/

void read_rtc() {

hour=read_ds1302(0x85); min=read_ds1302(0x83); sec=read_ds1302(0x81); }

第 23 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

/*写入闹钟时间*/

void write_alarm() {

write_ds1302(0x8E,0x00); //写保护寄存器允许写 write_ds1302(0xC0,alarm_h); //写入各个闹钟时间 write_ds1302(0xC2,alarm_m); write_ds1302(0xC4,alarm_s);

write_ds1302(0x8E,0x80); //写保护寄存器不允许写入 }

/*读闹钟时间*/

void read_alarm() {

hour1=read_ds1302(0xC1); min1=read_ds1302(0xC3); sec1=read_ds1302(0xC5); }

/*定时器0中断程序(闹钟)*/ void timet0(void) interrupt 1 {

TH0=0X15; //重置时间(60MS) TL0=0XA0;

speak=!speak; //蜂鸣器响 }

/*定时器1中断程序(闪烁用)*/ void timet1(void) interrupt 3 {

TH1=0x3C;

TL1=0xB0; //重置计数初值50mS t++;

if(t==10) //中断10次为500ms {

s=!s; //闪烁标志取反(0为熄灭,1为亮) t=0; //变量归0 if(s==0) //s标志为0将熄灭数据送显示 {

if(k==0) // 计数器=0小时位熄灭 {

hour1_sw=10; hour1_gw=10;

第 24 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

}

if(k==1)// 计数器=1分钟时位熄灭 {

min1_sw=10; min1_gw=10; }

if(k==2) // 计数器=2秒位熄灭 {

sec1_sw=10; sec1_gw=10; } }

else //s标志位为1送正常显示数据 { dat_to(); } } }

/*时钟调时程序*/ void clock_key(void) {

ET1=1; //打开定时器1(闪烁) TR1=1;

xs=1; //xs标志位置1

hour1=(hour>>4)*10+(hour&0x0f);//将读出时间转换成十进制数保存 min1=(min>>4)*10+(min&0x0f); sec1=(sec>>4)*10+(sec&0x0f); dat_to(); //把保存数据拆分显示 while(!k1)display();; //等待键放去

while(1) //死循环扫描K1,K2,K3 {

display(); //保持显示 /*扫描K1*/

if(k1==0)kdelay(2); //k1按下去抖动 if(k1==0)k++; //确认按下计数器加1 if(k>=3) //计数器=3 {

k=0; //计数器复位 ET1=0; //定时器1停止 TR1=0;

xs=0; //XS复位

write_ds1302(0x8E,0x00);//允许写入

write_ds1302(0x84,hour); //写入调时状态小时的时间到DS1302

第 25 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

write_ds1302(0x82,min); //写入调时状态分钟的时间到DS1302 write_ds1302(0x80,sec);//写入调时状态秒的时间(因秒不停走动) write_ds1302(0x8E,0x80); //禁止写入 while(!k1)display(); //等待按键放去 break; //退出 }

else //计数器少于3 {

while(!k1)display(); //等待按键放去 }

/*扫描K2*/

if(k2==0)kdelay(2); //k2按下去抖动 if(k2==0) //确认按下 {

write_ds1302(0x8E,0x00); //允许写入 switch(k) {

case 0: hour1++; //计数器为0小时加1 if(hour1>=24)hour1=0;

hour=(hour1/10<<4)|(hour1%10);//十进制数转换成BCD码 //write_ds1302(0x84,hour); //写入DS1302 break; //退出 case 1: min1++;

if(min1>=60)min1=0; //计数器为1分钟加1

min=(min1/10<<4)|(min1%10); //十进制数转换成BCD码 //write_ds1302(0x82,min); //写入DS1302 break; //退出 case 2: sec1++;

if(sec1>=60)sec1=0; //计数器为2秒加1

sec=(sec1/10<<4)|(sec1%10); //十进制数转换成BCD码 write_ds1302(0x80,sec); //写入DS1302 break; //退出 default: break; //退出 }

dat_to(); //拆分调时数据显示 write_ds1302(0x8E,0x80); //禁止写入

kdelay(15); //延时(长按可以连续调时) }

/*扫描K3*/

if(k3==0)kdelay(2); //k3按下去抖动

第 26 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

if(k3==0) //确认按下 {

write_ds1302(0x8E,0x00); //允许写入 switch(k) {

case 0: if(hour==0)hour1=24; //计数器为0小时减1 hour1--;

hour=(hour1/10<<4)|(hour1%10); //十进制数转换成BCD码

//write_ds1302(0x84,hour); //写入DS1302 break; //退出

case 1: if(min1==0)min1=60; //计数器为分钟减1 min1--;

min=(min1/10<<4)|(min1%10);//十进制数转换成BCD码 // write_ds1302(0x82,min); //写入DS1302 break; //退出

case 2:if(sec1==0)sec1=60; //计数器为2秒减1 sec1--;

sec=(sec1/10<<4)|(sec1%10); //十进制数转换成BCD码 //write_ds1302(0x80,sec); //写入DS1302 break; //退出 default: break; //退出 }

dat_to(); //拆分调时数据显示 write_ds1302(0x8E,0x80); //禁止写入

kdelay(15); //延时(长按可以连续调时) } } }

/*闹钟调时程序*/ alarm_key(void) {

ET1=1; //打开定时器1(闪烁) TR1=1;

xs=1; //xs标志位置1

d1=1; //关闭发光管(调时状态发光管不亮) d2=1;

read_alarm(); //读出DS1302中保存的闹钟数据到显示变量中 dat_to(); //拆分数据显示

while(!k1)display(); //等待按键放去 while(1) //死循环 {

display(); //保持显示

第 27 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

/*扫描K1*/

if(k1==0)kdelay(2); //k1按下去抖动 if(k1==0)k++; //确认按下计数器加1 if(k>=3) //计数器等于3 {

k=0; //计数器复位 ET1=0; //关定时器1 TR1=0;

xs=0; //标志位复位 d1=0; //亮发光管 d2=0;

while(!k1)display(); //等待按键放去 break; //退出 }

else //计数器少于3 {

while(!k1)display(); //等待按键放去 } /*扫描K2*/

if(k2==0)kdelay(2); //k2按下去抖动 if(k2==0) //确认按下 {

write_ds1302(0x8E,0x00); //允许写入 switch(k) {

case 0: alarm_h++; //计数器为0小时加1 if(alarm_h>=24)alarm_h=0;

hour1=alarm_h; //闹钟时间送显示变量 break; //退出

case 1: alarm_m++; //计数器为1分钟加1 if(alarm_m>=60)alarm_m=0;

min1=alarm_m; //闹钟时间送显示变量 break; //退出

case 2: alarm_s++; //计数器为2秒加1 if(alarm_s>=60)alarm_s=0;

sec1=alarm_s; //闹钟时间送显示变量 break; //退出 default: break; //退出 }

write_alarm(); //修改后闹钟时间写入到DS1302 RAM 中保存 dat_to();

write_ds1302(0x8E,0x80); //禁止写入

第 28 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

kdelay(15); //延时(长按可以连续调时) }

/*扫描K3*/

if(k3==0)kdelay(2); //k3按下去抖动 if(k3==0) //确认按下 {

write_ds1302(0x8E,0x00); //允许写入 switch(k) {

case 0: if(alarm_h==0)alarm_h=24; //计数器为0小时减1 alarm_h--;

hour1=alarm_h; //闹钟时间送显示变量 break;

case 1: if(alarm_m==0)alarm_m=60; //计数器为1分钟减1 alarm_m--;

min1=alarm_m; //闹钟时间送显示变量 break;

case 2: if(alarm_s==0)alarm_s=60; //计数器为2秒减1 alarm_s--;

sec1=alarm_s; //闹钟时间送显示变量 break; default: break; }

write_alarm(); //修改后闹钟时间写入到DS1302 RAM 中保存 dat_to(); //拆分显示数据进行显示 write_ds1302(0x8E,0x80); //禁入写入

kdelay(15); //延时(长按可以连续调时) } } }

/*按键设置函数*/ void key(void) {

/*扫描K1(走时及闹钟时间调整)*/ if(k1==0)kdelay(2); //k1按下去抖动 if(k1==0) //确认K1按下 {

kdelay(70); //延时约1秒(目的判断K1是长按还是短按) if(k1==0) //长按 {

alarm_key(); //调闹钟调时程序 }

else //短按

第 29 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

{

clock_key(); //调时钟调时程序 } }

/*扫描K2,K3(打开及关闭闹钟)*/

if(alarm_on==0) //闹钟不响状态时才能打开或关闭闹钟 {

if(k2==0)kdelay(2); //K2按下去抖动 if(k2==0) //确认按下则开闹钟 {

alarm=1; //开闹钟

write_ds1302(0x8E,0x00); //允许写入DS1302 write_ds1302(0xC6,0xaa); //与入0xaa

write_ds1302(0x8E,0x80); //禁止写入DS1302 while(!k2)display(); //等待键放去 }

if(k3==0)kdelay(2);// K3按下去抖动 if(k3==0) // 确认按下则关闹钟 {

alarm=0; // 关闹钟

write_ds1302(0x8E,0x00); //允许写入DS1302 write_ds1302(0xC6,0x00); //写入0x00

write_ds1302(0x8E,0x80); //禁止写入DS1302 while(!k3)display(); //等待键放去 } } }

void cch(void) //定时器初始化函数 {

TMOD=0x11; //定时器工作方式(定时器0,1工作在定时器工作方式) TH0=0x3C; //定义计数初值50ms (定时器0用于产生闹钟信号) TL0=0xB0;

TH1=0x3C; //定时器1用于调时闪烁用 TL1=0xB0;

EA=1; //CPU开中断 d1=0; //亮发光管 d2=0;

// ET0=1; //开定时中断 // TR0=1;

第 30 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

// ET0=1; //开定时器0 }

void buz(void) //闹钟函数 {

uchar h,m,s; //定义三个变量 uchar s1; //定义另一个变量

alarm_d=!alarm; //闹钟指示灯(亮灯闹钟开,闹钟关灯不亮) if(alarm) //开闹钟则比较时间 {

h=(hour>>4)*10+(hour&0x0f);//读出时间数据转换成十进制数保存在三个变量中

m=(min>>4)*10+(min&0x0f); s=(sec>>4)*10+(sec&0x0f);

if((alarm_h==h)&&(alarm_m==m)&&(alarm_s==s)) //比较实际时间和闹钟时间 { //时间相同则开中断0蜂鸣器响 ET0=1; //

TR0=1; //开定时器 alarm_on=1; //响玲状态标志置1 speak=0; } s1= alarm_s+10; //另一个变量保存响玲时间(即响多长时间停止+几就响几分钟) if((alarm_h==h)&&(alarm_m==m)&&(s1==s)) //时间到则关中断0,关闭蜂鸣器 {

ET0=0;

TR0=0; //关定时器 speak=1; }

if((alarm_h==h)&&(alarm_m==m)&&(alarm_s+15==s)) //比较实际时间和闹钟时间

{ //时间相同则开中断0蜂鸣器响 ET0=1; //

TR0=1; //开定时器 alarm_on=1; //响玲状态标志置1 speak=0; }

s1= alarm_s+25; //另一个变量保存响玲时间(即响多长时间停止+几就响几分钟)

if((alarm_h==h)&&(alarm_m==m)&&(s1==s)) //时间到则关中断0,关闭蜂鸣器 {

ET0=0;

TR0=0; //关定时器 speak=1; }

第 31 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

if((alarm_h==h)&&(alarm_m==m)&&(alarm_s+30==s)) //比较实际时间和闹钟时间

{ //时间相同则开中断0蜂鸣器响 ET0=1; //

TR0=1; //开定时器 alarm_on=1; //响玲状态标志置1 speak=0; }

s1= alarm_s+40; //另一个变量保存响玲时间(即响多长时间停止+几就响几分钟)

if((alarm_h==h)&&(alarm_m==m)&&(s1==s)) //时间到则关中断0,关闭蜂鸣器 {

ET0=0;

TR0=0; //关定时器 speak=1; }

if((alarm_h==h)&&(alarm_m==m)&&(alarm_s+45==s)) //比较实际时间和闹钟时间

{ //时间相同则开中断0蜂鸣器响 ET0=1; //

TR0=1; //开定时器 alarm_on=1; //响玲状态标志置1 speak=0; }

}

if(alarm_on) {

if(k3==0)kdelay(2);// K3按下去抖动 if(k3==0) // 确认按下则关闹钟 {

ET0=0; TR0=0; speak=1;

alarm_on=0; //响玲状态标志置1 while(!k3)display(); //等待键放去 } } }

/*主函数*/

void main(void) {

第 32 页

沈阳航空航天大学课程设计论文 基于单片机的数字电子时钟设计(LED显示)

cch(); //定时器初始化 /*判断DS1302时间数据存在与否*/

ACC=read_ds1302(0x81); //读出秒的数据到ACC

if(ACC7==0) // 判断秒寄存器BIT 7位(第一次上电该位为1) {

write_ds1302(0x8E,0x00); //写入初始数据(先允许写入)

alarm_h=read_ds1302(0xC1); //读出闹钟小时时间保存 (RAM地址0x00) alarm_m=read_ds1302(0xC3); //读出闹钟分钟时间保存 (RAM地址0x01) alarm_s=read_ds1302(0xC5); //读出闹钟秒时间保存 (RAM地址0x02) RAM_alarm=read_ds1302(0xC7); //读出闹钟状态保存 (RAM地址0x03) if(RAM_alarm==0xaa)alarm=1; //为0xaa是开闹钟状态,将标志置1开闹钟 write_ds1302(0x8E,0x80); //为0即数据存在,允许写入寄存器禁止写入 }

else //否则为1(即数据无保存) {

write_ds1302(0x8E,0x00); //写入初始数据(先允许写入) write_ds1302(0x84,0x12); //12时(时间初始数据) write_ds1302(0x82,0x12); //12分

write_ds1302(0x80,0x00); //00(时间初始数据)秒 write_alarm(); // (闹钟初始数据) write_ds1302(0x8E,0x80); //禁止写入 }

while(1) //死循环执行以下程序 {

read_rtc(); //读出DS1302时钟数据 display(); //显示 key(); //按键扫描 buz(); //闹钟 } }

第 33 页

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务