藍橋杯-單片機組基礎5——外部中斷與LED的控制(附小蜜蜂課程代碼)

藍橋杯單片機組備賽指南請查看這篇文章:戳此跳轉藍橋杯備賽指南文章

本文章針對藍橋杯-單片機組比賽開發板所寫,代碼可直接在比賽開發板上使用。

型號:國信天長4T開發板(綠板),芯片:IAP15F2K61S2

(使用國信天長藍板也可以完美兼容,與綠板幾乎無差別)


1.編程目的

????????通過對外部中斷的學習,了解外部中斷的操作過程,并實現獨自完成外部中斷的編程,通過控制led燈光進行展示效果。

//設置按鍵S5進行中斷操作,L1閃爍為主函數,自動運行,L8常按亮為中斷執行程序。

2.外部中斷原理

2.1 單片機的中斷系統

????????單片機的中斷系統具有很大的用處,賽題中必定會用到。中斷系統的響應流程如下:當有中斷信號輸入時,單片機停止當前的工作,轉而去先執行中斷服務函數要求的工作,等中斷服務函數要求的工作全部做完,單片機又返回去繼續執行先前的工作。

????????比賽用單片機最多允許兩層中斷的嵌套。即在低級的中斷服務函數執行過程中,收到了更高級的中斷信號,而去先執行更高級的中斷工作,執行完再返回繼續執行低級的中斷工作,低級的中斷工作做完,再回到最原本的代碼繼續執行。

比賽用芯片IAP15F2K61S2?涉及的中斷共有14個,這里介紹常用的5個:

中斷號中斷名中斷名解釋
0INT0外部中斷0
1T0定時/計數器中斷0
2INT1外部中斷1
3T1定時/計數器1
4TI/RI串口中斷
5T2定時/計數器中斷2

????????本文聚焦外部中斷,只對外部中斷0和外部中斷1進行講解,他們的中斷號對應為0和2。比賽用開發板中還有INT2,INT3,INT4,共計5個外部中斷信號源的介紹,將在專欄“藍橋杯-單片機組進階”中講解。

????????其余中斷的操作請參考本專欄下的其他文章。

2.2 什么叫外部中斷?

????????我們對比賽用開發板的芯片進行觀察,可以發現與INT0和INT1相關的兩個引腳,分別是P3.2和P3.3?

????????此時如果我們要使用外部中斷0,那么可以對P3.2引腳輸入低電平,通過觀察獨立按鍵的原理圖可以得知,當按鍵S5被按下時,剛好會向單片機的P3.2引腳輸入低電平,因此我們可以將按鍵S5作為一個中斷的信號源。

????????當按下S5時,P3.2引腳讀取到低電平,單片機內部產生中斷響應,暫停當前程序而優先執行中斷服務程序,執行完中斷服務程序后返回繼續執行當前程序。編程時,我們不需要對單片機引腳P3.2讀取到低電平、按鍵S5被按下等過程進行編程,因為中斷的響應只需要通過對寄存器的設置,單片機自動識別中斷信號并自動響應。我們只需要關注中斷產生之后,我們要做什么(中斷服務函數)。

2.3 設置外部中斷用到的寄存器

兩級中斷允許控制:IE(interrupt enable)

EA-ET2ESET1EX1ET0EX0

IE中各位的功能如下:

EA—中斷允許總開關控制位。EA=0,所有的中斷請求被屏蔽。EA=1,所有的中斷請求被開放。

ES—串行口中斷允許位。ES=0,禁止串行口中斷。ES=1,允許串行口中斷。

ET1—定時器/計數器T1溢出中斷允許位。ET1=0,禁止T1溢出中斷。ET1=1,允許T1溢出中斷。

EX1—外部中斷1中斷允許位。EX1=0,禁止外部中斷1中斷。EX1=1,允許外部中斷1中斷。

ET0—定時器/計數器T0的溢出中斷允許位。ET0=0,禁止T0溢出中斷。ET0=1,允許T0溢出中斷。

EX0—外部中斷0中斷允許位。EX0=0,禁止外部中斷0中斷。EX0=1,允許外部中斷0中斷。

? ? ? ? 該寄存器允許位尋址,在編程時,如果只用到一個外部中斷0,則我們只需要設置總開關EA和外部中斷0允許位EX0 。

兩級優先級控制:IP(interrupt priority)

--PT2PSPT1PX1PT0PX0

中斷優先級寄存器IP各位含義:

PS—串行口中斷優先級控制位,1—高級;0—低級。

PT1—T1中斷優先級控制位,1—高級;0—低級。

PX1—外部中斷1中斷優先級控制位,1—高級;0—低級。

PT0—T0中斷優先級控制位,1—高級;0—低級。

