0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

淺析單片機C語言函數(shù)之中斷函數(shù)

GReq_mcu168 ? 來源:未知 ? 作者:胡薇 ? 2018-07-18 16:56 ? 次閱讀

在開始寫中斷函數(shù)之前,我們來一起回顧一下,單片機的中斷系統(tǒng)。

中斷的意思(學習過微機原理與接口技術的同學,沒學過單片機,也應該知道),我們在這里就不講了,首先來回憶下中斷系統(tǒng)涉及到哪些問題。

(1)中斷源:中斷請求信號的來源。(8051有3個內(nèi)部中斷源T0,T1,串行口,2個外部中斷源INT0,INT1(這兩個低電平有效,上面的那個橫杠不知道怎么加上去))

(2)中斷響應與返回:CPU采集到中斷請求信號,怎樣轉(zhuǎn)向特定的中斷服務子程序,并在執(zhí)行完之后返回被中斷程序繼續(xù)執(zhí)行。期間涉及到CPU響應中斷的條件,現(xiàn)場保護,現(xiàn)場恢復。

(3)優(yōu)先級控制:中斷優(yōu)先級的控制就形成了中斷嵌套(8051允許有兩級的中斷嵌套,優(yōu)先權順序為INT0,T0,INT1,T1,串行口),同一個優(yōu)先級的中斷,還存在優(yōu)先權的高低。優(yōu)先級是可以編程的,而優(yōu)先權是固定的。

80C51的原則是①同優(yōu)先級,先響應高優(yōu)先權②低優(yōu)先級能被高優(yōu)先級中斷③正在進行的中斷不能被同一級的中斷請求或低優(yōu)先級的中斷請求中斷。

80C51的中斷系統(tǒng)涉及到的中斷控制有中斷請求,中斷允許,中斷優(yōu)先級控制

(1)3個內(nèi)部中斷源T0,T1,串行口,2個外部中斷源INT0,INT1

(2)中斷控制寄存器:定時和外中斷控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中斷允許寄存器IE,中斷優(yōu)先級寄存器IP

具體的是什么,包括哪些標志位,在這里不講了,所有書上面都會講。

在這里我們講下注意的事項

(1)CPU響應中斷后,TF0(T0中斷標志位)和TF1由硬件自動清0。

(2)CPU響應中斷后,在邊沿觸發(fā)方式下,IE0(外部中斷INT0請求標志位)和IE1由硬件自動清零;在電平觸發(fā)方式下,不能自動清楚IE0和IE1。所以在中斷返回前必須撤出INT0和INT1引腳的低電平,否則就會出現(xiàn)一次中斷被CPU多次響應。

(3)串口中斷中,CPU響應中斷后,TI(串行口發(fā)送中斷請求標志位)和RI(接收中斷請求標志位)必須由軟件清零。

(4)單片機復位后,TCON,SCON給位清零。

C51語言允許用戶自己寫中斷服務子程序(中斷函數(shù))

首先來了解程序的格式:

void 函數(shù)名() interrupt m [using n]

{}

關鍵字interrupt m [using n]表示這是一個中斷函數(shù)

m為中斷源的編號,有五個中斷源,取值為0,1,2,3,4,中斷編號會告訴編譯器中斷程序的入口地址,執(zhí)行該程序時,這個地址會傳個程序計數(shù)器PC,于是CPU開始從這里一條一條的執(zhí)行程序指令。

n為單片機工作寄存器組(又稱通用寄存器組)編號,共四組,取值為0,1,2,3

中斷號 中斷源0 外部中斷01 定時器02 外部中斷13 定時器1中斷4 串行口中斷

這5個中斷源的中斷入口地址為:(在上一篇文章中講到的ROM前43個存儲單元就是他們,這40個地址用來存放中斷處理程序的地址單元,每一個類中斷的存儲單元只有8B,顯然不是中斷處理的程序,而是存放著中斷處理程序的真正地址)

INT0:0003H 0

T0:000BH 1

INT1:0013H 2

T1: 001BH3

串口: 0023H 4

中斷向量(中斷入口地址)= 中斷號x8 +3

前面m意思很清楚,不同的m值表示這個函數(shù)是針對不同的中斷源,比如m為1是表示它是定時器0的中斷函數(shù),

