<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)C語言教程:C51函數(shù)

          單片機(jī)C語言教程:C51函數(shù)

          作者: 時(shí)間:2013-03-04 來源:網(wǎng)絡(luò) 收藏

          三.中斷

          中斷服務(wù)是編寫應(yīng)用程序不可缺少的。中斷服務(wù)只有在中斷源請求響應(yīng)

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

          CPU 的時(shí)間。實(shí)際應(yīng)用中一般都會還有其它的功能要求同時(shí)實(shí)現(xiàn),這個(gè)時(shí)候能根據(jù)需要選用第 二或第三種方式,第三種方式占用的 CPU 時(shí)間最少,只有在有按鈕事件發(fā)生時(shí),中斷服務(wù)函 數(shù)才會被執(zhí)行,其余的時(shí)間則是執(zhí)行其它的任務(wù)。

          如果你學(xué)習(xí)過匯編的話,剛開始寫匯編的中斷應(yīng)用程序時(shí),你一定會為出入堆棧的 問題而困擾過。c 擴(kuò)展了函數(shù)的定義使它能直接編寫中斷服務(wù)函數(shù),你能不必考 慮出入堆棧的問題,從而提高了工作的效率。擴(kuò)展的關(guān)鍵字是 interrupt,它是函數(shù)定義時(shí) 的一個(gè)選項(xiàng),只要在一個(gè)函數(shù)定義后面加上這個(gè)選項(xiàng),那么這個(gè)函數(shù)就變成了中斷服務(wù)函數(shù)。

          在后面還能加上一個(gè)選項(xiàng) using,這個(gè)選項(xiàng)是指定選用 51 芯片內(nèi)部 4 組工作寄存器中的

          那個(gè)組。開始學(xué)習(xí)者能不必去做工作寄存器設(shè)定,而由編譯器自動選擇,避免產(chǎn)生不必要的錯(cuò) 誤。定義中斷服務(wù)函數(shù)時(shí)能用如下的形式。

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

          interrupt 關(guān)鍵字是不可缺少的,由它告訴編譯器該函數(shù)是中斷服務(wù)函數(shù),并由后面的

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

          表 9-1 AT89c51 芯片中斷號和中斷向量
           AT89c51 芯片中斷號和中斷向量

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

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

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

          P1LED 狀態(tài)保持先前按下 P3.2 時(shí) P3 的狀態(tài)。

          #include

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

          void main(void)

          {

          IT0 = 0; //設(shè)外部中斷 0 為低電平觸發(fā)

          EX0 = 1; //允許響應(yīng)外部中斷 0

          EA = 1; //總中斷開關(guān)

          while(1);

          }

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

          void Int0Demo(void) interrupt 0 using 2

          {

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

          P1 = ~P3State(); //調(diào)用函數(shù)取得 p2 的狀態(tài)反相后并賦給 P1

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

          }

          //用于返回 P3 的狀態(tài),演示函數(shù)的使用

          unsigned char P3State(void)

          {

          unsigned char Temp;

          Temp = P3; //讀取 P3 的引腳狀態(tài)并保存在變量 Temp 中

          //這樣只有一句語句實(shí)在沒必要做成函數(shù),這里只是學(xué)習(xí)函數(shù)的基本使用方法

          return Temp;

          }


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();