
嵌入式系統 - 快速指南
嵌入式系統 - 概述
系統
系統是一種所有單元元件根據一組規則協同工作的安排。它也可以定義為一種工作、組織或執行一項或多項任務的方式,根據固定的計劃進行。例如,手錶是一個顯示時間的系統。它的元件遵循一組規則來顯示時間。如果其中一個部件發生故障,手錶將停止工作。因此,我們可以說,在一個系統中,所有其子元件都相互依賴。
嵌入式系統
顧名思義,嵌入式意味著某物附著在另一物上。嵌入式系統可以被認為是具有嵌入軟體的計算機硬體系統。嵌入式系統可以是獨立的系統,也可以是大型系統的一部分。嵌入式系統是一個基於微控制器或微處理器的系統,旨在執行特定任務。例如,火警報警器就是一個嵌入式系統;它只會感應煙霧。
嵌入式系統具有三個組成部分 -
它具有硬體。
它具有應用軟體。
它具有即時作業系統 (RTOS),它監督應用軟體並提供機制,讓處理器根據排程執行程序,遵循計劃以控制延遲。RTOS 定義了系統的工作方式。它在應用程式執行期間設定規則。小型嵌入式系統可能沒有 RTOS。
因此,我們可以將嵌入式系統定義為基於微控制器的、軟體驅動的、可靠的、即時控制系統。
嵌入式系統的特點
單功能 - 嵌入式系統通常執行專門的操作並重復執行相同的操作。例如:尋呼機始終充當尋呼機。
嚴格約束 - 所有計算系統對設計指標都有約束,但嵌入式系統的約束尤其嚴格。設計指標是衡量實現功能的指標,例如其成本、尺寸、功耗和效能。它必須能夠安裝在單個晶片上,必須能夠快速地即時處理資料,並且必須消耗最少的功率以延長電池壽命。
反應式和即時 - 許多嵌入式系統必須持續對系統環境的變化做出反應,並且必須即時計算某些結果,而沒有任何延遲。以汽車巡航控制為例;它持續監控和響應速度和制動感測器。它必須在有限的時間內反覆計算加速或減速;計算延遲會導致無法控制汽車。
基於微處理器 - 它必須基於微處理器或微控制器。
記憶體 - 它必須具有記憶體,因為其軟體通常嵌入在 ROM 中。它不需要計算機中的任何輔助儲存器。
連線 - 它必須具有連線的外設以連線輸入和輸出裝置。
軟硬體系統 - 軟體用於更多功能和靈活性。硬體用於效能和安全性。

優點
- 易於定製
- 低功耗
- 低成本
- 效能增強
缺點
- 開發工作量大
- 上市時間長
嵌入式系統的基本結構
下圖顯示了嵌入式系統的基本結構 -

感測器 - 它測量物理量並將其轉換為電訊號,觀察者或任何電子儀器(如 A2D 轉換器)都可以讀取該訊號。感測器將測得的量儲存到記憶體中。
A-D 轉換器 - 模數轉換器將感測器傳送的模擬訊號轉換為數字訊號。
處理器和 ASIC - 處理器處理資料以測量輸出並將其儲存到記憶體中。
D-A 轉換器 - 數模轉換器將處理器提供的數字資料轉換為模擬資料
執行器 - 執行器將 D-A 轉換器給出的輸出與儲存在其中的實際(預期)輸出進行比較,並存儲批准的輸出。
嵌入式系統 - 處理器
處理器是嵌入式系統的核心。它是獲取輸入並在處理資料後產生輸出的基本單元。對於嵌入式系統設計人員來說,必須瞭解微處理器和微控制器。
系統中的處理器
處理器有兩個基本單元 -
- 程式流程控制單元 (CU)
- 執行單元 (EU)
CU 包括用於從記憶體中獲取指令的獲取單元。EU 具有實現與資料傳輸操作相關的指令以及將資料從一種形式轉換為另一種形式的電路。
EU 包括算術邏輯單元 (ALU),以及執行程式控制任務(例如中斷或跳轉到另一組指令)的指令的電路。
處理器執行獲取和執行指令的迴圈,其順序與從記憶體中獲取指令的順序相同。
處理器型別
處理器可以屬於以下類別 -
通用處理器 (GPP)
- 微處理器
- 微控制器
- 嵌入式處理器
- 數字訊號處理器
- 媒體處理器
專用系統處理器 (ASSP)
專用指令處理器 (ASIP)
應用專用積體電路 (ASIC) 或超大規模積體電路 (VLSI) 上的 GPP 核心或 ASIP 核心。
微處理器
微處理器是一個具有 CPU 的單個 VLSI 晶片。此外,它還可以具有其他單元,例如教練、浮點處理算術單元和流水線單元,這些單元有助於更快地處理指令。
早期版本的微處理器的獲取和執行週期由大約 1 MHz 數量級的時鐘頻率引導。現在的處理器以 2GHz 的時鐘頻率執行

微控制器
微控制器是一個單晶片 VLSI 單元(也稱為微型計算機),儘管計算能力有限,但具有增強的輸入/輸出能力和許多片上功能單元。
CPU | RAM | ROM |
I/O 埠 | 定時器 | 序列通訊埠 |
微控制器特別用於具有片上程式儲存器和裝置的即時控制應用中的嵌入式系統。
微處理器與微控制器的區別
現在讓我們看一下微處理器和微控制器之間最顯著的區別。
微處理器 | 微控制器 |
---|---|
微處理器本質上是多工的。可以同時執行多個任務。例如,在計算機上,我們可以在文字編輯器中編寫文字的同時播放音樂。 | 面向單一任務。例如,洗衣機僅設計用於洗衣服。 |
RAM、ROM、I/O 埠和定時器可以外部新增,數量也可以變化。 | RAM、ROM、I/O 埠和定時器不能外部新增。這些元件必須一起嵌入到晶片上,數量是固定的。 |
設計人員可以決定所需的記憶體或 I/O 埠數量。 | 記憶體或 I/O 的固定數量使微控制器非常適合有限但特定的任務。 |
外部儲存器和 I/O 埠的外部支援使基於微處理器的系統更重且成本更高。 | 微控制器比微處理器輕巧且價格更低。 |
外部裝置需要更多空間,功耗也更高。 | 基於微控制器的系統功耗更低,佔用空間更小。 |
嵌入式系統 - 架構型別
8051 微控制器使用 8 位資料匯流排。因此,它們最多可以支援 64K 的外部資料記憶體和 64k 的外部程式記憶體。總的來說,8051 微控制器可以定址 128k 的外部記憶體。
當資料和程式碼位於不同的記憶體塊中時,該架構稱為哈佛架構。如果資料和程式碼位於同一個記憶體塊中,則該架構稱為馮·諾伊曼架構。
馮·諾伊曼架構
馮·諾伊曼架構最初由計算機科學家約翰·馮·諾伊曼提出。在這種架構中,存在一條用於指令和資料的公共資料路徑或匯流排。因此,CPU 每次執行一項操作。它要麼從記憶體中獲取指令,要麼對資料執行讀/寫操作。因此,指令獲取和資料操作不能同時發生,它們共享一個公共匯流排。

馮·諾伊曼架構支援簡單的硬體。它允許使用單個順序記憶體。如今的處理速度遠遠超過記憶體訪問時間,我們使用少量但速度極快的記憶體(快取)作為處理器的本地記憶體。
哈佛架構
哈佛架構為指令和資料提供單獨的儲存和訊號匯流排。這種架構的資料儲存完全包含在 CPU 內部,並且無法將指令儲存作為資料訪問。計算機使用內部資料匯流排為程式指令和資料設定單獨的記憶體區域,允許同時訪問指令和資料。
程式需要由操作員載入;處理器無法自行啟動。在哈佛架構中,無需使兩個記憶體共享屬性。

