單片機-89C51部分:7、中斷

飛書文檔https://x509p6c8to.feishu.cn/wiki/A5gcwyL5giq1JOkkcsscn8eLnzf

一、中斷的作用

中斷是為使單片機具有對外部或內部隨機發生的事件實時處理而設置的,中斷功能的存在,很大程度上提高了單片機處理外部或內部事件的能力。它也是單片機最重要的功能之一,是我們學習單片機必須要掌握的。

為了能讓大家更容易理解中斷概念, 我們先來舉一個生活事例:

你打開火,燒上一壺水。然后去洗衣服,在洗衣服的過程中,突然聽到水壺發出水開的報警聲,這時,你停止洗衣服動作,立即去關掉火,然后才回去繼續洗衣服。
這個過程中實際上就發生了一次中斷。對于單片機來講,中斷是指 CPU 在處理某一事件 A 時,發生了另一事件 B,請求 CPU 迅速去處理(中斷發生);CPU 暫時停止當前的工作(中斷響應), 轉去處理事件 B(中斷服務);待 CPU 將事件 B 處理完畢后,再回到原來事件 A 被中斷的地方繼續處理事件 A(中斷返回),這一過程稱為中斷。

二、那中斷是如何解決實際問題的呢?

回到按鍵章節,如果我們在while循環中,沒有耗時的代碼需要執行,這段代碼是能夠實時記錄按鍵值的,但如果我們的程序設計復雜后,有耗時的任務需要處理,例如下方的Delay1ms(20000);延時20s,那在這20s內我們按下按鍵,芯片就無法讀取到信號的變化了。

