51单片机按键控制数码管0~9_51单片机外部中断
? ? ? ?前面為大家介紹的點亮LED燈、數碼管、按鍵只用到了51單片機的IO資源,我們要是僅僅用單片機點燈、操作數碼管,那可真是大才小用了。這些都只是51單片機資源的冰山一角,51單片機還有好多的功能,我后面將為大家一一介紹。今天為大家介紹單片機一個重要的外設——中斷。
中斷
? ? ??沒接觸過單片機的朋友聽到這個詞肯定很陌生,大家對打斷這個詞應該不陌生吧,中斷字面意思可以理解為中途被打斷。大家可以思考一下,什么的中途被什么給打斷了呢?想明白了這個問題就說明理解中斷了。下面看看百度的解釋:
? ? ? 中斷是指計算機運行過程中,出現某些意外情況需主機干預時,機器能自動停止正在運行的程序并轉入處理新情 況的程序,處理完畢后又返回原被暫停的程序繼續運行。
? ? ? ?百度的這個解釋還是比較權威的,我們再通俗點理解就是計算機(單片機)在運行中途被某些意外打斷了,處理完意外后又回到被打斷的地方繼續運行。
STC89C52RC單片機外部中斷
????STC89C52RC單片機總共有6個中斷,分別是:外部中斷0(INT0)、定時器0中斷、外部中斷1(INT1)、定時器1中斷、串口中斷、定時器2中斷、。
????今天我們主要介紹和使用外部中斷。什么是外部中斷呢?外部中斷就是外部條件觸發單片機的中斷,單片機的只有IO和外部聯系,所以單片機引腳的電平變化便會觸發外部中斷。我們看看51單片機可以觸發外部中斷的引腳:
????可以看到外部中斷的引腳是P3.2和P3.3,?當這兩個引腳檢測到電平變化(高電平變為低電平)時,便會觸發中斷。也許有人會問這不跟前面講的按鍵實現人機互動一樣嗎,通過單片機檢測IO引腳的電平狀態來判斷按鍵是否被按下。注意!中斷和單片機掃描檢測是有本質區別的,大家應該注意到我們前面寫的程序全部在一個while里面,如下面這段代碼。
1????這種代碼結構在單片機里很常見,mian函數里面一個while,就是讓單片機一直做while里面的事情,從while第一個大括號到最后一個大括號,反反復復,只要不停電便一直運行。看這段代碼,如果代碼執行到第6行時候按鍵按下了,單片機會立即檢測到嗎?肯定是檢測不到的,只有當程序執行完第7、8、9行重新回到第4行運行到第5行時單片機才去判斷KEY是否等于0,這時候要是沒有松手肯定會檢測到。但要是在執行第7、8、9、4行特別耗時松手了呢?是不是這次按鍵就無效了。假如這個按鍵外部是一個消防安全的緊急按鈕,按下了單片機沒有反應,鬧著玩呢!火災那么嚴重了消防警報沒有響起來,消防人員也不知道,可能會造成嚴重的后果。這個例子可能有點夸張,但有助于大家理解按鍵掃描的不足,也就是按鍵的實時性不好。設計人員的想法肯定是按鍵按下就做出響應,但是僅僅靠一個while是肯定實現不了很高的實時性。這個問題肯定設計單片機的工程師也注意到了,于是給單片機增加了中斷的功能。不光單片機有中斷,電腦也有,鼠標、鍵盤其實也是電腦的一種中斷。說了一大篇,再總結一下,中斷發生后必須立即做出響應。接下來我們看看51單片機的中斷怎么用,51單片機可不是P3.2和P3.3給個低電平就能跑到中斷里面去的。
????我們再來看下51單片的外部中斷結構:
????圖中的INT0和INT1連接引腳P3.2和P3.3,進去之后有一個開關可以推上去也可以拉下來,先不管上去下來是什么意思,反正要選一個。再過來是IE0,IE1,先不管是干啥的,要想外部中斷反正得經過這個關卡。接著是EX0、EX1這個開關肯定需要打開。EA好像是一個多刀單擲的開關,它控制著所有中斷的總開關,使用外部中斷必須打開這個開關。后面的開關路線主要控制優先級的,優先級就是多個中斷同時觸發,優先執行優先級高的中斷。只有把上面的這條中斷線路給導通了,外部中斷就可以觸發了。單片機里面可沒有看得見開關我們應該怎么去配置這些開關呢?為了控制這些開關工程師們設計出了一個叫寄存器的東西。感興趣的同學可以上網查下,我們這里把寄存器先理解成為開關,寄存器里面寫1就是打開開關,寫0就是關閉開關,當然單片機也可以告訴我們哪個開關是打開的哪個開關是關閉的。
51單片機中斷控制寄存器
中斷允許寄存器IE
????我們來認識一下51單片機的第一個寄存器中斷允許寄存器IE,51單片機所有的內部資源都要通過配置寄存器來實現,所以大家一定要掌握如何通過單片機的數據手冊去配置寄存器。上圖表格中標紅的是不是在上面的中斷結構中看到過,哪個開關什么作用我們可以查看下方的寄存器位說明,再聯系中斷結構圖大家可以很輕松的理解51單片機的外部中斷控制邏輯。我們今天要用外部中斷0,那么我們只需讓EA=1,EX0=1即可。EA是51單片機的中斷總開關,打開EA之后51單片機才具備中斷功能。EX0只管外部中斷0的開關,打開EX0外部中斷功能才能使用。接下來我們講講另一個寄存器TCON,這個寄存器不是今天的主角,但外部中斷需要用到它的四個位。
定時器/計數器中斷控制寄存器TCON
這4個位給大家詳細介紹下,因為IE0和IE1、IT0和IT1功能是一樣的,只不過一個是外部中斷0一個是外部中斷1,我們只看外部中斷0。IE0是外部中斷0的標志位,標志位意味著單片機要告訴我們這個位是打開還是關閉的,如果IE0這個位是1(打開的)說明外部中斷已經觸發,觸發完成之后單片機會自己把IE0這個位給清0。說白了,這個位我們暫時可以不用操心,單片機就自動處理了。IT0?是外部中斷0中斷源類型選擇位,就是選擇外部中斷0的觸發方式,為0時是低電平觸發,為1時是下降沿觸發。我們今天給這個位寫0,用低電平觸發。低電平觸發大家可能容易理解,下降沿可能有點難理解。下降沿就是從高電平變為低電平的一瞬間,如下圖所示。
這里簡單給大家介紹下這兩種觸發方式有什么不同,前面我們了解到51單片機上電后引腳都是高電平,P3.2連接的是外部中斷0,這時給P3.2一個低電平并保持一段時間,如果外部中斷0配置的是低電平觸發(IT0=0),那么中斷便會一直觸發,只有當P3.2為高電平時中斷觸發才會停止;當外部中斷0配置為下降沿觸發(IT0=1)時,中斷則會觸發一次,因為在這期間只出現了一個下降沿。后面有機會用到再舉例說明。使用外部中斷只需掌握這兩個寄存器就足夠了。
????前面說了這么多有些人可能就納悶了,中斷觸發了該去哪執行呢?這里告訴大家,中斷觸發后去中斷服務函數里面執行相應的代碼。
????STC的官方手冊已經提供中斷服務函數和中斷號了,我們今天用外部中斷0,中斷服務函數為Int0_Routine(void)這個函數名可以隨便起,中斷號為0,單片機找中斷服務函數主要就是依據中斷號找的,所以中斷號一定不能寫錯。51單片機默認外部中斷0的優先級最高,所以當外部中斷0觸發后單片機會無條件放下手中所有的事去執行外部中斷0的服務函數。
51單片機外部中斷實戰
實戰內容:模擬一個報警器,電路原理圖如下所示,當按鍵S1和按鍵S2按下時蜂鳴器發出響聲,當按鍵S3按下時蜂鳴器停止響聲(必須使用外部中斷)。
????分析:由電路圖可知,S1連接的是外部中斷0,所以我們可以用觸發外部中斷0實現報警,S2和S3就用普通的按鍵掃描實現報警和停止報警。蜂鳴器前面我們沒有提到過,大家可以把它當作一個LED,給低電平就發出響聲,高電平停止響聲。通過電路圖可以知道蜂鳴器連接的是P2.3,我們讓P2.3=0蜂鳴器便會發出響聲,P2.3=1,蜂鳴器便停止響聲。
開始寫代碼
1????雖然代碼有點長,我們逐步分析其實并不復雜。頭文件不用說了,前面介紹過。接著是位聲明,我們用到四個引腳。然后是四個子函數,第一個函數delay我們之前用過,是一個毫秒級的延時函數;第二個是外部中斷0初始化函數,主要是作用是初始化控制中斷的寄存器,也就是把控制中斷相關的開關打開或者關閉。第三個函數是按鍵掃描函數,函數的原理我們前面講過,兩個按鍵分別控制蜂鳴器的打開和關閉。第四個函數模擬其他比較耗時的應用,主要為了體現按鍵掃描和外部中斷的區別。接著就是主函數了,主函數和前面講的結構查不多,都是mian里面一個while循環,讓單片機反復在執行while里面的代碼。說到這里,大家能不能聯想到使用中斷的另一個好處。這里先不告訴大家,后面給大家詳細說明。這里要注意一點,初始化函數在運行過程中只需執行一次。所以我們把ExternalInt0Init函數放在了while外面。
????最后一個函數便是今天的主角了——外部中斷0服務函數。當外部中斷0觸發后,單片機便會跳轉到這個函數中去打開蜂鳴器,執行完成后則跳回主函數。這里要注意下,中斷服務函數和其他函數是有區別的,中斷服務函數后面的interrupt 0一定要加上,因為加上之后相當于是告訴單片機,我就是外部中斷0的中斷服務函數。如果不加當外部中斷0觸發后,單片機就不知道去哪執行中斷服務函數。interrupt是51單片機的關鍵字,后面的數字是中斷號,外部中斷0的中斷號就是0外部中斷1的中斷號為2。想知道其他中斷號可以查看51單片機的數據手冊。代碼分析完了,有問題大家可以進群討論551867309,當然本節代碼我也會上傳至群文件。
????編譯……下載……觀察現象
????首先我按下的是S2,大家可以看到,短按蜂鳴器沒有打開,只有長按蜂鳴器才能打開,按下S3關閉蜂鳴器也一樣。這是因為單片機在處理比較耗時的事情,等處理完成后才去檢查按鍵有沒有按下。按下S1蜂鳴器立即會打開,因為S1按下觸發了外部中斷0,單片機會在第一時間去處理外部中斷,這就是使用中斷和不使用中斷的區別。
總結
????通過這篇文章給大家介紹了什么是中斷,單片機的高級玩法都離不開中斷,所以中斷必須掌握。同時也介紹了51單片機的外部中斷0的應用以及如何通過查看數據手冊去操作51單片機的寄存器。后面涉及到51單片機的外設我們都需要和寄存器打交道,寄存器就是我們和單片機對話的樞紐,我們可以把數據通過寄存器發送給單片機,同時單片機也可以將內部數據通過寄存器告訴我們,這樣我們就可以用單片機做好多事情了。后面還有好多好玩的實驗,堅持下去就能成功。
喜歡就關注我們哦
總結
以上是生活随笔為你收集整理的51单片机按键控制数码管0~9_51单片机外部中断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mobx中跟新了数据视图没变化_【第17
- 下一篇: 摄像头分辨率怎么调整_亿联CAM50 -