馮·諾伊曼架構與哈佛架構的比較
以下幾點將馮·諾伊曼架構與哈佛架構區分開來。
馮·諾伊曼架構 | 哈佛架構 |
---|---|
程式碼和資料共享單個記憶體。 | 程式碼和資料使用單獨的記憶體。 |
處理器需要在單獨的時鐘週期中獲取程式碼,在另一個時鐘週期中獲取資料。因此,它需要兩個時鐘週期。 | 由於使用單獨的匯流排訪問程式碼和資料,因此單個時鐘週期就足夠了。 |
速度更快,因此耗時更少。 | 速度較慢,因此耗時更多。 |
設計簡單。 | 設計複雜。 |
CISC 和 RISC
CISC 是複雜指令集計算機。它是一種可以處理大量指令的計算機。
在 20 世紀 80 年代初期,計算機設計師建議計算機應該使用更少的指令和簡單的結構,以便它們可以在 CPU 內更快地執行,而無需使用記憶體。此類計算機分類為精簡指令集計算機或 RISC。
CISC 與 RISC 的比較
以下幾點區分了 CISC 和 RISC -
CISC | RISC |
---|---|
更大的指令集。易於程式設計 | 更小的指令集。難以程式設計。 |
考慮到更大的指令集,編譯器的設計更簡單。 | 編譯器的設計複雜。 |
許多定址模式導致複雜的指令格式。 | 定址方式較少,需要修正指令格式。 |
指令長度可變。 | 指令長度變化。 |
每秒更高的時鐘週期。 | 每秒較低的時鐘週期。 |
重點在於硬體。 | 重點在於軟體。 |
控制單元使用微程式單元實現大型指令集。 | 每個指令都由硬體執行。 |
執行速度較慢,因為指令需要從記憶體讀取並由解碼單元解碼。 | 執行速度較快,因為每個指令都由硬體執行。 |
流水線技術不可行。 | 考慮到單個時鐘週期,指令流水線是可能的。 |
嵌入式系統 - 工具與外設
編譯器和彙編器
編譯器
編譯器是一個計算機程式(或一組程式),它將用程式語言(源語言)編寫的原始碼轉換為另一種計算機語言(通常為二進位制格式)。轉換的最常見原因是建立可執行程式。術語“編譯器”主要用於將原始碼從高階程式語言轉換為低階語言(例如,組合語言或機器碼)的程式。
交叉編譯器
如果編譯後的程式可以在與編譯器編譯該程式的計算機不同的 CPU 或作業系統上執行,則該編譯器稱為交叉編譯器。
反編譯器
可以將程式從低階語言翻譯成高階語言的程式稱為反編譯器。
語言轉換器
翻譯用不同高階語言編寫的程式的程式通常稱為語言轉換器、源到源轉換器或語言轉換器。
編譯器可能會執行以下操作:
- 預處理
- 語法分析
- 語義分析(語法制導翻譯)
- 程式碼生成
- 程式碼最佳化
彙編器
彙編器是一個程式,它接收基本的計算機指令(稱為組合語言)並將其轉換為計算機處理器可用於執行其基本操作的位元模式。彙編器透過將彙編指令助記符轉換為操作碼並解析符號名稱到記憶體位置來建立目的碼。組合語言使用助記符來表示每個低階機器操作(操作碼)。
嵌入式系統中的除錯工具
除錯是一個系統化的過程,用於查詢並減少計算機程式或電子硬體中的錯誤數量,使其按預期工作。當子系統緊密耦合時,除錯很困難,因為一個子系統中的微小變化可能會在另一個子系統中產生錯誤。嵌入式系統中使用的除錯工具在開發時間和除錯功能方面差異很大。這裡我們將討論以下除錯工具:
- 模擬器
- 微控制器入門套件
- 模擬器
模擬器
透過在用於程式碼開發的主機計算機上模擬 MCU/系統來測試程式碼。模擬器嘗試在軟體中模擬整個微控制器的行為。
模擬器的功能
模擬器執行以下功能:
定義目標系統的處理器或處理裝置系列及其各種版本。
在每次單步執行過程中,監視帶標籤和符號引數的原始碼部分的詳細資訊。
提供每次單步執行的目標系統的 RAM 和模擬埠的狀態。
監視系統響應並確定吞吐量。
提供程式計數器內容與處理器暫存器輸出的跟蹤。
提供當前命令的詳細含義。
監視從鍵盤輸入或從選單中選擇的模擬器命令的詳細資訊。
支援條件(最多 8 或 16 或 32 個條件)和無條件斷點。
提供斷點和跟蹤,它們共同構成了重要的測試和除錯工具。
促進內部外設和延遲的同步。
微控制器入門套件
微控制器入門套件包括:
- 硬體板(評估板)
- 線上程式設計器
- 一些軟體工具,如編譯器、彙編器、連結器等。
- 有時,IDE 和編譯器的程式碼大小受限的評估版本。
與模擬器相比,這些套件的一大優勢在於它們可以即時工作,從而可以輕鬆驗證輸入/輸出功能。但是,入門套件完全足夠,並且是開發簡單微控制器專案的最便宜選擇。
模擬器
模擬器是一個硬體套件或軟體程式,或者兩者兼而有之,它在一個計算機系統(主機)中模擬另一個計算機系統(客戶機)的功能,與第一個系統不同,因此模擬的行為與真實系統的行為非常相似(客戶機)。
模擬指的是電子裝置中的計算機程式模擬(模仿)另一個程式或裝置的能力。模擬側重於重建原始計算機環境。模擬器能夠與數字物件的真實性保持更緊密的聯絡。模擬器幫助使用者以類似於軟體在其原始環境中執行的方式,在平臺上執行任何型別的應用程式或作業系統。
嵌入式系統中的外設
嵌入式系統透過其外設與外部世界通訊,例如:
- 序列通訊介面 (SCI),如 RS-232、RS-422、RS-485 等。
- 同步序列通訊介面,如 I2C、SPI、SSC 和 ESSI。
- 通用序列匯流排 (USB)
- 多媒體卡(SD 卡、Compact Flash 等)。
- 網路,如乙太網、LonWorks 等。
- 現場匯流排,如 CAN 匯流排、LIN 匯流排、PROFIBUS 等。
- 定時器,如 PLL、捕獲/比較和時間處理單元。
- 離散 I/O 又名通用輸入/輸出 (GPIO)
- 模數/數模轉換器 (ADC/DAC)
- 除錯,如 JTAG、ISP、ICSP、BDM 埠、BITP 和 DP9 埠。
選擇微控制器的標準
在選擇微控制器時,確保它滿足手頭的任務並且具有成本效益。我們必須檢視 8 位、16 位或 32 位微控制器哪一個最適合處理任務的計算需求。此外,在選擇微控制器時應牢記以下幾點:
速度 - 微控制器可以支援的最高速度是多少?
封裝 - 是 40 引腳 DIP(雙列直插封裝)還是 QFP(四側扁平封裝)?這在最終產品的空間、組裝和原型設計方面很重要。
功耗 - 對於電池供電的產品,這是一個重要的標準。
晶片上的RAM 和 ROM 容量。
晶片上的I/O 引腳和定時器數量。
單位成本 - 這對於使用微控制器的產品的最終成本至關重要。
此外,確保您擁有微控制器提供的工具,例如編譯器、偵錯程式和彙編器。最重要的是,您應該從可靠的來源購買微控制器。
嵌入式系統 - 8051 微控制器
8051 的簡史
第一個微處理器4004是由英特爾公司發明的。8085 和8086 微處理器也是由英特爾發明的。1981 年,英特爾推出了一款名為8051 的 8 位微控制器。它被稱為片上系統,因為它在一個晶片上集成了 128 位元組的 RAM、4K 位元組的片上 ROM、兩個定時器、一個序列埠和 4 個埠(8 位寬)。當它變得非常流行時,英特爾允許其他製造商製造和銷售 8051 的不同版本,並且其程式碼與 8051 相容。這意味著如果您為 8051 的一個版本編寫程式,它也將在其他版本上執行,無論製造商是誰。這導致了幾個具有不同速度和片上 RAM 容量的版本。
8051 版本/成員
8052 微控制器 - 8052 具有 8051 微控制器的所有標準功能,以及額外的 128 位元組 RAM 和一個額外的定時器。它還具有 8K 位元組的片上程式 ROM,而不是 4K 位元組。
8031 微控制器 - 它是 8051 系列的另一個成員。該晶片通常被稱為無 ROM 8051,因為它具有 0K 位元組的片上 ROM。您必須向其新增外部 ROM 才能使用它,其中包含要獲取和執行的程式。該程式可以大到 64K 位元組。但在向 8031 新增外部 ROM 的過程中,它丟失了 4 個埠中的 2 個埠。為了解決這個問題,我們可以向 8031 新增外部 I/O。
8051 系列成員之間的比較
下表比較了 8051、8052 和 8031 中可用的功能。
功能 | 8051 | 8052 | 8031 |
---|---|---|---|
ROM(位元組) | 4K | 8K | 0K |
RAM(位元組) | 128 | 256 | 128 |
定時器 | 2 | 3 | 2 |
I/O 引腳 | 32 | 32 | 32 |
序列埠 | 1 | 1 | 1 |
中斷源 | 6 | 8 | 6 |
8051 微控制器的特性
8051 微控制器捆綁了以下特性:
- 4KB 位元組片上程式儲存器 (ROM)
- 128 位元組片上資料儲存器 (RAM)
- 四個暫存器組
- 128 個使用者定義的軟體標誌
- 8 位雙向資料匯流排
- 16 位單向地址匯流排
- 32 個通用暫存器,每個暫存器 8 位
- 16 位定時器(通常為 2 個,但可能更多或更少)
- 三個內部中斷和兩個外部中斷
- 四個 8 位埠(短型號有兩個 8 位埠)
- 16 位程式計數器和資料指標
- 8051 還可能具有一些特殊功能,例如 UART、ADC、運算放大器等。
8051 微控制器的框圖
下圖顯示了 8051 微控制器的框圖:

嵌入式系統 - I/O 程式設計
在 8051 中,I/O 操作是使用四個埠和 40 個引腳完成的。以下引腳圖顯示了 40 個引腳的詳細資訊。I/O 操作埠保留了 32 個引腳,每個埠有 8 個引腳。其他 8 個引腳被指定為 Vcc、GND、XTAL1、XTAL2、RST、EA(反相)、ALE/PROG(反相)和 PSEN(反相)。
它是一個 40 引腳 PDIP(塑膠雙列直插封裝)

注意 - 在 DIP 封裝中,您可以透過 IC 中間的切口識別第一個引腳和最後一個引腳。第一個引腳位於此切口標記的左側,最後一個引腳(在本例中為第 40 個引腳)位於切口標記的右側。
I/O 埠及其功能
四個埠 P0、P1、P2 和 P3 各使用 8 個引腳,使其成為 8 位埠。在復位後,所有埠都配置為輸入,準備用作輸入埠。當第一個 0 寫入埠時,它將變為輸出。要將其重新配置為輸入,必須向埠傳送 1。
埠 0(引腳號 32 – 引腳號 39)
它有 8 個引腳(32 到 39)。它可以用於輸入或輸出。與 P1、P2 和 P3 埠不同,我們通常將 P0 連線到 10K 歐姆上拉電阻,以將其用作輸入或輸出埠,因為它是一個開漏輸出。
埠0(引腳32-39)也被指定為AD0-AD7,這意味著它既可以作為地址匯流排,也可以作為資料匯流排使用。對於8031(即無ROM晶片),當我們需要訪問外部ROM時,P0將同時用作地址匯流排和資料匯流排。ALE(引腳31)指示P0是地址還是資料。當ALE=0時,它提供資料D0-D7,但當ALE=1時,它具有地址A0-A7。如果沒有外部儲存器連線,則必須將P0外部連線到一個10K歐姆的上拉電阻。

