c51中斷函數(shù)的介紹
成都創(chuàng)新互聯(lián)專注于企業(yè)營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、崇明網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為崇明等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
C51編譯器允許用c51創(chuàng)建中斷服務(wù)程序,大家僅僅需要關(guān)心中斷號(hào)和寄存器組的選擇就可以了。編譯器自動(dòng)產(chǎn)生中斷向量和程序的入棧及出棧代碼。在函數(shù)聲明時(shí)包括interrupt,將把所聲明的函數(shù)定義為一個(gè)中斷服務(wù)程序。另外,可以用using定義此中斷服務(wù)程序所使用的寄存器組。
一、中斷函數(shù)的定義
1、中斷函數(shù)定義的格式為:
函數(shù)類型 函數(shù)名 interrupt n using n
其中:
Interrupt后面的n是中斷號(hào)。
關(guān)鍵字using后面的n是所選擇的寄存器組,取值范圍是0-3.
定義中斷函數(shù)時(shí),using是一個(gè)選項(xiàng),可以省略不用。如果不用則由編譯器選擇一個(gè)寄存器組作為絕對(duì)寄存器組。
2、8051的中斷過(guò)程通過(guò)使用interrupt關(guān)鍵字和中斷號(hào)來(lái)實(shí)現(xiàn),中斷號(hào)告訴編譯器中斷程序的入口地址。中斷號(hào)對(duì)應(yīng)著IE寄存器中的使能位,換句話說(shuō),IE寄存器中的0位對(duì)應(yīng)著外部中斷0,相應(yīng)的外部中斷0的中斷號(hào)是0.
IE寄存器中的使能位與外部中斷對(duì)應(yīng)關(guān)系:
中斷號(hào) 中斷源
0 外部中斷0
1 定時(shí)器0
2 外部中斷1
3 定時(shí)器1中斷
4 串行口中斷
5 定時(shí)器2中斷
二、使用中斷函數(shù)時(shí)要注意的問(wèn)題:
1. 在設(shè)計(jì)中斷時(shí),要注意的是哪些功能應(yīng)該放在中斷程序中,哪些功能應(yīng)該放在主程序中。一般來(lái)說(shuō)中斷服務(wù)程序應(yīng)該做最少量的工作,這樣做有很多好處。首先系統(tǒng)對(duì)中斷的反應(yīng)面更寬了,有些系統(tǒng)如果丟失中斷或?qū)χ袛喾磻?yīng)太慢將產(chǎn)生十分嚴(yán)重的后果,這時(shí)有充足的時(shí)間等待中斷是十分重要的。其次它可使中斷服務(wù)程序的結(jié)構(gòu)簡(jiǎn)單,不容易出錯(cuò)。
中斷程序中放入的東西越多,他們之間越容易起沖突。簡(jiǎn)化中斷服務(wù)程序意味著軟件中將有更多的代碼段,但可把這些都放入主程序中。中斷服務(wù)程序的設(shè)計(jì)對(duì)系統(tǒng)的成敗有至關(guān)重要的作用,要仔細(xì)考慮各中斷之間的關(guān)系和每個(gè)中斷執(zhí)行的時(shí)間,特別要注意那些對(duì)同一個(gè)數(shù)據(jù)進(jìn)行操作的ISR.
2. 中斷函數(shù)不能傳遞參數(shù)。
3. 中斷函數(shù)沒(méi)有返回值。
4. 中斷函數(shù)調(diào)用其他函數(shù),則要保證使用相同的寄存器組,否則出錯(cuò)。
5. 中斷函數(shù)使用浮點(diǎn)運(yùn)算要保存浮點(diǎn)寄存器的狀態(tài)。
對(duì)于C51單片機(jī),其內(nèi)部總共有五級(jí)中斷源
分別為外部中斷0、定時(shí)器0、外部中斷1、定時(shí)器1及串行中斷。
C51單片機(jī)的中斷使用時(shí),主要是通過(guò)中斷來(lái)決定的。
如你定義一個(gè)中斷服務(wù)函數(shù):
void KEY(void) intterrupt 0
{
}
當(dāng)外部中斷0申請(qǐng)中斷時(shí)
會(huì)自動(dòng)根據(jù)interrupt后面的0,找到上面定義的這個(gè)中斷服務(wù)函數(shù)。
對(duì)于其他四個(gè)中斷源,其對(duì)應(yīng)的中斷號(hào)分別為1、2 、3、4
三個(gè):
1.總中斷使能位EA=1
2.相應(yīng)中斷使能 (ET0、EX0……) 打開
3.中斷源:外部中斷引腳的電平觸發(fā)、定時(shí)器溢出……
oid PxInt0(void) interrupt 0 //定義外部中斷0
void PxInt1(void) interrupt 2 //定義外部中斷1
void time0_int(void) interrupt 1 //定義定時(shí)器0
void time1_int(void) interrupt 3 //定義定時(shí)器1
這里為什么是 0 1 2 3的順序呢~?其實(shí)是單片機(jī)內(nèi)部默認(rèn)的,順序依次是:
0 外部中斷0
1 定時(shí)/計(jì)數(shù)器0
2 外部中斷1
3 定時(shí)/計(jì)數(shù)器1
4 串行口中斷
這個(gè)是沒(méi)有什么理由的,記住就行,以后要定義一個(gè)中斷的時(shí)候,定義的是哪一個(gè),就在后面加上它的序號(hào)就行了,比如void PxInt0(void) interrupt 0 表示外部中斷0,就在后面加上interrupt 0.
逐詞解釋的話。。。如:void PxInt0(void) interrupt 0
void的意思是沒(méi)有返回值,Pxint0(void)是你定義的函數(shù)名,interrupt表示你定義的是中斷函數(shù),0表示你定義的是外部中斷0
后面的依此類推。
另外,中斷函數(shù)不需要在main函數(shù)前聲明,當(dāng)單片機(jī)檢測(cè)到中斷所需的信號(hào)時(shí),它會(huì)自動(dòng)立即停止正在進(jìn)行的工作進(jìn)入中斷函數(shù)。