day42 51單片機中斷系統與8×8 LED點陣掃描顯示
一、51單片機引腳位操作 —— sbit
關鍵字
作用
sbit
是專用于 51 單片機架構的 C 語言擴展關鍵字,用于定義特殊功能寄存器(SFR)中的某一位,從而實現對單個 I/O 引腳的直接位操作。
示例代碼
#include <reg51.h> // 包含51單片機寄存器定義頭文件// 定義74HC595芯片控制引腳
sbit SER = P3^4; // 串行數據輸入引腳,連接P3.4
sbit RCLK = P3^5; // 存儲寄存器時鐘引腳,連接P3.5
sbit SRCLK = P3^6; // 移位寄存器時鐘引腳,連接P3.6
- SER = P3^4:將 P3 端口第 4 位(即 P3.4 引腳)命名為
SER
,后續可直接用SER = 1;
或SER = 0;
控制電平。 - RCLK = P3^5:控制 74HC595 的存儲寄存器鎖存時鐘。
- SRCLK = P3^6:控制 74HC595 的移位寄存器時鐘。
? 應用場景:精準控制單個引腳,如驅動外設芯片、LED、按鍵檢測等。
二、74HC595 串轉并芯片工作原理
功能概述
74HC595 是一個 8 位串行輸入、并行輸出的移位寄存器芯片,通過 3 根控制線(SER、SRCLK、RCLK)即可控制 8 路輸出,極大節省單片機 I/O 資源。
關鍵引腳說明
引腳名 | 功能說明 |
---|---|
SER | 串行數據輸入端,逐位送入數據 |
SRCLK | 移位寄存器時鐘,上升沿將 SER 數據移入內部寄存器 |
RCLK | 存儲寄存器時鐘,上升沿將移位寄存器數據鎖存到輸出端口 |
行選通函數實現
/*** 選擇8*8點陣的行* @param num 要選擇的行號(0-7)* 通過74HC595串行輸入數據,控制對應行的選通*/
void led_rect_select(unsigned char num)
{unsigned char i = 0;RCLK = 0; // 拉低存儲寄存器時鐘,準備接收數據SRCLK = 0; // 拉低移位寄存器時鐘,準備移位操作// 循環8次,串行輸入8位數據for(i = 0; i < 8; i++){SRCLK = 0; // 拉低移位時鐘,準備輸入數據// 當i等于要選擇的行號時,SER置1,否則置0(num == i) ? (SER = 1) : (SER = 0);SRCLK = 1; // 拉高移位時鐘,將SER數據移入移位寄存器}RCLK = 1; // 拉高存儲寄存器時鐘,將移位寄存器數據鎖存到輸出寄存器
}
- 運行理想結果:調用
led_rect_select(3)
時,74HC595 輸出端口第 3 位為高電平,其余為低,即選通第 3 行 LED。
三、8×8 LED點陣掃描顯示原理
硬件結構
- 8 行 × 8 列共 64 個 LED,采用“行選通 + 列數據”方式控制。
- 本例使用共陰極點陣:行選通為低電平有效,列數據為高電平時對應 LED 點亮。
逐行掃描 + 視覺暫留
- 原理:每次只選通一行,輸出該行的列數據,快速循環掃描 8 行(每行約 1ms),利用人眼視覺暫留效應(約 10~20ms)形成完整穩定圖像。
- 優勢:節省 I/O 資源,僅需 3 個引腳(74HC595)控制 8 行 + 8 個引腳(P0)控制 8 列。
顯示函數實現
/*** 在8*8點陣上顯示圖案* 通過逐行掃描的方式,顯示預設的圖案(此處為數字"1")*/
void led_8_8_show(void)
{// 存儲8*8點陣每行要顯示的數據,對應顯示數字"1"unsigned char led_1_array[8] = {0x0, 0x10, 0x30, 0x10, 0x10, 0x10, 0x38, 0x0};unsigned char i = 0;// 逐行掃描顯示for(i = 0; i < 8; i++){ P0 = 0xff; // 關閉當前行顯示,避免串擾(共陰極,全高電平熄滅)led_rect_select(i); // 選擇第i行P0 = ~led_1_array[i]; // 輸出第i行的列數據(取反是因為共陰極點陣:數據1=高電平=點亮)delay(1); // 延時1ms,保持當前行顯示,利用視覺暫留形成穩定圖像}
}
- 圖案數組說明:
led_1_array[8] = {0x0, 0x10, 0x30, 0x10, 0x10, 0x10, 0x38, 0x0};
- 例如
0x10
=00010000B
,表示該行第 5 列 LED 點亮。
- 取反原因:共陰極點陣中,列需輸出高電平才能點亮 LED,而數組中
1
表示“點亮”,故需~
取反后送 P0 口。 - 理想運行結果:點陣穩定顯示數字“1”的圖案。
四、延時函數實現與作用
功能
通過空循環消耗 CPU 時間,實現軟件延時,用于控制掃描頻率、穩定顯示亮度。
實現代碼
/*** 延時函數* @param i 延時參數,控制延時時間長短* 通過雙重循環實現延時,外層循環10次,內層循環由i控制*/
void delay(unsigned int i)
{unsigned int num = i;int j = 0;for(j = 0; j < 10; j++){num = i;while(num--); // 內層循環,通過遞減計數實現延時}
}
- 調節方式:增大
i
值可延長延時。 - 應用場景:
- 點陣掃描中,每行延時約 1ms(
delay(1)
),總周期約 8ms,刷新率約 125Hz,遠高于視覺暫留閾值(約 50Hz),顯示穩定無閃爍。 - 延時過短 → 亮度不足;過長 → 閃爍明顯。
- 點陣掃描中,每行延時約 1ms(
五、數組在硬件控制中的應用
1. 數碼管段碼數組(備用)
/*** 共陰極數碼管段碼數組* 索引0-9分別對應數字0-9的十六進制段碼*/
unsigned char digit_data[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
- 雖未在主邏輯中使用,但體現“用數組存儲固定硬件控制數據”的設計思想。
2. 點陣圖案數組
unsigned char led_1_array[8] = {0x0, 0x10, 0x30, 0x10, 0x10, 0x10, 0x38, 0x0};
- 每個元素對應一行 LED 的亮滅狀態。
- 修改數組即可切換顯示圖案,如改為
0x7F, 0x49, 0x49, 0x49, 0x36, 0x0, 0x0, 0x0
可顯示字母“E”。
六、中斷系統詳解
中斷基本概念
- 中斷源:引起中斷產生的事件(如外部信號、定時器溢出、串口接收完成等)。
- 中斷服務程序(ISR):中斷產生后 CPU 跳轉執行的處理函數。
- 程序計數器(PC):指向當前執行指令地址,中斷發生時自動壓棧保存,中斷返回時恢復。
中斷系統作用
使 CPU 具備實時響應外部緊急事件的能力,提高系統效率與實時性。
中斷響應流程
- 當前指令執行完畢。
- PC 值壓入堆棧。
- 現場保護(可選,由程序員實現)。
- 屏蔽同級/低級中斷。
- PC 裝載中斷向量地址(跳轉至 ISR)。
- 執行中斷服務程序。
RETI
指令返回:恢復 PC,恢復中斷設置,繼續原程序。
? 中斷服務程序特點:無參數、無返回值、執行要快、盡量簡短。
七、STC89C51RC/RD+ 中斷系統特性
中斷源(共8個)
中斷源 | 中斷號 | 中斷向量地址 | 查詢優先級 |
---|---|---|---|
外部中斷0 (INT0) | 0 | 0003H | 最高 |
定時器0 | 1 | 000BH | |
外部中斷1 (INT1) | 2 | 0013H | |
定時器1 | 3 | 001BH | |
UART 串口中斷 | 4 | 0023H | |
定時器2 | 5 | 002BH | |
外部中斷2 (INT2) | 6 | 0033H | |
外部中斷3 (INT3) | 7 | 003BH | 最低 |
中斷優先級
- 支持 4 級優先級(通過
IPH
寄存器設置)。 - 若僅使用
IP
或XICON
,則為傳統 8051 的 2 級優先級。 - 高優先級可打斷低優先級 → 支持中斷嵌套。
- 同級中斷按查詢次序響應。
中斷控制寄存器
- EA (IE.7):總中斷允許位,置 1 開啟全局中斷。
- EX0 (IE.0):外部中斷 0 允許位。
- IT0 (TCON.0):外部中斷 0 觸發方式(0=低電平,1=下降沿)。
八、C語言中斷編程示例
初始化與主函數
// 外部中斷0初始化函數
void eint0_init(void)
{IT0 = 1; // 設置外部中斷0為邊沿觸發方式(下降沿觸發)EX0 = 1; // 使能外部中斷0EA = 1; // 使能總中斷
}// 主函數
void main(void)
{unsigned char i = 0;eint0_init(); // 調用外部中斷0初始化函數while(1) // 無限循環,等待中斷發生{// 主程序可執行其他任務,中斷發生時自動跳轉處理}
}
中斷服務程序(ISR)
// 外部中斷0處理函數,interrupt 0 表示該函數為外部中斷0的中斷服務程序
void eint0_handler(void) interrupt 0
{P2 = 0xaa; // 中斷發生時,P2口輸出0xAA(10101010B),控制外部LED或指示燈
}
- interrupt 0:指定該函數為中斷號 0(外部中斷 0)的服務程序。
- 理想運行結果:當外部中斷 0 引腳(P3.2)檢測到下降沿,CPU 跳轉執行
eint0_handler()
,P2 口輸出0xAA
,之后自動返回主循環。
📌 注意:ISR 中避免使用延時函數或復雜操作,防止阻塞其他中斷。
九、中斷向量表與響應機制圖示
- 中斷向量表:包含各中斷服務函數入口地址(如
fun0() interrupt 0
對應 0003H)。 - CPU 響應中斷時,根據中斷源自動跳轉至對應向量地址。
- 中斷響應步驟:
- 當前指令執行完。
- PC 壓棧。
- 現場保護(程序員手動)。
- 屏蔽同級中斷。
- PC = 中斷向量地址。
- 執行 ISR。
RETI
返回,恢復現場。
- 中斷觸發流程:中斷源(如 eint0)→ CPU 查詢中斷向量表 → 跳轉 ISR(如
eint0_handler()
)→ 執行 →RETI
返回。
十、總結
本節內容涵蓋 51 單片機兩大核心模塊:
1. 硬件驅動層
- 使用
sbit
精準控制 I/O 引腳。 - 驅動 74HC595 實現串轉并,節省 I/O。
- 8×8 LED 點陣逐行掃描 + 視覺暫留顯示技術。
- 延時函數調節掃描頻率。
- 數組存儲硬件控制數據,便于圖案切換。
2. 中斷系統層
- 中斷源、中斷向量、中斷優先級機制。
- 中斷響應流程與現場保護。
- C 語言中斷服務程序編寫規范(
interrupt n
)。 - 外部中斷初始化與觸發方式設置。
- 支持中斷嵌套與多級優先級。
? 綜合應用價值:掌握本節內容,可獨立完成“按鍵中斷控制點陣顯示切換”、“定時器中斷動態刷新圖案”等復雜嵌入式項目,是邁向高級單片機開發的堅實基礎。