MOV A,#0FFH ;(comments: A=FFH(Hexadecimal i.e. A=1111 1111) MOV P0,A ;(Port0 have 1's on every pin so that it works as Input)
埠1(引腳1至8)
它是一個8位埠(引腳1至8),可以用作輸入或輸出。它不需要上拉電阻,因為它們已經在內部連線。復位後,埠1配置為輸入埠。以下程式碼可用於向埠1傳送55H和AAH的交替值。
;Toggle all bits of continuously MOV A,#55 BACK: MOV P2,A ACALL DELAY CPL A ;complement(invert) reg. A SJMP BACK
如果將埠1配置為輸出埠,則要再次將其用作輸入埠,請透過向其所有位寫入1來對其進行程式設計,如下面的程式碼所示。
;Toggle all bits of continuously MOV A ,#0FFH ;A = FF hex MOV P1,A ;Make P1 an input port MOV A,P1 ;get data from P1 MOV R7,A ;save it in Reg R7 ACALL DELAY ;wait MOV A,P1 ;get another data from P1 MOV R6,A ;save it in R6 ACALL DELAY ;wait MOV A,P1 ;get another data from P1 MOV R5,A ;save it in R5
埠2(引腳21至28)
埠2佔用總共8個引腳(引腳21至28),可用於輸入和輸出操作。與P1(埠1)一樣,P2也不需要外部上拉電阻,因為它們已經在內部連線。它必須與P0一起使用,以提供外部儲存器的16位地址。因此,它也被指定為(A0-A7),如引腳圖所示。當8051連線到外部儲存器時,它為16位地址的高8位提供路徑,並且不能用作I/O。復位後,埠2配置為輸入埠。以下程式碼可用於向埠2傳送55H和AAH的交替值。
;Toggle all bits of continuously MOV A,#55 BACK: MOV P2,A ACALL DELAY CPL A ; complement(invert) reg. A SJMP BACK
如果將埠2配置為輸出埠,則要再次將其用作輸入埠,請透過向其所有位寫入1來對其進行程式設計,如下面的程式碼所示。
;Get a byte from P2 and send it to P1 MOV A,#0FFH ;A = FF hex MOV P2,A ;make P2 an input port BACK: MOV A,P2 ;get data from P2 MOV P1,A ;send it to Port 1 SJMP BACK ;keep doing that
埠3(引腳10至17)
它也是8位的,可以用作輸入/輸出。此埠提供一些非常重要的訊號。P3.0和P3.1分別是RxD(接收器)和TxD(傳送器),它們共同用於序列通訊。P3.2和P3.3引腳用於外部中斷。P3.4和P3.5分別用於定時器T0和T1。P3.6和P3.7是寫(WR)和讀(RD)引腳。這些是低電平有效的引腳,這意味著當向它們提供0時它們將處於活動狀態,並且它們用於在基於8031的系統中向外部ROM提供讀寫操作。
P3位 | 功能 | 引腳 |
---|---|---|
P3.0 | RxD | 10 |
P3.1 < | TxD | 11 |
P3.2 < | INT0的反碼 | 12 |
P3.3 < | INT1 | 13 |
P3.4 < | T0 | 14 |
P3.5 < | T1 | 15 |
P3.6 < | WR | 16 |
P3.7 < | RD的反碼 | 17 |
埠0和埠2的雙重角色
埠0的雙重角色 - 埠0也被指定為AD0-AD7,因為它可以同時用於資料和地址處理。在將8051連線到外部儲存器時,埠0可以提供地址和資料。8051微控制器然後將輸入多路複用為地址或資料,以節省引腳。
埠2的雙重角色 - 除了用作I/O外,埠P2還與埠0一起用於為外部儲存器提供16位地址匯流排。埠P2也被指定為(A8-A15),而埠0透過A0-A7提供低8位。換句話說,我們可以說,當8051連線到外部儲存器(ROM)時,該儲存器最多可以達到64KB,這是透過16位地址匯流排實現的,因為我們知道216 = 64KB。埠2用於16位地址的高8位,並且不能用作I/O,這是訪問外部ROM程式程式碼的方式。
引腳的硬體連線
Vcc - 引腳40為晶片供電,為+5V。
Gnd - 引腳20為參考提供接地。
XTAL1,XTAL2(引腳18和引腳19) - 8051具有片上振盪器,但需要外部時鐘來執行它。石英晶體連線在晶片的XTAL1和XTAL2引腳之間。該晶體還需要兩個30pF的電容來產生所需頻率的訊號。每個電容的一端連線到地。8051 IC有各種速度,這都取決於這個石英晶體,例如,一個20MHz的微控制器需要一個頻率不超過20MHz的晶體。

RST(引腳9) - 它是一個輸入引腳,並且是高電平有效的引腳。在該引腳上施加高脈衝,即1,微控制器將復位並終止所有活動。此過程稱為上電覆位。啟用上電覆位將導致暫存器中的所有值丟失。它會將程式計數器設定為全0。為了確保復位的有效輸入,高脈衝必須在允許其變為低電平之前保持高電平至少兩個機器週期,這取決於電容值和其充電速率。(機器週期是執行單個指令所需的最小頻率。)
EA或外部訪問(引腳31) - 它是一個輸入引腳。此引腳是低電平有效的引腳;在施加低脈衝後,它會被啟用。對於具有片上ROM的微控制器(8051/52),EA(反碼)引腳連線到Vcc。但在沒有片上ROM的8031微控制器中,程式碼儲存在外部ROM中,然後由微控制器獲取。在這種情況下,我們必須將(引腳31)EA連線到Gnd,以指示程式程式碼儲存在外部。

PSEN或程式儲存器使能(引腳29) - 這也是一個低電平有效的引腳,即在施加低脈衝後它會被啟用。它是一個輸出引腳,與EA引腳一起在基於8031的(即無ROM)系統中使用,以允許將程式程式碼儲存在外部ROM中。
ALE或(地址鎖存使能) - 這是一個輸出引腳,並且是高電平有效的。它專門用於8031 IC將其連線到外部儲存器。在確定P0引腳將用作地址匯流排還是資料匯流排時可以使用它。當ALE=1時,P0引腳用作資料匯流排,當ALE=0時,P0引腳用作地址匯流排。
I/O埠和位定址
在為8051編寫程式碼時,這是8051最廣泛使用的功能之一。有時我們需要訪問埠的1或2位,而不是整個8位。8051提供了訪問埠各個位的功能。
以單位元方式訪問埠時,我們使用語法“SETB X.Y”,其中X是埠號(0到3),Y是資料位(0到7)的位號,其中D0是最低有效位,D7是最高有效位。例如,“SETB P1.5”將埠1的第5位設定為高電平。
以下程式碼顯示了我們如何連續切換P1.2位。
AGAIN: SETB P1.2 ACALL DELAY CLR P1.2 ACALL DELAY SJMP AGAIN
單位元指令
指令 | 功能 |
---|---|
SETB bit | 設定位(bit = 1) |
CLR bit | 清除位(bit = 0) |
CPL bit | 反轉位(bit = NOT bit) |
JB bit, target | 如果bit = 1,則跳轉到target(如果bit,則跳轉) |
JNB bit, target | 如果bit = 0,則跳轉到target(如果無bit,則跳轉) |
JBC bit, target | 如果bit = 1,則跳轉到target,並清除bit(如果bit,則跳轉,然後清除) |
嵌入式系統 - 術語
程式計數器
程式計數器是一個16位或32位暫存器,其中包含要執行的下一條指令的地址。每次獲取指令時,PC都會自動遞增到下一個連續的記憶體位置。分支、跳轉和中斷操作會將程式計數器載入到除下一個連續位置之外的其他地址。
啟用上電覆位將導致暫存器中的所有值丟失。這意味著復位後PC(程式計數器)的值為0,迫使CPU從ROM記憶體位置0000獲取第一個操作碼。這意味著我們必須將操作碼的第一位元組放在ROM位置0000,因為這是CPU期望找到第一條指令的位置。
復位向量
復位向量的意義在於它將處理器指向包含韌體第一條指令的記憶體地址。如果沒有復位向量,處理器將不知道從哪裡開始執行。復位後,處理器從預定義的記憶體位置載入程式計數器(PC)的復位向量值。在CPU08架構上,此位置位於$FFFE:$FFFF。
當不需要復位向量時,開發人員通常認為它是理所當然的,並且不會將其程式設計到最終映像中。結果,處理器不會在最終產品上啟動。這是除錯階段發生的常見錯誤。
堆疊指標
堆疊在RAM中實現,並且使用一個稱為SP(堆疊指標)暫存器的CPU暫存器來訪問它。SP暫存器是一個8位暫存器,可以定址範圍為00h到FFh的記憶體地址。最初,SP暫存器包含值07,以將位置08指向為8051使用的第一個堆疊位置。
當CPU暫存器的內容儲存在堆疊中時,稱為PUSH操作。當堆疊的內容儲存在CPU暫存器中時,稱為POP操作。換句話說,將暫存器壓入堆疊以儲存它,並從堆疊中彈出以檢索它。
無限迴圈
無限迴圈或無休止迴圈可以識別為計算機程式中的一系列指令,由於以下原因,這些指令在迴圈中無限執行:
- 沒有終止條件的迴圈。
- 終止條件永遠無法滿足的迴圈。
- 終止條件導致迴圈重新開始的迴圈。
此類無限迴圈通常會導致舊的作業系統變得無響應,因為無限迴圈會消耗所有可用的處理器時間。等待使用者輸入的I/O操作也稱為“無限迴圈”。計算機“凍結”的一個可能原因是無限迴圈;其他原因包括死鎖和訪問衝突。
與PC不同,嵌入式系統永遠不會“退出”應用程式。它們透過一個無限迴圈空閒,等待以中斷或預先安排的任務的形式發生的事件。為了節省電力,一些處理器進入特殊的睡眠或等待模式,而不是透過無限迴圈空閒,但它們將在定時器或外部中斷後退出此模式。
中斷
中斷大多是硬體機制,用於指示程式已發生事件。它們可能隨時發生,因此與程式流非同步。它們需要處理器進行特殊處理,並最終由相應的中斷服務程式(ISR)處理。中斷需要快速處理。如果您花費太多時間處理中斷,那麼您可能會錯過另一箇中斷。
小端序與大端序
儘管數字始終以相同的方式顯示,但它們在記憶體中的儲存方式並不相同。大端序機器將資料的最高有效位元組儲存在最低記憶體地址中。大端序機器將0x12345678儲存為 -
ADD+0: 0x12 ADD+1: 0x34 ADD+2: 0x56 ADD+3: 0x78
另一方面,小端序機器將資料的最低有效位元組儲存在最低記憶體地址中。小端序機器將0x12345678儲存為 -
ADD+0: 0x78 ADD+1: 0x56 ADD+2: 0x34 ADD+3: 0x12
嵌入式系統 - 組合語言
組合語言是為了提供機器級程式碼指令的助記符或符號而開發的。組合語言程式由助記符組成,因此應將其轉換為機器程式碼。負責此轉換的程式稱為彙編器。組合語言通常被稱為低階語言,因為它直接與CPU的內部結構互動。要使用匯編語言程式設計,程式設計師必須瞭解CPU的所有暫存器。
諸如 C、C++、Java 等不同的程式語言被稱為高階語言,因為它們不涉及 CPU 的內部細節。相比之下,彙編器用於將組合語言程式轉換為機器碼(有時也稱為目的碼或操作碼)。類似地,編譯器將高階語言轉換為機器碼。例如,要編寫 C 語言程式,必須使用 C 編譯器將程式轉換為機器語言。
組合語言的結構
組合語言程式是一系列語句,這些語句要麼是組合語言指令(例如 ADD 和 MOV),要麼是稱為指令的語句。
指令告訴 CPU 要做什麼,而指令(也稱為偽指令)則向彙編器發出指令。例如,ADD 和 MOV 指令是 CPU 執行的命令,而 ORG 和 END 是彙編器指令。當使用 ORG 指令時,彙編器將操作碼放置到記憶體位置 0,而 END 指示原始碼的結尾。程式語言指令包含以下四個欄位:
[ label: ] mnemonics [ operands ] [;comment ]
方括號([ ])表示該欄位是可選的。
標號欄位允許程式透過名稱引用程式碼行。標號欄位不能超過一定數量的字元。
助記符和運算元欄位共同執行程式的實際工作並完成任務。例如語句 ADD A , C & MOV C, #68,其中 ADD 和 MOV 是助記符,生成操作碼;“A, C” 和 “C, #68” 是運算元。這兩個欄位可以包含指令。指令不會生成機器碼,僅供彙編器使用,而指令則被轉換為機器碼供 CPU 執行。
1.0000 ORG 0H ;start (origin) at location 0 2 0000 7D25 MOV R5,#25H ;load 25H into R5 3.0002 7F34 MOV R7,#34H ;load 34H into R7 4.0004 7400 MOV A,#0 ;load 0 into A 5.0006 2D ADD A,R5 ;add contents of R5 to A 6.0007 2F ADD A,R7 ;add contents of R7 to A 7.0008 2412 ADD A,#12H ;add to A value 12 H 8.000A 80FE HERE: SJMP HERE ;stay in this loop 9.000C END ;end of asm source file
註釋欄位以分號開頭,分號是註釋指示符。
請注意程式中的標號“HERE”。任何引用指令的標號都應後跟冒號。
彙編和執行 8051 程式
在這裡,我們將討論組合語言的基本形式。建立、彙編和執行組合語言程式的步驟如下:
首先,我們使用編輯器鍵入類似於上述程式的程式。所有 Microsoft 作業系統附帶的類似 MS-DOS EDIT 程式的編輯器可用於建立或編輯程式。編輯器必須能夠生成 ASCII 檔案。原始檔的“asm”副檔名在下一步中由彙編器使用。
“asm”原始檔包含在步驟 1 中建立的程式程式碼。它被饋送到 8051 彙編器。然後,彙編器將組合語言指令轉換為機器碼指令,並生成.obj 檔案(目標檔案)和.lst 檔案(列表檔案)。它也被稱為原始檔,因此一些彙編器要求此檔案具有“src”副檔名。“lst”檔案是可選的。它對程式非常有用,因為它列出了所有操作碼和地址以及彙編器檢測到的錯誤。
彙編器需要一個稱為連結的第三步。連結程式獲取一個或多個目標檔案,並生成一個副檔名為“abs”的絕對目標檔案。
接下來,“abs”檔案被饋送到一個名為“OH”(目標到十六進位制轉換器)的程式,該程式建立一個副檔名為“hex”的檔案,該檔案已準備好刻錄到 ROM 中。

