
簡介面向初學單片機或期末復習的讀者這份AT89C51匯編學習筆記壓縮包基于斐多課堂網課截圖整理而成覆蓋除串口通信外的多數知識點適合系統掌握8051單片機匯編編程。資源共174個文件以164張PNG截圖為主體搭配2個md筆記文檔、2個txt說明及許可證等輔助文件壓縮包大小83.9MB文件命名按時間有序排列便于對照課程章節瀏覽。已有111人學習筆記包含定時器/計數器、中斷系統、LED控制及按鍵輸入等模塊化講解并附有筆記.md快速預覽和PDF導出版本方便打印復習或離線查閱。整體而言這套資料能幫助初學者在補天或課程設計中快速建立匯編編程的完整框架減少看視頻時反復暫停記筆記的負擔。1. 期末“補天”前先把 AT89C51 單片機匯編筆記變成自己的索引期末補天這件事大多數人不是沒聽課而是聽完了等于沒聽。網課里講 51 單片機的尋址方式老師在屏幕上把 MOV 指令列表翻了三頁你截了四張圖關掉窗口就再沒回去翻過。直到考前一周打開相冊面對幾百張截圖才意識到你根本沒建立知識點之間的連接。這個問題的根源在于截圖是按時間線堆積的可考試是按功能線出題的寄存器配置、定時器初值、中斷入口、查表算法每一類都要能獨立調用。所以正確的“補天”姿勢應該是先把所有截圖重新分類再按類別生成自己的速查索引最后用匯編在 Keil5 里把每一種題型跑通。這篇筆記就是按這條思路展開的。2. AT89C51 匯編筆記重建先分清 ROM、RAM 和 SFR網課第一節到第二節一定會講存儲器結構。如果你只截下來一張圖那這張圖就是整個匯編復習的根。AT89C51 匯編里幾乎所有指令都在和三個區域打交道ROM 放程序RAM 放臨時數據SFR 控制片內外設。順序搞反后面的定時器、中斷、串口全都會跟著亂。2.1 把截圖按“存儲器地圖”重排而不是按網課順序AT89C51 片上有 4KB Flash、128B RAM 和一組 SFR 特殊功能寄存器。Flash 放編譯后的機器碼復位后從 0000H 開始取指RAM 的低 128 字節用來放變量、堆棧和位尋址區地址范圍 00H7FHSFR 區占據 80HFFHP0P3、TMOD、TCON、IE、IP、SCON、SBUF 全住在里面。整理截圖時我一般不做課本章節復制而是把所有涉及存儲器分配的截圖歸為一組自己壓成一張總表。以下是期末復習最常用到的 SFR考試考到寄存器配置時先定位到這張表再動手寫代碼。SFR 名稱字節地址主要作用考試出鏡率P0P380H/90H/A0H/B0H4 個 8 位并行 I/O 口極高TMOD89H定時器工作方式選擇極高TCON88H定時器運行控制與中斷標志高TH0/TL08CH/8AH定時器 0 初值高/低字節高SCON98H串口控制寄存器中SBUF99H串口收發緩沖寄存器中這張表是從幾十張網課截圖里提煉出來的最終形態。對照它去復習比反復翻 PPT 截圖有用得多因為考試答題時需要的是“TMOD 地址是多少、里面每一位是什么含義”這種確定信息而不是一張模糊的課堂板書照片。2.2 尋址方式速記用一條 MOV 串起七種寫法匯編語法里最容易丟分的就是尋址方式??荚嚱洺=o一條指令問源操作數的尋址方式或者直接讓你用不同尋址方式寫同一條數據訪問。AT89C51 的七種尋址方式可以全部用 MOV 指令串起來復習MOV A, #3CH ; 立即數尋址3CH 就是數據本身 MOV A, 30H ; 直接尋址取 RAM 30H 單元的值 MOV A, R0 ; 寄存器尋址R0 里的內容就是數據 MOV A, R0 ; 寄存器間接尋址R0 里存的是地址 MOV DPTR, #2000H ; 16 位立即數裝入數據指針 MOV C, 20H ; 位尋址操作對象是 RAM 20H 的某一位 MOVC A, ADPTR ; 變址尋址查表專用指令R0和R0的區別是新手翻車頻率最高的一對。R0表示 R0 里保存的是一個地址讀的是這個地址指向的存儲單元R0直接使用寄存器保存的值本身。位尋址區域有兩塊RAM 的 20H2FH 共 16 個字節以及 SFR 中字節地址能被 8 整除的寄存器比如 P080H、TCON88H。答題時先判斷操作數地址能不能被 8 整除位尋址的題基本不會錯。注意Keil 匯編器把十六進制數后忘寫H的值當作十進制處理30H和30是兩個完全不同的地址考試寫代碼和上機仿真都要養成補H的習慣。2.3 按真題頻率重排指令表而不是背網課目錄網課里指令系統按功能分類數據傳送、算術運算、邏輯運算、控制轉移、位操作。期末復習必須把這個順序倒過來按真題出題頻率排。我把常見指令分成三檔筆記里只詳細整理高中頻低頻指令考前瀏覽一遍即可。高頻指令MOV、ADD、SUBB、CLR、SETB、LCALL、RET、DJNZ、CJNE、RL、RR、CPL、ANL、ORL。這些要能白紙默寫并且知道執行后對 PSW 中 CY、AC、OV、P 四個標志位的影響。中頻指令INC、DEC、SWAP、XCH、PUSH、POP、AJMP。低頻指令容易出成判斷和選擇比如 JB、JNB、JZ、JNZ只需要記住“哪個位為 1 跳轉”“哪個標志為 0 跳轉”即可。紙面背指令記不牢我的習慣是每背一組就在 Keil5 里敲一行、編譯一下再看 Simulation 窗口里 A、PSW 寄存器的變化。匯編語法檢查通過只代表拼寫沒錯不等于邏輯對只有單步執行觀察寄存器變化指令行為才會真正變成長期記憶。2.4 從網課截圖里抽出“一句話注釋”重寫執行結果網課里的指令注釋基本都是“將立即數送入累加器”這種官方說法它沒有告訴你執行后標志位變成了什么。處理截圖時我會強制自己把每條注意的指令改寫成一個帶執行結果的注釋這個動作比截圖本身重要得多。MOV A, #80H ; 改寫后的注釋A80HZ0 ADD A, #80H ; 改寫后的注釋A00HCY1OV1Z1改寫注釋的價值在碰到類似指令時才會體現如果你只寫“累加器加立即數”溢出和進位對你毫無警示一旦用自己的手算結果把標志位標在旁邊做判斷類題目時就不會再錯。網課截圖里老師順手寫的“注意進位”信息密度遠不如自己算一遍寫下的CY1。3. 把網課截圖的流水燈代碼在 Keil5 里跑成最小 .asm聽懂了網課和跑通了工程是兩回事。流水燈是 AT89C51 匯編里第一道必須自己上機過的程序它同時覆蓋 I/O 輸出、循環跳轉、子程序調用和軟件延時四個考點。我建議直接在 Keil5 里建一個最小工程從新建文件到生成 HEX 全流程走一遍這比對著截圖背十遍都有效。3.1 先把人話翻譯成偽代碼再轉匯編網課老師在黑板上畫流水燈電路圖P1 口每根引腳接一個 LED 和限流電阻通常是低電平點亮。電氣接線先不管解題思路直接寫偽代碼上電 累加器 A 中放入 1111 1110最低位是 0 循環 把 A 的值輸出到 P1 延時約 100ms A 循環左移一位偽代碼的好處是忽略寄存器細節先把算法定下來。確定“最低位點亮”之后下一步才是選指令。延時部分可長可短為了觀察方便取 100ms 左右數據左移用 RL 指令它不帶進位循環左移正好符合流水燈從 P1.0 到 P1.7 循環點亮的需求。3.2 最小可編譯的流水燈匯編程序帶注釋完整代碼可以直接復制進 Keil5從復位入口到無限循環包含全部必需段ORG 0000H ; 復位后第一條指令的地址 LJMP START ; 長跳轉到主程序跳過中斷向量區 ORG 0030H ; 主程序起始地址 START: MOV A, #0FEH ; 1111 1110P1.0 先輸出低電平 LOOP: MOV P1, A ; 把 A 的內容送到 P1 口 LCALL DELAY ; 調用延時子程序 RL A ; A 循環左移一位點亮下一盞 LED SJMP LOOP ; 無限循環 DELAY: MOV R7, #200 ; 外循環計數值 D1: MOV R6, #250 ; 內循環計數值 D2: DJNZ R6, D2 ; R6 減 1不為 0 繼續內循環 DJNZ R7, D1 ; R7 減 1不為 0 繼續外循環 RET ; 子程序返回 END ; 源程序結束ORG 0000H保證復位后從零地址開始執行LJMP START必須用長跳因為從 0000H 到主程序之間要留出 8 個中斷向量入口普通短跳轉跳不到 0030H 那么遠。MOV P1, A屬于直接尋址P1 是 SFR地址在 90HLCALL DELAY是長調用子程序在 64KB 空間任意位置都能被調用。DJNZ R6, D2一條指令完成減一和條件跳轉兩個操作是匯編循環的支柱指令。3.3 Keil5 工程五個步驟和三個隱藏坑Keil5 安裝教程網上很多這里只記建 51 工程時容易出錯的步驟New μVision Project芯片型號選 AT89C51也可以選 AT89C52寄存器定義完全兼容。新建源文件保存時擴展名必須寫成.asm寫成.c或.txt都不會被編譯。Options for Target → Output 勾選 Create HEX File否則燒錄時找不到目標文件。在左側文件樹把源文件添加到 Source Group。按 F7 編譯看到 0 Error(s) 后進入 Debug 模式單步執行。三個隱藏坑第一漏勾 Create HEX File這是期末上機最常見的翻車點第二ORG 0030H被寫成ORG 30Keil 按十進制處理程序入口直接偏到 1EH中斷向量區被踩爛第三芯片型號選成 STC89C52增強型 SFR 多出不少雖然基礎代碼能運行但和 AT89C51 的題目要求存在細微信號差別上機考試建議嚴格按題目選型。3.4 12MHz 晶振下延時精度到底怎么算延時計算是期末考場上最常見的填空和簡答題。AT89C51 的機器周期是 12 個晶振周期外部晶振 12MHz 時一個機器周期正好是 1μs。常用指令的執行時間需要背熟指令機器周期數12MHz 晶振下耗時MOV A, #data11μsMOV direct, #data22μsDJNZ Rn, rel22μsLCALL addr1622μsRET22μs用前面的流水燈代碼估算內層MOV R6,#250耗時 1μsDJNZ R6,D2每次 2μs250 次約 500μs外層再乘 200總延時約 100ms。這個數值足夠肉眼觀察。如果你用 Proteus 仿真 51 單片機測量會看到實際延時略大于理論值因為調用LCALL和返回RET本身占用的周期沒有計入。需要精確延時的場合優先用后面第 4 章講的定時器而不是加大軟件循環圈數。4. 從截圖筆記到可執行程序定時器和矩陣鍵盤的考試高頻寫法定時器和矩陣鍵盤是《單片機原理及應用》考得最密的兩塊。前者考配置流程后者考 I/O 讀寫順序兩者在網課截圖里出現的頻率也最高??荚嚂r這兩道題能拿滿分的同學通常不是背代碼最熟的人而是會把配置步驟拆成固定順序的人。4.1 定時器配置五步一步都不能少配置定時器 0 的方式 1也就是 16 位定時模式時核心順序是選方式、裝初值、開中斷、啟動、重裝初值。漏掉第五步是考場丟分最大的源頭。下面是一段 50ms 定時中斷的完整代碼ORG 0000H LJMP MAIN ORG 000BH ; 定時器 0 中斷入口地址 LJMP T0_ISR ORG 0030H MAIN: MOV TMOD, #01H ; T0 工作方式 116 位定時 MOV TH0, #3CH ; 初值高字節 MOV TL0, #0B0H ; 初值低字節整體 3CB0H SETB ET0 ; 允許定時器 0 中斷 SETB EA ; 開放總中斷 SETB TR0 ; 啟動定時器 0 SJMP $ ; 主程序空轉等待中斷 T0_ISR: CPL P1.0 ; P1.0 取反輸出方波 MOV TH0, #3CH ; 方式 1 沒有自動重裝必須手動恢復初值 MOV TL0, #0B0H RETI ; 中斷返回 END初值計算邏輯要寫在代碼旁邊方式 1 是 16 位計數器最大計數值 65536。定時 50ms 需要計數 50000 個機器周期因為 12MHz 晶振下 1 個機器周期是 1μs所以初值等于 65536 減 50000結果是 15536轉十六進制就是 3CB0H。MOV TMOD,#01H里的 01H 表示定時器 0 工作在方式 1定時器 1 保持默認方式 0兩個定時器共享一個 TMOD 字節改寫時不要互相覆蓋。中斷服務程序里重新裝初值是方式 1 的硬性要求。計數器溢出后 TH0/TL0 會自動回到 0000H不重新賦值的話下一次溢出時間就變成 65536 個周期方波頻率立刻跑偏。如果改用方式 2 的 8 位自動重裝只需寫 TH0TL0 溢出后自動從 TH0 加載省掉重裝指令但定時范圍只有 256μs。4.2 中斷向量表和優先級考前背這張表就夠AT89C51 有 5 個中斷源中斷入口地址是期末默寫題的高頻考點。中斷系統需要關心中斷入口和允許位的對應關系以及重置后的優先級順序中斷源入口地址使能位默認優先級外部中斷 00003HEX01最高定時器 0000BHET02外部中斷 10013HEX13定時器 1001BHET14串口0023HES5最低考試碰到“寫出某個中斷服務程序的入口地址”這類題直接對照這張表。還要記住 IP 寄存器可以調整優先級復位后默認為全低優先級多個同級中斷同時請求時查詢順序按表中編號從前到后。判斷先響應哪條中斷要先看 IP 配置而不是只看入口地址誰靠前。4.3 矩陣鍵盤行列掃描的匯編寫法避開兩個典型錯矩陣鍵盤常用 P1 口的 8 根線接 4×4 鍵盤行接高四位、列接低四位。掃描思路是先讓所有行為低讀列判斷是否有鍵按下確認有鍵后逐行置低、逐列讀回確定按鍵坐標。; 假設 P1 高四位接行低四位接列 KEY_SCAN: MOV P1, #0FH ; 高四位輸出低電平低四位設為輸入 MOV A, P1 ANL A, #0FH ; 屏蔽高四位只保留列電平 CJNE A, #0FH, KEY_DEBOUNCE ; 有列變低說明有鍵按下 MOV R7, #0FFH ; 返回 0FFH 表示無按鍵 RET KEY_DEBOUNCE: LCALL DELAY ; 調用 10ms 延時消抖 MOV A, P1 ANL A, #0FH CJNE A, #0FH, KEY_CONFIRM ; 二次確認確實有鍵 MOV R7, #0FFH RET KEY_CONFIRM: ; 到這里確認有鍵按下 ; 后續逐行掃描P1.4 置 0讀 P1.0~P1.3 判斷行號 ...兩個典型錯第一MOV P1,#0FH之后立刻讀引腳沒有給電平穩定時間在 Proteus 仿真 51 單片機時可能讀到上一次的輸出值需要插入幾條 NOP 空操作延時第二寫循環逐行掃描時容易把已經輸出過的行狀態帶到下一次讀列導致鍵號判斷錯亂。每次掃描前都要重新設置行輸出值不要復用上一次的 P1 狀態。4.4 數碼管段碼查表把截圖里的表存成 ROM 查表結構數碼管顯示部分是網課截圖出現頻率最高的內容之一核心就是一張 09 的段碼表。共陰七段數碼管的段碼常見如下TAB: DB 3FH, 06H, 5BH, 4FH, 66H ; 0 1 2 3 4 DB 6DH, 7DH, 07H, 7FH, 6FH ; 5 6 7 8 9查表時先用 A 保存數字索引DPTR 載入表格起始地址再執行MOVC A, ADPTRA 里得到的才是要送出到 P0 或 P2 口的段碼。MOVC的 C 代表 Code訪問的是程序存儲器不是 RAM 或 SFR這是變址尋址方式在考試中的標準用法。表里放錯一位數字數碼管就會顯示成錯位字符??记鞍?09 的段碼手寫一遍再和網課截圖比對通常能發現原圖本身就有一兩處錯誤。5. 把截圖整理成能帶走的 zip考前 30 小時把素材合進一棵目錄樹5.1 截圖命名用“考點_引腳_行為”三段式補天的最后階段最浪費時間的動作是在幾十張命名相同的Screenshot_20241201_142358.png里翻找某張定時器截圖。我一般把相冊里的截圖全部導到一個臨時文件夾用三段式重命名考點名稱、引腳或寄存器名、預期行為。舉幾個例子定時器_TCON_TR0_啟動計數.png、流水燈_P1_循環左移效果圖.png、中斷_入口地址_0003H外部中斷0.png。這樣文件管理器排序出來的結果就是按知識點的邏輯順序而不是按拍攝時間。批量重命名可以用 Everything 工具或者寫一個簡單的 Python 腳本遞歸改名先把文件名中的日期戳替換成知識點前綴。命名這一步做完zip 里的目錄本身就是一份復習大綱。5.2 壓縮成 zip 前做一次“減重”不是所有截圖都值得留在壓縮包里。網課截圖中屬于“老師手寫演算”和“PPT 整頁文字”的兩類考前幾天復習價值很低只各留一張串聯章節即可。真正值得保留的是指令表截圖、尋址方式對照、中斷向量表、定時器初值計算過程、數碼管段碼、電路接線原理圖。整理完成后按下面的結構打包AT89C51期末補天/ ├── 00-考前速查/ ├── 01-存儲器與尋址方式/ ├── 02-指令表與延時/ ├── 03-流水燈與I/O口/ ├── 04-定時器與中斷/ ├── 05-矩陣鍵盤與數碼管/ └── 06-真題錯題/zip 內置的目錄結構加上三位數字編號保證在任何設備上解壓后都能按順序瀏覽。不要在壓縮包里放網課視頻的轉碼文件那不是索引是備份。5.3 考前 3 小時的復查動作zip 建好之后考前 3 小時的用法不是再看一遍截圖而是帶著問題驗證。打開 Keil5挑三個高頻代碼片段流水燈、定時器翻轉、矩陣鍵盤讀列。對著 zip 里的截圖口述每一條指令的機器周期數和標志位變化。能口述清楚的截圖保留卡殼的就是最后一輪復習的突破點。最后打開 Proteus把流水燈程序重新仿真一遍觀察 P1 口的波形頻率是否和筆記里計算的延時一致。一致說明這套筆記閉環了不一致馬上回查延時公式和初值計算問題通常出在漏算了調用指令本身的周期。本文還有配套的精品資源點擊獲取