一篇带你快速入门51单片机开发的技术笔记
前言
51单片机作为嵌入式入门的经典芯片,虽然架构简单,但它包含了微控制器最核心的组成部分:CPU、RAM、ROM、定时器、中断、UART等。
本文基于实际学习笔记整理,结合代码示例与硬件图示,带你快速上手51单片机开发。
一、单片机基础概念
1.1 什么是MCU?
MCU(Microcontroller Unit,微控制器)将CPU、RAM、ROM、定时器、I/O接口等集成在一块芯片上,成本低、功耗小,适用于控制类应用。
与之相对的是MPU(Micro Processing Unit,微处理器),只包含CPU,需外接RAM、ROM,适合运行Linux等复杂系统。
| 类型 | 集成度 | 成本 | 典型应用 |
|---|---|---|---|
| MCU | 高 | 低 | 家电、工控、汽车电子 |
| MPU | 低 | 高 | 手机、嵌入式Linux设备 |
1.2 最小系统
单片机工作的最低硬件要求包括:
-
电源:一般为5V或3.3V
-
晶振:提供时钟信号
-
复位电路:上电后复位芯片
下图是一个典型的最小系统框图:
text
+-------------------+
| MCU |
| |
| VCC ---- 5V |
| GND ---- GND |
| OSC ---- 晶振 |
| RST ---- 复位电路|
+-------------------+
二、开发环境与工具
2.1 软件工具
-
Keil4:51单片机主流IDE
-
stc-isp:STC单片机下载软件
注意:Keil安装路径不能包含中文,也不要与之前版本路径重复。
2.2 硬件调试工具
| 工具 | 作用 |
|---|---|
| 万用表 | 测量电压、通断 |
| 示波器 | 观察信号波形 |
| 逻辑分析仪 | 分析数字信号时序 |
三、位运算与寄存器操作
51单片机通过寄存器控制外设,寄存器每一位对应一个硬件状态。
3.1 常用位运算
| 操作 | 示例 | 说明 |
|---|---|---|
| 置1 | `t | = (1 << n)` |
| 清0 | t &= ~(1 << n) |
将第n位清0 |
| 取反 | ~t |
按位取反 |
| 与 | a & b |
判断某位是否为0 |
| 或 | `a | b` |
3.2 示例:指定位置1
c
unsigned char t = 0x00;
t |= (1 << 0) | (1 << 7); // 将bit0和bit7置1
3.3 示例:指定位清0
c
unsigned char t = 0xFF;
t &= ~(1 << 0); // 将bit0清0
四、GPIO:通用输入输出
GPIO(General Purpose Input Output)是单片机最基础的外设,用于控制LED、读取按键等。
4.1 输出模式
-
推挽输出:驱动能力强,可直接驱动LED
-
开漏输出:需外接上拉电阻,适合总线通信
4.2 输入模式
-
上拉输入:默认高电平
-
下拉输入:默认低电平
-
浮空输入:电平不确定,适合按键检测
4.3 示例:检测按键
c
if ((P1 & (1 << 5)) == 0) {
// 按键按下
}
五、中断系统
中断是单片机处理紧急事件的重要机制。
5.1 中断源
51单片机有5个中断源:
-
外部中断0(INT0)
-
外部中断1(INT1)
-
定时器0
-
定时器1
-
串口中断
5.2 中断优先级
51单片机支持两级中断嵌套,优先级高的中断可以打断优先级低的中断。
5.3 中断处理流程
-
中断源发出请求
-
CPU检查总中断开关(EA)及子中断开关
-
比较优先级
-
保护现场
-
执行中断服务函数
-
恢复现场
5.4 示例:外部中断0初始化
c
void int0_init() {
EA = 1; // 开启总中断
EX0 = 1; // 开启外部中断0
IT0 = 1; // 下降沿触发
}
六、定时器与PWM
6.1 定时器工作原理
51单片机定时器是自增型计数器,从初值计数到65535产生溢出中断。
-
时钟来源:系统时钟经12分频
-
12MHz晶振 → 定时器时钟1MHz → 每1us计数一次
6.2 定时器初值计算
以12MHz晶振、1ms定时为例:
text
计数次数 = 1ms / 1us = 1000
初值 = 65535 - 1000 = 64535
6.3 示例:定时器0初始化(16位模式)
c
void timer0_init() {
TMOD |= 0x01; // 16位定时器模式
TH0 = 64535 >> 8; // 高8位
TL0 = 64535; // 低8位
TR0 = 1; // 启动定时器
EA = 1; // 开总中断
ET0 = 1; // 开定时器中断
}
6.4 PWM原理
PWM(Pulse Width Modulation)通过调节占空比控制输出平均电压,常用于调光、调速、蜂鸣器音调控制。
-
周期:一个完整波形的时间
-
占空比:高电平时间 / 周期
七、数码管与动态扫描
7.1 数码管结构
-
段选:控制哪一段亮
-
位选:控制哪一位亮
7.2 动态扫描原理
利用人眼视觉暂留效应,快速轮流点亮各位数码管,实现多位显示。
c
unsigned char seg_table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void bit_select(unsigned int n)
{
P1 &= ~(0x0F << 0);
P1 |= 1 << n;
}
void seg_select(unsigned int n)
{
P0 = seg_table[n];
}
void num_show(unsigned int num)
{
int n = 0;
int t = 0;
if(num == 0)
{
bit_select(0);
seg_select(0);
delay(100);
P0 = 0;
}
else
{
while(num != 0)
{
n = num % 10;
bit_select(t++);
seg_select(n);
delay(100);
P0 = 0;
num = num / 10;
}
}
}
八、练习:按键控制蜂鸣器音调
功能描述
通过4个按键控制蜂鸣器发出不同频率的声音。
代码框架