資料型別
8051 微控制器包含一種 8 位的單一資料型別,每個暫存器也是 8 位大小。程式設計師必須將大於 8 位(00 到 FFH,或十進位制的 255)的資料分解,以便 CPU 可以處理它。
DB(定義位元組)
DB 指令是彙編器中最廣泛使用的資料指令。它用於定義 8 位資料。它還可以用於定義十進位制、二進位制、十六進位制或 ASCII 格式的資料。對於十進位制,十進位制數後的“D”是可選的,但“B”(二進位制)和“Hl”(十六進位制)是必需的。
要指示 ASCII,只需將字元放在引號中('像這樣')。彙編器會自動為數字/字元生成 ASCII 程式碼。DB 指令是唯一可以用於定義大於兩個字元的 ASCII 字串的指令;因此,它應該用於所有 ASCII 資料定義。下面給出了一些 DB 的示例:
ORG 500H DATA1: DB 28 ;DECIMAL (1C in hex) DATA2: DB 00110101B ;BINARY (35 in hex) DATA3: DB 39H ;HEX ORG 510H DATA4: DB "2591" ;ASCII NUMBERS ORG 520H DATA6: DA "MY NAME IS Michael" ;ASCII CHARACTERS
ASCII 字串周圍可以使用單引號或雙引號。DB 也用於以位元組大小的塊分配記憶體。
彙編器指令
8051 的一些指令如下:
ORG(原點) - 原點指令用於指示地址的開頭。它採用十六進位制或十進位制格式的數字。如果數字後提供 H,則該數字被視為十六進位制,否則為十進位制。彙編器將十進位制數轉換為十六進位制。
EQU(等價) - 它用於定義常量而不佔用記憶體位置。EQU 將常量值與資料標號關聯,以便標號出現在程式中,其常量值將替換為標號。在執行指令“MOV R3, #COUNT”時,暫存器 R3 將載入值為 25(注意 # 符號)。使用 EQU 的優點是程式設計師可以更改一次,彙編器將更改其所有出現;程式設計師不必搜尋整個程式。
END 指令 - 它指示源(asm)檔案的結尾。END 指令是程式的最後一行;END 指令之後的任何內容都會被彙編器忽略。
組合語言中的標號
組合語言中的所有標號都必須遵循以下規則:
每個標號名稱必須唯一。組合語言程式設計中用於標號的名稱由大小寫字母、數字 0 到 9 以及特殊字元(如問號(?)、句點(.)、@ 符號、下劃線(_)和美元符號($))組成。
第一個字元應為字母字元;它不能是數字。
保留字不能用作程式中的標號。例如,ADD 和 MOV 詞是保留字,因為它們是指令助記符。
嵌入式系統 - 暫存器
暫存器用於 CPU 中臨時儲存資訊,這些資訊可能是要處理的資料,或者指向要獲取的資料的地址。在 8051 中,有一種資料型別為 8 位,從 MSB(最高有效位)D7 到 LSB(最低有效位)D0。對於 8 位資料型別,任何大於 8 位的資料型別都必須在處理之前分解成 8 位塊。
8051 最常用的暫存器是 A(累加器)、B、R0-R7、DPTR(資料指標)和 PC(程式計數器)。所有這些暫存器都是 8 位的,除了 DPTR 和 PC。
8051 中的儲存暫存器
我們將在這裡討論以下型別的儲存暫存器:
- 累加器
- R 暫存器
- B 暫存器
- 資料指標 (DPTR)
- 程式計數器 (PC)
- 堆疊指標 (SP)
累加器
累加器,暫存器 A,用於所有算術和邏輯運算。如果沒有累加器,則每次計算(加法、乘法、移位等)的結果都必須儲存到主記憶體中。訪問主記憶體比訪問像累加器這樣的暫存器慢,因為用於大型主記憶體的技術比用於暫存器的技術慢(但更便宜)。
“R”暫存器
“R”暫存器是一組八個暫存器,即 R0、R1 到 R7。這些暫存器在許多操作中充當輔助或臨時儲存暫存器。考慮 10 和 20 之和的示例。將變數 10 儲存在累加器中,將另一個變數 20 儲存在,例如,暫存器 R4 中。要處理加法運算,請執行以下命令:
ADD A,R4
執行此指令後,累加器將包含值 30。因此,“R”暫存器是非常重要的輔助或輔助暫存器。如果沒有這些“R”暫存器,累加器本身將不是很有用。“R”暫存器用於臨時儲存值。
讓我們再舉一個例子。我們將 R1 和 R2 中的值加在一起,然後從結果中減去 R3 和 R4 的值。
MOV A,R3 ;Move the value of R3 into the accumulator ADD A,R4 ;Add the value of R4 MOV R5,A ;Store the resulting value temporarily in R5 MOV A,R1 ;Move the value of R1 into the accumulator ADD A,R2 ;Add the value of R2 SUBB A,R5 ;Subtract the value of R5 (which now contains R3 + R4)
如您所見,我們使用 R5 臨時儲存 R3 和 R4 的和。當然,這不是計算 (R1 + R2) – (R3 + R4) 的最有效方法,但它確實說明了“R”暫存器作為臨時儲存值的方式。

