阅读本文大概需要4分钟。
Arduino不但有外部中断,还有定时器中断,不同Arduino开发板其定时器数量及性能也各不相同,这取决于开发板主控制器。Uno R3开发板有三个定时器,本篇通过使用定时器库「TimerOne」来更新数码管显示,制作一个数字时钟。
Arduino提供了丰富的库,关于定时器的库包括「TimerOne」、「MsTimer2」等,更多的支持库的信息可从官网获取Libraries for Arduino(https://playground.arduino.cc/Main/LibraryList)。
1. 定时器库安装
在IDE中点击「项目」—「加载库」—「管理库」,查找「TimerOne」进行安装。

2. 实验材料
-
Uno R3开发板
-
配套USB数据线
-
面包板及配套连接线
-
四位共阴极数码管
-
4个220Ω限流电阻
3. 实验步骤
1. 根据原理图搭建电路。
根据四位数码管的引脚图,a,b,c,d,e,f,g,dp引脚分别连接开发板的数字引脚7,6,5,10,11,8,9,4。数码管的1,2,3,4引脚分别串联220Ω限流电阻,电阻另一端分别连接开发板的数字引脚2,3,12,13。
实验原理图如下图所示:

实物连接图如下图所示:

2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。
1/*
2
SevTimer
3
使用定时器驱动四位数码管实现数字时钟显示
4*/
5#include
"TimerOne.h"
6#include
"SevSeg.h"
7
8SevSeg
sevseg;
9
10int
Fen
=
0;
11int
Miao
=
0;
12
13byte
numDigits
=
4;
//数码管位数
14byte
digitPins[]
=
{2,
3,
12,
13 };
//数码管公共极连接Arduino的引脚
15byte
segmentPins[]
=
{7,
6,
5,
10,
11,
8,
9,
4 };
//数码管a,b,c,d,e,f,g,dp对应引脚
16byte
hardwareConfig
=
COMMON_CATHODE
;
//
共阴极数码管
17
18void
setup()
{
19
sevseg.begin(hardwareConfig,
numDigits,
digitPins,
segmentPins);
//初始化数码管
20
21
Timer1.initialize(1000000);
//初始化定时器为1s
22
Timer1.attachInterrupt(
timerIsr
);
//设置中断回调函数
23 }
24
25void
loop()
{
26
sevseg.setNumber(Fen
*
100
+
Miao,
-1);
//设置要显示的数据,不显示小数点
27
sevseg.refreshDisplay();
//
必须重复运行刷新数码管显示
28 }
29
30void
timerIsr()//定时器中断处理函数
31{
32
Miao++;
33
if
(Miao
>
59)
34
{
35
Miao
=
0;
36
Fen++;
37
if
(Fen
>
59)
38
Fen
=
0;
39
}
40 }
3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

4. 实验现象
数码管1秒计数一次,满60秒分钟加一,实现数字时钟效果。

5. 实验分析
数码管驱动依旧使用「SevSeg」,具体使用方法在前面文章有所介绍。在setup()中使用 Timer1.initialize(1000000)来初始化定时器,括号内为定时周期,以微妙为单位,所以这里的1000000为1秒。然后使用Timer1.attachInterrupt( timerIsr )来设置中断回调函数。我们在程序中要实现timerIsr()函数,在里面实现分钟和秒数的控制。
有了定时器,有了数码管,我们可以很方便的实现一些跟时钟有关的制作,你可以结合数码管和蜂鸣器,来实现倒计时提示的制作。

原文始发于微信公众号(
TonyCode
):Arduino基础入门篇18—数字时钟
|