新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C51單片機C語言函數編輯

        C51單片機C語言函數編輯

        作者: 時間:2014-01-10 來源:網絡 收藏

        三.中斷函數

        中斷服務函數是編寫應用程序不可缺少的。中斷服務函數只有在中斷源請求響應

        中斷時才會被執行,這在處理突發事件和實時控制是十分有效的。例如:電路中一個按鈕, 要求按鈕后 LED 點亮,這個按鈕何時會被按下是不可預知的,為了要捕獲這個按鈕的事件, 通常會有三種方法,一是用循環語句不斷的對按鈕進行查詢,二是用定時中斷在間隔時間內 掃描按鈕,三是用外部中斷服務函數對按鈕進行捕獲。在這個應用中只有單一的按鈕功能, 那么第一種方式就能勝任了,程序也很簡單,但是它會不停的在對按鈕進行查詢浪費了

        CPU 的時間。實際應用中一般都會還有其它的功能要求同時實現,這個時候能根據需要選用第 二或第三種方式,第三種方式占用的 CPU 時間最少,只有在有按鈕事件發生時,中斷服務函 數才會被執行,其余的時間則是執行其它的任務。

        如果你學習過匯編語言的話,剛開始寫匯編的中斷應用程序時,你一定會為出入堆棧的 問題而困擾過。c語言 語言擴展了函數的定義使它能直接編寫中斷服務函數,你能不必考 慮出入堆棧的問題,從而提高了工作的效率。擴展的關鍵字是 interrupt,它是函數定義時 的一個選項,只要在一個函數定義后面加上這個選項,那么這個函數就變成了中斷服務函數。

        在后面還能加上一個選項 using,這個選項是指定選用 51 芯片內部 4 組工作寄存器中的

        那個組。開始學習者能不必去做工作寄存器設定,而由編譯器自動選擇,避免產生不必要的錯 誤。定義中斷服務函數時能用如下的形式。

        函數類型 函數名 (形式參數) interrupt n [using n]

        interrupt 關鍵字是不可缺少的,由它告訴編譯器該函數是中斷服務函數,并由后面的

        n 指明所使用的中斷號。n 的取值范圍為 0-31,但具體的中斷號要取決于芯片的型號,像 AT89c51 實際上就使用 0-4 號中斷。每個中斷號都對應一個中斷向量,具體地址為 8n+3, 中斷源響應后處理器會跳轉到中斷向量所處的地址執行程序,編譯器會在這地址上產生一個 無條件跳轉語句,轉到中斷服務函數所在的地址執行程序。下表是 51 芯片的中斷向量和中 斷號。

        表 9-1 AT89c51 芯片中斷號和中斷向量
        C51單片機C語言函數編輯

        使用中斷服務函數時應注意:中斷函數不能直接調用中斷函數;不能通過形參傳速參數; 在中斷函數中調用其它函數,兩者所使用的寄存器組應相同。限于篇幅其它與函數相關的知 識這里不能一一加以說明,如變量的傳遞、存儲,局部變量、全部變量等,有興趣的朋友可 以訪問筆者的網站 閱讀更多相關文章。

        下面是簡單的例子。首先要在前面做好的實驗電路中加多一個按鈕,接在 P3.2(12 引腳外 部中斷 INT0)和地線之間。把編譯好后的程序燒錄到芯片后,當接在 P3.2 引腳的按鈕接下 時,中斷服務函數 Int0Demo 就會被執行,把 P3 當前的狀態反映到 P1,如按鈕接下后 P3.7

        (之前有在這腳裝過一按鈕)為低,這個時候 P1.7 上的 LED 就會熄滅。放開 P3.2 上的按鈕后,

        P1LED 狀態保持先前按下 P3.2 時 P3 的狀態。

        #include

        unsigned char P3State(void); //函數的說明,中斷函數不用說明

        void main(void)

        {

        IT0 = 0; //設外部中斷 0 為低電平觸發

        EX0 = 1; //允許響應外部中斷 0

        EA = 1; //總中斷開關

        while(1);

        }

        //外部中斷 0 演示,使用 2 號寄存器組

        void Int0Demo(void) interrupt 0 using 2

        {

        unsigned int Temp; //定義局部變量

        P1 = ~P3State(); //調用函數取得 p2 的狀態反相后并賦給 P1

        for (Temp=0; Temp50; Temp++); //延時 這里只是演示局部變量的使用

        }

        //用于返回 P3 的狀態,演示函數的使用

        unsigned char P3State(void)

        {

        unsigned char Temp;

        Temp = P3; //讀取 P3 的引腳狀態并保存在變量 Temp 中

        //這樣只有一句語句實在沒必要做成函數,這里只是學習函數的基本使用方法

        51單片機相關文章:51單片機教程


        c語言相關文章:c語言教程



        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 平武县| 古丈县| 永寿县| 贵德县| 临海市| 米泉市| 马边| 闻喜县| 普陀区| 长海县| 柯坪县| 梁平县| 固始县| 丽水市| 宁晋县| 称多县| 郎溪县| 天等县| 商河县| 孝昌县| 敦化市| 托克逊县| 舞钢市| 巩留县| 长治市| 乐陵市| 资源县| 城固县| 和政县| 巩留县| 安康市| 甘泉县| 武定县| 隆昌县| 松滋市| 柘荣县| 临漳县| 伽师县| 安乡县| 黄梅县| 正定县|