微處理機原理 Unit 5: MCS-51 Hardware 中原大學機械工程學系張耀仁 justin@cycu.edu.tw Intel 8051 Intel 8052/8031 MCS-51/52 系列比較 Intel 在 1981 年首先推出第一個 8 位元的 8051 微控制器 8052 與 8031 特性上幾乎相同 任何在 8051/8031 上所發展的軟體程式, 均可直接在 8052 上執行, 反之不然 系列比較 標準的 MCS-51 微控制器 : RAM: 128 位元組 ROM: 4K 位元組 定時器 : 2 個 串列通信埠 : 1 個 通用並列 I/O 埠 : 4 個 (8 位元 ) 特性 8031 8051 8052 ROM 0 KB 4 KB 8 KB RAM 128 B 128 B 256 B 定時器 2 2 3 I/O 埠位元 32 32 32 串列通信 1 1 1 中斷來源 5 5 6 Intel 8751/8752 Atmel AT89C51 MCS-51/52 系列比較 可以使用紫外光 ( 波長 2537Å) 清除的可規劃 ROM (UV- EPROM) 將快閃記憶體技術整合於 MCS-51 系列比較 MCS 51/52 微控制器系統架構 (15) 外部中斷輸入 中斷要求控制器 (INT controller) 微控制器系統架構 ROM(4KB) ROM(4KB) RAM(128B) RAM(128B) 定時器 0 定時器 1 定時器 2 計時器輸入 CPU 時脈產生器 BUS 控制 4 I/O 埠串列埠 8052 擴充部分 P0 P1 P2 P3 位址 / 資料 TxD RxD 接腳說明 說明 (1) Port 1 Port 0 Port 2 xx: 表示須接高電位, 當此接腳由高電位變成低電位時致能 1
接腳說明 8051 pinouts 共 40 接腳, 其中 32 接腳作為 I/O port lines 每個 I/O 埠有 8 條 I/O 線都是雙向, 分成四個 I/O 埠 (P0 P1 P2 P3), 總計 32 條 I/O 線 (48,4) 24 接腳具雙重用途 : I/O Control line Address or data bus I/O 埠 每個 I/O 架構上都有栓鎖器 輸出驅動器和輸入緩衝器 (48,5) 靜態特性 I/O 埠 (P0~P3) 所送出的訊號會被栓鎖, 除非再次的更動, 否則訊號固定不變 ( 稱為靜態訊號 )(48,8) 程式設計者只要在 SFR 填入特殊暫存器的資料, 便可以在 I/O 埠上得到相對應的訊號 (48,10) 栓鎖器以典型的 D 型正反器代表, 兩個 FET 強化輸出電流能力 ( 輸出驅動器 )(48,19) Port 0 Pins 32 39 可位元定址 ( 個別設定接腳為輸入或輸出 ) Mini-component design: 作為一般用途 I/O 埠 Large design with external memory: 當存取外部記憶體時, 作為較低 8 位元位址匯流排 (A0-A7) 和資料匯流排 (D0-D7) Port 0 動作 當寫入指令 ( 如 : MOV P0, A ) 操作埠時, 會呈現靜態輸出特性 若送出 1 時 D 型正反器 Q 為 1 多工器受選擇線控制 ( 此時選擇線為 0 開關下切 ), 所以 Q1 OFF, Q2 的輸入腳也為 0,Q2 OFF, 接腳輸出呈現高阻抗 Z 狀態 資料線送出 0 時,Q2 ON, 所以接腳接地即 0 訊號 Port 1 Pins 1 8 可位元定址 與外部元件之介面 Port 2 Pins 21 28 可位元定址 作為一般用途 I/O 埠 當存取外部記憶體時, 作為較高 8 位元位址匯流排 (A8-A15) Port 3 雙重用途 I/O 埠 可位元定址阜腳功能阜腳功能 P3.0 RXD( 串列埠輸入 ) P3.4 T0( 計時器 0 外部時脈輸入 ) P3.1 TXD( 串列埠輸出 ) P3.5 T1( 計時器 1 外部時脈輸入 ) P3.2 /INT0( 外部中斷 0 輸入 ) P3.6 /WR( 外部資料記憶體寫信號 ) P3.3 /INT1( 外部中斷 1 輸入 ) P3.7 /RD( 外部資料記憶體讀信號 ) 電源與振盪電路 V SS : 電路之地電位 (GND) 接腳 V CC : 電源接腳, 須接 +5 V XTAL 在 XTAL1 和 XTAL2 腳上, 跨接石英 (Crystal) 或陶瓷震盪器便可供應晶片內部所需要的時脈 (15,3) 石英或陶瓷震盪器典型值約 1 M~12 MHz, 電容則採 10 p~30 pf (15,5) 常用石英晶體 :12 MHz 電容為 30 pf ± 10 pf 2
系統時序 內部振盪器產生狀態序列 ( 若使用 12 MHz 石英晶體振盪器 ) 每秒產生 12 百萬個振盪週期 (Clock cycle) 每一個機械週期 (Machine cycle) 由 6 個狀態序列 (State Cycle,S1 S6), 即 12 個振盪週期所組成 (16,2) 每一個狀態序列 (State) 有 2 個震盪器週期 (OSC Cycle), 即 P1(Phase 1) 和 P2(Phase 2) (16,3) 每個狀態週期包含有兩個 指令提取 解碼 執行 完成一個指令通常需要一個機械週期 1 機械週期 = (16,5) f XTAL 為石英震盪頻率 XTAL 震盪頻率為 12 MHz, 就表示一個機械週期為 1 µs (17,1) T clock = 1/12 MHz = 83.33 ns 83.33 ns 12 = 1 µs MCS-51 指令處理資料速度通常為 µs( 微秒 ) (13,14) 標準運作時脈為 12 MHz, 指令周期約在 1 µs~4 µs 區間 (17,3) 重置 RESET 重置信號輸入接腳 正常的重置方法 :RST 接腳必須由 1 準位觸發重置程序後, 再回復電位為 0, 讓單晶片恢復正常執行狀態 (19,2) 必須維持至少 2 個機械週期 所有埠腳 (Port 0 Port 3) 皆為輸入狀態 : 讓 I/O 埠 32 個接腳全部出現高態 ( High ) 電氣訊號 (17,8) 內部相關的暫存器會被重置為特定的內容值, 其中, 程式計數器 (PC) 被設為 0000H PC=0000H, 從程式記憶體 0000H 處開始執行指令 (19,5) 只需接一個電容器至 +V CC 通常會在 RESET 腳用一個 8.2 ~ 10 kω 電阻器接地, 以縮短開機重置時間 外部程式記憶體相關腳位 /EA (External Access) 存取外部程式記憶體的致能腳 須接 +V CC /EA = 1,CPU 執行內部程式記憶體 (ROM),8051 為 4KB, 若超過此容量,CPU 將強迫提取外部程式記憶體 接地時 (/EA = 0) 內部程式記憶體失效,CPU 被迫只讀取外部程式記憶體 /PSEN (Program Store Enable) Pin 29: Output signal 程式儲存致能信號 : 是 8051 晶片讀取外部程式記憶體的激發信號, 當晶片在讀取外部記憶體時, 會送出此信號到記憶體上的輸出致能腳促使記憶體送出程式碼 外部程式記憶體相關腳位 ALE (Address Latch Enable) Pin 30 位址閂鎖致能信號 當 CPU 對外部裝置存取資料時, 此腳輸出脈波之負緣可用來鎖住由 P0 送出之低位元組位址 ALE is the signal that latches the address into an external register during the first half of a memory cycle. This done, the Port 0 lines are then available for data input or output during the second half of the memory cycle 程式計數器 程式計數器 (Program Counter, PC) 16 位元暫存器 CPU 執行指令會依據 PC 暫存器內容 ( 紀錄 ROM 位址指標 ) 指示, 擷取燒錄在 ROM 的指令 (19,10) PC 記錄下一個要執行指令的位址 (19,11) 可定址之最大記憶體空間為 64KB (2 16 ) PC 內含值為 0000H CPU 每提取一個指令碼後,PC 內容會自動加 1 特殊情況 跳躍指令 : 如 JMP 副程式呼叫指令 : 如 CALL 硬體中斷 3
ORG 指令 (20, 範例 2-2.2) 使用 ORG 指令進行定位, 告訴組譯器把隨後的指令置放於程式記憶體 (ROM) 的位址 ORG 為虛擬指令並不會佔據任何記憶體空間 例 :ORG 0000H MOV P1, #11111110B CALL DELAY MOV P1, #11111110B 指令 ( 此指令共需要 3 個機械碼 ) 燒錄於程式記憶體 (ROM) 位址 0000H 0001H 0002H 上 CALL DELAY 指令 ( 此指令共需要 2 個機械碼 ) 燒錄於程式記憶體 (ROM) 位址 0003H 0004H 上 MCS-51 內部記憶體 內部記憶體 程式記憶體 (ROM):4KB 資料記憶體 (RAM) 資料儲存區 (General-purpose storage) 可位元定址區 (Bit-addressable storage) Internal RAM: 128 Bytes 暫存器庫區 (Register banks) (Special function registers, SFR) A 累加器 B 暫存器 程式狀態字元 堆疊指標 資料指標暫存器內部資料記憶體使用 MOV 指令存取 程式記憶體 原始程式 (.asm 檔 ) 翻譯成執行檔 (.hex 檔 ) (21,8) 執行檔內部會記錄轉換後機械碼 使用燒錄器可以把這些機械碼存入 MCS-51 單晶片內部的 ROM 上 每個指令的機械碼大小並不一致, 可能佔據 1~3 位元組 (21,15) 程式記憶體 (ROM) 儲存程式碼 (4KB: 0000H ~ 0FFFH) 7 個特殊用途位址 : 存放中斷副程式起始位址 程式計數器與計數器與程式程式記憶體關係 程式計數器 16 位元暫存器 MCS-51 之 ROM 位址線共計 16 條 (16 位元 ) (25,4) PC0~PC15 分別控制著 16 條程式位址線, 藉著程式計數器可改變欲抓取的指令 (25,6) 16 條位址選擇線, 共可以選擇 64 Kbytes 的容量 (25,8) 事實上 8051 只常駐 4 Kbytes 的程式, 必要時可以使用外部擴充的方式, 使單晶片程式容量達到 64 Kbytes (25,9)(25,11) 外部程式記憶體 當 /EA=1 時 ( 即 /EA 接至 VCC), 表示不使用外部擴充方式, 此時 8051 所執行得的是來自於單晶片內部 (25,13) 若 /EA=0(/EA 接至 GND), 則 8051 內部 Flash ROM 失效, 其抓取的程式完全由外部記憶體提供 (25,14) 程式從 ROM 位址 0000H 處開始執行 (26,6) 特殊情況, 會直接更改 PC 值 (26,9) 分支跳躍指令 ( 含無條件跳躍 條件跳躍 ) 呼叫副程式 接受中斷請求中斷源位址 重置 (RESET) 外部中斷 0 (/INT0) 計時 / 計數器 0 中斷 外部中斷 1 (/INT1) 計時 / 計數器 1 中斷串列埠中斷計時 / 計數器 2 中斷 (8052) 0000H 0003H 000BH 0013H 001BH 0023H 002BH 分支跳躍 跳躍表示方式 (26,15) Rel 非代表程式記憶體的實際位址, 而是相對偏移位址 (Relative Offset) 由於 Rel 為一帶符號之 8 位元值, 代表此類型的跳躍空間僅能在 -128 Bytes 到 +127 Bytes 之間 Addr11 記載著實體位址 (Address) 的 11 個低階位址 執行此種跳躍時, 目前 PC 值較低階 11 位元會被這 11 位元 (Addr11) 取代, PC10~PC0 會更改, 但 PC15~PC11 此 5 位元不變 此類型的跳躍空間僅在 2 Kbytes(2 11 =2K) 的位址範圍有效 Addr16 記載著 16 位元的實際位址 (Address) 表示 PC15~PC0 會全部更改, 其跳躍範圍可在程式記憶體 64 Kbytes 任何地點 (2 16 =64K) 4
分支跳躍指令 (28,7) SJMP 僅限於下個指令 -128~+127 Bytes 之間 佔據 2 Bytes 之程式記憶體空間 AJMP 有 2 Kbytes 範圍 LJMP 則有 64 Kbytes 範圍 程式設計師在撰寫原始程式時, 絕大部分用標記去指定目標位址 (27,1) 指令跳躍能力佔據容量 SJMP REL -128 到 +127 Bytes 2 Bytes AJMP ADDR11 2K Bytes 區塊 2 Bytes LJMP ADDR16 64K Bytes 任何位址 3 Bytes 副程式 呼叫副程式指令 (30,4) ACALL ( 絕對呼叫副程式 ) 必須在距離副程式 2 Kbytes 範圍內 LCALL( 長程呼叫副程式 ) 可以在 64 Kbytes 任何範圍內 動作 (30,9) 當呼叫副程式時, 下一個指令的位址會被自動地推入 (PUSH) 堆疊 (Stack) 記憶體內部儲存 副程式之標記位址會被載入 PC 內, 並轉移至副程式執行指令 執行到 RET 後, 系統再自動地從堆疊區取出 (POP) 剛才推入的位址回 PC, 以使程式恢復到主程式繼續執行程式指令 注意 (30, 範例 2-3.8) 副程式不可以使用程式跳躍指令 ( 如 :JMP 指令 ) 跳到副程式任何標記上, 必須使用 ACALL 或 LCALL 指令來進行呼叫 程式流程 MCS-51 指令執行 在正常的情況下,PC 逐步遞增並執行指令, 但是一旦遇到程式跳躍指令, 則會使程式流程改變 由於各個時間點只能執行一個指令, 常稱為單步執行 (Single-Step Execution) (31,3) 迴圈設計 可以在主程式的最後一個指令, 使用程式跳躍指令, 跳回先前的標記, 重複執行主要的功能 (31,15) 原地踏步 如果不想重複進行主功能, 程式流程一直重複在一指令上踏步 (32,1) HERE: JMP HERE( 或者簡寫成 JMP $) 資料記憶體 RAM MCS-51 在 8051 內部提供了 128 Bytes 的 RAM (33,1) RAM 為資料記憶體 (Data Memory) 或內部記憶體 (Internal Memory) (33,2) 較低位址 128 Bytes 的資料記憶體 -- 位址編號 00H~7FH 較高位址 128 Bytes 的資料記憶體 -- 位址編號 80H~FFH (8052 才有 ) SFR(Special Function Register): 位址編號 80H~FFH 直接定址或間接定址 RAM 資料儲存區可位元定址區 暫一存般器用途 不可作為間一接般資存料取記區憶體使用 資料儲存區 資料儲存區 共 80 個 byte, 位址 30H ~ 7FH 只能以位元組定址使用 用途 由鍵盤輸入的數值儲存於此區 可將堆疊指標 SP 指至此區, 當作堆疊器 (Stack) 使用 定址方式 存取資料時, 必須指明欲存取資料的位址, 此稱定址模式 (34,6) 直接定址 (Direct addressing) 把直接位址放在指令上 (34,8):MOV A, 5FH a byte of data 間接定址 (Indirect addressing through R0 or R1) 藉著 @R0 或 @R1 指向欲抓取資料的定址 (34,10) MOV R0, #5FH immediate add. To move the value 5FH into R0 MOV A, @R0 indirect add. To move the data pointed at by R0 into the accumulator 5
間接定址說明 @ 為間接定址模式之表示符號, 其後為位址指標, 位址指標不是 R0 就是 R1 (38, 範例 2-4.4) MOV A,@R0( 將 R0 所指向位址的位元組資料搬到累積器 ACC) MOV A,@R0 ( 正確的間接定址 ) MOV @R1,A ( 正確的間接定址 ) MOV A,@R2 ( 錯誤的間接定址 ) MOV @R7,A ( 錯誤的間接定址 ) 範例 2-4.5 直接定址間接定址 MOV A,39H MOV 6AH,A MOV 07H,#BAH MOV R0,#39H MOV A,@R0 MOV R0,#6AH MOV @R0,A MOV R1,#07H MOV @R1,#BAH 可位元定址區 RAM 位址 00H~7FH 可以接受直接定址模式 間接定址模式兩種 (35,1) 可位元定址區 (Bit addressable RAM) 共 128 個可位元定址之位元 (16 個 byte), 位址 20H ~ 2FH (37,3) 每個位元可單獨用位元定址法直接定址 每個位元可設定 (Set) 清除 (Clear) AND/OR 等運算 Example: SETB 67H to set bit 67H SETB 26H.3 將 26H 的 Bit 3 設為 1 暫存器庫區 暫存器庫 (Register bank) 共 32 個 byte, 位址 00H ~ 1FH 分為 4 個暫存器庫, 每個暫存器庫有 8 個一般用途暫存器 R0 ~ R7 預設暫存器庫為 Bank 0 ( 位址 00H ~ 07H) Example: MOV A, R5 read the contents of address 05H into A 暫存器庫之選擇 以指令改變程式狀態字元 PSW 中的暫存器庫選擇位元 RS1 與 RS0 RS1 (PSW.4) RS0 (PSW.3) 暫存器庫 0 0 Bank0 0 1 Bank1 1 0 Bank2 1 1 Bank3 系統重置後, 堆疊指標 SP 會設定為 07H, 若堆疊動作開始時, 資料將由位址 08H( 即 Bank 1 的 R0 處 ) 開始存放 (Special Function Register,SFR) 位址 80H ~ FFH 共 128 位址, 但大部份未定義, 僅其中 21 SFR 位址有定義 定址方式 內部記憶體位址 80H ~ FFH: 只能以間接定址方式存取資料 : 只能以直接定址方式存取資料 Example: SETB 0E0H set bit 0 in the accumulator, leaving the other bits unchanged A 累加器 (Accumulator) 簡稱 ACC 或 A 可位元定址 算數運算 邏輯運算及資料搬移等工作, 都需要藉由累加器來完成 B 暫存器 可位元定址 用於乘法和除法的運算 乘法 : 運算結果的高位元組存入 B 暫存器中, 而低位元組存入 A 累加器 除法 : 運算結果的商數存入 A 累加器中, 而餘數存入 B 暫存器中 輸出 / 輸入埠暫存器 8051 具有 4 個 8 位元的輸出輸入埠 經由這四個輸出輸入埠與外界進行資料交換 分別為資料記憶體 80H 90H A0H B0H 等四個位元組 (byte), 並一輸出 / 輸入埠分別命名為 P0 P1 P2 及 P3 當軟體程式對輸出輸入埠 P0~3 作輸出 / 輸入的動作, 即是對 80H 90H A0H 及 B0H 等四個位元組作寫入 / 讀出的動作 程式狀態字元 (Program Status Word,PSW) 可位元定址, 位址 D0H, 紀錄 CPU 運算後之狀態旗標 旗標位址位元 名稱 功能 CY D7H 7 進位旗標 加減運算之進 ( 借 ) 位 布林運算時之累加器 AC D6H 6 輔助進位旗標 BCD 運算時之進位調整 由位元 3 至位元 4 之進位 F0 D5H 5 使用者旗標 一般用途 RS1 D4H 4 暫存器庫選擇旗標 RS0 D3H 3 暫存器庫選擇旗標 OV D2H 2 溢位旗標 OV = 0, 未溢位 OV = 1, 溢位 - 1 保留 P D0H 0 同位旗標 P = 0, A 累加器中含偶數個 1 P = 1, A 累加器中含奇數個 1 6
程式狀態字元 進位旗標 (Carry flag) Example: if the accumulator contains FFH ADD A, #1 A = 00H, CY = 1 Example: MOV R5, #55H 01010101 MOV A, #0AAH +) 10101010 ADD A, R5 11111111 輔助進位旗標 (Auxiliary carry flag) Example: MOV R5, #1 00000001 MOV A, #9 +) 00001001 ADD A, R5 00001010 A = FFH, CY = 0 A = 0AH, AC = 1 程式狀態字元 溢位旗標 (Overflow flag) Example: Hex: 0F Decimal: 15 + 7F + 127 8E 116 142 OV = 1 同位旗標 (Parity bit) 在每一個機械週期, 同位旗標位元 (P) 會自動被設定或清除 累加器中含 1 的個數與 P 位元相加, 恆保持偶數 Example: A = 10101101 P = 1 用於串列埠傳輸時檢查用 堆疊指標 (Stack Pointer,SP) 當執行 PUSH CALL 或中斷時,SP 值先加 1, 再將返回主程式位址推入堆疊暫存器中 當執行 POP RET RETI 時, 再將堆疊頂端內容取出存入程式計數器 PC 中, SP 值再減 1 初始位址 :07H 資料指標暫存器 (Data Pointer,DPTR) 程式記憶體之位址為 16 位元, 其內容長度為 8 位元 資料記憶體之位址為 8 位元, 其內容長度為 8 位元 DPTR 為 16 位元暫存器 由 2 個 8 位元暫存器 DPH DPL 所組合而成 被用於程式記憶體定址 (16 位元 ), 或用於存取外部擴充之 RAM 的資料 (42,6) 定址模式 定址 (Addressing) 模式 分成三類 : 立即資料定址 暫存器定址 記憶體定址定址模式格式範例立即資料 (Immediate) 定址 #data8 ADD A, #44H 暫存器 (Register) 定址 Rn (R0 ~ R7) ADD A, R5 直接 (Direct) 定址 addr8 ADD A, 55H ( 暫存器 ) 間接 (Indirect) 定址 @Ri (@R0, @R1) ADD A, @R0 絕對 (Absolute) 定址 addr11 AJMP BACK ( 暫存器 ) 相對 (Relative) 定址 disp8 SJMP AHEAD 長程 (Long) 定址 addr16 LJMP FAR_AHEAD 指標 (Indexed) 定址 @A+PC MOVC A, @A+PC 定址模式 立即資料 (Immediate) 定址 Example: MOV A, #12 load the value 12 (0CH) into the ACC ( 運算碼 ) ( 運算元 ) Example: ADD A, #56H 將常數資料 (56H) 加入累積器 A 中 立即運算元前須加 # 運算元可為數值常數 符號變數 運算式 Example: MOV PSW, #00011000B 選擇暫存器庫 Bank 3 暫存器 (Register) 定址 Example: MOV A, R7 將暫存器 R7 的 8-bit 內容移至累積器 A 中 Example: ADD A, R0 將 R0 的內容加入累積器 A 中 定址模式 直接 (Direct) 定址 使用 1 個位元組作為運算元位址, 因此資料存取的範圍為 0 到 255 個位元組 當 bit 7 =0, 存取範圍介於 0 ~ 127 (00H ~ 7FH) 當 bit 7 =1, 存取範圍介於 128 ~ 255 (80H ~ FFH) Example: MOV 20H, #12H 將常數資料 (12H) 載入內部資料記憶體位址 20H 處 Example: ADD A, 34H 將內部資料記憶體位址 34H 的內容加入累積器 A 中 Example: MOV 0A0H, #34H MOV P2, #34H 將常數資料 (#34H) 載入 PORT 2 7
定址模式 ( 暫存器 ) 間接 (Indirect) 定址 可以使用的暫存器包括 R0 R1 DPTR 三個 R0 與 R1 可以存取內部或外部資料記憶體中的最前面 256 個位元組 DPTR 只能存取外部資料記憶體 ( 至 64K 位元組範圍 ) 相當於 指標 (Pointer), 其內容為 RAM 之位址 Example: MOV R0, #32H ( 立即資料定址 ) 將常數資料 (32H) 載入暫存器 R0 MOV A, @R0 ( 間接定址 ) 將內部資料記憶體 32H 位址中資料移至累積器 A 中 8