从”自动控制一盏灯”说起
设想一个需求:让一盏灯在天黑后自动亮起,或者让一个风扇在温度升高时自动转动。把这些”自动”翻译成工程语言,就是——需要一个能反复执行一小段程序、并通过引脚控制外部开关的装置。
可行的方案有好几种。用一堆比较器和定时器电路”硬连线”拼出行为,改需求就得改电路;用一台个人电脑当然也行,但为一盏灯配一台几千元的电脑明显不划算。嵌入式领域给出了一种折中:把”会执行程序的计算机”浓缩到一颗芯片上。这颗芯片就是单片机,英文叫 Microcontroller,缩写 MCU(Micro Controller Unit),也常被称作微控制器。
一颗芯片上的完整计算机
单片机不是”一块处理器”,而是一台集成的微型计算机:CPU、存储器、时钟和输入输出接口都被放进同一颗芯片里,配上最少的外围电路就能独立工作。“单片”两个字强调的就是这种”都在一片芯片上”的集成方式。
每个部分的分工大致如下:
- CPU:执行程序的核心,负责取指令、做算术、搬运数据。
- Flash(程序存储器):存放程序本身,断电不丢,上电后 CPU 从这里开始执行。
- RAM:运行时的”草稿纸”,存放变量和中间结果,断电即失。
- 时钟:给 CPU 提供节拍,所有操作都按这个节拍进行。
- GPIO 等外设:通过引脚与外部世界打交道,比如输出高/低电平来点亮 LED、读取按键状态。
和电脑有什么不同
电脑和单片机都能运行程序,但设计目标完全不同:
| 对比项 | 单片机(MCU) | 个人电脑(PC) |
|---|---|---|
| CPU | 简单,主频 MHz ~ 数百 MHz | 复杂,主频 GHz 级 |
| 内存 | 几 KB ~ 几 MB | GB 级 |
| 程序存储 | 内置 Flash | 硬盘 / SSD |
| 外设 | 集成 GPIO、定时器、串口等 | 靠主板和扩展卡 |
| 成本 | 几元到几十元 | 数千元 |
| 功耗 | 毫瓦级 | 数十到数百瓦 |
| 定位 | 专用控制 | 通用计算 |
一句话总结:电脑是高性能的通用平台,单片机是够用、便宜、专为控制设计的完整小计算机。它不是”小号的电脑”,而是为了用最少资源完成确定任务而生的控制核心——家电、遥控器、玩具、汽车电子里到处都有它。
程序怎么在芯片里跑起来
把程序写进芯片后,它究竟是怎么”跑”起来的?关键理解只有一句:程序最终是存在内存里的一串指令,CPU 用一个叫 PC(程序计数器)的指针,一条条把它们取出来执行。
为了让过程看得见,先认识四条最基础的指令:
| 指令 | 含义 |
|---|---|
LOAD R, 地址 | 把内存某个地址的值搬进寄存器 R |
ADD R1, R2 | 计算 R1 + R2,结果放回 R1 |
STORE R, 地址 | 把寄存器 R 的值写回内存某个地址 |
HALT | 停止执行 |
下面的实验把“计算 2 + 3”的任务交给你:从指令库里把 LOAD、ADD、STORE、HALT 按顺序组装进程序区,再单步执行,观察 PC 如何移动、指令如何进入指令寄存器、寄存器与内存如何变化。故意排错顺序也没关系,执行完会有判定告诉你哪里不对:
你来组装程序:CPU 到底怎么执行
任务:让芯片算出 2 + 3 并把结果写进内存 0x0A。先在指令库点指令把它装进程序区,再单步执行——每条指令都要经历取指、执行两个阶段。
0x08 = 2、0x09 = 3 已就绪,0x0A 是结果位置。程序区就是内存 0x00–0x04,装好的指令会逐条被取指、执行。
你的 5 条指令已按顺序写入 0x00–0x04。点击「单步」从取指开始,看它能否算出 2 + 3。
教学模型把每条指令简化为“取指 + 执行”两个阶段、各占一个时钟周期;真实 CPU 的阶段更多,不同指令耗时也不同。8 位寄存器上限为 255,本示例数值小,不会溢出。
注意到一个细节:每条指令都先经历取指——按 PC 从内存读出指令放进指令寄存器(IR),PC 自动指向下一条;再经历执行——由 CPU 完成搬运或计算。教学模型把这两个阶段各算一个时钟周期,所以”每秒能执行多少条指令”直接由主频决定:一个 12 MHz 的时钟意味着每秒 1200 万个周期,按每条指令 2 个周期估算,CPU 大约每秒执行 600 万条指令。这也是单片机”看起来不复杂却足够快”的底气。
程序怎么控制外面的世界
算出来的结果最终要影响现实世界,靠的是 GPIO(通用输入输出)引脚:程序向一个输出寄存器写入 0 或 1,对应引脚就输出低电平或高电平,从而驱动外部电路。下面是最经典的一段嵌入式 C 语言程序——让接在 P1.0 引脚上的 LED 闪烁:
#include <reg52.h> // 51 单片机寄存器定义(示意)sbit LED = P1 ^ 0; // 把 P1.0 引脚命名为 LED
void delay(unsigned int ms) { /* 简单的软件延时(教学示意,真实工程常用定时器) */}
void main() { while (1) { // 主循环:程序永不结束 LED = 0; // 输出低电平 → LED 亮 delay(500); // 保持 500 ms LED = 1; // 输出高电平 → LED 灭 delay(500); // 保持 500 ms }}注意这里用的是低电平点亮:LED 一端接引脚、另一端经限流电阻接电源正极,引脚输出低电平时电流流过 LED。限流电阻用来防止电流过大烧毁 LED。具体接线与引脚行为因开发板而异,动手时请以开发板原理图为准。
下面的实验先把控制权交给你——手动按按钮点亮、熄灭 LED,亲身体会“写寄存器 → 引脚输出电平”这条链路;再切到“程序运行”,看主循环如何自动重复你刚才的操作,拖动延时滑杆可以改变闪烁频率:
你来按灯,再看程序替你做
先用按钮亲手控制 PA0 点亮或熄灭 LED;再切换到“程序运行”,让主循环自动完成同样的事。
现在你就是在扮演"程序":每按一次,相当于执行一条写寄存器的指令。切到 "程序运行",让芯片自己循环执行这几行。
教学模型与真实单片机的差距
上面的实验为了讲清核心概念做了大量简化,真实工程中的单片机要复杂得多:
- 指令集:真实 MCU 有几十到上千条指令,还有比较、跳转、位操作、中断响应等;本页只有 4 条。
- 指令耗时:不同指令的时钟周期数不同,现代 MCU 还有流水线、缓存,不能简单按”2 周期/条”估算。
- GPIO:真实引脚有推挽/开漏、上下拉电阻、复用功能(同一引脚可作串口、定时器等),配置寄存器也不止一个。
- 工程流程:程序要经过编译 → 烧录才能进入 Flash,开发需要开发板、编译器、烧录器/调试器;调试时经常用断点、单步和串口打印。
- 存储器与功耗:真实芯片有 Flash/RAM/SRAM 分层、低功耗模式、看门狗等。
本页的教学 CPU 不是任何真实芯片的精确模型,但”取指 → 执行 → 循环”和”写寄存器控制外设”这两条主线,与所有真实单片机一致。
小结
回顾这条理解链路:
- 单片机 = 一颗芯片上的完整计算机:CPU + Flash + RAM + 时钟 + GPIO 外设。
- 程序 = 存放在内存里的一串指令;CPU 用 PC 逐条取指、执行。
- 主频决定执行速度,时钟是芯片的”节拍器”。
- 外设控制 = 程序写寄存器 → 引脚输出电平 → 驱动外部电路。
有了这些基础,下一篇可以继续学习怎么用单片机驱动电机,看看 PWM 调速和方向控制是怎么实现的。