系統是一種按照一套規則將其所有單元組裝在一起的安排。它也可以定義爲根據一個固定的計劃工作、組織或執行一個或多個任務的一種方式。例如,手錶是一種時間顯示系統。它的組件遵循一組規則來顯示時間。如果手錶的一個零件壞了,它就會停止工作。所以我們可以說,在一個系統中,它的所有子組件都相互依賴。
Embedded System
顧名思義,嵌入意味著與另一事物相連的事物。嵌入式系統可以被認爲是一個包含軟體的計算機硬體系統。嵌入式系統可以是獨立的系統,也可以是大型系統的一部分。嵌入式系統是一種基於微控制器或微處理器的系統,用於執行特定的任務。例如,火災報警器是一個嵌入式系統,它只能感知煙霧。
一個嵌入式系統有三個組成部分;
它有硬體。
它有應用軟體。
它有實時作業系統(RTOS)來監控應用軟體,並提供機制,讓處理器按照計劃運行進程,從而控制延遲。RTOS定義了系統的工作方式。它在應用程式執行期間設置規則。小型嵌入式系統可能沒有實時作業系統。
因此,我們可以將嵌入式系統定義爲基於微控制器、軟體驅動、可靠、實時的控制系統。
Characteristics of an Embedded System
單功能的嵌入式系統通常執行專門的操作,並重複執行相同的操作。例如:傳呼機總是起傳呼機的作用。
嚴格約束−所有計算系統都對設計指標有約束,但嵌入式系統上的設計指標可能特別嚴格。設計度量是對實現的特性(如成本、大小、能力和性能)的度量。它的尺寸必須適合於單個晶片,必須有足夠快的速度來實時處理數據,並消耗最小的功率來延長電池壽命。
許多嵌入式系統必須不斷地對系統環境的變化作出反應,並且必須毫不延遲地實時計算某些結果。舉一個汽車巡航控制器的例子,它持續監測速度和制動傳感器並對其作出反應。它必須在有限的時間內重複計算加速度或減加速度;延遲計算會導致車輛無法控制。
基於微處理器的−必須是基於微處理器或微控制器的。
內存−它必須有內存,因爲它的軟體通常嵌入ROM中。它不需要計算機中的任何輔助內存。
已連接−它必須有連接的外圍設備才能連接輸入和輸出設備。
HW-SW系統−軟體用於更多功能和靈活性。硬體用於性能和安全性。
Advantages
- Easily Customizable
- Low power consumption
- Low cost
- Enhanced performance
Disadvantages
- High development effort
- Larger time to market
Basic Structure of an Embedded System
下圖顯示了嵌入式系統的基本結構;
傳感器測量物理量並將其轉換爲電信號,可由觀察者或任何電子儀器(如A2D轉換器)讀取。傳感器將測量的量存儲到存儲器中。
A-D轉換器−模數轉換器將傳感器發送的模擬信號轉換爲數位訊號。
處理器&ASICs−處理器處理數據以測量輸出並將其存儲到內存中。
D-A轉換器
執行器將D-A轉換器給出的輸出與其中存儲的實際(預期)輸出進行比較,並存儲批准的輸出。
Embedded Systems - Processors
處理器是嵌入式系統的核心。它是接受輸入並在處理數據後產生輸出的基本單元。對於一個嵌入式系統設計者來說,既要有微處理器的知識,又要有單片機的知識。
Processors in a System
處理器有兩個基本單元&負;
- Program Flow Control Unit (CU)
- Execution Unit (EU)
CU包括一個提取單元,用於從存儲器中提取指令。歐盟的電路實現了有關數據傳輸操作和從一種形式到另一種形式的數據轉換的指令。
EU包括算術和邏輯單元(ALU)以及執行程序控制任務指令(如中斷)或跳轉到另一組指令的電路。
處理器運行獲取周期,並按照從內存獲取指令的相同順序執行這些指令。
Types of Processors
處理器可以是以下類別&負;
通用處理器(GPP)
- Microprocessor
- Microcontroller
- Embedded Processor
- Digital Signal Processor
- Media Processor
應用程式特定系統處理器(ASSP)
應用程式專用指令處理器(ASIP)
應用專用集成電路(ASIC)或超大規模集成電路(VLSI)上的GPP核或ASIP核。
Microprocessor
微處理器是一個具有CPU的VLSI晶片。此外,它還可以有其他單元,如coach、浮點運算單元和流水線單元,這些單元有助於更快地處理指令。
早期微處理器的獲取和執行周期由~1MHz的時鐘頻率引導。處理器現在以2GHz的時鐘頻率運行
Microcontroller
微控制器是一種單片VLSI單元(也稱爲微型計算機),它雖然具有有限的計算能力,但具有增強的輸入/輸出能力和許多片上功能單元。
CPU | RAM | ROM |
I/O Port | Timer | Serial COM Port |
微控制器在嵌入式系統中特別用於具有片上程序存儲器和設備的實時控制應用。
Microprocessor vs Microcontroller
現在讓我們來看看微處理器和微控制器之間最顯著的區別。
Microprocessor | Microcontroller |
---|---|
Microprocessors are multitasking in nature. Can perform multiple tasks at a time. For example, on computer we can play music while writing text in text editor. | Single task oriented. For example, a washing machine is designed for washing clothes only. |
RAM, ROM, I/O Ports, 和 Timers can be added externally 和 can vary in numbers. | RAM, ROM, I/O Ports, 和 Timers cannot be added externally. These components are to be embedded together on a chip 和 are fixed in numbers. |
Designers can decide the number of memory or I/O ports needed. | Fixed number for memory or I/O makes a microcontroller ideal for a limited but specific task. |
External support of external memory 和 I/O ports makes a microprocessor-based system heavier 和 costlier. | Microcontrollers are lightweight 和 cheaper than a microprocessor. |
External devices require more space 和 their power consumption is higher. | A microcontroller-based system consumes less power 和 takes less space. |
Embedded Systems - Architecture Types
8051單片機採用8位數據總線。因此,它們最多可支持64K的外部數據存儲器和64K的外部程序存儲器。總的來說,8051微控制器可以尋址128k的外部存儲器。
當數據和代碼位於不同的內存塊中時,該體系結構稱爲哈佛體系結構。如果數據和代碼位於同一個內存塊中,則該體系結構稱爲Von Neumann體系結構。
Von Neumann Architecture
馮·諾依曼結構最初是由計算機科學家約翰·馮·諾依曼提出的。在這種體系結構中,指令和數據都存在一條數據路徑或總線。因此,CPU一次執行一個操作。它要麼從內存中獲取指令,要麼對數據執行讀/寫操作。因此,指令獲取和數據操作不能同時發生,共享一條公共總線。
Von Neumann體系結構支持簡單的硬體。它允許使用單個順序存儲器。今天的處理速度大大超過了內存訪問時間,並且我們在處理器本地使用了非常快但數量很少的內存(緩存)。
Harvard Architecture
哈佛體系結構爲指令和數據提供單獨的存儲和信號總線。這種體系結構的數據存儲完全包含在CPU中,並且不能作爲數據訪問指令存儲。計算機有單獨的存儲區域,用於使用內部數據總線的程序指令和數據,允許同時訪問指令和數據。
程序需要由操作員加載;處理器無法自行啓動。在哈佛的架構中,沒有必要讓這兩個記憶共享屬性。
Von-Neumann Architecture vs Harvard Architecture
以下幾點將馮·諾依曼建築與哈佛建築區分開來。
Von-Neumann Architecture | Harvard Architecture |
---|---|
Single memory to be shared by both code 和 data. | Separate memories for code 和 data. |
Processor needs to fetch code in a separate clock cycle 和 data in another clock cycle. So it requires two clock cycles. | Single clock cycle is sufficient, as separate buses are used to access code 和 data. |
Higher speed, thus less time consuming. | Slower in speed, thus more time-consuming. |
Simple in design. | Complex in design. |
CISC 和 RISC
CISC是一種複雜的指令集計算機。它是一台能處理大量指令的計算機。
在20世紀80年代早期,計算機設計者建議計算機應該使用更少的指令和簡單的結構,這樣它們就可以在CPU中執行得更快,而不必使用內存。這種計算機被歸類爲精簡指令集計算機或RISC。
CISC vs RISC
以下幾點將CISC與RISC區分開來;
CISC | RISC |
---|---|
Larger set of instructions. Easy to program | Smaller set of Instructions. Difficult to program. |
Simpler design of compiler, considering larger set of instructions. | Complex design of compiler. |
Many addressing modes causing complex instruction formats. | Few addressing modes, fix instruction format. |
Instruction length is variable. | Instruction length varies. |
Higher clock cycles per second. | Low clock cycle per second. |
Emphasis is on hardware. | Emphasis is on software. |
Control unit implements large instruction set using micro-program unit. | Each instruction is to be executed by hardware. |
Slower execution, as instructions are to be read from memory 和 decoded by the decoder unit. | Faster execution, as each instruction is to be executed by hardware. |
Pipelining is not possible. | Pipelining of instructions is possible, considering single clock cycle. |
Embedded Systems - Tools & Peripherals
Compilers 和 Assemblers
Compiler
編譯器是將用一種程式語言(源語言)編寫的原始碼轉換成另一種計算機語言(通常是二進位格式)的電腦程式(或一組程序)。轉換的最常見原因是創建可執行程序。「編譯器」這個名稱主要用於將原始碼從高級程式語言翻譯成低級語言(例如彙編語言或機器代碼)的程序。
Cross-Compiler
如果編譯後的程序可以在一台CPU或作業系統與編譯器編譯程序的計算機不同的計算機上運行,則該編譯器稱爲交叉編譯器。
Decompiler
可以將程序從低級語言翻譯成高級語言的程序稱爲反編譯程序。
Language Converter
翻譯用不同高級語言編寫的程序的程序通常稱爲語言轉換器、源到源轉換器或語言轉換器。
編譯器可能執行以下操作&負;
- Preprocessing
- Parsing
- Semantic Analysis (Syntax-directed translation)
- Code generation
- Code optimization
Assemblers
彙編程序是一種程序,它接受基本的計算機指令(稱爲彙編語言),並將它們轉換成計算機處理器可以用來執行基本操作的位模式。彙編程序通過將彙編指令助記符轉換爲操作碼、將符號名解析爲內存位置來創建目標代碼。彙編語言使用助記符來表示每一個低級機器操作(操作碼)。
Debugging Tools in an Embedded System
調試是一個有條不紊的過程,它可以發現並減少電腦程式或電子硬體中的錯誤,從而使其按預期工作。當子系統緊密耦合時,調試是很困難的,因爲一個子系統中的一個小變化會在另一個子系統中產生錯誤。嵌入式系統中使用的調試工具在開發時間和調試特性上有很大的不同。我們將在這裡討論以下調試工具;
- Simulators
- Microcontroller starter kits
- Emulator
Simulators
通過在用於代碼開發的上位機上進行仿真,對單片機/系統的代碼進行了測試。模擬器試圖在軟體中模擬整個微控制器的行爲。
Functions of Simulators
模擬器執行以下功能−
定義目標系統的處理器或處理設備系列及其各種版本。
在執行每個步驟時,使用標籤和符號參數監視原始碼部分的詳細信息。
爲每個單步執行提供目標系統的RAM和模擬埠的狀態。
監視系統響應並確定吞吐量。
提供程序計數器內容的輸出與處理器寄存器的對比跟蹤。
提供當前命令的詳細含義。
監視從鍵盤輸入或從菜單中選擇的模擬器命令的詳細信息。
支持條件(最多8或16或32個條件)和無條件斷點。
提供斷點和跟蹤,它們是重要的測試和調試工具。
有助於同步內部外設和延遲。
Microcontroller Starter Kit
一個微控制器啓動套件包括−
- Hardware board (Evaluation board)
- In-system programmer
- Some software tools like compiler, assembler, linker, etc.
- Sometimes, an IDE 和 code size limited evaluation version of a compiler.
與模擬器相比,這些工具包的一大優勢是它們可以實時工作,因此可以方便地驗證輸入/輸出功能。然而,初學者工具包是開發簡單微控制器項目的完全足夠和最便宜的選擇。
Emulators
仿真器是一個硬體包或軟體程序,或者兩者都可以用來模擬另一個計算機系統(主機)中的一個計算機系統(來賓)的功能,不同於第一個計算機系統,因此模擬的行爲與實際系統(來賓)的行爲非常相似。
仿真是指電子設備中的電腦程式模擬(模擬)另一個程序或設備的能力。仿真的重點是重新創建原始的計算機環境。模擬器能夠與數字對象的真實性保持更緊密的聯繫。仿真器幫助用戶在平台上處理任何類型的應用程式或作業系統,其方式與軟體在其原始環境中運行的方式類似。
Peripheral Devices in Embedded Systems
嵌入式系統通過其外圍設備與外界進行通信,如following&mins;
- Serial Communication Interfaces (SCI) like RS-232, RS-422, RS-485, etc.
- Synchronous Serial Communication Interface like I2C, SPI, SSC, 和 ESSI
- Universal Serial Bus (USB)
- Multi Media Cards (SD Cards, Compact Flash, etc.)
- Networks like Ethernet, LonWorks, etc.
- Fieldbuses like CAN-Bus, LIN-Bus, PROFIBUS, etc.
- imers like PLL(s), Capture/Compare 和 Time Processing Units.
- Discrete IO aka General Purpose Input/Output (GPIO)
- Analog to Digital/Digital to Analog (ADC/DAC)
- Debugging like JTAG, ISP, ICSP, BDM Port, BITP, 和 DP9 ports
Criteria for Choosing Microcontroller
在選擇微控制器時,要確保它能滿足手頭的任務,並且具有成本效益。我們必須看看一個8位、16位或32位微控制器是否能夠最好地處理任務的計算需求。此外,在選擇微控制器時,應記住以下幾點;
速度−微控制器能支持的最高速度是多少?
包裝−是40針DIP(雙列直插包裝)還是QFP(四平板包裝)?這對於最終產品的空間、裝配和原型設計都很重要。
功耗這是電池供電產品的一個重要標準。
晶片上的RAM和ROM數量。
晶片上I/O管腳和計時器的計數。
單位成本−這對於使用微控制器的產品的最終成本來說很重要。
此外,請確保微控制器提供編譯器、調試器和彙編程序等工具。最重要的是,你應該從可靠的來源購買微控制器。
Embedded Systems - 8051 Microcontroller
Brief History of 8051
第一個微處理器是英特爾公司發明的。8085和8086微處理器也是英特爾發明的。1981年,英特爾推出了一款名爲8051的8位微控制器。它之所以被稱爲「片上系統」,是因爲它有128位元組的RAM、4K字節的片上ROM、兩個定時器、一個串行埠和4個埠(8位寬),都在一個晶片上。當它廣受歡迎時,英特爾允許其他製造商生產和銷售不同口味的8051,其代碼與8051兼容。這意味著,如果你爲8051的一個版本編寫程序,它也將在其他版本上運行,不管制造商是什麼。這導致了不同速度和數量的片上RAM的幾個版本。
8051 Flavors / Members
8052微控制器−8052具有8051微控制器的所有標準功能,以及額外的128位元組RAM和額外計時器。它還有8K字節的片上程序ROM,而不是4K字節。
8031微控制器是8051系列的另一個成員。這個晶片通常被稱爲沒有8051的ROM,因爲它有0K字節的片內ROM。要使用它,你必須添加外部ROM,其中包含要獲取和執行的程序。這個程序可以大到64K字節。但在將外部ROM添加到8031的過程中,它失去了4個埠中的2個埠。爲了解決這個問題,我們可以在8031上增加一個外部I/O
Comparison between 8051 Family Members
下表比較了8051、8052和8031中可用的功能。
Feature | 8051 | 8052 | 8031 |
---|---|---|---|
ROM(bytes) | 4K | 8K | 0K |
RAM(bytes) | 128 | 256 | 128 |
Timers | 2 | 3 | 2 |
I/O pins | 32 | 32 | 32 |
Serial port | 1 | 1 | 1 |
Interrupt sources | 6 | 8 | 6 |
Features of 8051 Microcontroller
一個8051微控制器捆綁了以下特性&負;
- 4KB bytes on-chip program memory (ROM)
- 128 bytes on-chip data memory (RAM)
- Four register banks
- 128 user defined software flags
- 8-bit bidirectional data bus
- 16-bit unidirectional address bus
- 32 general purpose registers each of 8-bit
- 16 bit Timers (usually 2, but may have more or less)
- Three internal 和 two external Interrupts
- Four 8-bit ports,(short model have two 8-bit ports)
- 16-bit program counter 和 data pointer
- 8051 may also have a number of special features such as UARTs, ADC, Op-amp, etc.
Block Diagram of 8051 Microcontroller
下圖顯示了8051微控制器的框圖;
Embedded System - I/O Programming
在8051中,I/O操作使用4個埠和40個管腳完成。下圖顯示了40個管腳的詳細信息。I/O操作埠保留32個管腳,每個埠有8個管腳。其他8個管腳被指定爲Vcc、GND、XTAL1、XTAL2、RST、EA(巴)、ALE/PROG(巴)和PSEN(巴)。
它是一個40針PDIP(塑料雙列直插封裝)
注意在DIP封裝中,您可以通過IC中間的切口識別第一個管腳和最後一個管腳。第一個銷位於該切割標記的左側,最後一個銷(即,在本例中,40th銷)位於切割標記的右側。
I/O Ports 和 their Functions
四個埠P0、P1、P2和P3各使用8個管腳,使它們成爲8位埠。復位後,所有埠都配置爲輸入,準備用作輸入埠。當第一個0寫入埠時,它將成爲輸出。若要將其重新配置爲輸入,必須將1發送到埠。
Port 0 (Pin No 32 – Pin No 39)
它有8個引腳(32到39)。它可以用於輸入或輸出。與P1、P2和P3埠不同,我們通常將P0連接到10K歐姆上拉電阻器,將其用作開路漏極的輸入或輸出埠。
它也被指定爲AD0-AD7,允許它同時用作地址和數據。在8031(即無ROM晶片)的情況下,當我們需要訪問外部ROM時,地址和數據總線都將使用P0。ALE(Pin no 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)
Port 1 (Pin 1 through 8)
它是一個8位埠(引腳1到8),可以用作輸入或輸出。它不需要上拉電阻,因爲它們已經在內部連接。復位後,埠1被配置爲輸入埠。以下代碼可用於將55H和AAH的交替值發送到埠1。
;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
Port 2 (Pins 21 through 28)
埠2總共占用8個管腳(管腳21到28),可用於輸入和輸出操作。就像P1(埠1)一樣,P2也不需要外部上拉電阻器,因爲它們已經在內部連接。它必須與P0一起使用,爲外部存儲器提供16位地址。所以它也被指定爲(A0-A7),如引腳圖所示。當8051連接到外部存儲器時,它爲16位地址的高8位提供路徑,並且不能用作I/O。復位時,埠2被配置爲輸入埠。以下代碼可用於將55H和AAH的交替值發送到埠2。
;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 和 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
Port 3 (Pins 10 through 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 Bit | Function | Pin |
---|---|---|
P3.0 | RxD | 10 |
P3.1 < | TxD | 11 |
P3.2 < | Complement of INT0 | 12 |
P3.3 < | INT1 | 13 |
P3.4 < | T0 | 14 |
P3.5 < | T1 | 15 |
P3.6 < | WR | 16 |
P3.7 < | Complement of RD | 17 |
Dual Role of Port 0 和 Port 2
埠0的雙重角色也被指定爲AD0–AD7,因爲它可以用於數據和地址處理。在將8051連接到外部存儲器時,埠0可以提供地址和數據。然後,8051微控制器將輸入作爲地址或數據進行多路復用,以保存管腳。
埠2的雙重作用−除了作爲I/O工作外,埠P2還用於爲外部存儲器和埠0提供16位地址總線。埠P2也被指定爲(A8–A15),而埠0通過A0–A7提供較低的8位。換句話說,我們可以說,當8051連接到最大可達64KB的外部存儲器(ROM)時,這可以通過16位地址總線實現,因爲我們知道216=64KB。埠2用於16位地址的上8位,不能用於I/O,這是外部ROM的任何程序代碼的尋址方式。
Hardware Connection of Pins
Vcc−引腳40爲晶片供電,電壓爲+5 V。
接地−引腳20爲參考提供接地。
XTAL1、XTAL2(引腳18和引腳19)−8051具有片內振盪器,但需要外部時鐘來運行。石英晶體連接在晶片的XTAL1和XTAL2引腳之間。該晶體還需要兩個30pF的電容器來產生所需頻率的信號。每個電容器的一側接地。8051集成電路有不同的速度,這一切都取決於這個石英晶體,例如,一個20兆赫的微控制器需要一個頻率不超過20兆赫的晶體。
RST(引腳9)−它是一個輸入引腳和激活的高引腳。在該引腳上施加高脈衝(即1)時,微控制器將重置並終止所有活動。這個過程被稱爲開機復位。啓動上電復位將導致寄存器中的所有值丟失。它會將一個程序計數器設置爲所有0。爲了確保有效的復位輸入,高脈衝必須高達至少兩個機器周期,然後才允許低脈衝,這取決於電容值和充電速率。(Machine Cycle是執行單個指令所需的最小頻率量)。
EA或外部訪問(引腳31)−它是一個輸入引腳。這個引腳是一個激活的低引腳;當應用低脈衝時,它被激活。如果微控制器(8051/52)具有片內ROM,則EA(bar)引腳連接到Vcc。但是,在沒有片上ROM的8031微控制器中,代碼存儲在外部ROM中,然後由微控制器獲取。在這種情況下,我們必須將(引腳31)EA連接到Gnd,以指示程序代碼存儲在外部。
PSEN或程序存儲啓用(引腳29)−這也是一個激活的低引腳,即在施加低脈衝後激活。它是一個輸出管腳,與8031(即無ROM)系統中的EA管腳一起使用,允許在外部ROM中存儲程序代碼。
ALE或(地址鎖存啓用)−這是一個輸出引腳,處於高激活狀態。它特別用於8031集成電路與外部存儲器的連接。它可以在決定P0管腳是用作地址總線還是數據總線時使用。當ALE=1時,P0管腳作爲數據總線,當ALE=0時,P0管腳作爲地址總線。
I/O Ports 和 Bit Addressability
在爲8051編寫代碼時,它是8051最廣泛使用的特性。有時我們只需要訪問埠的1或2位而不是整個8位。8051提供訪問埠的單個位的能力。
以單位方式訪問埠時,我們使用語法「SETB X.Y」,其中X是埠號(0到3),Y是數據位D0-D7的位號(0到7),其中D0是LSB,D7是MSB。例如,「SETB P1.5」設置埠1的高位5。
下面的代碼演示了如何連續切換位P1.2。
AGAIN: SETB P1.2 ACALL DELAY CLR P1.2 ACALL DELAY SJMP AGAIN
Single-Bit Instructions
Instructions | Function |
---|---|
SETB bit | Set the bit (bit = 1) |
CLR bit | clear the bit (bit = 0) |
CPL bit | complement the bit (bit = NOT bit) |
JB bit, target | jump to target if bit = 1 (jump if bit) |
JNB bit, target | jump to target if bit = 0 (jump if no bit) |
JBC bit, target | jump to target if bit = 1, clear bit (jump if bit, then clear) |
Embedded Systems - Terms
Program Counter
程序計數器是一個16位或32位寄存器,它包含下一條要執行的指令的地址。每次獲取指令時,PC會自動遞增到下一個順序內存位置。分支、跳轉和中斷操作使用下一個順序位置以外的地址加載程序計數器。
啓動上電復位將導致寄存器中的所有值丟失。這意味著復位時PC(程序計數器)的值爲0,迫使CPU從ROM存儲器位置0000獲取第一個操作碼。這意味著我們必須將upcode的第一個字節放在ROM位置0000中,因爲這是CPU希望找到第一條指令的地方
Reset Vector
重置向量的意義在於它將處理器指向包含固件第一條指令的內存地址。如果沒有重置向量,處理器將不知道從何處開始執行。復位後,處理器從預定義的存儲器位置加載帶有復位矢量值的程序計數器(PC)。在CPU08架構上,這是在$FFFE:$FFFF位置。
當不需要重置向量時,開發人員通常認爲這是理所當然的,並且不會對最終圖像進行編程。因此,處理器不會在最終產品上啓動。這是調試階段常見的錯誤。
Stack Pointer
堆棧是在RAM中實現的,CPU寄存器用來訪問它,稱爲SP(堆棧指針)寄存器。SP寄存器是一個8位寄存器,可以尋址範圍從00h到FFh的內存地址。最初,SP寄存器包含值07以指向位置08,作爲8051用於堆棧的第一個位置。
當CPU寄存器的內容存儲在堆棧中時,稱爲推送操作。當堆棧的內容存儲在CPU寄存器中時,稱爲POP操作。換句話說,一個寄存器被推到堆棧上保存它,並從堆棧中彈出來檢索它。
Infinite Loop
無限循環或無限循環可以被識別爲電腦程式中的一系列指令,它們在循環中無休止地執行,原因如下&負;
- loop with no terminating condition.
- loop with a terminating condition that can never be met.
- loop with a terminating condition that causes the loop to start over.
這種無限循環通常會導致較舊的作業系統變得無響應,因爲無限循環會消耗所有可用的處理器時間。等待用戶輸入的I/O操作也稱爲「無限循環」。計算機「凍結」的一個可能原因是無限循環;其他原因包括死鎖和訪問衝突。
嵌入式系統與PC不同,它從不「退出」應用程式。它們通過無限循環空閒,等待以中斷或預先安排的任務形式發生的事件。爲了省電,一些處理器進入特殊的「睡眠」或「等待」模式,而不是通過無限循環空閒,但它們會在計時器或外部中斷時退出此模式。
Interrupts
中斷主要是指示程序發生事件的硬體機制。它們可能隨時發生,因此與程序流異步。它們需要處理器進行特殊處理,並最終由相應的中斷服務例程(ISR)處理。中斷需要迅速處理。如果你花太多時間來處理一個中斷,那麼你可能會錯過另一個中斷。
Little Endian Vs Big Endian
儘管數字總是以相同的方式顯示,但它們在內存中的存儲方式不同。大端機將最重要的數據字節存儲在最低的內存地址中。大端機存儲0x12345678 as−
ADD+0: 0x12 ADD+1: 0x34 ADD+2: 0x56 ADD+3: 0x78
另一方面,小端機將數據的最低有效字節存儲在最低的內存地址中。一個小小的Endian機器存儲0x12345678 as−
ADD+0: 0x78 ADD+1: 0x56 ADD+2: 0x34 ADD+3: 0x12
Embedded Systems - Assembly Language
彙編語言被開發用來爲機器級代碼指令提供助記符或符號。彙編語言程序是由助記符組成的,因此應該翻譯成機器碼。負責此轉換的程序稱爲彙編程序。彙編語言通常被稱爲低級語言,因爲它直接與CPU的內部結構一起工作。要用彙編語言編程,程式設計師必須知道CPU的所有寄存器。
不同的程式語言如C、C++、java和各種其他語言被稱爲高級語言,因爲它們不處理CPU的內部細節。相反,彙編程序用於將彙編語言程序翻譯成機器代碼(有時也稱爲目標代碼或操作代碼)。類似地,編譯器將高級語言翻譯成機器代碼。例如,要用C語言編寫程序,必須使用C編譯器將程序翻譯成機器語言。
Structure of Assembly Language
彙編語言程序是一系列語句,它們要麼是彙編語言指令,如ADD和MOV,要麼是稱爲指令的語句。
指令告訴CPU該做什麼,而指令(也稱爲僞指令)則向彙編程序發出指令。例如,ADD和MOV指令是CPU運行的命令,而ORG和END指令是彙編程序指令。當使用ORG指令時,彙編程序將操作碼放在內存位置0,而END表示原始碼的末尾。一個程序語言指令由以下四個欄位組成;
[ label: ] mnemonics [ oper和s ] [;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」。任何引用指令的標籤後面都應該跟一個冒號。
Assembling 和 Running an 8051 Program
這裡我們將討論彙編語言的基本形式。創建、組裝和運行彙編語言程序的步驟如下所示;
首先,我們使用編輯器輸入一個類似於上述程序的程序。所有Microsoft作業系統附帶的MS-DOS編輯程序等編輯器可用於創建或編輯程序。編輯器必須能夠生成一個ASCII文件。源文件的「asm」擴展名由彙編程序在下一步中使用。
「asm」源文件包含在步驟1中創建的程序代碼。它被輸入到一個8051彙編程序。然後,彙編程序將彙編語言指令轉換爲機器代碼指令,並生成一個.obj文件(對象文件)和一個.lst文件(列表文件)。它也被稱爲源文件,這就是爲什麼一些彙編程序要求此文件具有「src」擴展名。「lst」文件是可選的。它對程序非常有用,因爲它列出了所有操作碼和地址以及彙編程序檢測到的錯誤。
彙編程序需要第三個步驟,稱爲連結。連結程序接受一個或多個對象文件,並生成擴展名爲「abs」的絕對對象文件。
接下來,「abs」文件被輸入到一個名爲「OH」(object to hex converter)的程序中,該程序創建一個擴展名爲「hex」的文件,該文件可以刻錄到ROM中。
Data Type
8051微控制器包含8位的單一數據類型,並且每個寄存器也具有8位大小。程式設計師必須分解大於8位的數據(00到FFH,或者小數點到255),這樣CPU才能處理它。
DB (Define Byte)
DB指令是彙編程序中使用最廣泛的數據指令。它用於定義8位數據。它還可以用於定義十進位、二進位、十六進位或ASCII格式的數據。對於decimal,小數後面的「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還用於在字節大小的塊中分配內存。
Assembler Directives
8051的一些指令如下所示;
ORG(origin)−origin指令用於指示地址的開頭。它接受十六進位或十進位格式的數字。如果在數字後面提供H,則該數字被視爲十六進位,否則爲十進位。彙編程序將十進位數轉換爲十六進位數。
eq(equal)−它用於定義一個常量而不占用內存位置。EQU將一個常量值與一個數據標籤相關聯,以便該標籤出現在程序中,其常量值將替換該標籤。在執行指令「MOV R3,#COUNT」時,寄存器R3將加載值25(注意#符號)。使用eq的優點是程式設計師可以更改一次,彙編程序將更改它的所有出現;程式設計師不必搜索整個程序。
END指令−它指示源(asm)文件的結尾。END指令是程序的最後一行;彙編程序將忽略END指令之後的任何內容。
Labels in Assembly Language
彙編語言中的所有標籤必須遵循下面給出的規則;
每個標籤名稱必須唯一。彙編語言程序設計中用於標籤的名稱包括大小寫字母、數字0到9以及特殊字符,如問號(?),句點(.),按匯率@,下劃線(\u)和美元($)。
第一個字符應該是字母字符,不能是數字。
保留字不能用作程序中的標籤。例如,ADD和MOV字是保留字,因爲它們是指令助記符。
Embedded Systems - Registers
CPU中使用寄存器臨時存儲信息,這些信息可以是要處理的數據,也可以是指向要獲取的數據的地址。在8051中,有一個數據類型是8位的,從MSB(最高有效位)D7到LSB(最低有效位)D0。對於8位數據類型,任何大於8位的數據類型在處理之前都必須分解爲8位塊。
8051最廣泛使用的寄存器是A(累加器)、B、R0-R7、DPTR(數據指針)和PC(程序計數器)。所有這些寄存器都是8位的,除了DPTR和PC。
Storage Registers in 8051
我們將在這裡討論以下類型的存儲寄存器−
- Accumulator
- R register
- B register
- Data Pointer (DPTR)
- Program Counter (PC)
- Stack Pointer (SP)
Accumulator
累加器寄存器A用於所有算術和邏輯運算。如果累加器不存在,則每次計算的每個結果(加法、乘法、移位等)都將存儲在主存儲器中。訪問主存比訪問累加器之類的寄存器慢,因爲用於大主存的技術比用於寄存器的技術慢(但便宜)。
The "R" Registers
「R」寄存器是一組8個寄存器,即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」寄存器作爲臨時存儲值的方法。
The "B" Register
「B」寄存器與累加器非常相似,因爲它可以保存8位(1位元組)的值。「B」寄存器僅由兩個8051指令使用:MUL AB和DIV AB。爲了快速方便地將A乘或除以另一個數,您可以將另一個數存儲在「B」中並使用這兩條指令。除了使用MUL和DIV指令外,「B」寄存器還經常用作另一個臨時存儲寄存器,很像第九個R寄存器。
The Data Pointer
數據指針(DPTR)是8051唯一用戶可訪問的16位(2位元組)寄存器。累加器、R0–R7寄存器和B寄存器是1位元組值寄存器。DPTR用於指向數據。它被8051用來使用DPTR指示的地址訪問外部存儲器。DPTR是唯一可用的16位寄存器,通常用於存儲2位元組值。
The Program Counter
程序計數器(PC)是一個2位元組的地址,它告訴8051下一條要執行的指令在內存中的位置。當8051初始化時,PC在0000h開始,並且在每次執行指令後遞增。PC不總是遞增1。有些指令可能需要2或3個字節;在這種情況下,PC將增加2或3個字節。
分支、跳轉和中斷操作用下一個順序位置以外的地址加載程序計數器。啓動上電復位將導致寄存器中的所有值丟失。這意味著復位時PC的值爲0,迫使CPU從ROM位置0000獲取第一個操作碼。這意味著我們必須將upcode的第一個字節放在ROM位置0000中,因爲這是CPU希望找到第一條指令的地方。
The Stack Pointer (SP)
堆棧指針與除DPTR和PC之外的所有寄存器一樣,可以保存8位(1位元組)的值。堆棧指針告訴要從堆棧中移除下一個值的位置。當一個值被推送到堆棧上時,SP的值將遞增,然後將該值存儲在生成的內存位置。當從堆棧中彈出一個值時,該值將從SP指示的內存位置返回,然後SP的值將遞減。
這個操作順序很重要。當8051初始化時,SP將被初始化爲07h。如果同時將一個值推送到堆棧上,則該值將存儲在內部RAM地址08h中,因爲8051將首先遞增SP的值(從07h到08h),然後將所推的值存儲在該存儲器地址(08h)。SP被8051直接修改爲6個指令:PUSH、POP、ACALL、LCALL、RET和RETI。
ROM Space in 8051
有些8051的家族成員只有4K字節的片上ROM(如8751、AT8951);有些像AT89C52一樣有8K的ROM,有些家族成員有32K字節和64K字節的片上ROM,如達拉斯半導體。需要記住的一點是,8051系列的任何成員都不能訪問超過64K字節的操作碼,因爲8051中的程序計數器是16位寄存器(0000到FFFF地址)。
程序ROM在8051中的第一個位置具有0000H的地址,而最後一個位置可以根據晶片上ROM的大小而不同。在8051系列成員中,AT8951具有$k字節的片上ROM,其存儲器地址爲0000(第一位置)到0FFFH(最後位置)。
8051 Flag Bits 和 PSW Register
程序狀態字(PSW)寄存器是一個8位寄存器,也稱爲標誌寄存器。它有8位寬,但只有6位使用。兩個未使用的位是用戶定義的標誌。其中四個標誌稱爲條件標誌,這意味著它們指示在執行指令後產生的條件。這四個是CY(進位)、AC(輔助進位)、P(奇偶校驗)和OV(溢出)。位RS0和RS1用於改變銀行寄存器。下圖顯示程序狀態字寄存器。
PSW寄存器包含反映CPU當前狀態的狀態位。
CY | CA | F0 | RS1 | RS0 | OV | - | P |
---|
CY | PSW.7 | Carry Flag |
AC | PSW.6 | Auxiliary Carry Flag |
F0 | PSW.5 | Flag 0 available to user for general purpose. |
RS1 | PSW.4 | Register Bank selector bit 1 |
RS0 | PSW.3 | Register Bank selector bit 0 |
OV | PSW.2 | Overflow Flag |
- | PSW.1 | User definable FLAG |
P | PSW.0 | Parity FLAG. Set/ cleared by hardware during instruction cycle to indicate even/odd number of 1 bit in accumulator. |
We can select the corresponding Register Bank bit using RS0 和 RS1 bits.
RS1 | RS2 | Register Bank | Address |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
CY, the carry flag − This carry flag is set (1) whenever there is a carry out from the D7 bit. It is affected after an 8-bit addition or subtraction operation. It can also be reset to 1 or 0 directly by an instruction such as "SETB C" 和 "CLR C" where "SETB" st和s for set bit carry 和 "CLR" st和s for clear carry.
AC, auxiliary carry flag − If there is a carry from D3 和 D4 during an ADD or SUB operation, the AC bit is set; otherwise, it is cleared. It is used for the instruction to perform binary coded decimal arithmetic.
P, the parity flag − The parity flag represents the number of 1's in the accumulator register only. If the A register contains odd number of 1's, then P = 1; 和 for even number of 1's, P = 0.
OV, the overflow flag − This flag is set whenever the result of a signed number operation is too large causing the high-order bit to overflow into the sign bit. It is used only to detect errors in signed arithmetic operations.
Example
Show the status of CY, AC, 和 P flags after the addition of 9CH 和 64H in the following instruction.
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
Embedded Systems - Registers Bank/Stack
The 8051 microcontroller has a total of 128 bytes of RAM. We will discuss about the allocation of these 128 bytes of RAM 和 examine their usage as stack 和 register.
RAM Memory Space Allocation in 8051
The 128 bytes of RAM inside the 8051 are assigned the address 00 to 7FH. They can be accessed directly as memory locations 和 are divided into three different groups as follows −
32 bytes from 00H to 1FH locations are set aside for register banks 和 the stack.
16 bytes from 20H to 2FH locations are set aside for bit-addressable read/write memory.
80 bytes from 30H to 7FH locations are used for read 和 write storage; it is called as scratch pad. These 80 locations RAM are widely used for the purpose of storing data 和 parameters by 8051 programmers.
Register Banks in 8051
A total of 32 bytes of RAM are set aside for the register banks 和 the stack. These 32 bytes are divided into four register banks in which each bank has 8 registers, R0–R7. RAM locations from 0 to 7 are set aside for bank 0 of R0–R7 where R0 is RAM location 0, R1 is RAM location 1, R2 is location 2, 和 so on, until the memory location 7, which belongs to R7 of bank 0.
寄存器R0–R7的第二組從RAM位置08開始,到h位置。第三組R0–R7從內存位置10H開始,到位置17H。最後,爲第四組R0–R7預留內存位置18H到1FH。
Default Register Bank
如果爲四個寄存器組預留了RAM位置00–1F,那麼當8051通電時,我們可以訪問R0–R7的哪個寄存器組?答案是寄存器組0;也就是說,在編程8051時,可以使用名稱R0到R7訪問0到7之間的RAM位置。因爲用諸如R0到R7之類的名稱來引用這些RAM位置比用它們的內存位置來引用要容易得多。
How to Switch Register Banks
當8051通電時,寄存器組0是默認值。我們可以使用PSW寄存器切換到其他銀行。PSW的D4和D3位用於選擇所需的寄存器組,因爲它們可以由位可尋址指令SETB和CLR訪問。例如,「SETB PSW.3」將設置PSW.3=1並選擇銀行寄存器1。
RS1 | RS2 | Bank Selected |
---|---|---|
0 | 0 | Bank0 |
0 | 1 | Bank1 |
1 | 0 | Bank2 |
1 | 1 | Bank3 |
Stack 和 its Operations
Stack in the 8051
堆棧是CPU用來臨時存儲數據或內存地址等信息的RAM的一部分。考慮到寄存器的數量有限,CPU需要這個存儲區域。
How Stacks are Accessed
由於堆棧是RAM的一部分,CPU內部有寄存器指向它。用於訪問堆棧的寄存器稱爲堆棧指針寄存器。8051中的堆棧指針寬8位,可以從00到FFH。當8051初始化時,SP寄存器包含值07H。這意味著RAM位置08是用於堆棧的第一個位置。CPU寄存器在堆棧中的存儲操作稱爲aPUSH,將堆棧中的內容返回到CPU寄存器中稱爲aPOP。
Pushing into the Stack
在8051中,堆棧指針(SP)指向堆棧的最後使用位置。當數據被推送到堆棧上時,堆棧指針(SP)將遞增1。當執行PUSH時,寄存器的內容保存在堆棧中,SP遞增1。要將寄存器推送到堆棧上,我們必須使用它們的RAM地址。例如,指令「PUSH 1」將寄存器R1推送到堆棧上。
Popping from the Stack
將堆棧的內容彈出到給定的寄存器中與推送過程相反。每次pop操作時,堆棧的頂字節都會複製到指令指定的寄存器中,堆棧指針也會減少一次。
Embedded Systems - Instructions
除非執行控制傳輸指令,否則程序流按順序從一條指令轉到下一條指令。彙編語言中的各種控制轉移指令包括有條件或無條件跳轉和調用指令。
Loop 和 Jump Instructions
Looping in the 8051
重複一系列指令一定次數稱爲a循環。指令DJNZ reg,label用於執行循環操作。在該指令中,寄存器遞減1;如果不是0,則8051跳轉到標籤所指的目標地址。
在循環開始之前,寄存器加載有重複次數的計數器。在這條指令中,寄存器減量和跳轉決定被組合成一條指令。寄存器可以是R0到R7中的任何一個。計數器也可以是RAM位置。
Example
用重複加法把25乘以10
解決方案−乘法可以通過重複添加被乘數(倍於乘數)來實現。例如,
25*10=250(華氏度)
25+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 multiplic和 to the ACC AGAIN:DJNZ R2, AGAIN:repeat until R2 = 0 (10 times) MOV R5 , A ;save A in R5 ;R5 (FAH)
使用指令DJNZ Reg label的8051−循環操作的缺點僅限於256次疊代。如果不執行條件跳轉,則執行跳轉後的指令。
Looping inside a Loop
當我們在另一個循環中使用循環時,它被稱爲a嵌套循環。當最大計數限制爲256時,使用兩個寄存器保存計數。所以我們用這個方法重複這個動作超過256次。
示例
編寫一個程序到−
- Load the accumulator with the value 55H.
- Complement the ACC 700 times.
由於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
Other Conditional Jumps
下表列出了8051中使用的條件跳轉−
Instruction | Action |
---|---|
JZ | Jump if A = 0 |
JNZ | Jump if A ≠ 0 |
DJNZ | Decrement 和 Jump if register ≠ 0 |
CJNE A, data | Jump if A ≠ data |
CJNE reg, #data | Jump if byte ≠ data |
JC | Jump if CY = 1 |
JNC | Jump if CY ≠ 1 |
JB | Jump if bit = 1 |
JNB | Jump if bit = 0 |
JBC | Jump if bit = 1 和 clear bit |
JZ(如果A=0,則跳轉)−在此指令中,將檢查累加器的內容。如果爲零,則8051跳到目標地址。JZ指令只能用於累加器,不適用於任何其他寄存器。
JNZ(如果A不等於0,則跳轉)−在此指令中,累加器的內容被檢查爲非零。如果不是零,則8051跳到目標地址。
JNC(無進位跳轉,CY=0跳轉)−標誌(或PSW)寄存器中的進位標誌位用於決定是否跳轉「JNC label」。CPU查看進位標誌是否被提升(CY=1)。如果沒有引發,則CPU開始從標籤的地址獲取並執行指令。如果CY=1,它將不跳轉,而是執行JNC下面的下一條指令。
JC(如果進位則跳轉,如果CY=1則跳轉)−如果CY=1,則跳轉到目標地址。
JB(高位跳)
JNB(位低時跳轉)
注意−必須注意,所有條件跳轉都是短跳轉,即目標地址必須在程序計數器內容的–128到+127位元組範圍內。
Unconditional Jump Instructions
8051中有兩個無條件跳轉&負;
LJMP(跳遠)−LJMP是3位元組指令,其中第一個字節表示操作碼,第二個和第三個字節表示目標位置的16位地址。2位元組的目標地址允許從0000跳到FFFFH的任何內存位置。
SJMP(short jump)−它是一個2位元組的指令,其中第一個字節是操作碼,第二個字節是目標位置的相對地址。相對地址的範圍從00H到FFH,分爲向前和向後跳轉;也就是說,相對於當前PC(程序計數器)的地址,在-128到+127位元組的內存內。在前向跳轉的情況下,目標地址可以在當前PC 127位元組的空間內。在後向跳轉的情況下,目標地址可以在當前PC–128位元組的空間內。
Calculating the Short Jump Address
所有條件跳轉(JNC、JZ和DJNZ)都是短跳轉,因爲它們是2位元組指令。在這些指令中,第一個字節表示操作碼,第二個字節表示相對地址。目標地址總是相對於程序計數器的值。爲了計算目標地址,第二個字節被添加到跳轉下面的指令的PC中。看看下面給出的程序;
Line PC Op-code Mnemonic Oper和 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
Backward Jump Target Address Calculation
在向前跳躍的情況下,位移值是介於0到127(十六進位爲00到7F)之間的正數。但是,對於向後跳躍,位移爲0到-128的負值。
CALL Instructions
調用用於調用子例程或方法。子例程用於執行需要頻繁執行的操作或任務。這使得程序更加結構化,節省了內存空間。有兩個指令&負;LCALL和ACALL。
LCALL (Long Call)
LCALL是一個3位元組指令,其中第一個字節表示操作碼,第二個和第三個字節用於提供目標子程序的地址。LCALL可用於調用8051的64K字節地址空間內可用的子程序。
爲了在被調用的子程序執行之後成功地返回到該點,CPU將指令的地址保存在堆棧上LCALL的正下方。因此,當調用一個子例程時,控制權轉移到該子例程,處理器將PC(程序計數器)保存在堆棧上,並開始從新位置獲取指令。指令RET(return)在完成子例程的執行後,將控制項傳輸回調用方。每個子程序使用RET作爲最後一條指令。
ACALL (Absolute Call)
ACALL是一個2位元組的指令,而LCALL是3位元組。子例程的目標地址必須在2K字節內,因爲2位元組中只有11位用於地址。a CALL和LCALL的區別在於,LCALL的目標地址可以在8051的64K字節地址空間內的任何地方,而調用的目標地址則在2K字節範圍內。
Embedded Systems - Addressing Modes
尋址模式指的是如何對給定的內存位置進行尋址。執行此指令有五種不同的方式或五種尋址模式,如下所示;
- Immediate addressing mode
- Direct addressing mode
- Register direct addressing mode
- Register indirect addressing mode
- Indexed addressing mode
Immediate Addressing Mode
讓我們從一個例子開始。
MOV A, #6AH
一般來說,我們可以寫,
MOV A, #data
它被稱爲立即數,因爲8位數據立即傳輸到累加器(目標操作數)。
下圖描述了上述指令及其執行。操作碼74H保存在0202地址。數據6AH保存在程序存儲器的0203地址。在讀取操作碼74H之後,下一個程序存儲器地址處的數據被傳送到累加器A(E0H是累加器的地址)。由於指令爲2位元組,且在一個周期內執行,因此程序計數器將增加2,並指向程序存儲器的0204。
注意−6AH之前的「#」符號表示操作數是數據(8位)。如果沒有「35;」,則十六進位數將被視爲地址。
Direct Addressing Mode
這是處理操作數的另一種方法。這裡,數據(源數據)的地址作爲操作數給出。舉個例子。
MOV A, 04H
寄存器組#0(第四個寄存器)具有地址04H。當執行MOV指令時,存儲在寄存器04H中的數據被移動到累加器。當寄存器04H保存數據1FH時,1FH被移到累加器。
注意−我們沒有在直接尋址模式中使用「#」,這與立即尋址模式不同。如果我們使用了「35;」,那麼數據值04H將被傳輸到累加器,而不是1FH。
現在,請看下圖。它顯示了指令是如何執行的。
如上圖所示,這是一個2位元組指令,需要1個周期才能完成。PC將增加2,並指向0204。指令MOV A的操作碼,地址爲E5H。當在0202執行指令(E5H)時,累加器被激活並準備接收數據。然後,PC轉到下一個地址0203,查找源數據(要傳輸到累加器)所在位置04H的地址。在04H,控制項找到數據1F並將其傳輸到累加器,從而完成執行。
Register Direct Addressing Mode
在這種尋址模式下,我們直接使用寄存器名(作爲源操作數)。讓我們試著用一個例子來理解。
MOV A, R4
一次,寄存器可以接受從R0到R7的值。有32個這樣的寄存器。爲了使用只有8個變量的32個寄存器來尋址寄存器,使用寄存器組。從0到3有4個註冊銀行。每個銀行由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從數據存儲器位置0ch傳輸到累加器,並顯示爲虛線。0CH是註冊銀行1的寄存器4(R4)的地址位置。上面的指令是1位元組,需要1個周期才能完成執行。意思是,你可以使用寄存器直接尋址模式來節省程序內存。
Register Indirect Addressing Mode
在這種尋址模式下,數據的地址作爲操作數存儲在寄存器中。
MOV A, @R0
Here the value inside R0 is considered as an address, which holds the data to be transferred to the accumulator. 示例: If R0 has the value 20H, 和 data 2FH is stored at the address 20H, then the value 2FH will get transferred to the accumulator after executing this instruction. See the following illustration.
因此MOV A,@R0的操作碼是E6H。假設選擇了寄存器組0,則寄存器組0的R0保存數據20H。程序控制移到20H,在那裡它定位數據2FH,並將2FH傳輸到累加器。這是一條1位元組指令,程序計數器遞增1並移到程序存儲器的0203。
注意−只允許R0和R1組成寄存器間接尋址指令。換句話說,程式設計師可以使用@R0或@R1創建指令。允許所有註冊銀行。
Indexed Addressing Mode
我們將舉兩個例子來理解索引尋址模式的概念。看一下下面的說明;
MOVC A, @A+DPTR
和
MOVC A, @A+PC
where DPTR is the data pointer 和 PC is the program counter (both are 16-bit registers). Consider the first example.
MOVC A, @A+DPTR
The source oper和 is @A+DPTR. It contains the source data from this location. Here we are adding the contents of DPTR with the current content of the accumulator. This addition will give a new address which is the address of the source data. The data pointed by this address is then transferred to the accumulator.
The opcode is 93H. DPTR has the value 01FE, where 01 is located in DPH (higher 8 bits) 和 FE is located in DPL (lower 8 bits). Accumulator has the value 02H. Then a 16-bit addition is performed 和 01FE H+02H results in 0200 H. Data at the location 0200H will get transferred to the accumulator. The previous value inside the accumulator (02H) will be replaced with the new data from 0200H. The new data in the accumulator is highlighted in the illustration.
This is a 1-byte instruction with 2 cycles needed for execution 和 the execution time required for this instruction is high compared to previous instructions (which were all 1 cycle each).
另一個示例MOVC A,@A+PC的工作方式與上面的示例相同。這裡,程序計數器(PC)中的數據與累加器一起添加,以獲得目標地址,而不是與累加器一起添加DPTR。
Embedded Systems - SFR Registers
特殊功能寄存器(或特殊用途寄存器,或簡單的特殊寄存器)是微處理器內控制或監視微處理器各種功能的寄存器。由於特殊寄存器與處理器的某些特殊功能或狀態密切相關,因此它們可能無法由普通指令(如add、move等)直接寫入。相反,某些處理器體系結構中的某些特殊寄存器需要特殊指令來修改它們。
In the 8051, register A, B, DPTR, 和 PSW are a part of the group of registers commonly referred to as SFR (special function registers). An SFR can be accessed by its name or by its address.
The following table shows a list of SFRs 和 their addresses.
Byte Address | Bit Address | ||||||||
---|---|---|---|---|---|---|---|---|---|
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 | Not bit Addressable | SBUF | |||||||
98 | 9F | 9E | 9D | 9C | 9B | 9A | 99 | 98 | SCON |
90 | 97 | 96 | 95 | 94 | 93 | 92 | 91 | 90 | P1 |
8D | Not bit Addressable | TH1 | |||||||
8C | Not bit Addressable | TH0 | |||||||
8B | Not bit Addressable | TL1 | |||||||
8A | Not bit Addressable | TL0 | |||||||
89 | Not bit Addressable | TMOD | |||||||
88 | 8F | 8E | 8D | 8C | 8B | 8A | 89 | 88 | TCON |
87 | Not bit Addressable | PCON | |||||||
83 | Not bit Addressable | DPH | |||||||
82 | Not bit Addressable | DPL | |||||||
81 | Not bit Addressable | SP | |||||||
80 | 87 | 87 | 85 | 84 | 83 | 82 | 81 | 80 | P0 |
考慮以下關於SFR地址的兩點。
特殊功能寄存器的地址可以在80H到FFH之間。這些地址在80H以上,因爲從00到7FH的地址是8051內部RAM存儲器的地址。
Not all the address space of 80 to FF are used by the SFR. Unused locations, 80H to FFH, are reserved 和 must not be used by the 8051 programmer.
CY | PSW.7 | Carry Flag |
AC | PSW.6 | Auxiliary Carry Flag |
F0 | PSW.5 | Flag 0 available to user for general purpose. |
RS1 | PSW.4 | Register Bank selector bit 1 |
RS0 | PSW.3 | Register Bank selector bit 0 |
OV | PSW.2 | Overflow Flag |
- | PSW.1 | User definable FLAG |
P | PSW.0 | Parity FLAG. Set/ cleared by hardware during instruction cycle to indicate even/odd number of 1 bit in accumulator. |
在下面的示例中,SFR寄存器的名稱將替換爲其地址。
CY | AC | F0 | RS1 | RS0 | OV | - | P |
---|
We can select the corresponding Register Bank bit using RS0 和 RS1 bits.
RS1 | RS2 | Register Bank | Address |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
The Program Status Word (PSW) contains status bits to reflect the current state of the CPU. The 8051 variants provide one special function register, PSW, with this status information. The 8251 provides two additional status flags, Z 和 N, which are available in a second special function register called PSW1.
Embedded Systems - Timer/Counter
A timer is a specialized type of clock which is used to measure time intervals. A timer that counts from zero upwards for measuring time elapsed is often called a stopwatch. It is a device that counts down from a specified time interval 和 used to generate a time delay, for example, an hourglass is a timer.
A counter is a device that stores (和 sometimes displays) the number of times a particular event or process occurred, with respect to a clock signal. It is used to count the events happening outside the microcontroller. In electronics, counters can be implemented quite easily using register-type circuits such as a flip-flop.
Difference between a Timer 和 a Counter
計時器和計數器的區別點如下所示;
Timer | Counter |
---|---|
The register incremented for every machine cycle. | The register is incremented considering 1 to 0 transition at its corresponding to an external input pin (T0, T1). |
Maximum count rate is 1/12 of the oscillator frequency. | Maximum count rate is 1/24 of the oscillator frequency. |
A timer uses the frequency of the internal clock, 和 generates delay. | A counter uses an external signal to count pulses. |
Timers of 8051 和 their Associated Registers
The 8051 has two timers, Timer 0 和 Timer 1. They can be used as timers or as event counters. Both Timer 0 和 Timer 1 are 16-bit wide. Since the 8051 follows an 8-bit architecture, each 16 bit is accessed as two separate registers of low-byte 和 high-byte.
Timer 0 Register
The 16-bit register of Timer 0 is accessed as low- 和 high-byte. The low-byte register is called TL0 (Timer 0 low byte) 和 the high-byte register is called TH0 (Timer 0 high byte). These registers can be accessed like any other register. For example, the instruction MOV TL0, #4H moves the value into the low-byte of Timer #0.
Timer 1 Register
The 16-bit register of Timer 1 is accessed as low- 和 high-byte. The low-byte register is called TL1 (Timer 1 low byte) 和 the high-byte register is called TH1 (Timer 1 high byte). These registers can be accessed like any other register. For example, the instruction MOV TL1, #4H moves the value into the low-byte of Timer 1.
TMOD (Timer Mode) Register
Both Timer 0 和 Timer 1 use the same register to set the various timer operation modes. It is an 8-bit register in which the lower 4 bits are set aside for Timer 0 和 the upper four bits for Timers. In each case, the lower 2 bits are used to set the timer mode in advance 和 the upper 2 bits are used to specify the location.
Gate−設置時,計時器僅在INT(0,1)高時運行。
C/T−計數器/定時器選擇位。
M1−模式位1。
M0−模式位0。
GATE
Every timer has a means of starting 和 stopping. Some timers do this by software, some by hardware, 和 some have both software 和 hardware controls. 8051 timers have both software 和 hardware controls. The start 和 stop of a timer is controlled by software using the instruction SETB TR1 和 CLR TR1 for timer 1, 和 SETB TR0 和 CLR TR0 for timer 0.
The SETB instruction is used to start it 和 it is stopped by the CLR instruction. These instructions start 和 stop the timers as long as GATE = 0 in the TMOD register. Timers can be started 和 stopped by an external source by making GATE = 1 in the TMOD register.
C/T (CLOCK / TIMER)
TMOD寄存器中的該位用於確定計時器是用作延遲生成器還是用作事件管理器。如果C/T=0,則用作產生計時器延遲的計時器。產生時間延遲的時鐘源是8051的晶體頻率。如果C/T=0,附著在8051上的晶體頻率也決定了8051定時器以固定間隔計時的速度。
定時器頻率始終是連接到8051的晶體頻率的1/12。雖然各種基於8051的系統的XTAL頻率爲10兆赫到40兆赫,但我們通常使用的XTAL頻率爲11.0592兆赫。這是因爲8051.XTAL=11.0592的串行通信波特率允許8051系統與PC進行無錯誤通信。
M1 / M2
M1 | M2 | Mode |
---|---|---|
0 | 0 | 13-bit timer mode. |
0 | 1 | 16-bit timer mode. |
1 | 0 | 8-bit auto reload mode. |
1 | 1 | Spilt mode. |
Different Modes of Timers
Mode 0 (13-Bit Timer Mode)
Both Timer 1 和 Timer 0 in Mode 0 operate as 8-bit counters (with a divide-by-32 prescaler). Timer register is configured as a 13-bit register consisting of all the 8 bits of TH1 和 the lower 5 bits of TL1. The upper 3 bits of TL1 are indeterminate 和 should be ignored. Setting the run flag (TR1) does not clear the register. The timer interrupt flag TF1 is set when the count rolls over from all 1s to all 0s. Mode 0 operation is the same for Timer 0 as it is for Timer 1.
Mode 1 (16-Bit Timer Mode)
Timer mode "1" is a 16-bit timer 和 is a commonly used mode. It functions in the same way as 13-bit mode except that all 16 bits are used. TLx is incremented starting from 0 to a maximum 255. Once the value 255 is reached, TLx resets to 0 和 then THx is incremented by 1. As being a full 16-bit timer, the timer may contain up to 65536 distinct values 和 it will overflow back to 0 after 65,536 machine cycles.
Mode 2 (8 Bit Auto Reload)
Both the timer registers are configured as 8-bit counters (TL1 和 TL0) with automatic reload. Overflow from TL1 (TL0) sets TF1 (TF0) 和 also reloads TL1 (TL0) with the contents of Th1 (TH0), which is preset by software. The reload leaves TH1 (TH0) unchanged.
The benefit of auto-reload mode is that you can have the timer to always contain a value from 200 to 255. If you use mode 0 or 1, you would have to check in the code to see the overflow 和, in that case, reset the timer to 200. In this case, precious instructions check the value 和/or get reloaded. In mode 2, the microcontroller takes care of this. Once you have configured a timer in mode 2, you don't have to worry about checking to see if the timer has overflowed, nor do you have to worry about resetting the value because the microcontroller hardware will do it all for you. The auto-reload mode is used for establishing a common baud rate.
Mode 3 (Split Timer Mode)
Timer mode "3" is known as split-timer mode. When Timer 0 is placed in mode 3, it becomes two separate 8-bit timers. Timer 0 is TL0 和 Timer 1 is TH0. Both the timers count from 0 to 255 和 in case of overflow, reset back to 0. All the bits that are of Timer 1 will now be tied to TH0.
When Timer 0 is in split mode, the real Timer 1 (i.e. TH1 和 TL1) can be set in modes 0, 1 or 2, but it cannot be started/stopped as the bits that do that are now linked to TH0. The real timer 1 will be incremented with every machine cycle.
Initializing a Timer
Decide the timer mode. Consider a 16-bit timer that runs continuously, 和 is independent of any external pins.
Initialize the TMOD SFR. Use the lowest 4 bits of TMOD 和 consider Timer 0. Keep the two bits, GATE 0 和 C/T 0, as 0, since we want the timer to be independent of the external pins. As 16-bit mode is timer mode 1, clear T0M1 和 set T0M0. Effectively, the only bit to turn on is bit 0 of TMOD. Now execute the following instruction −
MOV TMOD,#01h
現在,計時器0處於16位計時器模式,但計時器未運行。要在運行模式下啓動計時器,請執行以下指令設置TR0位−
SETB TR0
現在,定時器0將立即開始計數,每一個機器周期遞增一次。
Reading a Timer
16位計時器可以通過兩種方式讀取。要麼將計時器的實際值讀取爲16位數字,要麼檢測計時器何時溢出。
Detecting Timer Overflow
當定時器從其最高值溢出到0時,微控制器自動在TCON寄存器中設置TFx位。因此,可以檢查TFx位,而不是檢查計時器的確切值。如果設置了TF0,則計時器0溢出;如果設置了TF1,則計時器1溢出。
Embedded Systems - Interrupt
An interrupt is a signal to the processor emitted by hardware or software indicating an event that needs immediate attention. Whenever an interrupt occurs, the controller completes the execution of the current instruction 和 starts the execution of an Interrupt Service Routine (ISR) or Interrupt H和ler. ISR tells the processor or controller what to do when the interrupt occurs. The interrupts can be either hardware interrupts or software interrupts.
Hardware Interrupt
硬體中斷是從外部設備(如磁碟控制器或外部外設)發送到處理器的電子警報信號。例如,當我們按下鍵盤上的鍵或移動滑鼠時,它們會觸發硬體中斷,導致處理器讀取按鍵或滑鼠位置。
Software Interrupt
A software interrupt is caused either by an exceptional condition or a special instruction in the instruction set which causes an interrupt when it is executed by the processor. For example, if the processor's arithmetic logic unit runs a comm和 to divide a number by zero, to cause a divide-by-zero exception, thus causing the computer to ab和on the calculation or display an error message. Software interrupt instructions work similar to subroutine calls.
What is Polling?
The state of continuous monitoring is known as polling. The microcontroller keeps checking the status of other devices; 和 while doing so, it does no other operation 和 consumes all its processing time for monitoring. This problem can be addressed by using interrupts.
In the interrupt method, the controller responds only when an interruption occurs. Thus, the controller is not required to regularly monitor the status (flags, signals etc.) of interfaced 和 inbuilt devices.
Interrupts v/s Polling
這裡有一個類比,它區分了中斷和輪詢;
Interrupt | Polling |
---|---|
An interrupt is like a shopkeeper. If one needs a service or product, he goes to him 和 apprises him of his needs. In case of interrupts, when the flags or signals are received, they notify the controller that they need to be serviced. | The polling method is like a salesperson. The salesman goes from door to door while requesting to buy a product or service. Similarly, the controller keeps monitoring the flags or signals one by one for all devices 和 provides service to whichever component that needs its service. |
Interrupt Service Routine
For every interrupt, there must be an interrupt service routine (ISR), or interrupt h和ler. When an interrupt occurs, the microcontroller runs the interrupt service routine. For every interrupt, there is a fixed location in memory that holds the address of its interrupt service routine, ISR. The table of memory locations set aside to hold the addresses of ISRs is called as the Interrupt Vector Table.
Interrupt Vector Table
有六個中斷,包括8051中的復位。
Interrupts | ROM Location (Hex) | Pin |
---|---|---|
Interrupts | ROM Location (HEX) | |
Serial COM (RI 和 TI) | 0023 | |
Timer 1 interrupts(TF1) | 001B | |
External HW interrupt 1 (INT1) | 0013 | P3.3 (13) |
External HW interrupt 0 (INT0) | 0003 | P3.2 (12) |
Timer 0 (TF0) | 000B | |
Reset | 0000 | 9 |
當復位引腳被激活時,8051跳到地址位置0000。這是上電復位。
Two interrupts are set aside for the timers: one for timer 0 和 one for timer 1. Memory locations are 000BH 和 001BH respectively in the interrupt vector table.
Two interrupts are set aside for hardware external interrupts. Pin no. 12 和 Pin no. 13 in Port 3 are for the external hardware interrupts INT0 和 INT1, respectively. Memory locations are 0003H 和 0013H respectively in the interrupt vector table.
Serial communication has a single interrupt that belongs to both receive 和 transmit. Memory location 0023H belongs to this interrupt.
Steps to Execute an Interrupt
當中斷激活時,微控制器將執行以下步驟;
The microcontroller closes the currently executing instruction 和 saves the address of the next instruction (PC) on the stack.
它還會在內部保存所有中斷的當前狀態(即不在堆棧上)。
它跳到中斷向量表的內存位置,該表保存中斷服務例程的地址。
The microcontroller gets the address of the ISR from the interrupt vector table 和 jumps to it. It starts to execute the interrupt service subroutine, which is RETI (return from interrupt).
在執行RETI指令時,微控制器返回到中斷的位置。首先,它從堆棧中獲取程序計數器(PC)地址,方法是將堆棧的頂部字節彈出到PC中,然後從該地址開始執行。
Edge Triggering vs. Level Triggering
中斷模塊有兩種類型:負電平觸發或邊緣觸發。
Level Triggered | Edge Triggered |
---|---|
A level-triggered interrupt module always generates an interrupt whenever the level of the interrupt source is asserted. | An edge-triggered interrupt module generates an interrupt only when it detects an asserting edge of the interrupt source. The edge gets detected when the interrupt source level actually changes. It can also be detected by periodic sampling 和 detecting an asserted level when the previous sample was de-asserted. |
If the interrupt source is still asserted when the firmware interrupt h和ler h和les the interrupt, the interrupt module will regenerate the interrupt, causing the interrupt h和ler to be invoked again. | Edge-triggered interrupt modules can be acted immediately, no matter how the interrupt source behaves. |
Level-triggered interrupts are cumbersome for firmware. | Edge-triggered interrupts keep the firmware's code complexity low, reduce the number of conditions for firmware, 和 provide more flexibility when interrupts are h和led. |
Enabling 和 Disabling an Interrupt
重置後,所有中斷都將被禁用,即使它們已被激活。必須使用軟體啓用中斷,以便微控制器對這些中斷做出響應。
IE (interrupt enable) register is responsible for enabling 和 disabling the interrupt. IE is a bitaddressable register.
Interrupt Enable Register
EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
---|
EA−全局啓用/禁用。
-−未定義。
ET2−啓用定時器2中斷。
ES−啓用串行埠中斷。
ET1−啓用定時器1中斷。
EX1−啓用外部1中斷。
ET0−啓用定時器0中斷。
EX0−啓用外部0中斷。
爲了實現中斷,我們採取以下步驟&負;
IE寄存器(EA)的D7位必須高,以使其餘寄存器生效。
If EA = 1, interrupts will be enabled 和 will be responded to, if their corresponding bits in IE are high. If EA = 0, no interrupts will respond, even if their associated pins in the IE register are high.
Interrupt Priority in 8051
我們可以通過給任何一個中斷分配更高的優先級來改變中斷優先級。這是通過編程一個名爲IP(中斷優先級)的寄存器來實現的。
下圖顯示了IP寄存器的位。重置後,IP寄存器包含所有0。爲了給任何中斷賦予更高的優先級,我們將IP寄存器中的相應位設爲高。
- | - | - | - | PT1 | PX1 | PT0 | PX0 |
---|
- | IP.7 | Not Implemented. |
- | IP.6 | Not Implemented. |
- | IP.5 | Not Implemented. |
- | IP.4 | Not Implemented. |
PT1 | IP.3 | Defines the Timer 1 interrupt priority level. |
PX1 | IP.2 | Defines the External Interrupt 1 priority level. |
PT0 | IP.1 | Defines the Timer 0 interrupt priority level. |
PX0 | IP.0 | Defines the External Interrupt 0 priority level. |
Interrupt inside Interrupt
What happens if the 8051 is executing an ISR that belongs to an interrupt 和 another one gets active? In such cases, a high-priority interrupt can interrupt a low-priority interrupt. This is known as interrupt inside interrupt. In 8051, a low-priority interrupt can be interrupted by a high-priority interrupt, but not by any another low-priority interrupt.
Triggering an Interrupt by Software
There are times when we need to test an ISR by way of simulation. This can be done with the simple instructions to set the interrupt high 和 thereby cause the 8051 to jump to the interrupt vector table. For example, set the IE bit as 1 for timer 1. An instruction SETB TF1 will interrupt the 8051 in whatever it is doing 和 force it to jump to the interrupt vector table.