認(rèn)識中斷
什么是中斷拍屑,中斷的概念很簡單,我們從一個生活中的例程引入坑傅。你正在家中看書僵驰,突然電話鈴響了,你放下書本裁蚁,去接電話矢渊,和來電話的人交談,然后放下電話枉证,回來繼續(xù)看你的書。這就是生活中的“中斷”的現(xiàn)象移必,就是正常的工作過程被外部的事件打斷了室谚。仔細(xì)研究一下生活中的中斷,對于我們學(xué)習(xí)單片機的中斷也很有好處崔泵。
了解中斷結(jié)構(gòu)
我們先來了解了解51單片機的中斷原理秒赤。引起CPU中斷的根源稱為中斷源,中斷源向CPU 發(fā)出中斷請求憎瘸,CPU暫時中斷原來的事件A入篮,轉(zhuǎn)去處理事件B,對事件B處理完后幌甘,再轉(zhuǎn)過來繼續(xù)處理事件A的過程潮售。實現(xiàn)上述中斷功能的部件稱為中斷系統(tǒng)痊项。
除了單個中斷,還有多個中斷的概念酥诽,那就是中斷嵌套鞍泉,意思是說:如果單片機正在處理一個中斷程序時,此時肮帐,另一個中斷產(chǎn)生了咖驮,單片機將會停止當(dāng)前的中斷程序,當(dāng)新的中斷處理完后再回到剛停止的中斷程序出繼續(xù)執(zhí)行中斷训枢,執(zhí)行完這個中斷后托修,回到這個主程序繼續(xù)執(zhí)行。當(dāng)然中斷還有自己的中斷優(yōu)先級恒界,優(yōu)先級高的優(yōu)先執(zhí)行中斷诀黍,在單片機內(nèi)部有一個特殊的功能寄存器——中斷優(yōu)先級寄存器,通過設(shè)置中斷的優(yōu)先級仗处,當(dāng)兩個中斷同時出現(xiàn)時先執(zhí)行那個中斷程序眯勾。
而單片機的中斷的啟動和停止是由單片機內(nèi)部的一些特殊功能寄存器決定,后面我們在講如何通過寄存器的代碼編寫來控制中斷程序的啟動與停止婆誓。
51單片機5個中斷源的符號吃环、名稱及產(chǎn)生的條件如下。
INT0:外部中斷0洋幻,由P3.2端口線引入郁轻,低電平或下跳沿引起。
INT1:外部中斷1文留,由P3.3端口線引入好唯,低電平或下跳沿引起。
T0:定時器/計數(shù)器0中斷燥翅,由T0計滿回零引起骑篙。
T1:定時器/計數(shù)器l中斷,由T1計滿回零引起森书。
TI/RI:串行I/O中斷靶端,串行端口完成一幀字符發(fā)送/接收后引起。
52單片機多一個T2:定時器/計數(shù)器l中斷凛膏,由T1計滿回零引起
今天會用到T0和T1這兩個定時器
那么中斷和我們要講的定時器有什么關(guān)系呢杨名?關(guān)系大著呢
既然我們了解了中斷是怎么一回事了,那么接下來我們廢話少說猖毫,直接進(jìn)入今天的主題台谍,先來說說幾個特殊功能寄存器
中斷允許寄存器
在這里我就不一一說每一位了,想要了解的可以去找一下資料吁断,今天我們主要講幾個與定時器有關(guān)的位就行了
EA —全局中斷允許位
當(dāng)EA=1時為打開全局中斷控制
當(dāng)EA=0時為關(guān)閉全局中斷控制
ET1—定時器/計數(shù)器1中斷允許位
當(dāng)ET1=1時打開定時器/計數(shù)器T1
當(dāng)ET1=0時關(guān)閉定時器/計數(shù)器T1
ET0—定時器/計數(shù)器0中斷允許位
當(dāng)ET0=1時打開定時器/計數(shù)器T0
當(dāng)ET0=0時關(guān)閉定時器/計數(shù)器T0
注意一下ET0和ET1是兩個定時器/計數(shù)器
還有一個中斷優(yōu)先級寄存器我們就不講了趁蕊,這次沒用到不到
51單片機內(nèi)部共有兩個16位可編程的定時器/計數(shù)器坞生,由高8位和低8位組成,也稱加1計數(shù)器介衔,其有兩個計數(shù)脈沖來源恨胚,分別為外部和內(nèi)部脈沖,這里不做解析炎咖,可以去查找一下資料赃泡,接下來我們再講兩個寄存器
定時器/計數(shù)器工作方式寄存器TMOD
c/T定時器模式和計數(shù)器模式
c/T=1計數(shù)器模式
c/T=0定時器模式
M1M0工作方式
M1=0 ,M0=0 方式0,為13位定時器/計數(shù)器
M1=0,M0=01方式2乘盼,為16位定時器/計數(shù)器
M1=1 ,M0=0 方式3升熊,8位初值自動重裝的8位定時器/計數(shù)器
M1=1 ,M0=1 方式4,僅適用于T0绸栅,分成兩個8位定時器/計數(shù)器
定時器/計數(shù)器控制寄存器TCON
TCON 寄存器用來控制定時器的啟级野、停和溢出,當(dāng)發(fā)生溢出時粹胯,此時計數(shù)已滿蓖柔,就會去觸發(fā)啟動中斷
說幾個內(nèi)部中斷位
TF1定時器1溢出標(biāo)志:當(dāng)計數(shù)器1計滿數(shù)溢出時,硬件會把TF1置為1风纠,并請求進(jìn)入中斷况鸣,此時程序會進(jìn)入中斷函數(shù)去執(zhí)行相應(yīng)功能,中斷結(jié)束后竹观,硬件會把TF1置為0镐捧,計數(shù)器就會重新計數(shù),當(dāng)再次溢出時再次進(jìn)入中斷程序臭增,除非停止或結(jié)束懂酱,不然會一直發(fā)生
TF0為定時器0的溢出標(biāo)志:其功能跟TF1一樣
TR1為定時器1運行控制位:用于啟動和關(guān)閉定時器1
TR0為定時器0運行控制位:用于啟動和關(guān)閉定時器0
好了定時器的構(gòu)造和原理就講到這,接下來我們通過代碼進(jìn)行分析解說
`
#include<reg52.h>
sbit led=P1^1; //聲明一個用于測試的led燈
unsigned char number;
void main()
{
led=0;
TMOD=0x01; //聲明定時器的工作方式M1=0誊抛,M0=1
//裝入初始值列牺,即計滿所裝的數(shù)時,就會溢出
TH0=(65536-45872)/256;
TL0=(65536-45872)/256;
EA=1; //開啟全局中斷允許
ET0=1; //開啟定時器0中斷允許
TR0=1; //開啟定時器0
while(1); //讓程序一直循環(huán)下去芍锚,中斷也不斷產(chǎn)生
}
//中斷函數(shù)
void T_Time() interrupt 2
{
TH0=(65536-45872)/256;//重裝初值
TL0=(65536-45872)/256;
number++;
if(number==20) //當(dāng)number=20時昔园,即為1s
{
number=0; //把number置0,重新計數(shù)
led=~led; //使led燈每隔1s亮一次
}
}
通過上述函數(shù)分析可知其過程為:我們先給設(shè)定我們所需要的時間(即TH和TL的初值)并炮,通過一些寄存器的位來設(shè)定啟動定時器,當(dāng)單片機晶振每傳來一個脈沖甥郑,TH0和TL0的兩個8位寄存器逃魄,低位就會加1,當(dāng)?shù)臀粷M了后向高位加1澜搅,當(dāng)兩個8位都滿時伍俘,再輸入一個脈沖就會使其溢出邪锌,此時,TCON寄存器中的TF1或TF0癌瘾,看你用哪個定時器觅丰,就會置1,并觸發(fā)請求中斷妨退,然后進(jìn)入到中斷函數(shù)去執(zhí)行相應(yīng)的操作妇萄,執(zhí)行完后,返回繼續(xù)執(zhí)行中斷前的程序咬荷,以此類推冠句,如果沒有停止都將會一直下去