在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

學習C51單片機中斷功能的使用

CHANBAEK ? 來源:Zi Jin Code ? 作者: 錕醬不是醬 ? 2023-11-01 11:28 ? 次閱讀

前面我們學習了定時器的簡單用法,并且設計了幾個有趣的小項目

今天我們學習進階操作——中斷

1 認識中斷

一個生活的小場景……

你拿著手機,屏幕上顯示著Zi Jin Code的最新文章,一旁的藍牙音響播放著悠揚的古風音樂……目不轉睛之刻,朋友給你打來一個電話……你調小了藍牙音箱的音量,接起了電話,你聊得正歡時,門外傳來敲門聲,班主任來了……

相信這樣的場景,你應該也遇到不少,我們常常正在做一件事情,突然另一件事冒出來打斷我們,讓我們不得不趕快去處理這件事

事實上,單片機的世界里,這樣的事件比比皆是。舉個最簡單的例子,在一個秒表電路中,單片機一直輸出數碼管掃描顯示,這時候定時器溢出了,單片機不得不先放下手中的活,去處理時器溢出的操作,處理完后又返回到剛剛停下來的位置繼續來執行輸出顯示的操作。這個過程中,單片機放下輸出顯示的任務,先跑去執行定時器溢出的一些操作,就是一次中斷的過程,用圖表示如下

圖片

單片機正常執行程序的過程中,一個特殊的事件讓單片機停下現在正在執行的任務,跳轉去處理這個事件的任務,處理完之后再返回到剛剛停下來的地方,繼續執行最初放下來的任務,這個過程就叫中斷,觸發的這個事件叫做中斷源

到此,相信我們已經初步了解中斷的過程,思考以下,那之前我們寫的代碼(如下)是使用了定時器中斷嗎

#include< reg52.h >
sbit LED = P1^0;//LED接在P1.0
unsigned char Counter = 0;//溢出次數記錄
void main()
{
  TH0 = 0x00;
  TL0 = 0x00;
  TR0 = 1;//Timer0初始值設置,使能定時器
  LED = 1;//初始化LED引腳電平值
  while(1)
  {
    if(TF0 == 1)
    {
       Counter++;//定時器溢出次數++
       TH0 = 0x00;//溢出以后要對定時器進行簡單的重新裝載初始值
       TL0 = 0x00;
       TF0 = 0;//重新設置定時器溢出位的數值
     } 
     if(counter == 256)//定時器累計溢出256次
     {
      Counter = 0;//復位
      LED = !LED;//LED電平取反
     }
  }
}

從程序運行流程分析,這并不是一個中斷

我們的程序運行到while(1)的時候就進入我們設計的死循環,在這個死循環中有兩個任務,第一個是判斷Timer0有沒有溢出以及如果溢出后的操作,第二個是判斷定時器溢出次數是否累計達到我們的需求。

這個代碼中,只有執行到if(TF0==0)的時候才會執行判斷定時器是否溢出,倘若我們的程序執行到if(Counter==256)的代碼的時候定時器已經溢出,那么機器也會繼續執行完這個if的語句,直到再次執行到if(TF0==0)才會對timer溢出做出處理。顯然不是定時器中斷

這種使用定時器的優點是代碼簡單,而且應對簡單的定時器任務的時候可以簡潔的代碼完成任務(比如說一秒點亮一個led燈),但是應對稍微復雜的任務(例如做一個單片機電子時鐘,只有執行到判斷Timer溢出的代碼才做出判斷,這樣就可能發生定時不準確的問題了)

至此,希望你跟我一樣,也明白了定時器和中斷不是一回事,也希望大家不要把定時器和中斷搞混

2 中斷使用第一步, 中斷的分類,認識中斷源

C51中的中斷,可以這樣分類

中斷符號中斷名稱作用
IE0外部中斷0對應外部中斷INT0
IE1外部中斷1對應外部中斷INT1
T0Timer0中斷定時器溢出后觸發的中斷
T1Timer1中斷
T2Timer2中斷
ESuart串口中斷串口中斷

不難發現,按照功能分,一共有三類:

Timer中斷,當定時器溢出的時候觸發這個中斷