PX0—外部中斷0中斷優先級控制位,1—高級;0—低級。

各中斷源的中斷優先級關系的基本規則:

(1)低優先級可被高優先級中斷,高優先級不能被低優先級中斷。

(2)任何一種中斷(不管是高級還是低級)一旦得到響應,不會再被它的同級中斷源所中斷。如果某一中斷源被設置為高優先級中斷,在執行該中斷源的中斷服務程序時,則不能被任何其他的中斷源的中斷請求所中斷。

? ? ? ? 當不對其進行設置時,則按照默認優先級執行。如果我們只用到外部中斷0的話,則不需要對其進行設置。默認優先級與中斷號順序相同。

特殊功能寄存器:TCON(timer controller)

TF1TR1TF0TR0IE1IT1IE0IT0

TCON寄存器中與中斷系統有關各標志位功能如下:

TF1—定時器/計數器T1的溢出中斷請求標志位。當啟動T1計數后,T1從初值開始加1計數,當最高位產生溢出時,硬件 置TF1為“1”,向CPU申請中斷,響應TF1中斷時,TF1標志硬件自動清“0”,TF1也可由軟件清“0”。

TF0—定時器/計數器T0溢出中斷請求標志位,與TF1類似。

IE1—外部中斷請求1中斷請求標志位。

IE0—外部中斷請求0中斷請求標志位,與IE1類似。

IT1—選擇外中斷請求1為跳沿觸發還是電平觸發方式。0--電平觸發方式,加到INT0*腳上的外中斷請求輸入信號為低電平有效,并把IE1置“1”。轉向中斷服務程序時,則由硬件自動把IE1清“0”。1--跳沿觸發方式,加到INT1*腳上的外中斷請求輸入信號從高到低的負跳變有效,并把IE1置“1”。轉向中斷服務程序時,則由硬件自動把IE1清“0”。

IT0—選擇外中斷請求0為跳沿觸發方式還是電平觸發方式,與IT1類似。

? 該寄存器允許位尋址,在編程時,如果只用到一個外部中斷0,則我們只需要設置IT0從而確定外部中斷0的觸發方式 。

3.中斷在編程中的函數

3.1 外部中斷初始化函數

????????功能是在主函數運行時,將需要用到的中斷功能進行設置,使得響應的中斷正常運行。例如:

????????在該函數中,通過設置IT0使得外部中斷0為邊沿觸發,設置EX0和EA使得外部中斷0正常開啟。

3.2 外部中斷服務函數

????????功能是在單片機響應中斷后,去執行我們需要他執行的功能。注意,該函數內部不要設置返回值,通過不要寫判斷或循環等語句,可以通過設置全局標志的方式實現數據傳遞。例如:

????????在該段程序中,我們定義了一個全局變量state_INT0,用于在中斷響應后對該變量置一,從而可以在程序中通過對該變量進行查詢,獲知中斷是否產生。編程時,需要注意中斷服務函數后面需要加上關鍵字:interrupt X。X為該中斷的中斷號,外部中斷0為0

4.代碼參考

????????代碼效果://設置按鍵S5進行中斷操作,L1閃爍為主函數,L8常按亮為中斷執行程序

//設置按鍵S5進行中斷操作,L1閃爍為主函數,L8常按亮為中斷執行程序#include < REG52.h >
#include < INTRINS.h >sbit S5 = P3^2;
sbit L1 = P0^0;
sbit L2 = P0^1;void select_HC173 ( unsigned char channal )
{switch ( channal ){case 4:P2 = ( P2 & 0x1f ) | 0x80 ;break;case 5:P2 = ( P2 & 0x1f ) | 0xa0 ;break;		case 6:P2 = ( P2 & 0x1f ) | 0xc0 ;break;		case 7:P2 = ( P2 & 0x1f ) | 0xe0 ;break;		}
}void Delay2ms ()
{unsigned char i,j;_nop_ ();_nop_ ();i=22;j=128;do {while ( --j );}while ( --i );
}void clean_shake ( unsigned char t )
{while ( t-- ){Delay2ms ();}
}//========================================
void Init_INT0 ()
{IT0 = 1;EX0 = 1;EA = 1;
}unsigned char state_INT0 = 0;
void Service_INT0 () interrupt 0
{state_INT0 = 1;
}void LED_INT0 ()
{if ( state_INT0 == 1 ){L2 = 0;clean_shake ( 600000 );L2 = 1;clean_shake ( 600000 );}state_INT0 = 0;}//=========================================void LED_L1_running ()
{select_HC173 ( 4 );L1 = 0;clean_shake ( 20 );L1 = 1;clean_shake ( 20 );
}void main ()
{Init_INT0 ();while ( 1 ){LED_L1_running ();LED_INT0 ();}
}

