APP下载

多功能时钟的研制

2016-11-17沈阳市第二十中学鲍春光

电子世界 2016年20期
关键词:数码管子程序时钟

沈阳市第二十中学 鲍春光

东北大学信息科学与工程学院 许 楠

多功能时钟的研制

沈阳市第二十中学 鲍春光

东北大学信息科学与工程学院 许 楠

设计了一个基于单片机80C51的电子时钟。时钟系统通过搭建硬件平台实现模块化软件编程,完成了中断模块、显示模块、闹钟模块、时间调整等模块的设计,具有显时、调时、三组定时以及整点报时功能,同时电子钟还设计了掉电保护电路,当电源断电时能保存时钟当前定时设计的全部数据。本系统通过实际运行与测试,达到设计要求。

多功能时钟;80C51;时钟控制;中断程序;数码管

单片机[1]诞生于20世纪70年代末,经历了SCM、MCU、SOC[2]三大阶段。随着微电子技术、IC设计、EDA工具的发展,单片机已渗透到我们生活的各个领域。

单片机中最常见的是数字钟[3],数字钟是一种采用数字电路技术,通过显示模块,来显示年、月、日、时、分、秒的计时装置[4],是人们日常生活中不可少的必需品,广泛应用于各种场合。现如今,数字时钟已经飞速发展,已不单单只满足于简单显示时间,而是在数字钟的基础上,增加各种传感器,实现定时自动报警[5]、整点报时、学校里的自动打铃或定时自动响音乐等。所有这些,都是以钟表数字化为基础的。基于以上的研究基础,设计了一种显时、调时、定时以及具有整点报时功能的电子钟。本文将从硬件设计、软件设计和系统调试等方面详细论述。

1 电子时钟功能要求及实现方案

1.1功能要求

硬件功能设计:时钟系统采用单片机80C51芯片[6]为主CPU,搭配时钟日历芯片DS1302及晶振电路等构成最小系统。系统由单片机80C51、晶振电路、按键电路、时钟芯片DS1302电路、复位电路、数码管显示及驱动电路和报时电路等模块组成。利用单片机内部的定时器/计数器编程定时方法,能够完成的功能包括:时间实时显示、时分秒的调整、任意时段闹钟定时和整点报时等。而且在硬件电路设置四个按键,在软件功能上分别定义四个按键为SET、ALM、UP和DOWN,利用按键可以很方便的对时钟和闹钟进行调整。

在使用调时功能时,主要利用SET 键、UP 键和DOWN 键进行操作。具体操作方法如下:

(1)按SET键一下,可以调整“时”的单元,“时”单元区域闪烁,按UP 键或DOWN 键,调整当前时间;

(2)按SET键两下,调整显示“分”的单元;按SET 键三下,调整显示“秒”的单元;按SET键四下,调整时间结束,“时、分、秒”区域都没有闪烁,时钟系统进入正常走时程序。

利用ALM键、UP 键和DOWN 键来调整闹钟单元。调整方法与调时功能基本一致。其中ALM键相当于时钟设置里的SET键功能。另外两个按键UP 键和DOWN 键分别为加1 键和减1功能键,其中利用加1功能时,“时”单元以24 为限,“分”、“秒”单元以60 为限,调整时间时超出限值则返回数值0,从限值开始重新算起。当使用DOWN 键来实现减 1 功能时,“时”、“分”、“秒”三个单元都是以0为限,超出限值时,由于“时”单元以24小时制计数,因此减1操作低于0时返回数字23,“分”、“秒”单元则返回数字59,从限值开始重新算起。 当时间到达设置的闹钟时间时,蜂鸣器启动,响声4秒(或响起一段音乐),以起到提示作用。整点报时功能的设置是当时钟走到整点时,蜂鸣器响2秒,以提示当前时间为整点。

1.2电子时钟系统设计方案

采用基于单片机的数字时钟设计通常有三种方法:

