打印
[技术问答]

新唐N76E003如何计算定时器0模式1的初值,以4ms为例

[复制链接]
373|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Belle1257|  楼主 | 2025-6-25 13:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新唐N76E003如何计算定时器0模式1的初值,以4ms为例,麻烦解答详细些,感觉和51不一样

使用特权

评论回复
沙发
a_ziliu| | 2025-6-25 14:56 | 只看该作者
在 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
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

1660

帖子

3

粉丝