基于单片机的电子时钟设计与制作

2022-01-28 06:34安会蒲禹辰李纪榕马红静李莉张静
电子制作 2022年1期
关键词:数码管延时时钟

安会,蒲禹辰,李纪榕,马红静,李莉,张静

(石家庄邮电职业技术学院,河北石家庄,050020)

0 引言

近年来,电子技术高速发展,由于单片机体积小价格低的特点,被广泛的应用在家电、仪器仪表、玩具等产品中,成为现代智能化的工具,故基于单片机的多功能电子时钟应运而生。电子钟以精度高、运行可靠等特点,被应用在社会各个领域,如商超、家庭、车站、银行、写字楼等。与此同时,其特有的扩展性,使得它可以根据需求来集成、整合其他功能,比如定时、光照度显示、温度显示等。本文设计的电子时钟采用IAR15W413AS 单片机作为控制器,采用数码管作为显示器,运用独立按键进行时间调整和闹钟设定。相比传统的电子时钟,它的功能更加强大,并且具有体积小、携带方便、稳定性高等优势。

1 硬件设计

本文设计的电子时钟,硬件电路由单片机、时钟、热敏电阻测温电路、光敏电阻测温电路、数码显示电路、闹钟电路、键盘输入、电源等部分组成。硬件原理图如图1 所示。时钟芯片采用DS1302,具体硬件设计如下。

图1

■1.1 单片机

IAR15W413AS 的内部集成了高精度的RC 振荡电路和高可靠的复位电路,可以省略外部晶振和复位电路,芯片接通电源后就可以直接工作;单片机自带ADC 转换,可用来测温和测量光照度;显示部分就用简单的共阳数码管驱动;要实现调整时间,所以还需要按键;要有闹钟就还需要有发声元件,这里我们用简单的蜂鸣器;时钟的来源我们用DS1302 时钟芯片产生,测温用的是热敏电阻,最后还需要一个光敏电阻来采集光照度数据。

■1.2 PCB 板

在完成原理图后,开始设计PCB 板。首先要选择元件封装,LED 用3mm 的直插式封装,单片机用 DIP28 封装,DS1302 用DIP8 封装。其他的如数码管选的是0.56 寸的,电阻使用的是1/6W 的小尺寸电阻。选好封装后开始绘制PCB,最终的电路板如图2 所示。

图2

2 软件设计

■2.1 显示程序

为了在编程调试的时候,清楚地了解到程序的各个参数是否正确,我们先编写显示驱动,这样可以最直观的把想要知道的参数显示出来。电路整个显示部分可以看作是一个12×8 的点阵(LED 是8×8,数码管是4×8)。那么显示就只能是动态扫描的方式来显示。即一个时间只能显示8个灯,或者数码管只能显示一个位。动态扫描的重点是每组灯亮的时间必须是一样的,否则每组灯的亮度会不同。为了让每组灯亮的时间一样,通常的做法是把切换显示的程序放在定时中断里。

程序的第一步是包含单片机的头文件,头文件里定义了单片机里的各种硬件资源。在写程序前要先将IAR15 W413AS.h 添加到工程所在的目录里。我们将主程序的文件名命名为main.c,在程序的第一行写上#include“IAR15W413AS.h”虽然我们现在只是写一个显示程序,但以后我们要在这个程序的基础上加上其他功能,为了方便以后的程序,我们要定义一个12 个字节的数组作为显存(因为电路图是12×8 点阵),显示程序只需要显示数组里面的数据就可以了。然后又因为有一个四位数码管,还要再加一个数码管显示数组。以上定义的代码如下:

先初始化IO 口,因为这是共阳电路,所以点阵的公共端的IO 口要设为推挽输出,在这个模式下IO 口输出的最大电流有20MA,足够点亮8 个LED。STC 的单片机IO 口还有准双向口模式,开漏输出和高阻输出模式,可以满足各种应用需求。

■2.2 主程序设计

主函数就是单片机上电后开始工作的地方。考虑到刚上电时电源波动比较大,所以还要再加一个比较长的延时。此处的延时不要求很准确,因此用软件延时就可以了。软件延时在 STC-ISP 里也可以自动生成。在生成 1MS 的延时程序后,稍加改动就可以成为一个带参数的延时程序了,代码如下:

■2.3 按键功能的实现

