C51單片機C語(yǔ)言函數編輯
三.中斷函數
中斷服務(wù)函數是編寫(xiě)單片機應用程序不可缺少的。中斷服務(wù)函數只有在中斷源請求響應
中斷時(shí)才會(huì )被執行,這在處理突發(fā)事件和實(shí)時(shí)控制是十分有效的。例如:電路中一個(gè)按鈕, 要求按鈕后 LED 點(diǎn)亮,這個(gè)按鈕何時(shí)會(huì )被按下是不可預知的,為了要捕獲這個(gè)按鈕的事件, 通常會(huì )有三種方法,一是用循環(huán)語(yǔ)句不斷的對按鈕進(jìn)行查詢(xún),二是用定時(shí)中斷在間隔時(shí)間內 掃描按鈕,三是用外部中斷服務(wù)函數對按鈕進(jìn)行捕獲。在這個(gè)應用中只有單一的按鈕功能, 那么第一種方式就能勝任了,程序也很簡(jiǎn)單,但是它會(huì )不停的在對按鈕進(jìn)行查詢(xún)浪費了
CPU 的時(shí)間。實(shí)際應用中一般都會(huì )還有其它的功能要求同時(shí)實(shí)現,這個(gè)時(shí)候能根據需要選用第 二或第三種方式,第三種方式占用的 CPU 時(shí)間最少,只有在有按鈕事件發(fā)生時(shí),中斷服務(wù)函 數才會(huì )被執行,其余的時(shí)間則是執行其它的任務(wù)。
如果你學(xué)習過(guò)匯編語(yǔ)言的話(huà),剛開(kāi)始寫(xiě)匯編的中斷應用程序時(shí),你一定會(huì )為出入堆棧的 問(wèn)題而困擾過(guò)。單片機c語(yǔ)言 語(yǔ)言擴展了函數的定義使它能直接編寫(xiě)中斷服務(wù)函數,你能不必考 慮出入堆棧的問(wèn)題,從而提高了工作的效率。擴展的關(guān)鍵字是 interrupt,它是函數定義時(shí) 的一個(gè)選項,只要在一個(gè)函數定義后面加上這個(gè)選項,那么這個(gè)函數就變成了中斷服務(wù)函數。
在后面還能加上一個(gè)選項 using,這個(gè)選項是指定選用 51 芯片內部 4 組工作寄存器中的
那個(gè)組。開(kāi)始學(xué)習者能不必去做工作寄存器設定,而由編譯器自動(dòng)選擇,避免產(chǎn)生不必要的錯 誤。定義中斷服務(wù)函數時(shí)能用如下的形式。
函數類(lèi)型 函數名 (形式參數) interrupt n [using n]
interrupt 關(guān)鍵字是不可缺少的,由它告訴編譯器該函數是中斷服務(wù)函數,并由后面的
n 指明所使用的中斷號。n 的取值范圍為 0-31,但具體的中斷號要取決于芯片的型號,像 AT89c51 實(shí)際上就使用 0-4 號中斷。每個(gè)中斷號都對應一個(gè)中斷向量,具體地址為 8n+3, 中斷源響應后處理器會(huì )跳轉到中斷向量所處的地址執行程序,編譯器會(huì )在這地址上產(chǎn)生一個(gè) 無(wú)條件跳轉語(yǔ)句,轉到中斷服務(wù)函數所在的地址執行程序。下表是 51 芯片的中斷向量和中 斷號。
表 9-1 AT89c51 芯片中斷號和中斷向量
使用中斷服務(wù)函數時(shí)應注意:中斷函數不能直接調用中斷函數;不能通過(guò)形參傳速參數; 在中斷函數中調用其它函數,兩者所使用的寄存器組應相同。限于篇幅其它與函數相關(guān)的知 識這里不能一一加以說(shuō)明,如變量的傳遞、存儲,局部變量、全部變量等,有興趣的朋友可 以訪(fǎng)問(wèn)筆者的網(wǎng)站 閱讀更多相關(guān)文章。
下面是簡(jiǎn)單的例子。首先要在前面做好的實(shí)驗電路中加多一個(gè)按鈕,接在 P3.2(12 引腳外 部中斷 INT0)和地線(xiàn)之間。把編譯好后的程序燒錄到芯片后,當接在 P3.2 引腳的按鈕接下 時(shí),中斷服務(wù)函數 Int0Demo 就會(huì )被執行,把 P3 當前的狀態(tài)反映到 P1,如按鈕接下后 P3.7
(之前有在這腳裝過(guò)一按鈕)為低,這個(gè)時(shí)候 P1.7 上的 LED 就會(huì )熄滅。放開(kāi) P3.2 上的按鈕后,
P1LED 狀態(tài)保持先前按下 P3.2 時(shí) P3 的狀態(tài)。
#include
unsigned char P3State(void); //函數的說(shuō)明,中斷函數不用說(shuō)明
void main(void)
{
IT0 = 0; //設外部中斷 0 為低電平觸發(fā)
EX0 = 1; //允許響應外部中斷 0
EA = 1; //總中斷開(kāi)關(guān)
while(1);
}
//外部中斷 0 演示,使用 2 號寄存器組
void Int0Demo(void) interrupt 0 using 2
{
unsigned int Temp; //定義局部變量
P1 = ~P3State(); //調用函數取得 p2 的狀態(tài)反相后并賦給 P1
for (Temp=0; Temp50; Temp++); //延時(shí) 這里只是演示局部變量的使用
}
//用于返回 P3 的狀態(tài),演示函數的使用
unsigned char P3State(void)
{
unsigned char Temp;
Temp = P3; //讀取 P3 的引腳狀態(tài)并保存在變量 Temp 中
//這樣只有一句語(yǔ)句實(shí)在沒(méi)必要做成函數,這里只是學(xué)習函數的基本使用方法
51單片機相關(guān)文章:51單片機教程
c語(yǔ)言相關(guān)文章:c語(yǔ)言教程
評論