外部中斷,C51提供兩組外部中斷,當外部中斷引腳的電平變化的時候觸發中斷

圖片

分別是外部中斷0,對應INT0,在P3.2引腳

分別是外部中斷0,對應INT1,在P3.3引腳

串口中斷

圖片

串口中斷等到我們使用串口的時候再介紹,這里先放一放。

在單片機中,凡是能觸發中斷信號就叫中斷源,以上的定時器,外部中斷,串口都是中斷源。

換句話說,就是這些信號觸發了單片機的中斷。

3 中斷使用第二步,打開中斷

中斷使能寄存器,地址0xA8,可位尋址

符號復位值功能說明操作說明
7EA0總中斷使能開關EA = 1使能中斷總開關
6-0--
5ET20Timer2中斷使能開關寫1的時候啟用中斷,寫0的時候不使用中斷
4ES0串口中斷使能
3ET10Timer1中斷使能
2EX10外部中斷INT1使能
1ET00Timer0中斷使能
0EX00外部中斷INT0使能

下面說明一下,假設我們要使用Timer0中斷,需要這樣操作:

EA = 1;//中斷總使能開關
//現在先對中斷使能,確保我們能使用中斷


ET0 = 1;//使能timer0中斷

4 中斷使用第三步,認識外部中斷

前面我們知道了,C51的外部中斷INT0,INT1和串口中斷ES分別在P3.2,P3.3,P3.1。這里我們先不介紹串口中斷,我們介紹兩個外部中斷INT0和INT1,串口中斷我們學串口的時候再研究。

還記得我們之前學習定時器的時候提到的TCON寄存器嗎

TCON寄存器

符號功能描述操作復位值
7TF1Timer1溢出檢測定時器中斷標志0
6TR1Timer1使能TR1=1開啟定時器,寫0關閉定時器0
5TF0Timer0溢出檢測定時器中斷標志0
4TR0Timer0使能TR0=1開啟定時器,寫0關閉定時器0
3IE1INT1外部中斷請求標志請求標識,值為1的時候表明中斷向機器請求中斷。機器響應后,自動寫00
2IT1INT1中斷觸發設置外部中斷觸發模式設置0
1IE0INT0外部中斷請求標志請求標識,值為1的時候表明中斷向機器請求中斷。機器響應后,自動寫00
0IT0INT0中斷觸發設置外部中斷觸發模式設置0

上次我們沒有介紹低四位的功能,這回我們詳細的介紹一下:

首先,IE1,IT1屬于外部中斷1,也就是外部中斷INT1。IE0,IT0屬于外部中斷0,也就是外部中斷INT0。

相信這點不難理解,接下來介紹IE,IT的功能

IE是外部中斷請求標識,當外部中斷被觸發的時候,IE會變成1,表示外部中斷在向CPU請求中斷。當CPU響應這個外部中斷的時候,IE會自動變成0。所以,IE就是用于中斷請求的標識,一般使用的時候我們不用操作這一位寄存器

IT是中斷觸發方式,一共有兩種觸發方式

觸發方式說明IT設置值
低電平觸發當外部中斷引腳電平為低電平的時候觸發0
負跳變觸發當引腳電平由高電平轉換到低電平的這個過程中觸發(保持在高電平或者低電平都不會觸發)1

這里講一下什么叫負跳變,假設現在中斷引腳電平為高電平,外部電路變化讓外部中斷觸發引腳從高電平變化成低電平,這個時候外部中斷引腳的電平變化是1—>0,這就是個負跳變的變化過程。就在這個過程中,觸發了中斷。1—>0的負跳變過程后,單片機外部中斷IO但凡是保持在1或者保持在0都不會觸發中斷,只有再次發生電平1—>0的變化才會再次觸發外部中斷

而低電平觸發,只要中斷引腳的電平為低電平就能直接觸發中斷。

靈活使用外部中斷IT模式的設置,配合我們的程序,玩出新花樣?。?!

這里不得不聲明一下,之前我們學習定時器的時候,我們總是會寫這樣一行代碼

這個代碼之前我們說是判斷定時器是否溢出的標志,溢出后需要我們手動清零