“B”暫存器
“B”暫存器與累加器非常相似,因為它可以儲存 8 位(1 位元組)的值。“B”暫存器僅由兩個 8051 指令使用:MUL AB 和DIV AB。要快速輕鬆地將 A 乘以或除以另一個數字,您可以將另一個數字儲存在“B”中並使用這兩個指令。除了使用 MUL 和 DIV 指令外,“B”暫存器通常用作另一個臨時儲存暫存器,就像第九個 R 暫存器一樣。
資料指標
資料指標 (DPTR) 是 8051 唯一使用者可訪問的 16 位(2 位元組)暫存器。累加器、R0-R7 暫存器和 B 暫存器是 1 位元組值暫存器。DPTR 用於指向資料。它由 8051 用於使用 DPTR 指示的地址訪問外部儲存器。DPTR 是唯一可用的 16 位暫存器,通常用於儲存 2 位元組值。
程式計數器
程式計數器 (PC) 是一個 2 位元組地址,它告訴 8051 在哪裡可以找到記憶體中要執行的下一條指令。當 8051 初始化時,PC 從 0000h 開始,並在每次執行指令後遞增。PC 並不總是遞增 1。某些指令可能需要 2 或 3 個位元組;在這種情況下,PC 將遞增 2 或 3。
分支、跳轉和中斷操作將程式計數器載入到下一個順序位置以外的地址。啟用上電覆位將導致暫存器中的所有值丟失。這意味著 PC 的值為復位後的 0,迫使 CPU 從 ROM 位置 0000 獲取第一個操作碼。這意味著我們必須將第一個操作碼位元組放在 ROM 位置 0000,因為那是 CPU 期望找到第一條指令的地方。
堆疊指標 (SP)
堆疊指標與除 DPTR 和 PC 之外的所有暫存器一樣,可以儲存 8 位(1 位元組)的值。堆疊指標指示從何處從堆疊中刪除下一個值的地址。當將值壓入堆疊時,SP 的值會遞增,然後將該值儲存到結果記憶體位置。當從堆疊中彈出值時,將從 SP 指示的記憶體位置返回該值,然後 SP 的值會遞減。
操作順序很重要。當 8051 初始化時,SP 將被初始化為 07h。如果同時將一個值壓入堆疊,則該值將儲存在內部 RAM 地址 08h 中,因為 8051 將首先增加 SP 的值(從 07h 到 08h),然後將壓入的值儲存到該記憶體地址(08h)。SP 由 8051 透過六條指令直接修改:PUSH、POP、ACALL、LCALL、RET 和 RETI。
8051 中的 ROM 空間
一些 8051 家族成員只有 4K 位元組的片上 ROM(例如 8751、AT8951);有些有 8K ROM,如 AT89C52,還有一些家族成員有 32K 位元組和 64K 位元組的片上 ROM,例如達拉斯半導體。需要記住的是,8051 家族的任何成員都不能訪問超過 64K 位元組的操作碼,因為 8051 中的程式計數器是一個 16 位暫存器(0000 到 FFFF 地址)。
8051 內部的程式 ROM 的第一個位置的地址為 0000H,而最後一個位置可能因晶片上 ROM 的大小而異。在 8051 家族成員中,AT8951 有 $k 位元組的片上 ROM,其記憶體地址從 0000(第一個位置)到 0FFFH(最後一個位置)。

8051 標誌位和 PSW 暫存器
程式狀態字 (PSW) 暫存器是一個 8 位暫存器,也稱為標誌暫存器。它是 8 位寬的,但只有 6 位被使用。兩個未使用的位是使用者定義標誌。其中四個標誌稱為條件標誌,這意味著它們指示指令執行後產生的條件。這四個是CY(進位)、AC(輔助進位)、P(奇偶校驗)和OV(溢位)。RS0 和 RS1 位用於更改暫存器組。下圖顯示了程式狀態字暫存器。
PSW 暫存器包含反映 CPU 當前狀態的狀態位。
CY | CA | F0 | RS1 | RS0 | OV | - | P |
---|
CY | PSW.7 | 進位標誌 |
AC | PSW.6 | 輔助進位標誌 |
F0 | PSW.5 | 使用者可用於通用目的的標誌 0。 |
RS1 | PSW.4 | 暫存器組選擇位 1 |
RS0 | PSW.3 | 暫存器組選擇位 0 |
OV | PSW.2 | 溢位標誌 |
- | PSW.1 | 使用者可定義標誌 |
P | PSW.0 | 奇偶校驗標誌。在指令週期期間由硬體設定/清除,以指示累加器中 1 位的奇偶數。 |
我們可以使用 RS0 和 RS1 位選擇相應的暫存器組位。
RS1 | RS2 | 暫存器組 | 地址 |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
CY,進位標誌 - 每當從 D7 位進位時,此進位標誌就被置位 (1)。它在 8 位加法或減法運算後受到影響。它也可以透過指令(例如“SETB C”和“CLR C”)直接重置為 1 或 0,其中“SETB”代表設定進位位,“CLR”代表清除進位。
AC,輔助進位標誌 - 如果在 ADD 或 SUB 操作期間 D3 和 D4 之間有進位,則 AC 位被置位;否則,它被清除。它用於指令執行二進位制編碼十進位制算術。
P,奇偶校驗標誌 - 奇偶校驗標誌僅表示累加器暫存器中 1 的數量。如果 A 暫存器包含奇數個 1,則 P = 1;對於偶數個 1,P = 0。
OV,溢位標誌 - 每當帶符號數運算的結果過大導致高位溢位到符號位時,此標誌就被置位。它僅用於檢測帶符號算術運算中的錯誤。
示例
在以下指令中,顯示 9CH 和 64H 相加後 CY、AC 和 P 標誌的狀態。
MOV A, #9CH
ADD A, # 64H
Solution: 9C 10011100 +64 01100100 100 00000000 CY = 1 since there is a carry beyond D7 bit AC = 0 since there is a carry from D3 to D4 P = 0 because the accumulator has even number of 1's
嵌入式系統 - 暫存器組/堆疊
8051 微控制器共有 128 位元組的 RAM。我們將討論這 128 位元組 RAM 的分配,並檢查它們作為堆疊和暫存器的用法。
8051 中的 RAM 記憶體空間分配
8051 內部的 128 位元組 RAM 被分配了地址 00 到 7FH。它們可以直接作為記憶體位置訪問,並分為以下三組 -
從 00H 到 1FH 位置的 32 位元組留給暫存器組和堆疊。
從 20H 到 2FH 位置的 16 位元組留給按位定址的讀/寫記憶體。
從 30H 到 7FH 位置的 80 位元組用於讀寫儲存;它被稱為暫存器。這 80 個位置的 RAM 被 8051 程式設計師廣泛用於儲存資料和引數。