如void time0() interrupt 1{}

那么后面的using n 又是什么意思呢?在正在執(zhí)行一個特定任務時,有更緊急的事情需要CPU來處理,涉及到中斷優(yōu)先權。高優(yōu)先權中斷低優(yōu)先權正在處理的程序,所以最好給每個優(yōu)先程序分配不同的寄存器組。

CPU正在處理某個事件,突然另外一個事件需要處理,于是進入中斷后,而你不想將現(xiàn)在執(zhí)行的程序的各寄存器狀態(tài)入棧,那么可以把這個中斷程序放入另一個寄存器組,如切換到1組,然后退出中斷時,再切回到0組(原來的程序在0組)。

為了更好的了解這里意思,你可以看看工作寄存器組的作用是什么。

下面的注意事項轉(zhuǎn)自網(wǎng)絡上其他朋友的文章(整理下,重復的去掉了,寫的非常好):

(1)中斷函數(shù)不能進行參數(shù)傳遞

(2)中斷函數(shù)沒有返回值

(3)在任何情況下都不能直接調(diào)用中斷函數(shù)

(4)中斷函數(shù)使用浮點運算要保存浮點寄存器的狀態(tài)。

(5)如果在中斷函數(shù)中調(diào)用了其它函數(shù),則被調(diào)用函數(shù)所使用的寄存器必須與中斷函數(shù)相同,被調(diào)函數(shù)最好設置為可重入的。

(6)C51編譯器對中斷函數(shù)編譯時會自動在程序開始和結束處加上相應的內(nèi)容,具體如下:在程序開始處對ACC、B、DPH、DPL和PSW入棧,結束時出棧。中斷函數(shù)未加using n修飾符的,開始時還要將R0~R1入棧,結束時出棧。如中斷函數(shù)加using n修飾符,則在開始將PSW入棧后還要修改PSW中的工作寄存器組選擇位。

(7)C51編譯器從絕對地址8m+3處產(chǎn)生一個中斷向量,其中m為中斷號,也即interrupt后面的數(shù)字。該向量包含一個到中斷函數(shù)入口地址的絕對跳轉(zhuǎn)。

(8)中斷函數(shù)最好寫在文件的尾部,并且禁止使用extern存儲類型說明。防止其它程序調(diào)用。

(9)在設計中斷時,要注意的是哪些功能應該放在中斷程序中,哪些功能應該放在主程序中。一般來說中斷服務程序應該做最少量的工作,這樣做有很多好處。首先系統(tǒng)對中斷的反應面更寬了,有些系統(tǒng)如果丟失中斷或?qū)χ袛喾磻龑a(chǎn)生十分嚴重的后果,這時有充足的時間等待中斷是十分重要的。其次它可使中斷服務程序的結構簡單,不容易出錯。中斷程序中放入的東西越多,他們之間越容易起沖突。簡化中斷服務程序意味著軟件中將有更多的代碼段,但可把這些都放入主程序中。中斷服務程序的設計對系統(tǒng)的成敗有至關重要的作用,要仔細考慮各中斷之間的關系和每個中斷執(zhí)行的時間,特別要注意那些對同一個數(shù)據(jù)進行操作的ISR.

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10768

    瀏覽量

    210417
  • 中斷函數(shù)

    關注

    0

    文章

    13

    瀏覽量

    5262

