问答

汇集网友智慧,解决技术难题

21ic问答首页 -

N76E003 定时 定时器 新唐

2025-08-21
新唐N76E003如何计算定时器0模式1的初值,以4ms为例,麻烦解答详细些,感觉和51不一样

回答 +关注
人浏览 人回答问题 分享 举报
个回答
  • 在 N76E003 中,定時器0工作在模式1時,是一個16位元的定時器。這意味著它可以從 0 數到 65535 (即 2
    16
    −1)。當計數溢出時 (從 65535 變為 0),會觸發中斷旗標 (TF0)。

    計算初值的核心思想是:我們不讓定時器從0開始數,而是給它一個初始值,讓它數到溢出正好是我們需要的時間。

    計算步驟
    1. 確定時鐘源頻率
    首先,我們需要知道供給定時器0的時鐘頻率是多少。N76E003的系統時鐘 (SYSCLK) 通常來自其內部高精度16MHz RC振盪器 (HIRC)。在大多數應用中,為了簡化,系統時鐘會直接用作定時器的時鐘源。

    然而,定時器的時鐘頻率 (F_TIMER) 還會受到一個除頻器 (prescaler) 的影響。在N76E003中,定時器的時鐘可以設定為系統時鐘除以1、4、16、64、128或256。但在標準的8051內核中,定時器的時鐘通常是系統時鐘除以12 (F_SYSCLK/12)。除非特殊配置,我們通常先按 F_SYSCLK/12 來計算。

    假設系統時鐘 (F_SYSCLK) = 16 MHz
    定時器0的時鐘頻率 (F_TIMER) = 16,000,000
    Hz/12
    2. 計算定時器每計數一次所需的時間
    定時器每計數一次,時間就流逝一個時鐘週期。

    單次計數時間 (T_COUNT) = 1/F_TIMER=1/(16,000,000/12)=12/16,000,000
    s
    T_COUNT=0.00000075
    s=0.75
    mus
    3. 計算 4ms 所需的總計數次數
    現在,我們用期望的定時時間 (4ms) 除以單次計數所需的時間,得到總共需要計數多少次。

    目標時間 (T_TARGET) = 4 ms = 0.004 s
    總計數次數 (Total Counts) = T_TARGET/T_COUNT=0.004/0.00000075=5333.33
    由於計數次數必須是整數,我們取 5333 次。

    4. 計算定時器初值
    定時器是向上計數的。我們需要從一個特定的初值開始,數 5333 次後正好達到 65536 (溢出點)。

    初值 (Initial Value) = 65536−
    textTotalCounts
    Initial Value = 65536−5333=60203
    這是一個16進制的值。我們需要將它轉換為16進制,以便寫入高位元組 (TH0) 和低位元組 (TL0) 暫存器。

    60203 (十進制) = ECAB (十六進制)
    所以:

    TH0 = 0xEC
    TL0 = 0xAB
    總結與程式碼範例
    要在 N76E003 的定時器0模式1下產生 4ms 的定時中斷 (假設系統時鐘為 16MHz 且定時器時鐘為系統時鐘/12),您需要設定的初值為:

    TH0 = 0xEC
    TL0 = 0xAB
    C語言程式碼範例:

    C

    #include "N76E003.h"

    // ... 在您的初始化函式中 ...

    void Timer0_Init(void)
    {
        // 步驟1: 設定定時器0為模式1 (16位元定時器)
        // TMOD 的低4位用於 Timer0, M1=0, M0=1 -> 0001
        TMOD = (TMOD & 0xF0) | 0x01;

        // 步驟2: 載入初值 (達成 4ms 定時)
        // 65536 - 5333 = 60203 = 0xECAB
        TH0 = 0xEC; // 高8位
        TL0 = 0xAB; // 低8位

        // 步驟3: 清除定時器0中斷旗標
        TF0 = 0;

        // 步驟4: 啟動定時器0
        TR0 = 1;

        // 步驟5: 啟用定時器0中斷 (如果需要中斷服務)
        ET0 = 1;
        // 啟用全域中斷
        EA = 1;
    }

    // ... 在您的中斷服務常式中 ...
    void Timer0_ISR(void) interrupt 1
    {
        // 當中斷發生時,硬體會自動清除TF0嗎?
        // 在標準8051中,不會。但在N76E003中,通常會自動清除。請查閱datasheet確認。
        // 為保險起見,可以手動清除。

        // 重新載入初值,以便下一次4ms定時
        TH0 = 0xEC;
        TL0 = 0xAB;

        // 在這裡執行您需要每4ms處理一次的任務
        // 例如:翻轉一個LED
        P12 = ~P12; // 假設P1.2連接了一個LED
    }

您需要登录后才可以回复 登录 | 注册