51微控制器中斷系統(定時器、計數器)
*部分內容來源於網路
一、中斷
中斷是指計算機執行過程中,出現某些意外情況需主機干預時,機器能自動停止正在執行的程式並轉入處理新情況的程式,處理完畢後又返回原被暫停的程式繼續執行。
(*以上解釋來自於百度百科-中斷)
二、51微控制器中斷級別
中斷號 |
優先順序 |
中斷源 |
中斷入口地址 |
|
0 |
1(最高) |
INT0 |
外部中斷0 |
0003H |
1 |
2 |
T0 |
定時器/計數器0中斷 |
000BH |
2 |
3 |
INT1 |
外部中斷1 |
0013H |
3 |
4 |
T1 |
定時器/計數器1中斷 |
0018H |
4 |
5(最低) |
TX/RX |
序列口中斷 |
0023H |
三、中斷結構圖
四、中斷暫存器
1、 中斷允許控制暫存器IE
位地址 |
AFH |
AEH |
ADH |
ACH |
ABH |
AAH |
A9H |
A8H |
位序號 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
位名稱 |
EA |
- |
- |
ES |
ET1 |
EX1 |
ET0 |
EX0 |
EX0/EX1:外部中斷允許控制位
EX0=1 外部中斷0開關閉合 //開外部0中斷
EX0=0 外部中斷0開關斷開
ET0/ET1:定時中斷允許控制位
ET0=1 定時器中斷0開關閉合 //開內部中斷0
ET0=0 定時器中斷0開關斷開
ES:串列埠中斷允許控制位
ES=1 串列埠中斷開關閉合 //開串列埠中斷
ES=0 串列埠中斷開關斷開
2、 定時器控制暫存器TCON
位地址 |
8FH |
8EH |
8DH |
8CH |
8BH |
8AH |
89H |
88H |
位序號 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
位名稱 |
TF1 |
TR1 |
TF0 |
TR0 |
IE1 |
IT1 |
IE0 |
IT0 |
外部中斷:
IE0/IE1:外部中斷請求標誌位
當INT0(INT1)引腳出現有效的請求訊號,此位由微控制器自動置1,
CPU開始響應,處理中斷,而當入中斷程式後由微控制器自動置0.
IT0/IT1:外部中斷觸發方式控制位 //選擇有效訊號
IT0/IT1=1:脈衝觸發方式,下降沿有效。
IT0/IT1=0:電平觸發方式,低電平有效。
內部中斷:
TF0/TF1:內部定時器/計數器溢位中斷標誌位
當定時器、計數器計數溢位的時候,此位由微控制器自動置1,
cup開始響應,處理中斷,而當進入中斷程式後由微控制器自動置0.
//內部中斷實際上就是利用內部的計數器,
只不過提供計數的脈衝來自微控制器自身。
TR0(TR1):定時器/計數器啟動位 //啟動定時器
TR0/TR1=1;啟動定時器/計數器0
TR0/TR1=0;關閉定時器/計數器0
3、 串列埠控制暫存器SCON
位地址 |
9FH |
9EH |
9DH |
9CH |
9BH |
9AH |
99H |
98H |
位序號 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
位名稱 |
SM0 |
SM1 |
SM2 |
REN |
TB8 |
RB8 |
TI |
RI |
TI:序列口傳送中斷標誌位
當微控制器串列埠傳送完一幀資料後,此位由微控制器自動置1,
而當進入中斷服務程式後是不會自動清0的,
必須由使用者在中斷服務中用軟體清0.
RI:序列口接收中斷標誌位
當微控制器串列埠接收完一幀資料後,此位由微控制器自動置1,
而當進入中斷服務程式後是不會自動清0的,
必須由使用者在中斷服務軟體中用軟體清0.
4、 中斷優先控制暫存器IP
位序號 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
位名稱 |
- |
- |
- |
PS |
PT1 |
PX1 |
PT0 |
PX0 |
PS---序列口中斷優先順序控制位。
PS=1,序列口中斷定義為高優先順序中斷。
PS=0,序列口中斷定義為低優先順序中斷。
PT1---定時器/計數器1中斷優先順序控制位。
PT1=1,定時器/計數器1中斷定義為高優先順序中斷。
PT1=0,定時器/計數器1中斷定義為低優先順序中斷。
PX1---外部中斷1中斷優先順序控制位。
PX1=1,外部中斷1中斷定義為高優先順序中斷。
PX1=0,外部中斷1中斷定義為低優先順序中斷。
PT0---定時器/計數器0中斷優先順序控制位。
PT0=1,定時器/計數器0中斷定義為高優先順序中斷。
PT0=0,定時器/計數器0中斷定義為低優先順序中斷。
PX0---外部中斷0中斷優先順序控制位。
PX0=1,外部中斷0中斷定義為高優先順序中斷。
PX0=0,外部中斷0中斷定義為低優先順序中斷。
5、 定時器工作方式控制暫存器TMOD
位序號 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
定時器 |
定時器/計數器1(ET1) |
定時器/計數器0(ET0) |
||||||
位名稱 |
GATE |
C/T |
M1 |
MO |
GATE |
C/T |
M1 |
M0 |
GATE——門控制。
GATE=1時,由外部中斷引腳INT0、INT1來啟動定時器T0、T1。
當INT0引腳為高電平時TR0置位,啟動定時器T0;
當INT1引腳為高電平時TR1置位,啟動定時器T1。
GATE=0時,僅由TR0,TR1置位分別啟動定時器T0、T1。
C/T——功能選擇位
C/T=0時為定時功能,
C/T=1時為計數功能。
M0、M1——方式選擇功能
M1 |
M0 |
工作方式 |
功 能 |
0 |
0 |
工作方式0 |
13位計數器 |
0 |
1 |
工作方式1 |
16位計數器 |
1 |
0 |
工作方式2 |
自動再裝入8位計數器 |
1 |
1 |
工作方式3 |
定時器0:分成兩個8位計數器 |
定時器1:停止計數 |
6、 定時器初值賦予暫存器(TH0/TH1,TL0/TL1)
五、定時器、計數器
1、 工作方式
2、 定時器初值計算
1.計數器初值的計算
設計數器的最大計數值為M(根據不同工作方式,M可以是2^13、2^16或2^8),則計算初值X的公式如下:
X=M-要求的計數值
2.定時器初值的計算
在定時器模式下,計數器由微控制器主脈衝fosc經12分頻後計數。因此,定時器定時初值計算公式:
X=M-(要求的定時值)/(12/fosc)
式中,M為定時器模值(根據不同工作方式,M可以是213、216或28)
關於如何確定定時器T0的初值問題。定時器一但啟動,它便在原來的數值上開始加1計數,若在程式開始時,我們沒有設定TH0和TL0,它們的預設值都是0,假設時鐘頻率為12MHz,12個時鐘週期為一個機器週期,那麼此時機器週期為1us,記滿TH0和TL0就需要216 -1個數,再來一個脈衝計數器溢位,隨即向CPU申請中斷。因此溢位一次共需65536us,約等於65.6ms,如果我們要定時50ms的話,那麼就需要先給TH0和TL0裝一個初值,在這個初值的基礎上記50000個數後,定時器溢位,此時剛好就是50ms中斷一次,當需要定時1s時,我們寫程式時當產生20次50ms的定時器中斷後便認為是1s,這樣便可精確控制定時時間啦。要計50000個數時,TH0和TL0中應該裝入的總數是65536-50000=15536.,把15536對256求模:15536/256=60裝入TH0中,把15536對256求餘:15536/256=176裝入TL0中。
以上就是定時器初值的計演算法,總結後得出如下結論:當用定時器的方式1時,設機器週期為TCY,定時器產生一次中斷的時間為t,那麼需要計數的個數為N=t/TCY ,裝入THX和TLX中的數分別為:
THX=(65536-N)/256 , TLX=(65536-N)%256
設定為計數器模式時,外部計數脈衝由T0或T1引腳輸入到計數器。在每個機器週期S5P2期間取樣T0,T1引腳電平,當某週期取樣到一高電平輸入,而下一週期又取樣到一低電平時,則計時器加1,更新的計數值在下一個機器週期的S3P1期間裝入計數器。由於檢測一個從1到0的下降沿需要兩個機器週期,因此要求被取樣的電平至少維持一個機器週期。當晶振頻率位12MHz時,最高計數頻率不超過1/2MHz,即技術脈衝的週期要大於2us。
補充,
定時計數器2: MCS-52微控制器新增的定時計數器。
特點:
--16位定時計數器
--具有捕捉、自動重灌、波特率發生器3種工作模式
--可作為程式設計時鐘發生器
暫存器:
T2CON-定時器2控制暫存器
T2MOD定時器2方式暫存器
TH2,TL2定時計數暫存器
RCAP2H,RCAP2L-捕獲/重灌暫存器
引腳:
T2(P1.0):定時器2外部時鐘輸入/時鐘輸出
T2EXP(P1.1):定時器2重灌/捕獲/方向控制
IE, IP, IPH中有定時器2的中斷允許,終端優先控制位。
T2CON 暫存器
地址:0C8H 復位值:00000000B
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
TF2 |
EXF2 |
RCLK |
TCLK |
EXEN2 |
TR2 |
C/T2 |
CP/RL2 |
位 |
符號 |
功能 |
T2CON.7 |
TF2 |
定時器2溢位標誌位。 RCLK或TCLK=1時不置位。 |
T2CON.6 |
EXF2 |
定時器2外部標誌。 當EXEN2=1時,T2EX的負跳變產生捕獲或重灌時,EXF2=1. |
T2CON.5 |
RCLK |
接受時鐘標誌 |
T2CON.4 |
TCLK |
傳送時鐘標誌 |
T2CON.3 |
EXEN2 |
定時器2外部使能標誌。 |
T2CON.2 |
TR2 |
定時器2啟動/停止控制位。0停止,1啟動。 |
T2CON.1 |
C/T2 |
定時器計數器選擇:0定時,1計數。 |
T2CON.0 |
CP/RL2 |
捕獲重灌標誌,1捕獲,0重灌。 |
定時器2可以產生2箇中斷請求訊號,分別是TF2和EXF2,這2中斷請求訊號通過邏輯“或”的關係共享一個終端請求通道。
定時器2溢位時,TF2置1,向CPU申請中斷。若在定時器2工作在重灌模式時候,使RCAP2H,RCAP2L的值自動裝入TH2,TL2。
當EXEN2=1時,T2EX引腳的負跳變使EX2F置1,這個訊號除了向CPU申請中斷外,根據定時器2的工作方式,還有2個作用:一是將TH2,TL2的值裝入RCAP2H,RCAP2L,稱為捕獲;二是將RCAP2H,RCAP2L的值裝入TH2,TL2,稱為重灌。
TF2,EXF2必須由軟體清除。
RCLK:當該位置1時,定時器2做串列埠接受波特率發生器,即接受時鐘。否則使用定時器1做波特率發生器。
TCLK:當該位置1時,定時2做串列埠波特率發生器,即傳送時鐘。否則使用定時器1做波特率發生器。
TR2:置1時允許T2計數,置0時禁止T2計數
C/T2:置1時定時器2對T2引腳輸入的脈衝計數。置0時定時器2對內部震盪訊號的12分頻或6分頻計數。
CP/RL2:捕獲/重灌標誌,置1時捕獲,置0時重灌。當定時器2做波特率發生器時,強制自動重灌,不管該位狀態。
捕獲模式:
CKCON的X2位控制內部振盪訊號是12分頻還是6分頻。
T2CON的C/T2位控制T2對內部脈衝計數還是對外部脈衝計數。
T2CON的TR2位啟動或停止計數
T2CON的CP/RL位置1,使T2工作在捕獲模式
T2CON的EXEN2置1,連線T2EX引腳到捕獲控制端。
在T2EX引腳的負跳變時刻,使TH2的值捕獲到RCAP2H,TL2的值捕獲到RCAP2L,同時使T2CON的EXF2置1,向CPU申請中斷。
當T2溢位時,T2CON的TF2置1向CPU申請中斷。
捕獲方式可以用來測量外部脈衝的週期。
自動重灌模式
自動重灌模式下定時器的初值由硬體自動恢復。這個特性降低了軟體開銷。
T2的工作在自動重灌模式時計數方向可變,即定時器2即可工作在增量式計數方式,也可工作在減量式計數方式。計數方式的選擇由T2MOD暫存器的DCEN位控制使能,由T2EX引腳控制計數方向。
定時器2也可以在T2(P1.0)引腳輸出可程式設計時鐘。
通過配置T2MOD暫存器選擇以上功能。
T2MOD暫存器
地址0C9H 復位值:XXXXXX00B
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
- |
- |
- |
- |
- |
- |
T2OE |
DCEN |
位 |
符號 |
功能 |
T2CON.1 |
T2OE |
定時器2輸出使能 |
T2CON.0 |
DCEN |
向下計數使能位,置1使能。 |
其他不用的位在程式設計時不要置1. |
自動重灌載模式
自動重灌模式(DCEN=0)說明
CKCON的X2位控制內部振盪訊號是12分頻還是6分頻。
T2CON的C/T2位控制T2對內部脈衝計數還是對外部脈衝計數。
T2CON的TR2位啟動或停止計數
T2CON的CP/RL位置0,使T2工作在自動重灌模式
T2CON的EXEN2置1,連線T2EX引腳到重灌控制端。
在T2EX引腳的負跳變時刻,使RCAP2H 的值重灌到TH2 , RCAP2L 的值重灌到TL2 ,同時使T2CON的EXF2置1,向CPU申請中斷。
當T2溢位時,T2CON的TF2置1,使RCAP2H 的值重灌到TH2 , RCAP2L 的值重灌到TL2 ,同時向CPU申請中斷。
在DCEN=0時,定時器2增量式計數。
自動重灌模式(DCEN=1)
自動重灌模式(DCEN=1)說明
CKCON的X2位控制內部振盪訊號是12分頻還是6分頻。
T2CON的C/T2位控制T2對內部脈衝計數還是對外部脈衝計數。
T2CON的TR2位啟動或停止計數
T2CON的CP/RL位置0,使T2工作在自動重灌模式
T2CON的EXEN2置1,連線T2EX引腳到重灌控制端。
在定時器2溢位時,自動裝入初值。
當T2EX=0時,定時器2減量方式計數,FFH自動裝入TH2和TL2。
當T2EX=1時,定時器2增量方式計數,RCAP2H自動裝入TH2,RCAP2L自動裝入TL2。
波特率發生器模式
當T2CON的RCLK=1,或TCLK=1,或RCLK=TCLK=1時,定時器2做波特率發生器。
這時定時器2強制自動重灌。
T2CON的C/T2=0時,定時器2對內部振盪脈衝的2分頻計數。
T2CON的TR2位啟動或停止T2計數
定時器2溢位時不向CPU申請中斷,溢位訊號16分頻後做串列埠的傳送或接收時鐘。由RCLK,TCLK的狀態決定。
當T2CON的EXEB2=1時,T2EX引腳可做為外部中斷源,該引腳的負跳變使EXF2=1向CPU申請中斷
可程式設計時鐘輸出
通過對定時器2的設定,可在T2(P10)引腳上輸出頻率可程式設計的時鐘脈衝。
T2CON的設定
RCLK=TCLK=0
C/T2=0
CP/RL=0
TMOD2的T2OE=1
RCAPH2,RCAPL2的值控制輸出時鐘頻率。
輸出時鐘頻率=
振盪器頻率/4*[65536-(RCAP2H,RCAP2H)]