51單片機中斷系統(tǒng)詳解(定時器、計數(shù)器)
51單片機中斷級別
中斷源 | 默認中斷級別 | 序號(C語言用) |
INT0---外部中斷0 | 最高 | 0 |
T0---定時器/計數(shù)器0中斷 | 第2 | 1 |
INT1---外部中斷1 | 第3 | 2 |
T1----定時器/計數(shù)器1中斷 | 第4 | 3 |
TX/RX---串行口中斷 | 第5 | 4 |
T2---定時器/計數(shù)器2中斷 | 最低 | 5 |
中斷允許寄存器IE
位序號 | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
符號位 | EA | ------- | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
EA---全局中允許位。
EA=1,打開全局中斷控制,在此條件下,由各個中斷控制位確定相應(yīng)中斷的打開或關(guān)閉。
EA=0,關(guān)閉全部中斷。
-------,無效位。
ET2---定時器/計數(shù)器2中斷允許位。 EA總中斷開關(guān),置1為開;
ET2=1,打開T2中斷。 EX0為外部中斷0(INT0)開關(guān),……
ET2=0,關(guān)閉T2中斷。 ET0為定時器/計數(shù)器0(T0)開關(guān),……
ES---串行口中斷允許位。 EX1為外部中斷1(INT1)開關(guān),……
ES=1,打開串行口中斷。 ET1為定時器/計數(shù)器1(T1)開關(guān),……
ES=0,關(guān)閉串行口中斷。 ES為串行口(TX/RX)中斷開關(guān),……
ET1---定時器/計數(shù)器1中斷允許位。 ET2為定時器/計數(shù)器2(T2)開關(guān),……
ET1=1,打開T1中斷。
ET1=0,關(guān)閉T1中斷。
EX1---外部中斷1中斷允許位。
EX1=1,打開外部中斷1中斷。
EX1=0,關(guān)閉外部中斷1中斷。
ET0---定時器/計數(shù)器0中斷允許位。
ET0=1,打開T0中斷。
ET0=0,關(guān)閉T0中斷。
EX0---外部中斷0中斷允許位。
EX0=1,打開外部中斷0中斷。
EX0=0,關(guān)閉外部中斷0中斷。
中斷優(yōu)先級寄存器IP
位序號 | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
位地址 | --- | --- | --- | PS | PT1 | PX1 | PT0 | PX0 |
-------,無效位。
PS---串行口中斷優(yōu)先級控制位。
PS=1,串行口中斷定義為高優(yōu)先級中斷。
PS=0,串行口中斷定義為低優(yōu)先級中斷。
PT1---定時器/計數(shù)器1中斷優(yōu)先級控制位。
PT1=1,定時器/計數(shù)器1中斷定義為高優(yōu)先級中斷。
PT1=0,定時器/計數(shù)器1中斷定義為低優(yōu)先級中斷。
PX1---外部中斷1中斷優(yōu)先級控制位。
PX1=1,外部中斷1中斷定義為高優(yōu)先級中斷。
PX1=0,外部中斷1中斷定義為低優(yōu)先級中斷。
PT0---定時器/計數(shù)器0中斷優(yōu)先級控制位。
PT0=1,定時器/計數(shù)器0中斷定義為高優(yōu)先級中斷。
PT0=0,定時器/計數(shù)器0中斷定義為低優(yōu)先級中斷。
PX0---外部中斷0中斷優(yōu)先級控制位。
PX0=1,外部中斷0中斷定義為高優(yōu)先級中斷。
PX0=0,外部中斷0中斷定義為低優(yōu)先級中斷。
定時器/計數(shù)器工作模式寄存器TMOD
位序號 | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
位符號 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
|-----------------定時器1------------------------|--------------------定時器0----------------------|
GATE---門控制位。
GATE=0,定時器/計數(shù)器啟動與停止僅受TCON寄存器中TRX(X=0,1)來控制。
GATE=1,定時器計數(shù)器啟動與停止由TCON寄存器中TRX(X=0,1)和外部中斷引腳(INT0或INT1)上的電平狀態(tài)來共同控制。
C/T---定時器和計數(shù)器模式選擇位。
C/T=1,為計數(shù)器模式;C/T=0,為定時器模式。
M1M0---工作模式選擇位。
M1 | M0 | 工作模式 |
0 | 0 | 方式0,為13位定時器/計數(shù)器 |
0 | 1 | 方式1,為16位定時器/計數(shù)器 |
1 | 0 | 方式2,8位初值自動重裝的8位定時器/計數(shù)器 |
1 | 1 | 方式3,僅適用于T0,分成兩個8位計數(shù)器,T1停止工作 |
定時器/控制器控制寄存器TCON
位序號 | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
符號位 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
TF1---定時器1溢出標志位。
當定時器1記滿溢出時,由硬件使TF1置1,并且申請中斷。進入中斷服務(wù)程序后,由硬件自動清0。需要注意的是,如果使用定時器中斷,那么該位完全不用人為去操作,但是如果使用軟件查詢方式的話,當查詢到該位置1后,就需要用軟件清0。
TR1---定時器1運行控制位。
由軟件清0關(guān)閉定時器1。當GATE=1,且INIT為高電平時,TR1置1啟動定時器1;當GATE=0時,TR1置1啟動定時器1。
TF0---定時器0溢出標志,其功能及其操作方法同TF1。
TR0---定時器0運行控制位,其功能及操作方法同TR1。
IE1---外部中斷1請求標志。
當IT1=0時,位電平觸發(fā)方式,每個機器周期的S5P2采樣INT1引腳,若NIT1腳為定電平,則置1,否則IE1清0。
當IT1=1時,INT1為跳變沿觸發(fā)方式,當?shù)谝粋及其機器周期采樣到INIT1為低電平時,則IE1置1。IE1=1,表示外部中斷1正向CPU中斷申請。當CPU響應(yīng)中斷,轉(zhuǎn)向中斷服務(wù)程序時,該位由硬件清0。
IT1外部中斷1觸發(fā)方式選擇位。
IT1=0,為電平觸發(fā)方式,引腳INT1上低電平有效。
IT1=1,為跳變沿觸發(fā)方式,引腳INT1上的電平從高到低的負跳變有效。
IE0---外部中斷0請求標志,其功能及操作方法同IE1。
IT0---外部中斷0觸發(fā)方式選擇位,其功能及操作方法同IT1。
從上面的知識點可知,每個定時器都有4種工作模式,可通過設(shè)置TMOD寄存器中的M1M0位來進行工作方式選擇。
方式1的計數(shù)位數(shù)是16位,對T0來說,由TL0寄存器作為低8、TH0寄存器作為高8位,組成了16位加1計數(shù)器。
關(guān)于如何確定定時器T0的初值問題。定時器一但啟動,它便在原來的數(shù)值上開始加1計數(shù),若在程序開始時,我們沒有設(shè)置TH0和TL0,它們的默認值都是0,假設(shè)時鐘頻率為12MHz,12個時鐘周期為一個機器周期,那么此時機器周期為1us,記滿TH0和TL0就需要216 -1個數(shù),再來一個脈沖計數(shù)器溢出,隨即向CPU申請中斷。因此溢出一次共需65536us,約等于65.6ms,如果我們要定時50ms的話,那么就需要先給TH0和TL0裝一個初值,在這個初值的基礎(chǔ)上記50000個數(shù)后,定時器溢出,此時剛好就是50ms中斷一次,當需要定時1s時,我們寫程序時當產(chǎn)生20次50ms的定時器中斷后便認為是1s,這樣便可精確控制定時時間啦。要計50000個數(shù)時,TH0和TL0中應(yīng)該裝入的總數(shù)是65536-50000=15536.,把15536對256求模:15536/256=60裝入TH0中,把15536對256求余:15536/256=176裝入TL0中。
以上就是定時器初值的計算法,總結(jié)后得出如下結(jié)論:當用定時器的方式1時,設(shè)機器周期為TCY,定時器產(chǎn)生一次中斷的時間為t,那么需要計數(shù)的個數(shù)為N=t/TCY ,裝入THX和TLX中的數(shù)分別為:
THX=(65536-N)/256 , TLX=(65536-N)%256 <x為0或1>
中斷服務(wù)程序的寫法
void 函數(shù)名()interrupt 中斷號 using 工作組
{
中斷服務(wù)程序內(nèi)容
}
在寫單片機的定時器程序時,在程序開始處需要對定時器及中斷寄存器做初始化設(shè)置,通常定時器初始化過程如下:
(1)對TMOD賦值,以確定T0和 T1的工作方式。
(2)計算初值,并將初值寫入TH0、TL0或TH1、TL1。
(3)中斷方式時,則對IE賦值,開放中斷。
(4)使TR0和TR1置位,啟動定時器/計數(shù)器定時或計數(shù)。
例:利用定時器0工作方式1,實現(xiàn)一個發(fā)光管以1s亮滅閃爍。
程序代碼如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar num;
void main()
{
TMOD=0x01; //設(shè)置定時器0位工作模式1(M1,M0位0,1)
TH0=(65536-45872)/256; //裝初值11.0592M晶振定時50ms數(shù)為45872
TL0=(65536-45872)%256;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
while(1)
{
if(num==20) //如果到了20次,說明1秒時間
{
led1=~led1; //讓發(fā)光管狀態(tài)取反
num=0;
}
}
}
void T0_time()interrupt 1
{
TH0=(65536-45872)/256; //重新裝載初值
TL0=(65536-45872)%256;
num++;
}
擴展閱讀:51單片機的中斷系統(tǒng)
編輯:admin 最后修改時間:2019-07-31