(1)硬件电路方式设计时钟。

(2)采用软件编程实现时钟功能。

(3)通过单片机内部的定时器/计数器实现时钟功能。三种方案详细优缺点对比如下表:

方 案 特 点硬件电路即采用主CPU和时钟芯片,利用主芯片外围的晶振电路,给时钟系统提供很高精度的时基信号。可以到达精确计时,编程简单,使用非常方便。但是硬件成本相对较高且调试参数不方便。软件编程这种实现方法依靠基本的编程语言实现时钟功能,硬件电路要求简单,但仅依靠软件编程很难控制时间精度。缺点是通过软件延时程序实现秒的加1功能,占用过多的CPU 的时间。单片机定时器/计数器功能硬件电路采用普通单片机最小系统,利用单片机内部定时器功能,编写中断函数实现时钟计数。特点是硬件电路比较常见,定时器函数定时精准。

综合比较上述三种方案,本文采用第三种,即利用单片机80C51内部的定时器/计数器功能实现计时。不仅设置参数简单,方案容易实现,而且不占用CPU 工作时间。其中定时器概念:是对单片机内部的标准时钟脉冲进行计数。单片机定时器实现原理如下:单片机内部的16位定时器由高8位和低8位两个寄存器组成,分别是T0和T1。定时器溢出后标志位TF0(或TF1)由0变1,由此引发定时器中断。本文电路设计采用12MHz晶振,对应的脉冲周期是1微秒,计满65536个脉冲所对应的时间就是65.536ms,因此要根据设定的时间长短,来设置相应的定时器初值。定时器的工作方式也有四种,当定时器T0(或T1)启动后,按设定的工作方式独立进行计数,不再占用CPU时间。当定时器计满溢出时,TF0(或TF1)置1,向CPU发出中断请求信号。

在具体进行程序设计时,主程序中只需对定时器/计数器初始化,时钟的形成就在中断服务程序中实现,并调用显示子程序和控制子程序。其中显示模块是采用数码管动态显示的方法,利用三极管作为驱动电路,软件控制段选位选信号。控制模块包括对按键和蜂鸣器的编程控制,使对时钟的使用更加便捷。

2 系统硬件功能电路设计

多功能时钟系统硬件电路设计包括:主芯片模块,数码显示模块、按键控制电路、时钟电源模块、蜂鸣器控制模块等几部分。硬件电路设计框图如图1所示。

图1 硬件系统功能框图

本文时钟系统以单片机80C51为核心,结合时钟日历芯片DS1302[7],来完成电子时钟的主要功能。显示模块使用通用的8段共阴极数码管。P0口输出段数码数据P2.0~P2.5口作列扫描输出,P1.0,P1.1和P1.2口接三个按钮开关以实现调时、调分功能。下面详细介绍时钟电路设计。

图2 时钟系统电路图

时钟基准电路设计:单片机工作的时间基准是由时钟电路来完成的,本文设计的时基电路基本组成是在主芯片的XTAL1和XTAL2引脚间接一只12M晶振及两只30pF电容,为电路提供时钟频率。时钟以单位秒计时,本文程序设计时,1秒定时的实现方法为,首先把定时器的定时时间定为50ms,注意初始值的设置,然后采用中断方式进行次数累计,程序循环运行20次,最后得到1秒的准确计时。

数码显示电路设计:数码显示模块采用4位共阳极LED数码管显示器,与单片机P0端口相连接,即数码管的各引脚依次连接到单片机的P0.1、P0.2、P0.3、P0.4、P0.5、P0.6、P0.7,R是限流电阻。其中数码管的驱动电路由V1~V4三极管组成,四个三极管的集电极分别与4位LED数码管的共阳极引脚相连接,而三极管的基极通过限流电阻分别接在单片机P2端口的P2.0~P2.3引脚上。其驱动电路工作过程如下:P2.0输出为低电平时,V4三极管导通,与其相连的共阳极数码管显示器开始工作;P2.0输出为高电平时,V4三极管截止,与其相连的数码管显示器停止工作。时钟系统电路如图2所示。