#include <reg52.h>sfr P4??? = 0xe8;?????????????????? //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0E8H
sbit INT2 = P4^3;
sbit INT3 = P4^2;sfr XICON = 0xc0;?????????????????? //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0C0H
sbit PX3? = XICON^7;
sbit EX3? = XICON^6;
sbit IE3? = XICON^5;
sbit IT3? = XICON^4;
sbit PX2? = XICON^3;
sbit EX2? = XICON^2;
sbit IE2? = XICON^1;
sbit IT2? = XICON^0;sbit key1 = P4^3;
sbit led1 = P2^7;void delay_ms(unsigned int xms)?? //@12MHz
{unsigned int i, j;for(i=xms;i>0;i--){for(j=124;j>0;j--){}}
}void main()
{while(1){//當按鍵按下時燈切換if(key1 == 0){led1= ~led1;delay_ms(1000);}delay_ms(20000);}???????????????
}

這時候,我們就需要用中斷的功能,幫我們實時記錄。

三、51單片機的中斷

STC89C5X 系列單片機提供了 8 個中斷請求源,它們分別是:外部中斷O(INT0)、外部中斷 1(INT1)、外部中斷 2(INT2)、外部中斷 3(INT3)、定時器 0中斷、定時器 1 中斷、定時器 2 中斷、串口(UART)中斷。

外部中斷:由外部引腳觸發的中斷

定時器中斷:由定時器觸發的中斷

串口中斷:通訊過程中發送或接收數據完畢觸發的中斷

外部中斷

這個章節我們先來看下外部中斷,也就是INT0、INT1、INT2、INT3。

下面這個框圖很重要,它會給我們介紹,如果我們需要使用單片機的某個中斷,需要配置哪些寄存器,我們通過框圖、再結合寄存器表格和示例程序,就能知道怎么使用單片機中斷。

中斷寄存器

TCON.0/IT0:中斷觸發行為設置

IE0:外部中斷0請求源,IE0=1外部中斷向CPU請求中斷,中斷響應后,IE0=0

不需要手動設置,由CPU處理即可。

EX0:外部中斷0允許寄存器

EA:總中斷允許寄存器

中斷初始化

void exti0_init(void)
{IT2=1;//觸發方式:下降沿EX2=1;//打開 INT2 的中斷允許EA=1;//打開總中斷
}

中斷服務程序(回調函數)

//在中斷函數中 exti0 是函數名,可自定義,interrupt 是一個關鍵字,表示 51 單片機中斷。
//后面的“0”是中斷號
//外部中斷 0 中斷號為 0
//定時器中斷0,中斷號為1
//外部中斷 1,則中斷號為 2。
void exti0() interrupt 0 //外部中斷 0 中斷函數
{//執行所需的功能
}

外部中斷代碼:

#include <reg52.h>sfr P4??? = 0xe8;?????????????????? //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0E8H
sbit INT2 = P4^3;
sbit INT3 = P4^2;sfr XICON = 0xc0;?????????????????? //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0C0H
sbit PX3? = XICON^7;
sbit EX3? = XICON^6;
sbit IE3? = XICON^5;
sbit IT3? = XICON^4;
sbit PX2? = XICON^3;
sbit EX2? = XICON^2;
sbit IE2? = XICON^1;
sbit IT2? = XICON^0;sbit key1 = P4^3;
sbit led1 = P2^7;void delay_ms(unsigned int xms)?? //@12MHz
{unsigned int i, j;for(i=xms;i>0;i--){for(j=124;j>0;j--){}}
}void exit2() interrupt 6
{//當按鍵按下時燈切換if(key1 == 0){led1= ~led1;delay_ms(1000);}
}void main()
{IT2 = 1; //設置中斷觸發條件為下降沿EX2 = 1; //運行中斷2經過EA = 1;? //使能中斷while(1){delay_ms(20000);}???????????????
}

要注意:

標準的單片機頭文件reg52.h是沒有P4,我們可以參考工具自行添加。

中斷優先級

每一個中斷的優先級別均可用軟件設置。高優先級的中斷請求可以打斷低優先級的中斷,反之,低優先級的中斷請求不可以打斷高優先級及同優先級的中斷。當兩個相同優先級的中斷同時產生時,將由查詢次序來決定系統先響應哪個中斷。

默認情況下所有中斷優先級被設置為最高優先級3,當系統開啟了多個中斷,根據具體的業務設置對應的優先級即可。例如系統開啟了外部中斷INT0和INT1,默認情況下INT0的優先級是比INT1要高的,假設系統觸發了INT0,INT0在執行中斷服務程序時,INT1將不會被及時響應。
主任務:洗衣服
INT0:女朋友來電
INT1: 廚房著火
如果不修改中斷優先級,在INT0執行的時候,INT1將不會被響應。
所以我們需要降低INT0的優先級,設置PX0H=0 PX0=0,把優先級降到0,同時INT1的PX1H=1 PX1=1,這樣就能保證在INT0執行的時候,INT1也能被及時響應。

IP XICON IPH 中斷優先級控制寄存器

IP、IPH - PX0H PX0

0b0000 0001

0b0100 0000

0*8+1*4+0*2+0*1 = 4

0*8+0*4+0*2+0*1=0

0x40

注意:

IPH這個寄存器是不可位尋址的,
如要想讓PX0H這位置一的話,直接 PX0H=1;這個寫法是錯誤的,因為它不能位尋址。
只能 IPH= 0x01(0000 0001)

//STC單片機的中斷優先級需要設置IP和IPH寄存器,IP寄存器可以位操作,IPH只能寄存器操作
//優先級也可以不設置,默認的中斷優先級就是0,因為復位之后IPH和IP寄存器默認值就是0
PX0 = 1;
IPH =
0x01;

0x0116進制的表示

在Keil C51中數不能直接以二進制形式賦值,所以需要設置寄存器某一位為1,用10進制或16進制顯示,這里涉及到進制轉換:

一個寄存器8位,相當于一個字節。

十進制:十進制是我們平常使用的數字系統,包含0到9這10個數字。

二進制:二進制是一種數值表示方式,只包含0和1兩個數字。常常這樣表示:0b0000 0000

十六進制:十六進制是一種數值表示方式,包含0到9和A到F這16個數字,常常這樣表示0x01

A可以理解為十進制的10,B=11,C=12,D=13,E=14,F=15

二進制

二進制轉十六進制

十六進制

十進制

0b0000 0001

0*8+0*4+0*2+0*1=0

0*8+0*4+0*2+1*1=1

0x01

0×161+1×16?

0×16+1×1 = 1

1

0b0000 0100

0*8+0*4+0*2+0*1=0

0*8+1*4+0*2+0*1=4

0x04

0×161+4×16?

0×16+4×1 = 4

4

0b0001 0000

0*8+0*4+0*2+1*1=1

0*8+0*4+0*2+0*1=0

0x10

1×161+0×16?

1×16+0×1 = 16

16

0b0001 1111

0*8+0*4+0*2+1*1=1

1*8+1*4+1*2+1*1=15=f

0x1f

1×161+f×16?

f=15

1×16+15×1 = 31

31

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

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

相關文章

0805登錄_注冊_token_用戶信息_退出-網絡ajax請求2-react-仿低代碼平臺項目

文章目錄 1 JWT1.1 JWT結構1.2 工作流程1.3 優點1.4 缺點1.5 安全實踐1.6. 適用場景1.7 JWT與OAuth2**8. 示例代碼&#xff08;Node.js&#xff09;** 2 用戶mock和api3 注冊4 登錄5 token存儲6 請求攔截器設置token6 獲取用戶信息7 退出登錄結語 1 JWT JSON Web Token&#x…

大模型入門

一、模型入門路徑 1. 學習預備知識 編程語言&#xff1a;熟練掌握Python編程語言&#xff0c;包括基本語法、數據結構&#xff08;列表、字典、元組等&#xff09;、面向對象編程、文件操作等。Python有豐富的機器學習和深度學習庫&#xff0c;方便進行大模型的開發和實驗。數…

把dll模塊注入到游戲進程的方法_插APC注入

一、概述 APC是異步過程調用,系統創建線程的時候會為線程創建一個APC隊列,當線程調用SleepEx,WaitSingleObjectEx等函數時,并把線程狀態被設置為可提醒狀態時,線程并不會睡眠,而是檢查APC隊列是否為空,如果不為空,轉去執行APC隊列中的每一項,因此給目標進程中的線程插…

git 如何清空當前分支的歷史提交記錄,僅保留最后一次提交

本方法基于新建 Git 孤立分支實現&#xff1a; 1. ??首先檢出待清理的分支 在 IDEA 右下角檢查當前分支名稱 或執行 git branch 確認。如果不在目標分支上&#xff0c;會顯示 (HEAD detached at xxxxx)&#xff0c;這時需要先切換分支&#xff1a; git checkout 原分支名 2.…

【C++】Googletest應用

Googletest 1 配置 使用cmake配置&#xff1a; 具體文件后面上傳補充 ./test.out --gtest_filterXXXTest.xxx 2 gdb 為了跟蹤流程&#xff0c;可以使用gdb&#xff1b; gdb ./xxx.out gdb --args ./gtest --gtest_filterxxx.xxx設置運行參數 set args --gtest_filterxxx.…

JavaScript:從DOM概述到window對象的常見事件

一、BOM概述 1.BOM的概念 BOM&#xff08;Browser Object Model&#xff09;即瀏覽器對象模型&#xff0c;它提供了獨立于內容而與瀏覽器窗口進行交互的對象&#xff0c;其核心對象是window 2.BOM的構成 BOM比DOM更大&#xff0c;它包含DOM window對象是瀏覽器的頂級對象&a…

qobject與event事件應用

int main(int argc, char *argv[]) {QApplication a(argc, argv);MyWidget mainWidget;mainWidget.setWindowTitle("QObject與事件處理示例");mainWidget.resize(200, 200);mainWidget.show();return a.exec(); }QApplication a(argc, argv);&#xff1a;創建 QAppli…

QTableView復選框居中

目錄 方法一&#xff1a;QSS方法2:自定義復選框委托類一、構造函數 CheckBoxDelegate()二、paint() 方法三、editorEvent() 方法四、關鍵設計要點五、擴展應用場景六、代碼示例&#xff08;補充&#xff09; 方法一&#xff1a;QSS QTableView::indicator {position: relative…

基于QT的仿QQ音樂播放器

一、項目介紹 該項目是基于QT開發的?樂播放軟件&#xff0c;界面友好&#xff0c;功能豐富&#xff0c;主要功能如下&#xff1a; 窗口hand部分&#xff1a; 點擊最小化按鈕&#xff0c;窗口最小化 點擊最大化按鈕&#xff0c;窗口最大化 點擊關閉按鈕&#xff0c;程序退出 …

SQL知識點合集---第二彈

數據一 <select id"listPositionAuditCheckSample" resultType"net.nxe.cloud.content.server.entity.PositionAuditCheckSample"><trim prefixOverrides"union all"><if test"userSampleCount ! null and userSampleCount…

【QT】QT控制硬件

QT控制硬件 1.上位機程序開發2.具體例子控制led燈3. linux中的函數跟QT類里面的函數同名&#xff0c;發生沖突4.示例代碼 1.上位機程序開發 QT做一個上位機程序&#xff0c;控制底層的硬件設備(下位機) 總結&#xff1a; 在構造函數里面去初始化&#xff0c;打開硬件驅動在析…

Flutter介紹、Flutter Windows Android 環境搭建 真機調試

目錄 Flutter介紹 Windows 環境搭建 1.安裝配置JDK 2.下載安裝Android Studio 3.下載配置Flutter SDK ?4.運行Flutter doctor命令檢測環境是否配置成功 ?5.打開Android Studio安裝Flutter/Dart 插件 ?6.插件運行Flutter項目 ?編輯 Flutter Android真機調試 Flut…

Android Studio 中使用 SQLite 數據庫開發完整指南(Kotlin版本)

文章目錄 1. 項目準備1.1 創建新項目1.2 添加必要依賴 2. 數據庫設計3. 實現數據庫3.1 創建實體類 (Entity)3.2 創建數據訪問對象 (DAO)3.3 創建數據庫類 4. 創建 Repository5. 創建 ViewModel6. 實現 UI 層6.1 創建筆記列表 Activityactivity_notes_list.xmlNotesListActivity…

Vue基礎(7)_計算屬性

計算屬性(computed) 一、使用方式&#xff1a; 1.定義計算屬性&#xff1a; 在Vue組件中&#xff0c;通過在 computed 對象中定義計算屬性名稱及對應的計算函數來創建計算屬性。計算函數會返回計算屬性的值。 2.在模板中使用計算屬性&#xff1a; 在Vue的模板中&#xff0c;您…

辛格迪客戶案例 | 華道生物細胞治療生產及追溯項目(CGTS)

01 華道&#xff08;上海&#xff09;生物醫藥有限公司&#xff1a;細胞治療領域的創新先鋒 華道&#xff08;上海&#xff09;生物醫藥有限公司&#xff08;以下簡稱“華道生物”&#xff09;是一家專注于細胞治療技術研發與應用的創新型企業&#xff0c;尤其在CAR-T細胞免疫…

[26] cuda 應用之 nppi 實現圖像格式轉換

[26] cuda 應用之 nppi 實現圖像格式轉換 講述 nppi 接口定義通過nppi實現 bayer 格式轉rgb格式官網參考信息:http://gwmodel.whu.edu.cn/docs/CUDA/npp/group__image__color__debayer.html#details1. 接口定義 官網關于轉換的原理是這么寫的: Grayscale Color Filter Array …

2025“釘耙編程”中國大學生算法設計春季聯賽(8)10031007

題目的意思很好理解找從最左邊到最右邊最短路&#xff08;BFS&#xff09; #include <bits/stdc.h> using namespace std; int a[510][510]; // 存儲網格中每個位置是否有障礙&#xff08;1表示有障礙&#xff0c;0表示無障礙&#xff09; int v[510][510]; // 記錄每…

【Linux】第十一章 管理網絡

目錄 1.TCP/IP網絡模型 物理層&#xff08;Physical&#xff09; 數據鏈路層&#xff08;Date Link&#xff09; 網絡層&#xff08;Internet&#xff09; 傳輸層&#xff08;Transport&#xff09; 應用層&#xff08;Application&#xff09; 2. 對于 IPv4 地址&#…

python_股票月數據趨勢判斷

目錄 前置 代碼 視頻&月數據 前置 1 A股月數據趨勢大致判斷&#xff0c;做一個粗略的篩選 2 邏輯&#xff1a; 1&#xff09;取最近一次歷史最高點 2&#xff09;以1&#xff09;中最高點為分界點&#xff0c;只看右側數據&#xff0c;取最近一次最低點 3&#xf…

Python PyAutoGUI庫【GUI 自動化庫】深度解析與實戰指南

一、核心工作原理 底層驅動機制&#xff1a; 通過操作系統原生API模擬輸入使用ctypes庫調用Windows API/Mac Cocoa/Xlib屏幕操作依賴Pillow庫進行圖像處理 事件模擬流程&#xff1a; #mermaid-svg-1CGDRNzFNEffhvSa {font-family:"trebuchet ms",verdana,arial,sans…