事實上,當我們使用定時器的時候,就已經不再需要我們手動清零了,如果我們使能定時器的中斷,這里的TF就相當于IE一樣的中斷請求信號,當CPU接受請求(也就是CPU處理中斷函數之后,這個TF就自動清零了)

所以我們使用定時器中斷的時候就不必要使用

來進行手動清零了。

5 中斷使用第四步,中斷索引和中斷函數的使用

前面我們學習了中斷源和中斷觸發的配置。

中斷觸發了,我們總要讓單片機做一點事情。單片機依靠中斷索引知道是哪個中斷觸發了,并且找到中斷函數,執行中斷函數的內容。

先來看中斷函數的格式,這個是一個典型的中斷函數

void Timer1Interrupt() interrupt 1
{
   counter++;
}
void 【中斷函數名字】() interrupt 【中斷索引編號】
{
   counter++;
}

【中斷函數名字】可以是任何符合函數名規則的函數名

但是括號后的關鍵字“interrupt”一定不能寫錯,這個是中斷函數的關鍵字,關鍵字后面的數字是中斷索引

中斷索引,單片機靠這個找到中斷

索引中斷名稱符號功能
0外部中斷0IE0外部中斷引腳INT0電平變化符合我們設置觸發的類型的時候觸發外部中斷
1Timer0中斷T0Timer0溢出的時候觸發中斷
2外部中斷1IE1外部中斷引腳INT1電平變化符合我們設置觸發的類型的時候觸發外部中斷
3Timer1中斷T1Timer1溢出的時候觸發中斷
4UARTES串口中斷
5Timer2T2Timer2溢出的時候觸發中斷

單片機靠這個索引,知道是哪個中斷被觸發了,并且找到這個中斷觸發要執行的對應函數上

小總結(一)中斷的初始化

到這里,我們來簡單總結,對中斷進行初始化,中斷初始化在main函數中完成,值得一提,必須放在main函數的死循環前面

中斷使能寄存器,0xA8,可位尋址

76543210
EA-ET2ESET1EX1ET0EX0
功能中斷總開關-Timer2中斷使能開關UART串口中斷使能開關Timer1中斷使能開關外部中斷1中斷使能開關Timer0中斷使能開關外部中斷0中斷使能開關
操作1:打開-1:打開,0:關閉

中斷控制寄存器,0x88,可位尋址

76543210
TF1TR1TF0TR0IE1IT1IE 0IT0
功能檢測/復位定時1器溢出使能定時器1檢測/復位定時器0溢出使能定時器0外部中斷1請求信號外部中斷1觸發信號設置外部中斷0請求信號外部中斷觸0發信號設置
操作定時器中斷信號TR0 = 1使能定時器定時器中斷信號TR1 = 1使能定時器自動處理,無需干預設置觸發模式自動處理,無需干預設置觸發模式

這里還是再次說明一次

IE是中斷請求觸發器,當中斷觸發的時候自動寫1,CPU請求后自動寫0

IT設置中斷觸發模式

IT=1負跳變模式,電平由1—>0觸發
IT=0低電平觸發模式,低電平的時候自動觸發

我們使用了timer的中斷,這時候TF相當于Timer的中斷請求位,cpu響應中斷后就自動清零,所以我們就不需要在中斷函數里面對TF進行干預

小總結(二)中斷索引與中斷函數

索引中斷符號說明
0IE0外部中斷引腳INT0電平變化符合我們設置觸發的類型的時候觸發外部中斷
1T0Timer0溢出的時候觸發中斷
2IE1外部中斷引腳INT1電平變化符合我們設置觸發的類型的時候觸發外部中斷
3T1Timer1溢出的時候觸發中斷
4ES串口中斷
5T2Timer2溢出的時候觸發中斷

中斷函數格式

void [中斷函數名] () interrupt [中斷索引編號]
{


}

這里再次說明,中斷函數寫在main函數后面

[中斷函數名]可以是任何一個符合函數名規則的函數名

interrupt是中斷函數的關鍵字,必須寫對

[中斷索引編號參考以上的編號]

實踐(一)timer中斷

下面我們就來實踐一下吧

這個程序里面對定時器Timer0初始化(設置一個基本的16位定時器),并且設置定時器中斷

