汇集网友智慧,解决技术难题
N76E003 定时 定时器 新唐
赞0
评论
2025-06-25
点击图片添加到编辑器内容中
点击文件名将附件添加到文章中
提交
tyw
318个答案
天意无罪
287个答案
xch
236个答案
jjjyufan
206个答案
coody
201个答案
LcwSwust
170个答案
chunyang
135个答案
地瓜patch
126个答案
赞0
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
}
评论
2025-06-25
您需要登录后才可以回复 登录 | 注册