(學習筆記)51微控制器的中斷功能及其相關的暫存器
阿新 • • 發佈:2018-12-27
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 | 最低 |
中斷允許暫存器IE以及中斷優先順序暫存器IP
位序 | 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開啟中斷,置零關閉中斷
位序號 | 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
位 | 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來設定
M1 | M0 | 工作方式 |
0 | 0 | 方式0,為13位定時器/計數器 |
0 | 1 | 方式1,為16位定時器/計數器 |
1 | 0 | 方式2,8位初值自動重灌的定時器/計數器 |
1 | 1 | 方式3,僅適用於T0,分成兩個8位計數器,T1停止計數 |
位序號 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位符號 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
位地址 | 8FH | 8EH | 8DH | 8CH | 8BH | 8AH | 89H | 88H |
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燈,每一秒改變一次狀態。
一旦開啟定時器,其便開始計數,當計數溢位時候,自動進入中斷服務程式,計數器自動計數,知道程式執行結束才停止。所以,中斷服務程式的程式碼不可以過長,以免中斷服務程式未執行完,下一次中端來臨,便會丟失中斷。