8051 中的暫存器組
總共 32 位元組的 RAM 留給暫存器組和堆疊。這 32 位元組被分為四個暫存器組,每個暫存器組有 8 個暫存器,R0–R7。RAM 位置 0 到 7 留給 R0–R7 的組 0,其中 R0 是 RAM 位置 0,R1 是 RAM 位置 1,R2 是位置 2,依此類推,直到記憶體位置 7,它屬於組 0 的 R7。
暫存器 R0–R7 的第二個組從 RAM 位置 08 開始,到位置 OFH。R0–R7 的第三個組從記憶體位置 10H 開始,到位置 17H。最後,RAM 位置 18H 到 1FH 留給 R0–R7 的第四個組。
預設暫存器組
如果 RAM 位置 00–1F 留給四個暫存器組,那麼當 8051 加電時,我們能夠訪問哪個暫存器組 R0–R7?答案是暫存器組 0;也就是說,在對 8051 進行程式設計時,RAM 位置 0 到 7 使用名稱 R0 到 R7 進行訪問。因為用 R0 到 R7 等名稱引用這些 RAM 位置比用它們的記憶體位置引用更容易。
如何切換暫存器組
8051 加電時,暫存器組 0 為預設組。我們可以使用 PSW 暫存器切換到其他組。PSW 的 D4 和 D3 位用於選擇所需的暫存器組,因為它們可以透過按位定址指令 SETB 和 CLR 進行訪問。例如,“SETB PSW.3”將設定 PSW.3 = 1 並選擇暫存器組 1。
RS1 | RS2 | 選擇的組 |
---|---|---|
0 | 0 | 組 0 |
0 | 1 | 組 1 |
1 | 0 | 組 2 |
1 | 1 | 組 3 |
堆疊及其操作
8051 中的堆疊
堆疊是 CPU 用於臨時儲存資訊(如資料或記憶體地址)的 RAM 的一部分。考慮到暫存器的數量有限,CPU 需要此儲存區域。
如何訪問堆疊
由於堆疊是 RAM 的一部分,因此 CPU 內部有暫存器指向它。用於訪問堆疊的暫存器稱為堆疊指標暫存器。8051 中的堆疊指標為 8 位寬,其值可以為 00 到 FFH。當 8051 初始化時,SP 暫存器包含值 07H。這意味著 RAM 位置 08 是堆疊使用的第一個位置。將 CPU 暫存器儲存到堆疊中的操作稱為PUSH,將堆疊中的內容取回 CPU 暫存器稱為POP。
壓入堆疊
在 8051 中,堆疊指標 (SP) 指向堆疊的最後一個使用位置。當資料被壓入堆疊時,堆疊指標 (SP) 會遞增 1。當執行 PUSH 時,暫存器的內容被儲存到堆疊中,並且 SP 遞增 1。要將暫存器壓入堆疊,我們必須使用它們的 RAM 地址。例如,指令“PUSH 1”將暫存器 R1 壓入堆疊。
從堆疊彈出
將堆疊的內容彈出到給定的暫存器中與壓入過程相反。在每次彈出操作中,堆疊的頂部位元組都會被複制到指令指定的暫存器中,並且堆疊指標會遞減一次。
嵌入式系統 - 指令
程式流以順序方式進行,從一條指令到下一條指令,除非執行了控制轉移指令。組合語言中的各種型別的控制轉移指令包括條件或無條件跳轉和呼叫指令。
迴圈和跳轉指令
8051 中的迴圈
重複執行一系列指令一定次數稱為迴圈。指令DJNZ reg, label用於執行迴圈操作。在此指令中,暫存器遞減 1;如果它不為零,則 8051 跳轉到標籤引用的目標地址。
在迴圈開始之前,暫存器載入迴圈次數的計數器。在此指令中,暫存器遞減和跳轉決策被組合到單個指令中。暫存器可以是 R0–R7 中的任何一個。計數器也可以是 RAM 位置。
示例
使用重複加法技術將 25 乘以 10。
解決方案 - 乘法可以透過重複新增被乘數來實現,次數與乘數相同。例如,
25 * 10 = 250(FAH)
25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250
MOV A,#0 ;A = 0,clean ACC MOV R2,#10 ; the multiplier is replaced in R2 Add A,#25 ;add the multiplicand to the ACC AGAIN:DJNZ R2, AGAIN:repeat until R2 = 0 (10 times) MOV R5 , A ;save A in R5 ;R5 (FAH)
8051 中的缺點 - 使用指令DJNZ Reg label進行迴圈操作僅限於 256 次迭代。如果沒有進行條件跳轉,則執行跳轉後的指令。
迴圈內的迴圈
當我們在另一個迴圈內使用迴圈時,這稱為巢狀迴圈。當最大計數限制為 256 時,使用兩個暫存器來儲存計數。因此,我們使用此方法使操作重複的次數超過 256 次。
示例
編寫一個程式 -
- 將累加器載入為值 55H。
- 對 ACC 取反 700 次。
解決方案 - 由於 700 大於 255(任何暫存器的最大容量),因此使用兩個暫存器來儲存計數。以下程式碼顯示瞭如何使用兩個暫存器 R2 和 R3 進行計數。
MOV A,#55H ;A = 55H NEXT: MOV R3,#10 ;R3 the outer loop counter AGAIN:MOV R2,#70 ;R2 the inner loop counter CPL A ;complement
其他條件跳轉
下表列出了 8051 中使用的條件跳轉 -
指令 | 操作 |
---|---|
JZ | 如果 A = 0 則跳轉 |
JNZ | 如果 A ≠ 0 則跳轉 |
DJNZ | 遞減並如果暫存器 ≠ 0 則跳轉 |
CJNE A, data | 如果 A ≠ 資料,則跳轉 |
CJNE 暫存器, #資料 | 如果位元組 ≠ 資料,則跳轉 |
JC | 如果 CY = 1,則跳轉 |
JNC | 如果 CY ≠ 1,則跳轉 |
JB | 如果位 = 1,則跳轉 |
JNB | 如果位 = 0,則跳轉 |
JBC | 如果位 = 1 且清零該位,則跳轉 |
JZ(如果 A = 0,則跳轉) - 在此指令中,檢查累加器的內容。如果為零,則 8051 跳轉到目標地址。JZ 指令僅適用於累加器,不適用於任何其他暫存器。
JNZ(如果 A 不等於 0,則跳轉) - 在此指令中,檢查累加器的內容是否非零。如果非零,則 8051 跳轉到目標地址。
JNC(如果無進位,則跳轉,如果 CY = 0,則跳轉) - 標誌(或 PSW)暫存器中的進位標誌位用於決定是否跳轉“JNC 標籤”。CPU 檢視進位標誌以檢視它是否被置位(CY = 1)。如果未置位,則 CPU 開始從標籤地址獲取並執行指令。如果 CY = 1,它將不會跳轉,而是執行 JNC 下面的下一條指令。
JC(如果進位,則跳轉,如果 CY = 1,則跳轉) - 如果 CY = 1,則跳轉到目標地址。
JB(如果位為高,則跳轉)
JNB(如果位為低,則跳轉)
注意 - 必須注意,所有條件跳轉都是短跳轉,即目標地址必須在程式計數器內容的 -128 到 +127 位元組內。
無條件跳轉指令
8051 中有兩個無條件跳轉 -
LJMP(長跳轉) - LJMP 是 3 位元組指令,其中第一個位元組表示操作碼,第二個和第三個位元組表示目標位置的 16 位地址。2 位元組目標地址允許從 0000 到 FFFFH 的任何記憶體位置跳轉。
SJMP(短跳轉) - 它是一個 2 位元組指令,其中第一個位元組是操作碼,第二個位元組是目標位置的相對地址。相對地址範圍從 00H 到 FFH,分為向前跳轉和向後跳轉;也就是說,相對於當前 PC(程式計數器)地址的記憶體中 -128 到 +127 位元組內。對於向前跳轉,目標地址可以位於當前 PC 的 127 位元組空間內。對於向後跳轉,目標地址可以位於當前 PC 的 -128 位元組內。
計算短跳轉地址
所有條件跳轉(JNC、JZ 和 DJNZ)都是短跳轉,因為它們是 2 位元組指令。在這些指令中,第一個位元組表示操作碼,第二個位元組表示相對地址。目標地址始終相對於程式計數器的值。要計算目標地址,將第二個位元組新增到跳轉指令正下方的指令的 PC 中。請檢視下面給出的程式 -
Line PC Op-code Mnemonic Operand 1 0000 ORG 0000 2 0000 7800 MOV R0,#003 3 0002 7455 MOV A,#55H0 4 0004 6003 JZ NEXT 5 0006 08 INC R0 6 0007 04 AGAIN: INC A 7 0008 04 INC A 8 0009 2477 NEXT: ADD A, #77h 9 000B 5005 JNC OVER 10 000D E4 CLR A 11 000E F8 MOV R0, A 12 000F F9 MOV R1, A 13 0010 FA MOV R2, A 14 0011 FB MOV R3, A 15 0012 2B OVER: ADD A, R3 16 0013 50F2 JNC AGAIN 17 0015 80FE HERE: SJMP HERE 18 0017 END
向後跳轉目標地址計算
對於向前跳轉,位移值是 0 到 127(十六進位制為 00 到 7F)之間的正數。但是,對於向後跳轉,位移值是 0 到 -128 的負數。
CALL 指令
CALL 用於呼叫子程式或方法。子程式用於執行需要頻繁執行的操作或任務。這使程式更具結構化並節省記憶體空間。有兩個指令 - LCALL 和 ACALL。
LCALL(長呼叫)
LCALL 是一個 3 位元組指令,其中第一個位元組表示操作碼,第二個和第三個位元組用於提供目標子程式的地址。LCALL 可用於呼叫 8051 的 64K 位元組地址空間內的子程式。
為了成功返回到呼叫子程式執行後的點,CPU 將 LCALL 正下方的指令地址儲存在堆疊中。因此,當呼叫子程式時,控制權將轉移到該子程式,處理器將 PC(程式計數器)儲存在堆疊中,並開始從新位置獲取指令。RET(返回)指令在完成子程式執行後將控制權轉移回呼叫方。每個子程式都使用 RET 作為最後一條指令。
ACALL(絕對呼叫)
ACALL 是一個 2 位元組指令,與 3 位元組的 LCALL 相比。子程式的目標地址必須在 2K 位元組內,因為只有 2 位元組中的 11 位用於地址。ACALL 和 LCALL 之間的區別在於 LCALL 的目標地址可以在 8051 的 64K 位元組地址空間中的任何位置,而 CALL 的目標地址在 2K 位元組範圍內。
嵌入式系統 - 編址模式
編址模式是指如何定址給定的記憶體位置。執行此指令有五種不同的方式或五種編址模式,如下所示 -
- 立即定址模式
- 直接定址模式
- 暫存器直接定址模式
- 暫存器間接定址模式
- 索引定址模式
立即定址模式
讓我們從一個例子開始。
MOV A, #6AH
一般來說,我們可以寫,
MOV A, #data
它被稱為立即,因為 8 位資料立即傳輸到累加器(目標運算元)。
下圖描述了上述指令及其執行過程。操作碼 74H 儲存到 0202 地址。資料 6AH 儲存到程式記憶體的 0203 地址。讀取操作碼 74H 後,下一個程式記憶體地址處的資料被傳輸到累加器 A(E0H 是累加器的地址)。由於指令為 2 位元組並在一個週期內執行,因此程式計數器將遞增 2 並指向程式記憶體的 0204。

注意 - 6AH 前面的“#”符號表示運算元是資料(8 位)。在沒有“#”的情況下,十六進位制數將被視為地址。
直接定址模式
這是另一種定址運算元的方式。在這裡,資料的地址(源資料)作為運算元給出。讓我們舉個例子。
MOV A, 04H
暫存器組 #0(第 4 個暫存器)的地址為 04H。執行 MOV 指令時,暫存器 04H 中儲存的資料將移動到累加器。由於暫存器 04H 儲存資料 1FH,因此 1FH 將移動到累加器。
注意 - 與立即定址模式不同,我們在直接定址模式中未使用“#”。如果我們使用了“#”,則資料值 04H 將被傳輸到累加器而不是 1FH。
現在,請檢視下圖。它顯示了指令如何執行。

如上圖所示,這是一個 2 位元組指令,需要 1 個週期才能完成。PC 將遞增 2 並指向 0204。MOV A,address 指令的操作碼為 E5H。當執行 0202 處的指令(E5H)時,累加器被啟用並準備好接收資料。然後 PC 轉到下一個地址 0203 並查詢 04H 位置的地址,其中源資料(要傳輸到累加器)位於。在 04H 處,控制找到資料 1F 並將其傳輸到累加器,因此執行完成。
暫存器直接定址模式
在此定址模式下,我們直接使用暫存器名稱(作為源運算元)。讓我們嘗試透過一個例子來理解。
MOV A, R4
一次,暫存器可以取值 R0 到 R7。有 32 個這樣的暫存器。為了僅使用 8 個變數來定址暫存器而使用 32 個暫存器,使用了暫存器組。有 4 個暫存器組,命名為 0 到 3。每個組包含 8 個暫存器,命名為 R0 到 R7。
一次,可以選擇一個暫存器組。暫存器組的選擇可以透過名為處理器狀態字(PSW)的特殊功能暫存器(SFR)實現。PSW 是一個 8 位 SFR,其中每個位都可以根據需要進行程式設計。位從 PSW.0 到 PSW.7 指定。PSW.3 和 PSW.4 用於選擇暫存器組。
現在,請檢視下圖以清楚地瞭解其工作原理。

操作碼 EC 用於 MOV A,R4。操作碼儲存在地址 0202 處,當它被執行時,控制權直接轉到相應暫存器組的 R4(在 PSW 中選擇)。如果選擇了暫存器組 #0,則暫存器組 #0 的 R4 中的資料將移動到累加器。這裡 2F 儲存在 04H 處。04H 表示暫存器組 #0 的 R4 的地址。
資料(2F)移動以粗體突出顯示。2F 從資料記憶體位置 0C H 傳輸到累加器,並顯示為虛線。0CH 是暫存器組 #1 的暫存器 4(R4)的地址位置。上述指令為 1 位元組,需要 1 個週期才能完成執行。這意味著,您可以透過使用暫存器直接定址模式來節省程式記憶體。
暫存器間接定址模式
在此定址模式下,資料的地址儲存在暫存器中作為運算元。
MOV A, @R0
這裡 R0 內的值被視為地址,其中包含要傳輸到累加器的資料。示例:如果 R0 的值為 20H,並且資料 2FH 儲存在地址 20H 處,則執行此指令後,值 2FH 將被傳輸到累加器。請參閱下圖。