按键部分的程序思路也是和显示部分一样的。先把按键扫描程序写出来,然后再测试一下按键功能是否和设计的一样就可以了。首先我们新建一个工程,把main.c 和包含的头文件复制过来添加到工程里。首先在初始化函数void init_IO(void)里把 P3 数据出改为 P3=0x23;因为按键是低电平有效,所以要把按键口拉高。注意这两个按键口不能设为推挽输出,否则会造成电路短路。先完成按键扫描函数:

此扫按键扫描程序用到了三个新的全局变量,一个是用来计算按键去抖时间的 key_db,一个是用来保存键值的 key_cval,一个是用来保存上一次按键口的值的 key_temp。因此要在前面定义一下这三个变量。当然,在中断函数中要加上一句:

现在按键扫描已经做好了,那怎么验证这个思路正不正确呢。之前的显示部分已经做了一个流水灯程序,但数码管是随意显示的,我们现在就加一个测试代码,按下 PLUS 键数码管的显示就加 1,按 MODE 就减 1。

首先我们先定义一个整型的显示变量,就叫 shumaguan Disp 。然后在 void liushuidengTest(void)函数中数码管赋值的那四条语句改为:

然后在主函数中调用这两个函数,编译成功后就可以下载到时钟板上验证了。到此我们的按键程序也完成了。

■2.4 DS1302 的读写

完成了显示和按键后,现在就可以写DS1302 的程序了。首先新建一个工程,把上一章的源程序复制过来。DS1302的通信协议可以参考DS1302 的技术文档,是比较简单的同步串行通信。DS1302 的底层驱动就不再赘述,直接把DS1302.c 和 DS1302.h 这两个文件复制到本章的工程中。然后把 DS1302.c 添加到工程中。然后在 main.c 的前面包含 1302 的头文件 #include “DS1302.h”。这个头文件里定义有四个函数。

我们在写程序的时候只需要调用这四个函数就可以完成DS1302 的读写了。那么这四个函数各有什么功能呢?先来看 WriteTime 这个函数的定义。

这是一个写时间的函数。由于1302 的时间存储是10进制的方式,而我们的程序是用16 进制的方式,所以在写进去时要进行转换,(tim/10)<<4)|(tim%10)就是16 进制转10 进制的操作。ReadTime 是读取1302 时间的函数,同样,读出时间后要转成16 进制再给其他程序使用。

unsigned char ReadTime(unsigned char add)// 从1302 读时间值

编译后下载到单片机里,看是否和我们想的一样。完成了这个小测试程序后,我们时钟基本模块已经全部调试完。

3 遇到的问题及解决方法

电阻选择时,首先考虑采用最常用的1/4W 的电阻,但是由于电路板比较小,如果采用常用电阻,电阻板就会显得很拥挤,影响美观。最终考虑采用1/6W 的小尺寸电阻,而并非选择常用的1/4W 的电阻,看起来会整洁很多。

单片机选择时,首先考虑用AT89S52 或者STC89C52,但是这两款单片机太大了,有些元件可能需要使用贴片才能放得进板,这带来了一系列问题,因为贴片比较小,学生作为初学者对贴片不熟悉,所以导至焊接成功率不高。经过考虑,最终单片机选择了IAR15W413AS,较之前的AT89S52或者 STC89C52,有了很多的优点:

(1)体积小,可以在电路板上多放一些其他元件。(2)有内部时钟信号,可以省去外部晶振,可以减少一些元件。(3)内部集成了复位电路,也可以减少一些元件。(4)引脚输出最大电流可达20MA,足以驱动一个 LED,因此不需外接三极管来驱动,这省了很多的外围元件。(5)内部集成有ADC,这可以直接读取热敏电阻和光敏电阻的阻值变化,从而实现读取环境温度和测量光照度的功能。(6)内部 FLASH 有8K,足够写一个很多功能的电子钟程序了。

猜你喜欢
数码管延时时钟
课后延时服务
物理项目教学设计,用单片机控制四位数码管显示
蓝桥杯树莓派模拟题解析三:“电子测距仪”
课后延时中如何优化不同年级学生活动效果
Arduino编程
MC9S08FL16单片机数码管静态显示分析
这个时钟一根针
有趣的时钟
一种“死时间”少和自动校准容易的Wave Union TDC
时钟会开“花”