3 时钟系统软件设计

本文时钟系统的软件设计主要包括:

(1)主程序设计;

(2)显示程序设计,其中又由显示主函数、LED显示子程序、定时器中断函数、键盘扫描程序和其他功能函数组成;

(3)系统子程序设计,包括:闹钟功能子程序设计和其他指示标志的程序设计等。

在整个软件设计流程中,各功能模块都采用子程序设计方法,也是为了后期软件系统维护方便,增加了程序的通用性。在主函数中,先对单片机内部的各寄存器等进行初始化设置,然后根据需求循环调用各子函数。在子函数的设计中,分别编写了按键处理子函数、数码显示子函数和定时器中断服务子函数等。这里需要重点说明的是,在硬件电路设计时,使用按键操作进行时钟和闹钟的调整。在编写按键处理子函数时,程序通过判断键盘的输入情况调用不同的子程序功能函数,达到友好的人机交互功能。

3.1系统主程序设计

软件主程序的设计流程如下:

(1)定义头文件、主函数的相关变量和常量;

(2)初始化单片机内部的各种寄存器和定时器参数;

(3)循环程序的编写,这里根据需要调用不同的子程序函数,如有按键按下或者到达整点时间时,程序就转入相应的处理函数,实现相应功能。

主程序通过调用子程序,将各部分功能有机地组合到一起,并不断循环扫描K1~K4功能键。在此主程序里只有K1键赋予了设置目前时间的功能,而其他K2~K4键为空键,预留以后使用。如果按下K1键,则执行相应按键控制程序,按键控制程序执行完毕后,仍然回到主程序循环扫描。

3.2系统显示程序设计

本设计中计时采用定时器T0中断完成,其余状态循环调用显示子程序函数及键盘扫描子函数,当端口开关按下时,转入相应调时功能。

LED显示子程序:利用DS1302芯片提供时间数据,通过单片机的指令调用,将时间数据送到数码管模块显示,其程序实现流程图如图3所示。

图3 显示子程序流程图

其中工作指示闪烁子程序如下:

1. LED_BL:

2. MOV R4,#6;闪烁次数

3. LE1: CPL WLED;位反向输出

4. MOV R5,#25

5. ACALL DELAY;延时50ms

6. DJNZ R4,LE1

7. RET ;子程序返回

第2行语句是赋予闪烁次数,即每调用一次该子程序,工作指示灯闪烁6次,第3行语句位反向输出,即原来截止,现在导通;原来导通,现在截止。第4行语句通过对R5赋值来调节DELAY的延时时间,其延时时间为50ms。第5行语句调用DELAY延时子程序使工作灯亮(或灭)后停一段时间。

定时器[8]中断函数:本文定时器函数的设计,采用定时器/计数器T0,工作方式1,定时时间设为50ms,这里要注意初值的设定,然后程序循环在不停的对数码管动态扫描,同时等待中断的发生。在中断服务程序设计中,分别对秒、分、时单元进行控制,设置初值使计数器对50ms计数,循环20次则到整秒,对秒单元加1;当秒单元累计循环60次后则对分单元加1,同时秒单元清0;分单元方法同秒单元;当时单元加到24时则对时单元清0,即为一整天计数周期。

定时器子程序由INIT_TIMER函数实现,它可以实现每隔5ms产生一次中断信号,它是时钟标准时间的来源和保证。下面是定时器子程序INIT_TIMER:

INIT_TIMER;定时器T0初始化

MOV TMOD,#00000000B;设置定时器T0工作模式0

MOV TLO,#(8192-5000)MOD 32;加载低字节计数初值

MOV TH0,#(8192-5000)/32;加载高字节计数初值

MOV IE, #10000010B;启用定时器T0中断

SETB TRO ;启用定时器T0中断计时