原文標題:單片機C語言函數(shù)之中斷函數(shù)(中斷服務程序)

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AVR單片機C語言

    AVR單片機C語言庫內(nèi)容目錄: .1. Character Type Functions - 字符類型函數(shù)2. Standard C In
    發(fā)表于 04-22 10:14 ?0次下載
    AVR<b class='flag-5'>單片機</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>庫

    51單片機C語言實例淺析

    目錄 序 第一章 C語言 第一節(jié) 為何《實例淺析》選擇 C語言作為 51 單片機開發(fā)
    發(fā)表于 03-14 12:29 ?961次下載

    STC單片機Keil中C語言函數(shù)定位的方法

    STC單片機Keil中C語言函數(shù)定位的方法:STC單片機Keil中C
    發(fā)表于 01-24 16:20 ?82次下載

    51單片機C語言延時函數(shù)怎么定義和使用

    C語言定義延時函數(shù)主要通過無意義指令的執(zhí)行來達到延時的目的。下面給出一個經(jīng)典的延時函數(shù)。C程序中可使用不同類型的變量來進行延時設計。經(jīng)實驗測
    發(fā)表于 11-16 17:06 ?8.4w次閱讀

    52單片機 測試實驗協(xié)議和C語言函數(shù)的詳細資料免費下載

    本文檔的主要內(nèi)容詳細介紹的是52單片機 測試實驗協(xié)議和C語言函數(shù)的詳細資料免費下載。
    發(fā)表于 09-26 17:40 ?13次下載
    52<b class='flag-5'>單片機</b> 測試實驗協(xié)議和<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>函數(shù)</b>的詳細資料免費下載

    單片機C語言中如何使用nop函數(shù)進行短延時的效果資料和程序說明

    單片機C語言中如何使用nop函數(shù)進行短延時的效果資料和程序說明 標準的C語言中沒有空語句。但在
    發(fā)表于 03-05 11:01 ?10次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>中如何使用nop<b class='flag-5'>函數(shù)</b>進行短延時的效果資料和程序說明

    C51單片機中斷函數(shù)的修飾方法

    C51中斷函數(shù)必須通過該修飾符進行修飾。在C51程序設計中,當函數(shù)定義時用了interruptm修飾符,系統(tǒng)編譯時把對應
    發(fā)表于 03-18 14:20 ?2603次閱讀
    <b class='flag-5'>C</b>51<b class='flag-5'>單片機</b><b class='flag-5'>中斷</b><b class='flag-5'>函數(shù)</b>的修飾方法

    如何在中斷C函數(shù)中調(diào)用C++

    之前,我們在單片機程序開發(fā)時都會面對中斷函數(shù)。眾所周知的,這個中斷函數(shù)肯定是要用C
    發(fā)表于 05-09 18:17 ?0次下載
    如何在<b class='flag-5'>中斷</b><b class='flag-5'>C</b><b class='flag-5'>函數(shù)</b>中調(diào)用<b class='flag-5'>C</b>++

    單片機中斷函數(shù)編寫方法

    C51中斷函數(shù)必須通過該修飾符進行修飾。在C51程序設計中,當函數(shù)定義時用了interrupt m修飾符,系統(tǒng)編譯時把對應
    發(fā)表于 08-24 10:40 ?7811次閱讀

    51單片機編程之中斷函數(shù)using關鍵字的作用

    51單片機編程之中斷函數(shù)using關鍵字的作用
    發(fā)表于 11-20 16:36 ?7次下載
    51<b class='flag-5'>單片機</b>編程<b class='flag-5'>之中斷</b><b class='flag-5'>函數(shù)</b>using關鍵字的作用

    51單片機之中斷

    51單片機之中斷(interrupt)
    發(fā)表于 11-20 16:51 ?13次下載
    51<b class='flag-5'>單片機</b><b class='flag-5'>之中斷</b>

    單片機 keil c語言字符比較函數(shù)的使用 使用strcmp();

    單片機 keil c語言字符比較函數(shù)的使用 使用strcmp();strcmp()的介紹、32單片機中的使用示例注意事項strcmp()的
    發(fā)表于 11-21 15:06 ?17次下載
    <b class='flag-5'>單片機</b> keil  <b class='flag-5'>c</b><b class='flag-5'>語言</b>字符比較<b class='flag-5'>函數(shù)</b>的使用 使用strcmp();

    STC單片機Keil中C語言函數(shù)定位的方法

    STC單片機Keil中C語言函數(shù)定位的方法
    發(fā)表于 08-29 10:07 ?2次下載

    單片機用按鈕中斷函數(shù)

    單片機用按鈕中斷函數(shù)? 單片機中斷是一種能夠使單片機響應外部信號的機制,這種機制允許
    的頭像 發(fā)表于 09-01 10:17 ?1391次閱讀

    中斷函數(shù)的基本概念

    單片機中斷函數(shù)
    的頭像 發(fā)表于 12-05 09:08 ?527次閱讀
    <b class='flag-5'>中斷</b><b class='flag-5'>函數(shù)</b>的基本概念