day41 51單片機最小系統、GPIO控制、時序邏輯器件(74HC138/595)與LED點陣驅動原理
一、嵌入式系統基礎概念
1.1 嵌入式系統定義
先設計硬件,基于硬件設計軟件實現一個具體的功能 —— 專用的計算機系統
- 硬件/軟件可剪裁:根據功能需求裁剪軟硬件資源。
- 主流方案:ARM + Linux(當前主流)
- 早期方案:單片機 + C語言(至今仍廣泛用于教學與簡單控制)
1.2 軟件操作硬件的核心特點
- 軟件可以直接操作硬件寄存器/引腳電平
- 程序執行需要時間 → 引入延時函數、定時器、中斷機制
- 接口類型:
- 輸入/輸出(采集/控制/通信)
- 模擬量(需ADC/DAC)
- 關鍵技術模塊:
- 定時器(Timer)
- 中斷(Interrupt)
- UART(串口通信)
1.3 開發思維三要素(獨立思考)
- 做什么? —— 明確目標(如:點亮LED、顯示數字)
- 怎么做? —— 方法/步驟(如:查原理圖→找引腳→寫電平)
- 會不會? —— 評估能力(如:是否掌握GPIO、時序控制)
二、單片機最小系統與電平基礎
2.1 最小系統必備組件
- 電源:直流5V(部分支持3.3V)
- 晶振:提供標準時鐘信號(方波)
- 復位電路:高電平或低電平復位
- 51單片機必須外接以上三部分
2.2 電平標準(5V系統)
電壓范圍 | 邏輯電平 |
---|---|
< 0.8V | 低電平 (0) |
> 2.4V | 高電平 (1) |
0.8V ~ 2.4V | 不確定狀態(應避免) |
注:實際中,0V = GND = 邏輯0;5V = 邏輯1
2.3 時鐘與機器周期
- 時鐘頻率決定處理器工作速率
- STC89C52RC特性:
- 工作電壓:5.5V–3.3V
- 頻率:0–40MHz(等效8051的0–80MHz,實際可達48MHz)
- 6T/12T模式可選(指令周期)
- 4K–64K ROM,1280/512字節RAM
- 35/39個I/O口,P0開漏需上拉,其余為準雙向口
- 支持ISP/IAP,通過串口下載程序
- 內置EEPROM、看門狗、MAX810復位電路(可省外部復位)
標準時鐘信號:方波,協調數字系統各部分時序,保證有序運行。
晶振波形:正弦波形態,為系統提供穩定基準頻率。
三、裸機硬件開發流程
3.1 開發三步驟
- 理解硬件工作原理(如LED、數碼管、點陣、74HC595等)
- 查看原理圖 → 找連接關系
- 在開發板上找器件絲印(白色小字)
- 在原理圖中按絲印定位元器件
- 查看引腳連接關系(網絡標號成對出現)
- 控制對應引腳輸出電平(高/低)
原理圖:邏輯連接關系
PCB:物理連接關系
3.2 復位電路示例
高電平復位阻容電路:
- 元件:VCC、RSTK1(復位鍵)、C14(10μF)、R9(10kΩ)、GND
- 未按鍵:C14充電 → RST高電平 → 復位
- 按鍵:強制拉低 → 釋放后重新充電復位
3.3 排阻與灌電流
- 排阻:如 RP9、RP10,阻值 471 = 47 × 101 = 470Ω
- 引腳灌電流能力弱 → 需外接驅動或限流電阻
四、GPIO控制與LED點亮實踐
4.1 單片機端口結構
- P0(0x80)、P1(0x90)、P2(0xA0)、P3(0xB0)
- 每個端口8位,支持讀(輸入)和寫(輸出)
4.2 Keil工程與代碼示例
#include <reg51.h> // 包含51單片機寄存器定義頭文件void main(void)
{P2 = 0x55; // 0b 0101 0101,P2口輸出交替高低電平
}
編譯輸出:
Build target 'Target 1' assembling STARTUP.A51... compiling main.c... "test1" - 0 Error(s), 0 Warning(s).
下載成功提示(STC-ISP):
操作成功 !(2025-09-13 14:30:51)
示波器實測波形:正弦波,50kSa/s,2V/div,最大值5.20V
五、延時函數與方波生成
5.1 延時函數實現
#include <reg51.h>// 延時函數,參數i控制延時長度
void delay(unsigned int i)
{unsigned int num = i; // 初始化計數值int j = 0; // 循環變量for(j = 0; j < 10; j++) // 外層循環放大延時{num = i; // 重置內層計數while(num--); // 空循環消耗時間}
}void main(void)
{while(1){P2 = 0; // 輸出全低電平// P2 = 0xff; // 若取消注釋,將輸出全高電平,形成方波}
}
示波器實測方波:
- 2μs/div,250MSa/s采樣率
- 2V/div(10X探頭),最大值5.04V
- 波形穩定,高低電平分明
六、數碼管與74HC138譯碼器驅動
6.1 數碼管段碼
P0 = 0x5b;
// 顯示數字“2”
74HC138譯碼器電路:
- 輸入:A(P22)、B(P23)、C(P24) → 組合0~7
- 輸出:Yn低電平有效(選中第n個LED/數碼管)
- G1=VCC,G2A=G2B=GND → 使能譯碼器
74HC138真值表:輸入組合決定哪個Yn輸出低電平
動態數碼管模塊:P0口控制段碼,P2口經74HC138控制位選
6.2 動態掃描代碼
#include <reg51.h>void delay(unsigned int i)
{unsigned int num = i;int j = 0;for(j = 0; j < 10; j++){num = i;while(num--);}
}void main(void)
{while(1){P2 = 0; // 選中第0位P0 = 0x5b; // 顯示數字2delay(10000);P2 = (1 << 2); // 選中第1位(P2.2=1, P2.3=0, P2.4=0 → ABC=001)P0 = 0x5b;delay(10000);P2 = (2 << 2); // 選中第2位(ABC=010)P0 = 0x5b;delay(10000);P2 = (3 << 2); // 選中第3位(ABC=011)P0 = 0x5b;delay(10000);}
}
6.3 優化:循環掃描0~7位
void main(void)
{unsigned char i = 0;while(1){for(i = 0; i < 8; i++){P2 = i << 2; // 位選:i左移2位送P2口(控制ABC)P0 = 0x5b; // 段碼:顯示數字2delay(6000);}}
}
6.4 顯示0~7數字
// 數碼管0~9的段碼表(共陰)
unsigned char digit_data[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};void main(void)
{unsigned char i = 0;while(1){for(i = 0; i < 8; i++){P2 = i << 2; // 位選第i個數碼管P0 = digit_data[i]; // 顯示數字idelay(1); // 短暫延時P0 = 0; // 熄滅,避免殘影(動態掃描關鍵)}}
}
七、8×8 LED點陣驅動原理
175775507819211.png&pos_id=img-ptGkiVTP-1757759177008)
8×8 LED點陣模塊:
- 行:A1-A8(DPa-DPh)→ 接P0口
- 列:K1-K8 → 接P2口(或其他控制口)
- 顯示“1”示例:
- a=0, b=1, c=1, d=0, e=0, f=0, g=0 (需根據實際連接推導)
7.1 控制原理(以共陽點陣為例)
- 共陽極:行接VCC(高電平),列接地(低電平)則LED亮
- 共陰極:列接VCC(高電平),行接地(低電平)則LED亮
- 掃描方式:逐行/逐列掃描 + 視覺暫留 → 顯示完整圖案
八、74HC595 串轉并移位寄存器詳解
74HC595模塊電路:
- SER (P34):串行數據輸入
- SRCLK (P36):移位寄存器時鐘
- RCLK (P35):存儲寄存器時鐘(與OE共用P35,實際應分開)
- OE (P35):輸出使能(低電平有效)
- QA-QH → DPa-DPh(并行輸出)
引腳功能表:
- Q0~Q7 (15,1,7…):并行輸出
- MR (10):主復位(低有效,通常接VCC)
- SHCP (11):移位時鐘(SCK)
- STCP (12):存儲時鐘(RCK)
- OE (13):輸出使能(低有效)
- DS (14):串行數據輸入(SER)
- Q7’ (9):串行數據輸出(級聯用)
8.1 控制端說明
- /SCLR (MR, 10腳):低電平時清零移位寄存器。通常接VCC。
- SCK (SHCP, 11腳):
- 上升沿:數據移位 QA→QB→…→QH
- 下降沿:數據保持不變
- 脈寬 > 幾十納秒(5V系統)
- RCK (STCP, 12腳):
- 上升沿:移位寄存器 → 存儲寄存器
- 下降沿:存儲寄存器保持
- 通常先置低,移位完成后給一個正脈沖(微秒級)更新輸出
- /G (OE, 13腳):
- 高電平:輸出高阻態(禁止輸出)
- 低電平:正常輸出
- 用單獨引腳控制可輕松實現閃爍效果(比數據移位更高效)
工作邏輯示意圖:
- 輸入數據:0b 11001010
- 步驟:
RCLK=0; SRCLK=0;
- 8次
SRCLK
上升沿 → 數據逐位移入 QA~QH- 1次
RCLK
上升沿 → 數據鎖存到輸出端- 輸出:DPa=QA, DPb=QB, …, DPh=QH
? 本日知識點:嵌入式概念、最小系統、電平標準、GPIO控制、延時函數、74HC138譯碼器、數碼管動態掃描、8×8點陣原理、74HC595串轉并驅動 —— 構成單片機外設控制核心知識體系。