5.編程思路的小點點

???????中斷的操作主要是涉及兩個步驟:

1.對中斷進行正確的初始化,并在主函數中運行初始化函數;

2.正確利用中斷服務函數,要注意加上中斷號,且其內部盡量減少程序語句。并且通過適當的方式將“中斷產生”這個事件傳遞出來,從而進行執行。對于直接在中斷服務函數中寫入需要執行的程序,以及在中斷服務中設置一個標志變量兩種不同的方式,他們的對比如下:

????????第一種方式:在中斷服務函數中接入程序體,比較簡潔。容易出現一個問題:中斷前的代碼和中斷瞬間的代碼同時執行,如主函數是L1閃爍,中斷是L8燈閃爍,如果中斷發生時L1正好亮了,那么L1會一直亮直到中斷函數L8閃爍結束。

????????第二種方式:在中斷服務函數中修改標志變量的值,在外部函數中判斷標志變量的值來決定是否執行中斷程序。這種方式會將主函數與中斷的運行函數拆成兩個函數,就會在收到中斷后等主函數結束當前階段再進入中斷狀態,避免L1和L8同時亮的情況。注意標志變量要定義全局變量,中斷服務函數主體盡可能減少操作量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714708.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自學軟件測試怎么學?

軟件測試是一個變得越來越受歡迎的行業&#xff0c;在IT行業里面&#xff0c;也是初學比較容易的。但對小白而言&#xff0c;怎樣學習才能做到快速入門&#xff0c;少走彎路呢&#xff1f; 步驟一&#xff1a;初學學軟件測試&#xff0c;要先搞懂這種問題 要想進入到軟件測試…

Android Duplicate class 排除重復類

一、起因&#xff1a; 在迭代開發的時候&#xff0c;發現2個ijk很多類重復。但又2個庫實現的功能是不一樣&#xff0c;目前不能合并。但又想保留2個功能。需要排除其中一個庫。 二、報錯如何下圖&#xff1a; 三、解決方法&#xff1a; 3.1 在terminal 也就是命令行處輸入 …

Golang 并發機制 CSP模型

Golang 并發機制 CSP模型 1 前言 go語言的最大兩個亮點&#xff0c;一個是 goroutine &#xff0c;一個就是 chan 了。二者合體的典型應用CSP&#xff0c;基本就是大家認可的并行開發神器&#xff0c;簡化了并行程序的開發難度&#xff0c;我們來看一下CSP。 2 CSP是什么 C…

在Windows 11中運行磁盤清理工具的9種方法,總有一種適合你

自Windows98以來,微軟在操作系統中包含了一個內置的清理工具。當用戶轉向第三方清理應用程序時,這個值得信賴的實用程序站穩了腳跟。微軟甚至宣布,第三方應用程序幾乎毫無用處,刪除注冊表項不是一個好主意。 磁盤清理工具可以幫助刪除臨時文件、舊的更新日志、縮略圖緩存和…

git安裝與使用4.3

一、git的安裝 1、下載git包 下載git包url&#xff1a;https://git-scm.com/download/win 下載包分為&#xff1a;64位和32位 2、點擊安裝包 2、選擇安裝路徑 3、 點擊下一步 4、點擊next 5、點擊next 6、點擊next 7、 8、 9、 10、 11、 12、在桌面空白處&#xff0c;右鍵…

【SpringBoot】測試單元使用多線程

&#x1f4dd;個人主頁&#xff1a;五敷有你 &#x1f525;系列專欄&#xff1a;SpringBoot ??穩重求進&#xff0c;曬太陽 問題產生 今天學習了樂觀鎖&#xff0c;但在測試單元執行多線程的時候出現了問題&#xff0c;多線程并沒有直接結果 在控制臺沒有任何輸出…

KubeSphere平臺安裝系列之二【Linux單節點部署KubeSphere】(2/3)

**《KubeSphere平臺安裝系列》** 【Kubernetes上安裝KubeSphere&#xff08;親測–實操完整版&#xff09;】&#xff08;1/3&#xff09; 【Linux單節點部署KubeSphere】&#xff08;2/3&#xff09; 【Linux多節點部署KubeSphere】&#xff08;3/3&#xff09; **《KubeS…

RocketMQ學習筆記一

課程來源&#xff1a;002-MQ簡介_嗶哩嗶哩_bilibili &#xff08;尚硅谷老雷&#xff0c;時長19h&#xff09; 第1章 RocketMQ概述 1. MQ是什么&#xff1f; 2. MQ用途有哪些&#xff1f; 限流削峰&#xff1b;異步解耦&#xff1b;數據收集。 3. 常見MQ產品有哪些&對比…

Kaggle競賽之Titanic存活預測2

