程序中延時功能實現原理:定時器

定時器的應用在生活中太常見了,比如鬧鐘、電飯鍋定時煮飯以及微波爐定時加熱功能等。定時器允許我們預設一個時間,然後開始計時,時間到了它就會發出信號。

我們也可以用定時器實現延時功能。比如我們想要延時 1 毫秒就設定 1 毫秒的定時,接收到定時時間到的信號後再往後執行程序,這樣就相當於延時了 1 毫秒。

定時器的原理

定時器在運行時好比是一個人在不停地進行加 1 計數(計數器)。例如:0、1、2、3、...、255、0、1、...。那麼,現在有三個問題:

  1. 計數的節奏是什麼?

  2. 計數時應該從多少數到多少?

  3. 計數完成後如何通知系統?

計數的節奏

一個機器週期數一個數,即 1 微秒數一個數。詳情見:程序中延時功能實現原理:軟延時

計數的起、止點

計數的當前值是存儲在特殊功能寄存器 TH 和 TL 中的。這些寄存器是專供計數使用的。定時器有不同的模式,假設選擇的是 8 位模式且僅使用 TL 寄存器。那麼,計數的起始值就是 TL 寄存器中的初始值。示例:TL 初始值爲 0。若想從其它初始值開始計時,設置相應的 TL 寄存器初始值即可。

計數的終止點是 TL 溢出回 0 的時候。對於 8 位寄存器來講當每位都是 1,即數值爲 255 時再增加 1 就會發生溢出。由下圖可知,溢出時寄存器會回 0。

通知計數完成

在計數溢出時會產生定時器中斷,它是_中斷系統_的一部分。我們可以在程序中定義定時器中斷處理函數。在啓用中斷系統後,當中斷髮生時 CPU 會停下手頭的工作轉而去執行中斷處理程序。中斷處理程序可能是下面這樣:

void timer0_handler() interrupt 1
{
    TL0 = 0x64; // 從 100 開始計數
}

定時器延時比軟延時精確得多,這得益於以下幾方面:

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/HOwXIkk_F-Sjl9XswcOzNg