因此,MOV A,@R0 的操作碼為 E6H。假設選擇了暫存器組 #0,則暫存器組 #0 的 R0 儲存資料 20H。程式控制移動到 20H,在那裡它找到資料 2FH 並將其傳輸到累加器。這是一個 1 位元組指令,程式計數器遞增 1 並移動到程式記憶體的 0203。
注意 - 只有 R0 和 R1 才能構成暫存器間接定址指令。換句話說,程式設計師可以使用 @R0 或 @R1 建立指令。所有暫存器組都允許。
索引定址模式
我們將舉兩個例子來理解索引定址模式的概念。請檢視以下指令 -
MOVC A,@A+DPTR
和
MOVC A,@A+PC
其中 DPTR 是資料指標,PC 是程式計數器(兩者都是 16 位暫存器)。考慮第一個示例。
MOVC A, @A+DPTR
源運算元為@A+DPTR。它包含來自此位置的源資料。這裡我們將DPTR的內容與累加器的當前內容相加。此加法將得到一個新地址,即源資料的地址。然後將此地址指向的資料傳輸到累加器。

操作碼為93H。DPTR的值為01FE,其中01位於DPH(高8位),FE位於DPL(低8位)。累加器的值為02H。然後執行16位加法,01FE H+02H的結果為0200 H。位置0200H處的資料將被傳輸到累加器。累加器中的先前值(02H)將被來自0200H的新資料替換。累加器中的新資料在插圖中突出顯示。
這是一個1位元組指令,需要2個週期才能執行,並且此指令所需的執行時間與之前的指令(所有指令都是1個週期)相比較高。
另一個示例MOVC A, @A+PC的工作方式與上述示例相同。這裡不是將DPTR與累加器相加,而是將程式計數器(PC)內部的資料與累加器相加以獲得目標地址。
嵌入式系統 - SFR暫存器
特殊功能暫存器(或特殊用途暫存器,或簡稱特殊暫存器)是微處理器中控制或監控微處理器各種功能的暫存器。由於特殊暫存器與處理器的某些特殊功能或狀態密切相關,因此它們可能無法透過普通指令(如加法、移動等)直接寫入。相反,某些處理器架構中的一些特殊暫存器需要特殊指令來修改它們。
在8051中,暫存器A、B、DPTR和PSW是通常稱為SFR(特殊功能暫存器)的暫存器組的一部分。可以透過其名稱或地址訪問SFR。
下表顯示了SFR及其地址的列表。
位元組地址 | 位地址 | ||||||||
---|---|---|---|---|---|---|---|---|---|
FF | |||||||||
F0 | F7 | F6 | F5 | F4 | F3 | F2 | F1 | F0 | B |
E0 | E7 | E6 | E5 | E4 | E3 | E2 | E1 | E0 | ACC |
D0 | D7 | D6 | D5 | D4 | D3 | D2 | - | D0 | PSW |
B8 | - | - | - | BC | BB | BA | B9 | B8 | IP |
B0 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | P3 |
A2 | AF | - | - | AC | AB | AA | A9 | A8 | IE |
A0 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | P2 |
99 | 不可位定址 | SBUF | |||||||
98 | 9F | 9E | 9D | 9C | 9B | 9A | 99 | 98 | SCON |
90 | 97 | 96 | 95 | 94 | 93 | 92 | 91 | 90 | P1 |
8D | 不可位定址 | TH1 | |||||||
8C | 不可位定址 | TH0 | |||||||
8B | 不可位定址 | TL1 | |||||||
8A | 不可位定址 | TL0 | |||||||
89 | 不可位定址 | TMOD | |||||||
88 | 8F | 8E | 8D | 8C | 8B | 8A | 89 | 88 | TCON |
87 | 不可位定址 | PCON | |||||||
83 | 不可位定址 | DPH | |||||||
82 | 不可位定址 | DPL | |||||||
81 | 不可位定址 | SP | |||||||
80 | 87 | 87 | 85 | 84 | 83 | 82 | 81 | 80 | P0 |
關於SFR地址,請考慮以下兩點。
特殊功能暫存器可以具有80H到FFH之間的地址。這些地址高於80H,因為從00到7FH的地址是8051內部RAM儲存器的地址。
並非所有80到FF的地址空間都由SFR使用。未使用的80H到FFH位置是保留的,8051程式設計師不得使用。
CY | PSW.7 | 進位標誌 |
AC | PSW.6 | 輔助進位標誌 |
F0 | PSW.5 | 使用者可用於通用目的的標誌 0。 |
RS1 | PSW.4 | 暫存器組選擇位 1 |
RS0 | PSW.3 | 暫存器組選擇位 0 |
OV | PSW.2 | 溢位標誌 |
- | PSW.1 | 使用者可定義標誌 |
P | PSW.0 | 奇偶校驗標誌。在指令週期期間由硬體設定/清除,以指示累加器中 1 位的奇偶數。 |
在以下示例中,SFR暫存器的名稱被替換為它們的地址。
CY | AC | F0 | RS1 | RS0 | OV | - | P |
---|
我們可以使用 RS0 和 RS1 位選擇相應的暫存器組位。
RS1 | RS2 | 暫存器組 | 地址 |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
程式狀態字 (PSW) 包含狀態位以反映CPU的當前狀態。8051 變體提供了一個特殊功能暫存器 PSW,其中包含此狀態資訊。8251 提供了兩個額外的狀態標誌 Z 和 N,它們在稱為 PSW1 的第二個特殊功能暫存器中可用。
嵌入式系統 - 定時器/計數器
定時器是一種專門的時鐘型別,用於測量時間間隔。通常將從零開始向上計數以測量經過時間的定時器稱為秒錶。它是一種從指定時間間隔倒數的裝置,用於生成時間延遲,例如,沙漏就是一個定時器。
計數器是一種儲存(有時還顯示)特定事件或過程發生的次數的裝置,相對於時鐘訊號而言。它用於計數微控制器外部發生的事件。在電子學中,可以使用暫存器型別電路(如觸發器)非常輕鬆地實現計數器。
定時器和計數器的區別
區分定時器和計數器的要點如下:
定時器 | 計數器 |
---|---|
每個機器週期都會遞增暫存器。 | 考慮到其對應的外部輸入引腳(T0、T1)的1到0轉換,暫存器會遞增。 |
最大計數速率為振盪器頻率的1/12。 | 最大計數速率為振盪器頻率的1/24。 |
定時器使用內部時鐘的頻率並生成延遲。 | 計數器使用外部訊號來計數脈衝。 |
8051的定時器及其相關暫存器
8051有兩個定時器,定時器0和定時器1。它們可以用作定時器或事件計數器。定時器0和定時器1均為16位寬。由於8051遵循8位架構,因此每個16位被訪問為兩個獨立的低位元組和高位元組暫存器。
定時器0暫存器
定時器0的16位暫存器被訪問為低位元組和高位元組。低位元組暫存器稱為TL0(定時器0低位元組),高位元組暫存器稱為TH0(定時器0高位元組)。可以像訪問任何其他暫存器一樣訪問這些暫存器。例如,指令MOV TL0, #4H將值移入定時器#0的低位元組。

定時器1暫存器
定時器1的16位暫存器被訪問為低位元組和高位元組。低位元組暫存器稱為TL1(定時器1低位元組),高位元組暫存器稱為TH1(定時器1高位元組)。可以像訪問任何其他暫存器一樣訪問這些暫存器。例如,指令MOV TL1, #4H將值移入定時器1的低位元組。

TMOD(定時器模式)暫存器
定時器0和定時器1都使用同一個暫存器來設定各種定時器操作模式。它是一個8位暫存器,其中低4位留給定時器0,高四位留給定時器。在每種情況下,低2位用於預先設定定時器模式,高2位用於指定位置。