提高代碼規范性&#xff0c;基于上一個 baseline 的提高 import pandas as pd from sklearn.preprocessing import LabelBinarizer from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split#數據劃分方法 from sklearn.ensem…

哪個超聲波清洗機品牌值得入手?銷量榜品牌值得選購!

在科技日益發展的今天&#xff0c;超聲波清洗技術以其高效、便捷和深度清潔的特點&#xff0c;已經深入到生活的諸多領域&#xff0c;從精密儀器到珠寶首飾&#xff0c;從眼鏡框到假牙&#xff0c;甚至是廚房用品的日常護理&#xff0c;都能見到超聲波清洗機的身影。面對市場上…

無人機兩次飛行的圖像數據配準與幾何校正方法研究

標題: 無人機兩次飛行的圖像數據配準與幾何校正方法研究 摘要: 本文研究了利用無人機獲取的兩次飛行的圖像數據進行配準與幾何校正的方法。無人機航拍技術在地理信息獲取和空間數據應用中具有重要意義,但由于飛行條件、攝影設備和環境等因素的影響,同一區域的不同飛行任務…

【基頻提取算法-YIN】

本文對基頻提取算法 YIN 做以介紹。如有表述不當之處歡迎批評指正。歡迎任何形式的轉載&#xff0c;但請務必注明出處。 文章目錄 1. 引言2. YIN 各模塊代碼講解2.1. 差分函數的實現2.2. 累積均值歸一化差分函數的實現2.3. 絕對閾值2.4. 拋物線插值2.5. 最優局部估計 3. 總結 1…

免殺實戰-EDR對抗

文章目錄 殺軟分析BOF.NET 殺軟分析 x64dgb簡單調試發現該edr在r3環對ntdll.dll和kernel32.dll關鍵函數均存在hook&#xff0c;這里硬盤讀取原來的dll進行重新加載&#xff0c;原理如圖 loader // dllmain.cpp : 定義 DLL 應用程序的入口點。 #include "pch.h" #in…

DSI2協議之BTA行為理解

概念: DSI協議spec支持總線控制權在master和slave之間發生交換,即通過bus turn around來實現; BUS TURN AROUND: BTA 的實現是通過controller—>cdphy的turnrequest信號來實現; 關于控制器發出turnrequest給phy,phy通過lvds/trio線輸出turnaround sequence如下圖中…

LeetCode刷題筆記之二叉樹(四)

一、二叉搜索樹的應用 1. 700【二叉搜索樹中的搜索】 題目&#xff1a; 給定二叉搜索樹&#xff08;BST&#xff09;的根節點 root 和一個整數值 val。你需要在 BST 中找到節點值等于 val 的節點。 返回以該節點為根的子樹。 如果節點不存在&#xff0c;則返回 null 。代碼&a…

BUGKU 本地管理員

打開環境&#xff0c;先F12查看看到一串代碼。Base64解碼一下&#xff0c;得到的應該是密碼&#xff0c;然后輸入admin | test123試一下 使用BP抓包&#xff0c;修改XFF&#xff0c;得到flag

將鏡像上傳到私有鏡像倉庫Harbor

首先你需要安裝Harbor服務&#xff1a; https://blog.csdn.net/qq_50247813/article/details/136388229 客戶端已經安裝docker&#xff1a; https://docs.docker.com/engine/install/centos/ 在docker客戶端登錄 Harbor 我的Harbor 服務器地址&#xff1a; 192.168.44.161 賬號…

關于編寫測試用例的一些思考

測試用例是QA同學的基本功&#xff0c;每個人都有一套編寫測試用例的體系&#xff0c;本文是作者結合自身的工作經驗以及閱讀一些測試相關的書籍后的一些看法&#xff0c;歡迎大家一起討論學習。 測試設計 測試用例格式 面試中一些常見的問題 1.APP測試與服務端測試的區別&am…

微服務中的Feign:優雅實現遠程調用的秘密武器(二)

本系列文章簡介&#xff1a; 本系列文章將深入探討Feign的特點、原理以及在微服務中的應用場景&#xff0c;幫助讀者更好地理解和使用這個優秀的遠程調用工具。無論您是初學者還是有經驗的開發人員&#xff0c;本文都將為您揭示Feign的秘密&#xff0c;并帶您一起走進微服務的世…

何愷明新作 l-DAE:解構擴散模型

何愷明新作 l-DAE&#xff1a;解構擴散模型 提出背景擴散模型步驟如何在不影響數據表征能力的同時簡化模型&#xff1f;如何進一步推動模型向經典DAE靠攏&#xff1f;如何去除對生成任務設計的DDM中不適用于自監督學習的部分&#xff1f;如何改進DDM以專注于清晰圖像表示的學習…