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)

以計時器做蜂鳴器控制練習

範例(asm) 範例(C)

在以上範例中,每個音都執行200次的迴圈,給喇叭100次的方波,但因越往高音,每個音延遲的時間越短,造成越高音發聲的時間越短,修正此錯誤,改將喇叭的方波改以計時器中段完成,

每個音的延遲時間統一改以迴圈完成,詳細可參考以下範例

範例(asm) 範例(C)

練習:請修改程式,在每發一個音的同時,在七段顯示器上同時顯示該聲音的簡譜,例如發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 的電路方塊圖

由電路方塊圖可知,T0X12T1X12設定為1時,計時器時脈來源直接接到石英震盪器,速度快了12倍。

設定方式:

C語言:

1.將#include <reg51.h> 改成   #include <REG_MPC82G516.h>,引入 MPC82G516 暫存器定義檔
2.AUXR2 = 0x80;       //T0X12 = 1 => 計時器時脈來源 = Fosc

範例程式(C)

組合語言:

組合語言的設定較複雜,在先前的組合語言範例中,不需引用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)的錯誤

範例(ASM)

 

 

經比較可知速度整整快了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 之鮑率產生器模式

 

以下先以比較容易觀察的自動重新載入模式來做練習:

範例(ASM)

範例(C)