#include< reg51.h >
void main ()
{
 EA = 1;//【第一步】總中斷開關使能
 TMOD = 0x01;//【第二步】設置定時器T0的模式為標準的16位定時器
 TH0 = 0x00;//【第三步】設置定時器初始值
 TL0 = 0xEE;
 ET0 = 1;//【第四步】定時器Timer0中斷使能
 TR0 = 1;//【第五步】激活定時器
 while(1)
  {
  
  }
}


void Tmr0Int () interrupt 1
{
  TH0 = 0x00;
  TL0 = 0xFF;//只需要重新設置初始值,不需要復位TF
}

分析一下代碼,我們很容易的發現,新的代碼里面多了兩個對中斷的操作:

EA = 1;//【第一步】總中斷開關使能
 ET0 = 1;//【第四步】定時器Timer0中斷使能

EA=1使能總中斷開關

ET0=1打開Timer0中斷開關

還有一些注意事項:

定時器中斷設置的順序

EA=1 > TMOD設置 > 定時器初始值設置 > ET=1使能定時器中斷 > TR=1使能定時器
初始化在main函數的死循環前

中斷函數一般寫在main函數后面

我們使用了timer的中斷,這時候TF相當于Timer的中斷請求位,cpu響應中斷后就自動清零,所以我們就不需要在中斷函數里面對TF進行干預

使用16位定時器中斷,模式1,定時器溢出中斷后我們仍然需要對定時器初始值進行干預

實踐(二)timer中斷 ****

下面我們就來實踐一下吧

這里我們要用上外部中斷0,設置外部中斷觸發的方式是低電平觸發

以下是代碼

#include< reg51.h >
void main ()
{
 EA = 1;//【第一步】總中斷開關使能
 IT0 = 0;//【第二步】設置外部中斷模式,低電平觸發
 EX0 = 1;//【第三步】打開外部中斷0的使能開關
 while(1)
  {

  }
}


void ExInit0 () interrupt 0
{


}

不難發現,這段代碼比設置定時器中斷的代碼更簡單,不過仍然有兩個地方需要注意:

第一個當然是初始化操作的順序

第二個是注意中斷函數的索引編號絕對不能錯

好了,介紹就到這里了,希望能幫助你更好的了解單片機,如果您覺得還不錯的話歡迎關注我

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6044

    文章

    44627

    瀏覽量

    638969
  • 中斷
    +關注

    關注

    5

    文章

    900

    瀏覽量

    41793
  • 定時器
    +關注

    關注

    23

    文章

    3256

    瀏覽量

    115445
  • C51單片機
    +關注

    關注

    12

    文章

    164

    瀏覽量

    34865