RET ;子程序返回

定时器T0设置为工作模式0状态,定时器每隔5ms中断一次,在晶振频率为12MHz时,此5ms的初值为5000,但实际上程序还要作其他运算,使得时间偏长,因此此值需经实验做些调整。

4 时钟系统调试

系统调试主要分为硬件电路检测和软件程序调试两部分。硬件电路检测时,先从外观查看电路板的连线是否正确,各使能端的接线是否牢固,再用万用表测试电路板是否有短接现象、电源部分是否都连接正常,这些部分都检查无误后方可接通电源,接通电源后,如果发现有芯片烧毁或冒烟等现象要立即切断电源进行处理,然后重新检查硬件电路。硬件电路检查无误后,仍然没有指示灯亮或者显示时钟不正常,再检查软件编程问题,多次修改后,直至时钟电路正常工作。

在系统调试过程中主要遇到几个关键性问题。例如检测部分信号不稳定,经检查该问题与周围的干扰有密切关系,将检测部分的外围电路进行了整理,使检测信号很准确的检测到。还有闹铃模块的方案起初采用了三极管进行控制,但是这样设计影响了控制的精度,因此改为采用单片机I/O口直接控制指示灯及开关。不仅节省了硬件资源,还提高了系统的稳定性。

经过系统硬件模块的改进和软件的优化后,再将程序下载到硬件电路,设置初始时间为14:28。上电后LED数码管显示“14:28”,之后开始走时。观察32分钟之后,数码管显示“15:00”,证明电子钟电路系统正常运行。实际实物电路如图4所示。

5 结束语

本文设计的时钟系统,经过查阅大量的资料和反复的调试,到达了日常使用的标准,经过长时间的系统测试,数字时钟系统走时准确,并且硬件成本较小,充分发挥了软件编程的优点。在本次设计中,也学到很多电子产品开发的基本知识和技能,提高了动手能力,也有兴趣可以进一步实现更多功能,;例如下一步要实现遥控调时、校时和显示农历日期、节气等功能。但局限于本人的水平,本系统还有需要改进和提高的地方,例如选用更高级的主芯片系统,增加更多的传感器类型,而且在软件算法上还需要做进一步的优化与改进等。

[1]王守中,聂元铭.51单片机开发入门与典型实例[M].北京:人民邮电出版社,2009.

[2]Baekseok Ko; Joowon Kim.Simplified Chip Power Modeling Methodology Without Netlist Information in Early Stage of SoC Design Process[J].Published in: IEEE Transactions on Components, Packaging and Manufacturing Technology,2016,99:1-9.

[3]马庆勇,吴中明.基于单片机的多功能时钟控制电路[J].电子科技,2009,22(3):56-59.

[4]鲁广英.基于单片机电子万年历的设计与实现[J]. 硅谷,2010(12):57-57.

[5]李昊然,陈晓钰,刘玉玲,王晓萍.基于80C51 的智能报警系统设计[J].计算机技术与发展,2012,22(5):226-228.

[6]杨金岩等.8051单片机数据传输接口扩展技术与应用实例[M].人民邮电出版社,2005,(7)143-147.

[7]李伟跃.基于时钟芯片DS1302 的万年历的设计[J].科技创新导报,2012,9:20-21.

[8]冉秦翠,蒲利春,彭厚德,汪海军.多功能电子时钟[J].物理实验,2014,34(4):36-40.

鲍春光(1999—),男,山东乳山人,研究方向:电子技术等。

国家自然科学基金资助项目(11273001)。

猜你喜欢

数码管子程序时钟
别样的“时钟”
微课教学设计之“数码管动态显示”
古代的时钟
Arduino编程
MC9S08FL16单片机数码管静态显示分析
单片机控制的四位数码管动态显示编程
有趣的时钟
时钟会开“花”
浅谈子程序在数控车编程中的应用
子程序在数控车加工槽中的应用探索