Arduino基礎入門篇18—數字時鐘
Arduino不但有外部中斷,還有定時器中斷,不同Arduino開發板其定時器數量及效能也各不相同,這取決於開發板主控制器。Uno R3開發板有三個定時器,本篇通過使用定時器庫「TimerOne」來更新數碼管顯示,製作一個數字時鐘。
Arduino提供了豐富的庫,關於定時器的庫包括「TimerOne」、「MsTimer2」等,更多的支援庫的資訊可從官網獲取 ofollow,noindex">Libraries for Arduino 。
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,拷貝如下程式碼替換自動生成的程式碼並進行儲存。
/* SevTimer 使用定時器驅動四位數碼管實現數字時鐘顯示 */ #include "TimerOne.h" #include "SevSeg.h" SevSeg sevseg; int Fen = 0; int Miao = 0; byte numDigits = 4; //數碼管位數 byte digitPins[] = {2, 3, 12, 13}; //數碼管公共極連線Arduino的引腳 byte segmentPins[] = {7, 6, 5, 10, 11, 8, 9, 4}; //數碼管a,b,c,d,e,f,g,dp對應引腳 byte hardwareConfig = COMMON_CATHODE ; // 共陰極數碼管 void setup() { sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins); //初始化數碼管 Timer1.initialize(1000000);//初始化定時器為1s Timer1.attachInterrupt( timerIsr );//設定中斷回撥函式 } void loop() { sevseg.setNumber(Fen * 100 + Miao, -1); //設定要顯示的資料,不顯示小數點 sevseg.refreshDisplay(); // 必須重複執行重新整理數碼管顯示 } void timerIsr()//定時器中斷處理函式 { Miao++; if (Miao > 59) { Miao = 0; Fen++; if (Fen > 59) Fen = 0; } }
3. 連線開發板,設定好對應埠號和開發板型別,進行程式下載。

程式下載
4. 實驗現象
數碼管1秒計數一次,滿60秒分鐘加一,實現數字時鐘效果。

實驗現象
5. 實驗分析
數碼管驅動依舊使用「SevSeg」,具體使用方法在前面文章有所介紹。在setup()中使用 Timer1.initialize(1000000)來初始化定時器,括號內為定時週期,以微妙為單位,所以這裡的1000000為1秒。然後使用Timer1.attachInterrupt( timerIsr )來設定中斷回撥函式。我們在程式中要實現timerIsr()函式,在裡面實現分鐘和秒數的控制。
有了定時器,有了數碼管,我們可以很方便的實現一些跟時鐘有關的製作,你可以結合數碼管和蜂鳴器,來實現倒計時提示的製作。