收藏 人收藏

    評論

    相關推薦

    C51單片機學習

    C51單片機學習,教你玩轉單片機
    發表于 04-14 13:00

    C51單片機學習筆記(四)——單片機中斷系統及應用 精選資料推薦

    C51單片機學習筆記(四)——單片機中斷系統及應用文章目錄C51
    發表于 07-14 06:03

    單片機C51語言設計視頻演示

    給用戶提供了單片機C51視頻學習,希望對大家的學習有所幫助
    發表于 03-03 10:22 ?719次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>C51</b>語言設計視頻演示

    C51單片機中斷號以及中斷向量

    本內容簡單介紹了C51單片機中斷號以及中斷向量,方便大家了解和學習
    發表于 02-02 15:25 ?5887次閱讀
    <b class='flag-5'>C51</b><b class='flag-5'>單片機</b>的<b class='flag-5'>中斷</b>號以及<b class='flag-5'>中斷</b>向量

    單片機基礎知識C51

    單片機基礎知識C51版,學習單片機的基礎知識。包括單片機的簡介,單片機的程序如何寫,
    發表于 11-18 16:48 ?0次下載

    第7章單片機C51中斷

    第7章單片機C51中斷
    發表于 12-16 15:43 ?14次下載

    單片機C51語言程序設計基礎的資料合集免費下載

    本文檔的主要內容詳細介紹的是單片機C51語言程序設計基礎的資料合集免費下載包括了:單片機開發概述,構建C51集成開發環境,單片機
    發表于 03-16 08:00 ?19次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>C51</b>語言程序設計基礎的資料合集免費下載

    單片機C51程序設計的學習課件免費下載

    本文檔的主要內容詳細介紹的是單片機C51程序設計的學習課件免費下載包括了:1、C51程序設計基礎,2、C51的數據類型及其在
    發表于 11-24 17:24 ?64次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>C51</b>程序設計的<b class='flag-5'>學習</b>課件免費下載

    C51單片機流水燈C代碼

    C51單片機流水燈C代碼
    發表于 11-05 15:20 ?34次下載
    <b class='flag-5'>C51</b><b class='flag-5'>單片機</b>流水燈<b class='flag-5'>C</b>代碼

    C51單片機學習筆記(一)——搭建開發環境及燒寫工具

    C51單片機學習筆記(一)——搭建開發環境及燒寫工具文章目錄C51單片機學習筆記(一)——搭建開
    發表于 11-12 10:06 ?17次下載
    <b class='flag-5'>C51</b><b class='flag-5'>單片機</b><b class='flag-5'>學習</b>筆記(一)——搭建開發環境及燒寫工具

    C51單片機學習筆記(四)——單片機中斷系統及應用

    C51單片機學習筆記(四)——單片機中斷系統及應用文章目錄C51
    發表于 11-14 10:21 ?17次下載
    <b class='flag-5'>C51</b><b class='flag-5'>單片機</b><b class='flag-5'>學習</b>筆記(四)——<b class='flag-5'>單片機</b>的<b class='flag-5'>中斷</b>系統及應用

    C51單片機C52單片機內部的資源區別

    C52單片機可以理解為是C51單片機的增強版? 兩個方面有差異,存儲空間和定時器計數器方面有區別 ○ C52
    發表于 11-19 10:36 ?20次下載
    <b class='flag-5'>C51</b><b class='flag-5'>單片機</b>與<b class='flag-5'>C</b>52<b class='flag-5'>單片機</b>內部的資源區別

    51單片機學習筆記4 C51語言

    C51語言??C51語言與標準C語言間有許多相同地方,但也有自身特點。不同的嵌入式C語言編譯系統之所以與標準C語言有不同的地方,主要是由于它
    發表于 11-21 09:51 ?42次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b><b class='flag-5'>學習</b>筆記4 <b class='flag-5'>C51</b>語言

    51單片機學習筆記———10.中斷機制

    中斷單片機中斷系統是最基礎也是最重要的部分,博主在學習這個的時候踩到了很多的坑,于是寫下這篇筆記來整理一下自己的思路。中斷涉及的內容:
    發表于 11-22 13:51 ?11次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b><b class='flag-5'>學習</b>筆記———10.<b class='flag-5'>中斷</b>機制

    單片機學習C51源代碼和Proteus仿真文件

    單片機學習C51源代碼和Proteus仿真文件.zip, 有各種例子
    發表于 02-10 13:46 ?0次下載
    主站蜘蛛池模板: 色老头在线精品视频在线播放 | 小说区v天堂网 | 5278欧美一区 | 天天曰夜夜曰 | 午夜爽爽性刺激一区二区视频 | 日本一区二区三区在线观看视频 | 色猫成人网 | 国产h视频在线观看网站免费 | 午夜影吧 | 天天干天天射天天 | 在线免费视频你懂的 | 轻点灬大ji巴太粗太长了h | cao草棚视频网址成人 | 免费在线看视频 | 成人黄色三级 | 夜夜爽www| 久久思re热9一区二区三区 | 激情欧美一区二区三区中文字幕 | 免费的黄色大片 | 色婷婷精品视频 | 天天爱夜夜做 | 日本在线观看永久免费网站 | 午夜国产 | 性爽爽 | 狠狠操天天操视频 | 久久精品国产99久久72 | 夜夜春宵翁熄性放纵古代 | 男女性生动态免费视频 | 国产男女免费视频 | 国产亚洲欧美日韩俺去了 | 扒开双腿猛进入jk校视频 | 久久午夜影视 | 男人操女人视频网站 | 狠狠插狠狠操 | 成人午夜网站 | 美女张开大腿让男人捅 | 免费能看的黄色网址 | 极品美女啪啪 | 在线观看免费视频国产 | sihu影院永久在线影院 | 欧美无遮挡国产欧美另类 |