Timer 0 和 Timer 1 的控制:
8051的計時器控制方式,請參考課本,以下僅提供幾個基本範例做練習
基本練習
a.Timer 0, mode 1 練習。 範例(asm)
b.Timer 1, mode 0 練習。 範例(asm)
c.Timer 0, mode 1 練習。 範例(C)
d.Timer 1, mode 0 練習。 範例(C)
進階練習
1.8051的計時器,提供了由外部接腳控制計時或停止的功能(請參考以下之電路方塊圖),當暫存器GATE = 1時,Timer 0 和 Timer 1 分別可由INT0(P3.2) 或INT1(P3.3)控制計時或停止。 範例(asm)
2中斷練習,8051的Timer 0 和 Timer 1中斷向量分別位於 0BH 和 1BH, 將上述範例分別改用中斷完成。
a.Timer 0, mode 1 練習。 範例(asm)
b.Timer 1, mode 0 練習。 範例(asm)
c.Timer 0, mode 0 練習。 範例(C)
d.Timer 1, mode 1 練習。 範例(C)
以計時器做蜂鳴器控制練習
在以上範例中,每個音都執行200次的迴圈,給喇叭100次的方波,但因越往高音,每個音延遲的時間越短,造成越高音發聲的時間越短,修正此錯誤,改將喇叭的方波改以計時器中段完成,
每個音的延遲時間統一改以迴圈完成,詳細可參考以下範例
練習:請修改程式,在每發一個音的同時,在七段顯示器上同時顯示該聲音的簡譜,例如發Do音時,七段顯示器上顯示1。
笙泉82G516除了提供標準8051所提供之功能外,額外設計一組控制暫存器AUXR2,提供以下之功能
AUXR2 (Address=A6H, Auxiliary Register2, Reset Value=0000,0000B)
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
T0X12 |
T1X12 |
URM0X6 |
S2TR |
S2SMOD |
S2TX12 |
S2CKOE |
T0CKOE |
T0X12: Timer 0 在計時模式(C/-T=0)時的時脈來源選擇, T0X12 = 0 => 計時器時脈來源 = Fosc/12, T0X12 = 1 => 計時器時脈來源 = Fosc。 T1X12: Timer 1 在計時模式(C/-T=0)時的時脈來源選擇, T1X12 = 0 => 計時器時脈來源 = Fosc/12, T1X12 = 1 => 計時器時脈來源 = Fosc。 T0CKOE: T0CKOE = 0 => 無作用 T0CKOE = 1 => Timer 0 的計時溢位訊號輸出至P3.4
82G516 的Timer1, mode 0 的電路方塊圖
82G516 的Timer1, mode 1 的電路方塊圖
由電路方塊圖可知,T0X12或T1X12設定為1時,計時器時脈來源直接接到石英震盪器,速度快了12倍。
設定方式:
C語言:
1.將#include <reg51.h> 改成 #include <REG_MPC82G516.h>,引入 MPC82G516 暫存器定義檔 2.AUXR2 = 0x80; //T0X12 = 1 => 計時器時脈來源 = Fosc
組合語言:
組合語言的設定較複雜,在先前的組合語言範例中,不需引用8051暫存器定義檔的原因,是因為在Keil的專案(project)操作環境中,已經事先將Define 8051 SFR Names的選項中打勾勾,這樣在撰寫組合語言程式時,可省略了在程式開頭宣告的步驟( $INCLUDE (REG51.inc) ),
但Define 8051 SFR Names只定義8051有用到的SFR,對於82G516才有的暫存器,將會產生錯誤
修正方式
1.將Define 8051 SFR Names的選項中勾勾取消
2.程式開加上$INCLUDE (REG_MPC82G516.inc)
在做8051程式練習時,記得要將設定改回來,否則又會出現符號未定義(UNDEFINED SYMBOL)的錯誤
經比較可知速度整整快了12倍,在一些需要比較高速計時場合可以做此修改(例如控制產生串列傳輸之鮑率),如果只是單純做延遲,還是先除12比較方便,這樣迴圈也不用跑那麼多次。至於模式2自動載入模式,雖然不用每次計數時都重新給初值,但因計數範圍只有0~255,能計數範圍太小,比較常用到的是當串列傳輸時的鮑率產生器使用,設定方式就留在串列傳輸的章節再討論。如果要使用自動載入模式,還是建議使用Timer 2。
82G516 的Timer1, mode2 的電路方塊圖
Timer 2 的控制:
目前8051與8052的價差不大,學生要利用8051來做控制時,常會覺得計時器不夠用,這時可考慮使用8052的Timer 2,他的功能較多,但用法比較複雜,等對程式控制比較熟悉,亦可精簡成只用Timer 0和Timer 1來控制。
Timer 2 的操作模式
RCLK + TCLK |
CP/-RL2 |
TR2 |
DCEN |
T2OE |
Mode |
x |
x |
0 |
x |
0 |
計時器關閉(Timer Off) |
1 |
x |
1 |
0 |
0 |
鮑率產生器(Baud-rate Generator) |
0 |
1 |
1 |
0 |
0 |
16位元抓取模式 |
0 |
0 |
1 |
0 |
0 |
16位元自動重新載入模式(只能上數) |
0 |
0 |
1 |
1 |
0 |
16位元自動重新載入模式 (上數或下數) |
0 |
0 |
1 |
0 |
1 |
可程式化時脈輸出(Programmable clock-out) |
注意:紅字部分為82G516才有之功能
Timer 2的控制暫存器
T2CON (Address=C8H, Timer/Counter 2 Control Register, Reset Value=0000,0000B)
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
TF2 |
EXF2 |
RCLK |
TCLK |
EXEN2 |
TR2 |
C/-T2 |
CP/-RL2 |
T2MOD (Address=C9H, Timer 2 Mode Control Register, Reset Value=xxxx,xx00B)
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
- |
- |
- |
- |
- |
- |
T2OE |
DCEN |
注意:此暫存器為82G516才有之功能
T2OE: Timer 2 時脈輸出致能位元,T2OE=1啟動,T2OE=0關閉。 DCEN: Timer 2 下數致能位元,DCEN=1啟動,DCEN=0關閉。 (此時上數或下數由外部接腳T2EN(P1.1)決定。
Timer 2 之抓取模式
Timer 2 之自動重新載入模式 (DCEN=0)
Timer 2 之自動重新載入模式 (DCEN=1)
Timer 2 之鮑率產生器模式
以下先以比較容易觀察的自動重新載入模式來做練習: