1. 程式人生 > >(學習筆記)51微控制器的中斷功能及其相關的暫存器

(學習筆記)51微控制器的中斷功能及其相關的暫存器

51微控制器中斷系統

         引起CPU中斷的根源,稱為中斷源,中斷源向CPU提出中斷請求,CPU暫時中斷原來的事務A,轉去處理事件B,對時間B處理完畢後,再回來原來的地方(斷點),稱為中斷返回。實現上述中斷功能的部件稱為中斷系統(中斷機構)。 中斷優先順序決定了中斷是否能夠實現巢狀,52微控制器一共有六個中斷源
中斷源 序號(C 預設中斷級別
INT0 0 最高
T0 1 2
INT1 2 3
T1 3 4
TI/RI 4 5
T2 5 最低
 51系列微控制器的中斷有三種,外部中斷, 定時器/計數器中斷,序列口中斷,中斷優先級別如表格

中斷允許暫存器IE以及中斷優先順序暫存器IP

IE
位序 D7 D6 D5 D4 D3 D2 D1 D0
位符 EA -- ET2 ES ET1 EX1 ET0 EX0
位地址 AFH -- ADH ACH ABH AAH A9H A8H

IE在特殊功能暫存器中(sfr)可進行位定址,微控制器復位時IE全清零 EA----全域性中斷允許位          EA=1,開啟全域性中斷控制,由各個中斷控制位確定相應的開啟或者 關閉中斷          EA=0,禁用所有中斷 除--為無效位外,其他位分別為各個中斷的允許位,置1開啟中斷,置零關閉中斷
IP
位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 -- -- -- PS PT1 PX1 PT0 PX0
位地址 -- -- -- BCH BBH BAH B9H B8H

IP位於特殊功能暫存器中(sfr)可進行位定址,微控制器復位時IP全清零           51微控制器系列中,高優先順序 能夠打斷低優先順序中斷以形成中斷巢狀,同優先順序之間或者低階對高優先順序中斷則不能形成中斷巢狀。若幾個同級中斷同時向CPU請求中斷響應,在沒有設定的中斷優先順序的情況下,按照預設中斷級別響應中斷,在設定中斷優先順序後,則按設定順序確定響應的先後順序

51系列微控制器的定時器中斷

 微控制器的定時器系統

            51微控制器內有兩個16位可程式設計計數器/定時器(16位加1計數器,分由高八位和低八位兩個暫存器組成),分別為T0( TH0,TL0 )、T1( TH1,TL0 ),另52微控制器內部多一個T2。它們既有定時器功能又有計數功能,通過設定相關的特殊功能暫存器可以使用它們。定時器系統是微控制器內部一個獨立的硬體部分,它與CPU和晶振通過內部某些控制線連線並相互作用,CPU一旦設定開啟定時器功能後,定時器便在晶振的作用下自動開始計時,當定時器的計數器計滿後,會產生中斷。             加1計數器的計數脈衝有兩個來源:一個是系統的時鐘震盪器輸出脈衝經12分頻後送來,另一個是由T0或是T1引腳輸入的外部脈衝源,每一個脈衝計數加1,計滿再一個脈衝則歸零,向CPU請求中斷。   先來了解定時器,計數器功能暫不介紹

定時器/計數器工作方式暫存器TMOD以及定時器/計數器控制暫存器TCON

TMOD
D7 D6 D5 D4 D3 D2 D1 D0
符號 GATE C/T M1 M0 GATE C/T M1 M0

TMOD位於特殊功能暫存器中,位元組地址89H,不能進行位定址,微控制器復位全清零0 GATE----門控制位   GATE=0,定時器計數器啟動與停止僅受TCON暫存器中的TRX(X=0,1)控制   GATE=1,定時器計數器啟動與停止由外部中斷引腳(INT0或INT1)上的電平狀態來共同控制 C/T----定時器或者計數器模式選擇位 M1M0--工作方式選擇位 每個定時器都有4中工作方式,它們由M1M0來設定   
定時器/計數器4種工作方式
M1 M0 工作方式
0 0 方式0,為13位定時器/計數器
0 1 方式1,為16位定時器/計數器
1 0 方式2,8位初值自動重灌的定時器/計數器
1 1 方式3,僅適用於T0,分成兩個8位計數器,T1停止計數
TCON
位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H
  TCON位於特殊功能暫存器中(SFR),可進行位定址 TF1/TF0--------定時器/計數器溢位標誌位    當定時器計滿溢位時,由硬體使其置1,並且向CPU申請中斷,進入中斷服務程式後,由硬體自動清0。 TR1/TR0-------定時器執行控制位    當GATE=1,當相應的外部中斷引腳(INT1/INT0)為高電平時,TR1/TR0置1啟動定時器,當GATE=0,TR1/TR0置1啟動定時器
IE1/IE0--------外部中斷請求標誌位 IT1/IT0---------外部中斷觸發方式選擇位         0為電平觸發模式         1為跳變沿觸發模式

定時器中斷應用舉例->方式1

        16位定時器/計數器  在寫微控制器程式之前,需要對定時器以及中斷暫存器做初始化設定         ①對TMOD賦值,確定定時器工作方式         TOMD=0x01;-----即系設定定時器0為16位定時器,GATE=0此時僅由TR0控制啟動定時器0         ②計算初值,並將初值寫入TH0/TL0         ③對IE賦值,開放中斷         ④對TR0/TR1置位,開始定時或者計數         關於計算初值,前面提到,加1計數器的脈衝源為一個是系統的時鐘震盪器輸出脈衝經12分頻後送來,另一個是由T0或是T1引腳輸入的外部脈衝源,每一個脈衝計數加1,計滿再一個脈衝則歸零,向CPU請求中斷。          這裡使用系統的時鐘振盪器輸送經12分頻之後送來的脈衝源,由此,1個機械週期等於12個時鐘週期。          令微控制器的時鐘晶振頻率為f,則一個機械週期的時間為[(1/f)*12 ] 。51微控制器常用的外部晶振為12MHz和11.0592MHz,若使用12MHz的晶振,則機械週期為1us(微秒),即系定時器暫存器每經一微秒就加1。          我們令定時器暫存器(TH0和TL0)的初值為(2^16 - N),此時每經N微秒發生一次中斷。(2^16=65536)          將初值裝入TH0、TL0的方式: TH0=(65536-N)/256;  TH0=(65536-N)%256;       
#include<reg52.h>
sbit led1=P1^0;
unsigned char num;
void main()
{
        TMOD=0x01;<span style="white-space:pre">			</span>//設定定時器0為工作方式1
        TH0=(65536-50000)/256;          //定時器暫存器裝初值
        TL0=(65336-50000)%256;
        EA=1;                           //全域性中斷允許 
        ET0=1;                          //定時器0中斷允許
        TR0=1;                          //啟動定時器0
        while(1);

}
void timer0() interrupt 1  
{
	TH0=(65536-50000)/256;   //重灌初值
	TL0=(65536-50000)%256;
	num++;	
        if( 20==num)                   //每20*50ms 即系1秒讓led1取反一次
         {
                  num=0;
                  led1=~led1; 
         }
}
         這是一個簡單的程式,讓I/O口驅動一個led燈,每一秒改變一次狀態。          一旦開啟定時器,其便開始計數,當計數溢位時候,自動進入中斷服務程式,計數器自動計數,知道程式執行結束才停止。所以,中斷服務程式的程式碼不可以過長,以免中斷服務程式未執行完,下一次中端來臨,便會丟失中斷。