您的位置:網(wǎng)站首頁 > 電器維修資料網(wǎng) > 正文 >
C語言中斷處理過程
來源: 日期:2013-12-18 14:00:45 人氣:標(biāo)簽:
在單片機(jī)程序設(shè)計中,設(shè)置一個好的時鐘中斷,將能使一個cpu發(fā)揮兩個cpu的功效,大大方便和簡化程序的編制,提高系統(tǒng)的效率與可操作性。
我們可以把一些例行的及需要定時執(zhí)行的程序放在時鐘中斷中,還可以利用時鐘中斷協(xié)助主程序完成定時、延時等操作。
下面以6mhz時鐘的at89c51系統(tǒng)為例,說明時鐘中斷的應(yīng)用。
定時器初值與中斷周期:時鐘中斷無需過于頻繁,一般取20ms(50hz)即可。如需要百分之一秒的時基信號,可取10ms(100hz)。這里取20ms,用定時器t0工作于16位定時器方式(方式1)。t0的工作方式為:每過一個機(jī)器周期自動加1,當(dāng)計滿0ffffh,要溢出時,便會產(chǎn)生中斷,并由硬件設(shè)置相應(yīng)的標(biāo)志位供軟件查詢。即中斷時比啟動時經(jīng)過了n+1個機(jī)器周期。所以,我們只要在t0中預(yù)先存入一個比滿值0ffffh小n的數(shù),然后啟動定時器,便會在n個機(jī)器周期后產(chǎn)生中斷。這個值便是所謂的"初值"。下面計算我們需要的初值:時鐘為6mhz,12個時鐘周期為一個機(jī)器周期,20ms中有10000個機(jī)器周期。(10000)10=(2710)16,則 0ffffh-2710h+1=0d8f0h。由于響應(yīng)中斷、保護(hù)現(xiàn)場及重裝初值還需要7~8個機(jī)器周期,把這個值再加上7,即t0應(yīng)裝入的初值是0d8f7h。每次中斷進(jìn)入后,先把a(bǔ)及psw的值壓入堆棧,然后即把0d8f7h裝入t0。
設(shè)置一個單元,每次中斷加1,我們可以取內(nèi)部ram中一個單元,取名為incpi(increase per interrupt),在中斷中,裝完to初值后,用inc incpi指令將其加一。從這個單元中,無論中斷程序還是主程序,都可以從中獲得20ms的1~256之間任意整數(shù)倍的信號。例如:有一段向數(shù)碼管送顯的程序,需要每0.5秒執(zhí)行一次以便刷新顯示器,便可以設(shè)一單元(稱為等待單元)w_disp,用/mov a,incpi/add a,#25/mov w_disp,a/語句讓其比當(dāng)前的incpi值大25,然后在每次中斷中檢查是否于incpi值相等。若相等,說明已過了25個中斷周期,便執(zhí)行送顯程序,并且讓w_disp再加上25,等待下個0.5秒。我們可以設(shè)置多個等待單元,以便取出多個不同的時基信號。讓中斷程序在每次中斷時依次查詢各個等待單元是否與incpi相等,若相等,則執(zhí)行相應(yīng)的處理,并重新設(shè)置該等待單元的值,否則跳過。例如:用0.5秒信號刷新或閃爍顯示器,用1秒信號產(chǎn)生實時時鐘,或輸出一定頻率的方波,以一定間隔查詢輸入設(shè)備等。
在中斷中讀鍵:通常,我們在主程序中讀鍵盤,步驟為:掃描鍵盤,若有鍵按下,則延時幾十毫秒去抖動,再次確認(rèn)此鍵確實按下,然后處理該鍵對應(yīng)的工作,完成后再次重上述步驟。但這有兩點不足:1.處理相應(yīng)工作時無法鎖存按鍵的輸入,即可能漏鍵。2.延時去抖時cpu無法做其它事情,效率不高。如果把讀鍵放入時鐘中斷中,則可避免上述不足。方法為:如果兩次相鄰的中斷中都讀到同一個鍵按下,則這個鍵是有效的(達(dá)到了去抖目的),并將其鎖存到先入先出(隊列)的鍵盤緩沖區(qū),等主程序來處理。這樣,主程序處理按鍵的同時,仍可響應(yīng)鍵盤的輸入。緩沖區(qū)深度通常可設(shè)為8級,若鎖存的鍵數(shù)多于8個,則忽略新的按鍵,并報警提示用戶新的按鍵將無效。若鍵盤緩沖隊列停滯的時間大大長于主程序處理按鍵所需要的 大時間,說明主程序已出錯或跑飛,可以在中斷用指令將系統(tǒng)復(fù)位,起到了看門狗的目的。
主程序中的延時:由于有常開的時鐘中斷,所以當(dāng)主程序中有需要時間較短、精度較高的延時時,應(yīng)暫時把時鐘中斷關(guān)閉。而程序中需要時間較長、精度不高的延時時,便可仿照下需的寫法,避免多層嵌套的循環(huán)延時。
c51編譯器支持在c源程序中直接開發(fā)中斷過程,因此減輕了使用匯編語言的繁瑣工作,提高了開發(fā)效率。中、斷服務(wù)函數(shù)的完整語法如下:
其中n(o~31)代表中斷號。c51編譯器允許32個中斷,具體使用哪個中斷由80c51系列的芯片決定。r(o~3)代表第r組寄存器。在調(diào)用中斷函數(shù)時,要求中斷過程調(diào)用的函數(shù)所使用的寄存器組必須與其相同。"再入"用于說明中斷處理函數(shù)有無”再入“能力。
c51編譯器及其對c語言的擴(kuò)充允許編程者對中斷所有方面的控制和寄存器組的使用。這種支持能使編程者創(chuàng)建高效的中斷服務(wù)程序,用戶只須在c語言下關(guān)心中斷和必要的寄存器組切換操作。下面通過舉一個簡單的例子,讓大家了解一下c51編中斷程序的方法。
例:設(shè)單片機(jī)的fosc=12mhz,要求用t0的方式1編程,在p1.o腳輸出周期為2ms的方波。
從上看出,要靈活地應(yīng)用時鐘中斷,將任務(wù)合理分配給中斷和主程序,并且二者要分工明確,接口簡單。這其中的技巧還需要大家在實踐中多多摸索與體會。另外要注意:應(yīng)盡量縮短中斷處理程序的執(zhí)行時間,更不要長于20ms。另外需要注意的一點就是在編寫中斷服務(wù)程序時必須注意不能進(jìn)行參數(shù)傳遞,不能有返回值。
【看看這篇文章在百度的收錄情況】
相關(guān)文章
- 上一篇: C語言程序設(shè)計的基本技巧
- 下一篇: C語言與匯編語言程序的混合編程