門控 - 設定後,定時器僅在INT(0,1)為高電平時執行。
C/T - 計數器/定時器選擇位。
M1 - 模式位1。
M0 - 模式位0。
GATE
每個定時器都有啟動和停止的方法。有些定時器透過軟體執行此操作,有些透過硬體執行,有些同時具有軟體和硬體控制。8051定時器同時具有軟體和硬體控制。定時器的啟動和停止由軟體使用指令SETB TR1和CLR TR1(對於定時器1)以及SETB TR0和CLR TR0(對於定時器0)來控制。
SETB指令用於啟動它,並由CLR指令停止它。只要TMOD暫存器中的GATE = 0,這些指令就會啟動和停止定時器。可以透過使TMOD暫存器中的GATE = 1來透過外部源啟動和停止定時器。
C/T(時鐘/定時器)
TMOD暫存器中的此位用於確定定時器是作為延遲生成器還是事件管理器使用。如果C/T = 0,則將其用作定時器以生成定時器延遲。建立時間延遲的時鐘源是8051的晶體頻率。如果C/T = 0,則連線到8051的晶體頻率也決定了8051定時器以規則間隔滴答的頻率。
定時器頻率始終為連線到8051的晶體頻率的1/12。儘管各種基於8051的系統具有10 MHz到40 MHz的XTAL頻率,但我們通常使用11.0592 MHz的XTAL頻率。這是因為8051的序列通訊波特率。XTAL = 11.0592允許8051系統與PC通訊而不會出現錯誤。
M1 / M2
M1 | M2 | 模式 |
---|---|---|
0 | 0 | 13位定時器模式。 |
0 | 1 | 16位定時器模式。 |
1 | 0 | 8位自動過載模式。 |
1 | 1 | 分時模式。 |
定時器的不同模式
模式0(13位定時器模式)
模式0下的定時器1和定時器0都作為8位計數器執行(帶32分頻預分頻器)。定時器暫存器配置為一個13位暫存器,由TH1的所有8位和TL1的低5位組成。TL1的高3位是不確定的,應忽略。設定執行標誌(TR1)不會清除暫存器。當計數從全1翻轉到全0時,會設定定時器中斷標誌TF1。模式0操作對於定時器0與定時器1相同。
模式1(16位定時器模式)
定時器模式“1”是一個16位定時器,是一種常用的模式。它的功能與13位模式相同,只是使用了所有16位。TLx從0開始遞增到最大255。一旦達到值255,TLx重置為0,然後THx遞增1。作為完整的16位定時器,定時器最多可以包含65536個不同的值,並且在65,536個機器週期後將溢位回0。
模式2(8位自動過載)
兩個定時器暫存器都配置為帶自動過載的8位計數器(TL1和TL0)。TL1(TL0)的溢位設定TF1(TF0),並將TL1(TL0)重新載入為Th1(TH0)的內容,後者由軟體預設。過載不會更改TH1(TH0)。
自動過載模式的好處是您可以使定時器始終包含從200到255的值。如果您使用模式0或1,則必須在程式碼中檢查溢位,在這種情況下,將定時器重置為200。在這種情況下,寶貴的指令檢查值和/或被重新載入。在模式2中,微控制器負責此操作。一旦您將定時器配置為模式2,就不必擔心檢查定時器是否溢位,也不必擔心重置值,因為微控制器硬體將為您完成所有操作。自動過載模式用於建立常見的波特率。
模式3(分時模式)
定時器模式“3”稱為分時模式。當定時器0置於模式3時,它會變成兩個獨立的8位定時器。定時器0是TL0,定時器1是TH0。兩個定時器都從0計數到255,並在溢位時重置回0。定時器1的所有位現在都將與TH0繫結。
當定時器0處於分時模式時,真正的定時器1(即TH1和TL1)可以設定為模式0、1或2,但不能啟動/停止,因為執行此操作的位現在已連結到TH0。真正的定時器1將在每個機器週期遞增。
初始化定時器
確定定時器模式。考慮一個連續執行且獨立於任何外部引腳的16位定時器。
初始化 TMOD 特殊功能暫存器。使用 TMOD 的最低 4 位並考慮定時器 0。保持兩位 GATE 0 和 C/T 0 為 0,因為我們希望定時器獨立於外部引腳。由於 16 位模式是定時器模式 1,因此清除 T0M1 並設定 T0M0。實際上,唯一需要開啟的位是 TMOD 的第 0 位。現在執行以下指令:
MOV TMOD,#01h
現在,定時器 0 處於 16 位定時器模式,但定時器未執行。要啟動定時器使其執行,請透過執行以下指令設定 TR0 位:
SETB TR0
現在,定時器 0 將立即開始計數,每個機器週期遞增一次。
讀取定時器
16 位定時器可以透過兩種方式讀取。要麼讀取定時器的實際值作為 16 位數字,要麼檢測定時器何時溢位。
檢測定時器溢位
當定時器從其最高值溢位到 0 時,微控制器會自動設定 TCON 暫存器中的 TFx 位。因此,無需檢查定時器的精確值,而是可以檢查 TFx 位。如果 TF0 設定,則定時器 0 已溢位;如果 TF1 設定,則定時器 1 已溢位。
嵌入式系統 - 中斷
中斷是硬體或軟體發出的傳送到處理器的訊號,指示需要立即注意的事件。每當發生中斷時,控制器都會完成當前指令的執行並開始執行中斷服務程式 (ISR) 或中斷處理程式。ISR 告訴處理器或控制器中斷髮生時該做什麼。中斷可以是硬體中斷或軟體中斷。
硬體中斷
硬體中斷是由外部裝置(如磁碟控制器或外部外設)傳送到處理器的電子警報訊號。例如,當我們在鍵盤上按下按鍵或移動滑鼠時,它們會觸發硬體中斷,導致處理器讀取按鍵或滑鼠位置。
軟體中斷
軟體中斷是由異常情況或指令集中導致中斷的特殊指令引起的,當處理器執行該指令時會導致中斷。例如,如果處理器的算術邏輯單元執行一條將數字除以零的命令,則會導致除以零異常,從而導致計算機放棄計算或顯示錯誤訊息。軟體中斷指令的工作方式類似於子程式呼叫。
什麼是輪詢?
持續監控的狀態稱為輪詢。微控制器不斷檢查其他裝置的狀態;在執行此操作時,它不執行其他操作,並消耗所有處理時間進行監控。這個問題可以透過使用中斷來解決。
在中斷方法中,控制器僅在發生中斷時響應。因此,控制器不需要定期監控介面和內建裝置的狀態(標誌、訊號等)。
中斷與輪詢
以下是一個區分中斷和輪詢的類比:
中斷 | 輪詢 |
---|---|
中斷就像一個店員。如果需要服務或產品,他會去找他並告知他自己的需求。在中斷的情況下,當接收到標誌或訊號時,它們會通知控制器需要對其進行服務。 | 輪詢方法就像一個銷售人員。銷售人員挨家挨戶地推銷產品或服務。類似地,控制器逐個監控所有裝置的標誌或訊號,併為需要其服務的任何元件提供服務。 |
中斷服務程式
對於每個中斷,都必須有一箇中斷服務程式 (ISR) 或中斷處理程式。當發生中斷時,微控制器會執行中斷服務程式。對於每個中斷,記憶體中都有一個固定位置儲存其中斷服務程式 ISR 的地址。為儲存 ISR 地址而預留的記憶體位置表稱為中斷向量表。

中斷向量表
8051 中有六個中斷,包括復位。
中斷 | ROM 位置(十六進位制) | 引腳 |
---|---|---|
中斷 | ROM 位置(十六進位制) | |
序列通訊 (RI 和 TI) | 0023 | |
定時器 1 中斷 (TF1) | 001B | |
外部硬體中斷 1 (INT1) | 0013 | P3.3 (13) |
外部硬體中斷 0 (INT0) | 0003 | P3.2 (12) |
定時器 0 (TF0) | 000B | |
復位 | 0000 | 9 |
當復位引腳被啟用時,8051 會跳轉到地址位置 0000。這是上電覆位。
為定時器預留了兩個中斷:一個用於定時器 0,一個用於定時器 1。記憶體位置分別為中斷向量表中的 000BH 和 001BH。
為硬體外部中斷預留了兩個中斷。埠 3 中的引腳 12 和引腳 13 分別用於外部硬體中斷 INT0 和 INT1。記憶體位置分別為中斷向量表中的 0003H 和 0013H。
序列通訊有一個屬於接收和傳送的單箇中斷。記憶體位置 0023H 屬於此中斷。
執行中斷的步驟
當中斷變為活動狀態時,微控制器會執行以下步驟:
微控制器關閉當前正在執行的指令並將下一條指令的地址 (PC) 儲存到堆疊中。
它還內部儲存所有中斷的當前狀態(即,不在堆疊中)。
它跳轉到儲存中斷服務程式地址的中斷向量表的記憶體位置。
微控制器從中斷向量表獲取 ISR 的地址並跳轉到該地址。它開始執行中斷服務子程式,即 RETI(從中斷返回)。
執行 RETI 指令後,微控制器返回到中斷處的位置。首先,它透過將堆疊的頂部位元組彈出到 PC 中來從堆疊獲取程式計數器 (PC) 地址。然後,它開始從該地址執行。
邊沿觸發與電平觸發
中斷模組有兩種型別:電平觸發或邊沿觸發。
電平觸發 | 邊沿觸發 |
---|---|
電平觸發中斷模組只要中斷源的電平被置位就會始終生成中斷。 | 邊沿觸發中斷模組僅在檢測到中斷源的置位邊沿時才生成中斷。當中斷源電平實際發生變化時,邊沿會被檢測到。它也可以透過週期性取樣並在先前樣本被取消置位時檢測到置位電平來檢測到。 |
如果中斷源在韌體中斷處理程式處理中斷時仍處於置位狀態,則中斷模組將重新生成中斷,導致中斷處理程式再次被呼叫。 | 邊沿觸發中斷模組可以立即執行,無論中斷源的行為如何。 |
電平觸發中斷對韌體來說很麻煩。 | 邊沿觸發中斷使韌體的程式碼複雜度保持較低,減少了韌體的條件數量,並在處理中斷時提供了更大的靈活性。 |
啟用和停用中斷
復位後,即使中斷被啟用,所有中斷也會被停用。必須使用軟體啟用中斷,以便微控制器響應這些中斷。
IE(中斷啟用)暫存器負責啟用和停用中斷。IE 是一個按位定址的暫存器。
中斷啟用暫存器
EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
---|
EA - 全域性啟用/停用。
- - 未定義。
ET2 - 啟用定時器 2 中斷。
ES - 啟用序列埠中斷。
ET1 - 啟用定時器 1 中斷。
EX1 - 啟用外部中斷 1。
ET0 - 啟用定時器 0 中斷。
EX0 - 啟用外部中斷 0。
要啟用中斷,我們執行以下步驟:
IE 暫存器 (EA) 的位 D7 必須為高電平才能使暫存器的其餘部分生效。
如果 EA = 1,則中斷將被啟用並將得到響應,如果它們在 IE 中的相應位為高電平。如果 EA = 0,則任何中斷都不會響應,即使它們在 IE 暫存器中的關聯引腳為高電平。
8051 中的中斷優先順序
我們可以透過將較高優先順序分配給任何一箇中斷來更改中斷優先順序。這是透過程式設計一個名為IP(中斷優先順序)的暫存器來實現的。
下圖顯示了 IP 暫存器的位。復位後,IP 暫存器包含全 0。要為任何中斷賦予較高優先順序,我們將 IP 暫存器中相應的位設定為高電平。
- | - | - | - | PT1 | PX1 | PT0 | PX0 |
---|
- | IP.7 | 未實現。 |
- | IP.6 | 未實現。 |
- | IP.5 | 未實現。 |
- | IP.4 | 未實現。 |
PT1 | IP.3 | 定義定時器 1 中斷優先順序。 |
PX1 | IP.2 | 定義外部中斷 1 優先順序。 |
PT0 | IP.1 | 定義定時器 0 中斷優先順序。 |
PX0 | IP.0 | 定義外部中斷 0 優先順序。 |
中斷內部中斷
如果 8051 正在執行屬於一箇中斷的 ISR 並且另一箇中斷變為活動狀態會發生什麼?在這種情況下,高優先順序中斷可以中斷低優先順序中斷。這稱為中斷內部中斷。在 8051 中,低優先順序中斷可以被高優先順序中斷中斷,但不能被任何其他低優先順序中斷中斷。
透過軟體觸發中斷
有時我們需要透過模擬的方式測試 ISR。這可以透過簡單的指令來完成,這些指令將中斷置位,從而導致 8051 跳轉到中斷向量表。例如,將 IE 位設定為定時器 1 的 1。指令SETB TF1 將中斷 8051 當前正在執行的操作並強制其跳轉到中斷向量表。