1. 期末复习的正确打开方式:为什么一门课能压缩成4.5小时
每年临近考试周,总能在各种群里看到类似的问题:单片机原理这门课怎么复习?翻开教材五六百页,从单片机的发展历史到内部结构,从汇编指令到接口技术,从A/D转换到串行通信,看一遍目录就能劝退一大半人。
但作为过来人,我必须说一句实话:这门课的考试难度,通常远低于它的教材厚度。单片机原理是典型的“重基础、重理解、重应用”课程,绝大数高校的期末试卷,命题范围极其固定。无非就是几个板块:单片机最小系统、存储器结构、并行I/O口、中断系统、定时器/计数器、串行通信、以及汇编或C语言编程题。把这几块吃透,90分真的不是玄学。
我在读本科的时候,这门课考了94分。后来带过几届学弟学妹复习,也帮人补考、专升本、考研复试前突击过这门课,攒了不少经验。这篇博文就是把整个复习过程梳理成一套可以“抄作业”的方案,按照一套完整的速成逻辑来拆解:哪里可以跳过、哪里必须死磕、哪些题是必考的送分题、哪些地方最容易扣分。
先说结论:4.5小时复习单片机原理,完全可行,但前提是方法要对。不是从头到尾听课,而是带着“考什么”的意识去精准打击。下面这套方案,我按时间块拆解过很多次,基本能覆盖85%以上的常规考点。
不过丑话说在前面:如果你所在学校用的是STC系列单片机,老师用的是汇编教学,而且你们平时的实验课要求焊板子、写汇编程序,那这套速成方案的侧重点要相应调整。我会在后面的章节里专门讲不同教材和不同单片机型号的应对策略。
2. 先把骨架搭起来:4.5小时复习的时间分配与整体规划
别一上来就抱着书啃。速成课的核心不是“学完”,而是“考过”,更进一步说是“高分考过”。所以第一步是搞清楚试卷的构成。
2.1 常规试卷的题型分布与分值逻辑
大多数学校《单片机原理及应用》期末试卷,基本逃不出下面这些题型(顺序可能变,分值可能调,但板块就这些):
| 题型 | 常见分值 | 考查核心 |
|---|---|---|
| 填空题 | 15~20分 | 概念、寄存器名称、引脚功能、寻址方式 |
| 选择题 | 10~20分 | 指令功能、寄存器配置、硬件结构细节 |
| 判断题 | 10分左右 | 易混淆概念辨析 |
| 简答题/问答题 | 15~20分 | 中断过程、定时器工作方式、串口通信过程 |
| 编程题/综合题 | 20~30分 | 定时器初始化、外部中断、流水灯、数码管显示等 |
看出来了吧?概念记忆类题目占了将近一半分数,编程题则是拉分关键。所以复习的核心逻辑应该是:先背概念拿基础分,再练编程拿高分。
2.2 4.5小时怎么切:三个小时块,边学边练
我平时给学弟学妹做考前突击,基本按下面这个节奏走:
- 第一个小时块(约1.5小时):硬件基础与存储器结构。包括单片机引脚功能、内部RAM分区、特殊功能寄存器(SFR)、最小系统电路。这部分概念密集,是填空选择的主力出题区。
- 第二个小时块(约1.5小时):中断系统、定时器/计数器、串行口。这是单片机原理的“三大核心机制”,简答题和编程题的重灾区,也是与具体应用结合最紧密的部分。
- 第三个小时块(约1.5小时):指令系统与编程实战。重点过寻址方式、常用指令、以及3~5道典型编程题(流水灯、定时器中断、数码管、按键检测)。编程题只要练熟几道母题,考场上变通起来就不慌。
这中间每45分钟休息5~10分钟,大脑需要缓冲,硬扛着反而效率低。
2.3 不同教材版本的应对策略
国内用的单片机教材虽然五花八门,但核心无外乎两个流派:
- 以MCS-51为蓝本的经典教材(如张毅刚版),特点是系统性极强,从硬件结构到指令系统一条线讲下来,考试也紧跟教材。这类课程重点复习教材例题,尤其是每章课后习题里的简单题和编程题。
- 以STC系列或国产增强型51为基础的教材(如部分职业院校教材),特点是强调实际应用,可能涉及ISP下载、片上ADC、PWM等增强功能。考试重点会更倾向于应用设计题。如果你的教材涉及STC15或STC8系列,要额外注意内部时钟配置和下载方式。
但无论哪个版本,“51内核的三大经典资源——中断、定时器、串口”永远是绝对的重点。因为这部分最能反映单片机“程序+硬件寄存器配置”协同工作的核心思想,出题人出题也最顺手。
3. 第一个小时块:内部结构、存储器映射与最小系统
这门课的第一大板块,说难也难,说简单也简单。很多同学被“CPU、RAM、ROM、SFR”这些概念绕晕,其实关键在于建立“地图思维”——把你想象成一个单片机内部的调度员,你得知道什么东西放在哪个地址、通过哪条路访问。
3.1 单片机的“体格子”:内部结构到底考什么
MCS-51单片机内部结构,期末常考的点如下:
- 8位CPU:包含运算器和控制器。注意“8位”的含义——数据总线是8位,一次处理一个字节。
- 128字节RAM(数据存储器):分工作寄存器区、位寻址区、堆栈区与数据缓冲区。
- 4K字节ROM(程序存储器):对于8051而言,片内4KB,外部最多可扩展64KB。STC系列则常见8KB、16KB甚至更大。
- 4个并行I/O口:P0、P1、P2、P3,各8位。注意P0口是开漏结构,必须外接上拉电阻——这个知识点几乎年年考。
- 2个16位定时器/计数器:T0和T1(增强型51可能有更多)。
- 1个全双工串行口:UART,4种工作方式。
- 中断系统:5个中断源(INT0、T0、INT1、T1、串口),两个优先级。
逐项理解不难,但要注意内部细节。比如内部RAM低128字节和高128字节的区别(增强型51有高128字节RAM,但经典8051只有低128字节)。比如工作寄存器区的四组R0~R7,分别位于00H~1FH。数据地址20H~2FH是位寻址区,每一位有个独立的位地址。这些概念是选择题和填空题的常客,考前必须过一遍。
3.2 存储器配置:片内、片外、程序、数据,四张地图搞清楚
存储器是单片机最核心的骨架,也是新手最容易混的地方。我每次复习都会在纸上画一张存储空间示意图,把程序存储器和数据存储器分开画。程序存储器用PSEN(程序存储允许)信号选通,数据存储器用RD/WR(读/写)信号选通。
关键点如下:
- 程序存储器(ROM)地址从0000H开始。复位后CPU从0000H取第一条指令。
- 0003H、000BH、0013H、001BH、0023H分别是INT0、T0、INT1、T1、串口中断的中断入口地址。这是填空和简答的必考点,尤其要记住每个中断入口地址间隔8个字节(0003H到000BH,000BH到0013H……)。
- 数据存储器(RAM)与程序存储器地址空间独立、重叠,靠控制信号区分,两者相互独立但地址编号可以相同。这也是为什么51单片机的寻址空间可以做到“程序64KB+数据64KB”。
- 片外数据存储器用MOVX指令访问,片内RAM用MOV指令访问。
还有一个高频考点是堆栈。51单片机的堆栈设置在片内RAM中,由堆栈指针SP管理。复位后SP=07H,指向工作寄存器区1组。压栈时SP先加1,再存入数据;出栈时先弹出数据,SP再减1。这个“先加后存、先弹后减”的细节,判断题爱出。
3.3 最少系统:请把晶振、复位电路和EA引脚背下来
最小系统电路这题,画图题或简答题里经常出现。所谓最小系统就是单片机能够正常工作的最低硬件配置:电源、晶振电路、复位电路、EA引脚处理(或ROM选择)。
- 晶振电路:在XTAL1和XTAL2之间接晶振,两个引脚各接一个20~30pF的电容到地。常见晶振频率是11.0592MHz或12MHz。前者常用于波特率发生器,因为分频后能得到整数波特率(9600、4800等);后者便于精确延时(机器周期=1μs)。这个对比简答题里出现过无数次。
- 复位电路:RST引脚接高电平保持至少2个机器周期即可复位。典型电路:VCC经10μF电容接RST,RST再经10kΩ电阻到GND。上电瞬间电容充电,RST短暂高电平,完成上电复位。这是分析题的一个经典图,很多人不知道电容电阻的取值逻辑,这里补一句:RC时间常数≈10μF×10kΩ=100ms,远大于2个机器周期,可靠复位。
- EA引脚:高电平时从片内ROM取指,低电平时从片外ROM取指。如果用的是片内含ROM的单片机,直接接VCC;如果外部扩展ROM,EA接地。这个引脚在填空题里常考:“EA=1时,CPU从片内程序存储器取指令”。
3.4 并行I/O口的电气特性:为什么P0必须上拉
四个并行I/O口的结构和电气特性,是选择题和简答题的“钉子户”,尤其是P0口。
- P0口:开漏输出结构,没有内部上拉电阻。作为输出口时必须外接上拉电阻(典型4.7kΩ~10kΩ),否则输出高电平时引脚呈高阻态,驱动能力也是四个口中独有的“准双向”概念。地址/数据分时复用总线时,P0输出低8位地址和数据。这题考法很多,比如“为什么P0口要加上拉电阻”“P0口作总线时为何不用上拉”。
- P1口:准双向I/O口,内部有上拉电阻,不需要外接。通常作为通用I/O使用。
- P2口:同样准双向,既可作通用I/O,也可在扩展外部存储器时输出高8位地址。
- P3口:带第二功能,每个引脚都有专门用途,比如P3.0/RXD、P3.1/TXD、P3.2/INT0、P3.3/INT1、P3.4/T0、P3.5/T1。第二功能表是填空题的“题库”,必须背熟。
还有一个高频简答题:“51单片机四个I/O口在使用上有什么区别?”答题思路:先说四个口都可用作准双向I/O口,然后分别说明各自特点——P0要加上拉且可作总线,P1专用I/O,P2可作高8位地址,P3有第二功能。条理清晰就能拿满分。
4. 第二个小时块:中断、定时器与串口三大核心机制
这三大机制是单片机课的“主菜”。不仅简答题爱考概念,编程题的核心也在这里。这一块值得花最多的精力和笔墨。
4.1 中断系统:5个中断源、2级优先级、一张过程图
中断系统是单片机最像“现实中的处理方式”的机制。出题人极其偏爱它的原因很简单:它展示了CPU如何合理分配资源,既体现硬件设计又体现软件调度思想。
五个中断源及入口地址的表格,必须背到条件反射:
| 中断源 | 入口地址 | 触发条件 | 中断标志 |
|---|---|---|---|
| INT0(外部中断0) | 0003H | 下降沿或低电平 | IE0 |
| T0(定时器0) | 000BH | 定时/计数溢出 | TF0 |
| INT1(外部中断1) | 0013H | 下降沿或低电平 | IE1 |
| T1(定时器1) | 001BH | 定时/计数溢出 | TF1 |
| 串口收发 | 0023H | 接收/发送完成 | RI/TI |
中断相关寄存器也是必考:IE(中断允许)、IP(中断优先级)、TCON(定时控制与中断标志)、SCON(串口控制,含RI/TI)。要记住EA是总开关,EA=0时所有中断都关了;EA=1时还需要对应中断源的“分开关”置1才使能。
中断响应的完整过程是简答题最经典的题目:CPU检测到中断请求,置位对应中断标志→查询中断优先级(高级优先,同级按自然优先级:INT0→T0→INT1→T1→串口)→响应中断(保护断点,即把当前PC值压栈)→把对应中断入口地址装入PC→跳转到中断服务程序执行→执行RETI,弹出断点→返回主程序继续执行。
答题时别忘了写“RETI指令除了恢复断点,还会清零中断优先级状态触发器,使CPU能响应同级或低级中断”。这个细节往往是答题的加分点。
编程题里,定时器中断是最常见的套路。后面实战部分我会带一道完整题目。
4.2 定时器/计数器:工作方式寄存器TMOD的每一位都要会算
定时器是51单片机必考的“硬核”知识点,无论是简答还是编程都绕不开。核心是TMOD和TCON两个寄存器。
TMOD各位的含义(必须会算):
| 位 | 名称 | 功能 |
|---|---|---|
| D7 | GATE(T1) | 门控位=1时受INT1引脚控制,=0时不受 |
| D6 | C/T#(T1) | =1计数器模式,=0定时器模式 |
| D5、D4 | M1、M0(T1) | 工作方式选择 |
| D3 | GATE(T0) | 门控位=0时不受INT0控制 |
| D2 | C/T#(T0) | =1计数器模式,=0定时器模式 |
| D1、D0 | M1、M0(T0) | 工作方式选择 |
四种工作方式中,**方式1(16位定时器,M1M0=01)和方式2(8位自动重装,M1M0=10)**最常考。方式0是13位,老古董,现在基本不考。方式3是把T0拆成两个独立8位定时器,偶尔填空出现。
方式1的初值计算套路(必考公式):
定时时间T = (2^16 - 初值) × 机器周期
机器周期 = 12 / 晶振频率(MHz) (单位μs)
所以初值 = 2^16 - T / 机器周期。
举个例子:晶振12MHz,机器周期=12/12MHz=1μs,要定时1ms:
初值 = 65536 - 1000/1 = 64536 = 0xFC18
所以TH0=0xFC,TL0=0x18。
方式2的初值计算套路:
方式2是8位自动重装,初值 = 2^8 - T / 机器周期。一个TL计满后自动把TH的值重装到TL,适合需要周期定时或做波特率发生器的情况。
TR0/TR1是TCON里的启动位,TR0=1启动T0,TR0=0停止。还有TF0/TF1是溢出标志位。编程框架一般是:设置TMOD→装初值(TH、TL)→开中断(如果使用中断方式)→启动TR0→等待中断或查询TF0。
4.3 串行口:SCON、波特率、四种工作方式
串口通信这块,学校通常不会考太深,但基本概念必须清楚。
SCON寄存器的SM0、SM1两位决定串口工作方式:
| 工作方式 | 功能 | 波特率 |
|---|---|---|
| 方式0 | 移位寄存器方式 | 固定为fosc/12 |
| 方式1 | 8位UART,可变波特率 | 由T1溢出率决定 |
| 方式2 | 9位UART,固定波特率 | fosc/64或fosc/32 |
| 方式3 | 9位UART,可变波特率 | 由T1溢出率决定 |
方式1最常考,波特率计算公式:
波特率 = (2^SMOD / 32) × T1溢出率
T1溢出率 = 定时器1的溢出频率。如果用方式2自动重装:T1溢出率 = 1 / [(256 - 初值) × 机器周期]。
所以波特率 = (2^SMOD / 32) × 1 / [(256 - 初值) × 机器周期]。
如果选用晶振11.0592MHz,SMOD=0,波特率9600,求TH1初值:
机器周期 = 12/11.0592MHz ≈ 1.085μs
9600 = (1/32) × 1 / [(256 - 初值) × 1.085×10^-6]
反解得:256 - 初值 ≈ 3,所以初值 = 253 = 0xFD。
这就是为什么教材里常见“串口通信时TH1=0xFD”的原因。这个公式推导过程如果能自己推一遍,比死记硬背强得多。
4.4 三大机制的相互关系:一张图理清
中断、定时器、串口不是三个孤立的知识点。定时器溢出会产生中断,串口收发完成也会产生中断,而定时器又为串口提供波特率时钟。考场上最怕出“综合性简答题”——比如“如何利用定时器1产生9600波特率并完成串口发送一个字符?”这种题目需要你把这三大机制串起来回答。
我的建议:在复习时画一张三层关系图。
- 底层是硬件模块:T0/T1、UART、INT0/INT1。
- 中间层是控制寄存器:TMOD、TCON、SCON、IE、IP。
- 顶层是中断源:TF0/TF1、RI/TI、IE0/IE1。
哪个模块产生哪个标志、哪个标志触发哪个中断、中断里干什么,一目了然。面试和复试时这张图也特别好用。
5. 第三个小时块:指令系统与编程实战母题
到了这个阶段,很多同学的感受是:概念都会背了,一写代码就懵。这是正常的,因为代码需要的是“组合运用”能力。这个板块我直接带大家过一遍指令系统的骨架,再拆解几道高频编程母题。
5.1 寻址方式:7种方式及其“一眼识别”
寻址方式这个考点,说是送分题也不为过,但每年都有人丢分。记住一个口诀:“立即数前加#,直接地址是数,寄存器前加@,位寻址看CY”。
- 立即寻址:MOV A, #30H,操作数在指令中直接给出,注意#号。
- 直接寻址:MOV A, 30H,操作数是片内RAM地址30H。
- 寄存器寻址:MOV A, R0,操作数在R0中。
- 寄存器间接寻址:MOV A, @R0,R0存的是地址,操作数在那个地址的内存中。只用R0和R1,且访问片外RAM时用MOVX A, @DPTR或MOVX A, @R0。
- 变址寻址:MOVC A, @A+DPTR,查表专用的指令,访问程序存储器。
- 相对寻址:SJMP rel,转移指令专用。
- 位寻址:MOV C, 20H,对位寻址区操作。
我自己的经验是:最考的就是直接寻址和寄存器间接寻址的区别,以及MOV和MOVX、MOVC三者谁能访问哪块存储空间。把这三条指令分清楚,存储器结构那章就没白学。
5.2 常用指令分类速记
不要求背完整套111条指令,但高频指令必须熟到看一眼就知道功能:
数据传送类:
- MOV A, #data / MOV A, Rn / MOV A, direct / MOV A, @Ri
- MOV Rn, A / MOV direct, A / MOV @Ri, A
- MOV DPTR, #data16(唯一一条16位立即数传送指令)
- MOVX A, @DPTR / MOVX @DPTR, A(片外RAM读写)
- MOVC A, @A+DPTR(查表)
- PUSH direct / POP direct(堆栈操作,注意只有直接寻址)
算术运算类:
- ADD A, Rn / ADDC A, Rn(带进位加)/ SUBB A, Rn(带借位减)
- INC Rn / DEC Rn
- MUL AB(乘,结果高8位在B,低8位在A)
- DIV AB(除,商在A,余数在B)
- DA A(十进制调整,BCD码加法后使用)
逻辑运算类:
- ANL A, Rn / ORL A, Rn / XRL A, Rn
- CLR A / CPL A
- RL A / RR A / RLC A / RRC A(循环移位)
- ANL direct, #data(常用于清某些位)
控制转移类:
- LJMP addr16 / SJMP rel / AJMP addr11 / JMP @A+DPTR
- JZ rel / JNZ rel(累加器为0/非0转移)
- CJNE A, #data, rel(比较不等转移)
- DJNZ Rn, rel(减1非0转移,循环神器)
- LCALL addr16 / RET / RETI
位操作类:
- CLR C / SETB C / CPL C
- ANL C, bit / ORL C, bit
- MOV C, bit / MOV bit, C
- JC rel / JNC rel(C=1/0转移)
- JB bit, rel / JNB bit, rel(位为1/0转移)
每周的复习群里总有人问:“汇编到底要不要背?”
如果你们学校考试考编程题但允许用C语言写,那汇编只需能读懂即可,重点放在C51的语法和寄存器操作上。但如果考试要求写汇编,或者给了汇编让你分析运行结果,那上面这些指令就是基本功,没有捷径。我的经验是:与其死记指令,不如把课后习题里的汇编题刷5~10道,指令自然就熟了。
5.3 C51与汇编的权衡:考试写哪种更好
现在的考试,更多学校允许甚至要求用C语言编程。如果你有选择权,我强烈建议用C51写编程题。原因很简单:
- C51代码模块化强,阅读起来清晰直观,不容易犯低级语法错。
- 操作寄存器无非是给特殊功能寄存器赋值,例如
TMOD = 0x01;、TH0 = 0xFC;。 - 中断服务函数用
interrupt关键字声明,轻松对应中断号。比如void timer0_isr() interrupt 1。 - 延时函数写起来方便,
for循环一写,不用抠汇编的DJNZ循环次数。
但C51也有两个坑:一是头文件要写对,经典51用#include <reg51.h>或#include <reg52.h>;二是位操作要用sbit定义。比如想操作P1.0:sbit LED = P1^0;,注意是^不是.,这个符号错误每年能扣掉一大批人。
5.4 编程母题一:LED流水灯,最简单的综合题
流水灯算是单片机界的“Hello World”,考试也喜欢拿它开头。
题目描述:用P1口控制8个LED,实现依次点亮、循环流水。
C51参考代码:
#include <reg51.h> void delay(unsigned int ms) { unsigned int i, j; for (i = ms; i > 0; i--) for (j = 114; j > 0; j--); // 12MHz下近似1ms } void main() { unsigned char led = 0xFE; // 1111 1110,LED0亮 while (1) { P1 = led; delay(200); led = (led << 1) | 0x01; // 左移,补1 if (led == 0xFF) led = 0xFE; // 循环回来 } }答题时必须写清楚的几个点:
- 延时函数的来源——12MHz晶振下,机器周期1μs,两层循环实现约1ms延时。考官不要求精确,但希望你解释清楚。
- 流水效果的核心是移位运算
led << 1和补0x01。 - P1口输出低电平点亮LED(共阳极接法)。
如果你想避免在考场上纠结if (led == 0xFF),还有一种写法是用循环左移函数_crol_,但那个需要引入intrins.h头文件,如果考场记忆模糊,老老实实用位运算最稳妥。
5.5 编程母题二:定时器中断实现1秒闪烁
这是定时器章节的必练母题,综合了TMOD配置、初值计算、中断处理和主循环逻辑。
题目描述:用T0方式1定时50ms,软件计数20次实现1秒,控制P1.0上的LED每秒翻转一次。
C51参考代码:
#include <reg51.h> sbit LED = P1^0; unsigned int count = 0; void timer0_init() { TMOD &= 0xF0; // 清空T0控制位 TMOD |= 0x01; // T0方式1,16位定时器 TH0 = 0x3C; // 50ms初值高8位 TL0 = 0xB0; // 50ms初值低8位 ET0 = 1; // 开T0中断 EA = 1; // 开总中断 TR0 = 1; // 启动T0 } void timer0_isr() interrupt 1 { TH0 = 0x3C; // 重装初值 TL0 = 0xB0; count++; if (count == 20) { // 20次50ms = 1s count = 0; LED = ~LED; } } void main() { timer0_init(); while (1) { // 主循环可以干别的,或空转 } }为什么TH0=0x3C、TL0=0xB0?
12MHz晶振,机器周期1μs,50ms=50000μs。初值 = 65536 - 50000 = 15536 = 0x3CB0,所以TH0=0x3C,TL0=0xB0。这个数字大家最好亲手算一遍,否则考场换一个时间就不会了。
答题思路扩展:如果题目说用查询方式,则主循环里不断检查TF0,等溢出时手动清零并重装初值。如果题目说用方式2自动重装,那只要给TH0、TL0装同一个初值,中断服务程序里就不用重装了。出题人经常在这些地方挖坑,读题时务必看清“方式几”。
5.6 编程母题三:按键控制与外部中断
“按键按一下,LED状态翻转”也是一道经典题。这个题有两个层次:简单版是轮询查询按键状态,进阶版是外部中断触发。
查询方式核心代码:
sbit KEY = P3^2; // 独立按键接P3.2 sbit LED = P1^0; void main() { while (1) { if (KEY == 0) { // 按下为低电平 delay(20); // 消抖 if (KEY == 0) { // 确认按下 LED = ~LED; while (KEY == 0); // 等待释放 } } } }中断方式的核心区别在于配置IT0=1(下降沿触发)、EX0=1、EA=1,然后写外部中断0服务函数:
void int0_isr() interrupt 0 { LED = ~LED; // 中断服务函数里直接翻转 }这个题的考点除了代码本身,还会问“为什么要消抖”——按键机械抖动一般持续5~10ms,软件延时20ms再检测可以有效避免误触发。外部中断方式下,如果按键抖动严重,同样可能一次按下触发多次中断,所以也要结合延时消抖或判断释放状态。
5.7 编程母题四:数码管动态扫描显示
数码管显示是很多学校大作业和考试的“压轴题”。原理不复杂,但代码容易乱。
题目描述:用P0口输出段码,P2口做位选,动态扫描显示“1234”。
C51参考代码:
#include <reg51.h> unsigned char code seg_code[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; // 共阳极数码管段码,0~F void delay(unsigned int ms) { unsigned int i, j; for (i = ms; i > 0; i--) for (j = 114; j > 0; j--); } void main() { unsigned char i; while (1) { for (i = 0; i < 4; i++) { P2 = ~(0x01 << i); // 位选第i位数码管(低电平选中) P0 = seg_code[i + 1]; // 段码显示对应数字 delay(5); // 短暂停留,视觉暂留 } } }说明:动态扫描的原理就是“人眼视觉暂留”。每个数码管点亮时间极短(几毫秒),但切换足够快(刷新率>50Hz),人眼看起来就是四个数字同时亮。考试如果出分析题,问“为什么动态扫描不闪烁”,答案就是“刷新频率高于人眼临界闪烁频率”。
考场注意:段码表的数值取决于你的数码管是共阳还是共阴。共阳极段码常见,但如果题目给的是共阴极数码管,段码就成了0x3F、0x06、0x5B……务必看清题目再写,不要直接默写。
5.8 编程母题五:串口发送字符串
“用串口向电脑发送一个字符串”在很多学校的考试里也是热门编程题。它综合了波特率计算和串口初始化。
C51参考代码:
#include <reg51.h> void uart_init() { SCON = 0x50; // 方式1,允许接收 TMOD &= 0x0F; TMOD |= 0x20; // T1方式2,8位自动重装 TH1 = 0xFD; // 11.0592MHz, 9600波特率 TL1 = 0xFD; TR1 = 1; // 启动T1 } void send_char(unsigned char c) { SBUF = c; while (TI == 0); // 等待发送完成 TI = 0; // 清零发送标志 } void send_string(unsigned char *s) { while (*s != '\0') { send_char(*s++); } } void main() { uart_init(); send_string("Hello MCU!\r\n"); while (1); }这题最关键的三件事:
- SCON=0x50:0101 0000,SM0=0、SM1=1(方式1)、REN=1(允许接收)。
- T1用方式2自动重装,初值0xFD对应9600波特率(11.0592MHz晶振)。
- 发送流程:把数据放入SBUF→等待TI置1→软件清零TI。
5.9 考场上的编程题应试技巧
编程题分值高,但阅卷是按点给分。几个拿分技巧:
- 先写头文件和主函数框架,就算中间寄存器配置写错,结构分能拿一半。
- 每条关键配置旁边加注释,表明你知道自己在干什么。注释不会加分,但能让阅卷老师快速判断你是否理解。
- 如果题目没指定晶振频率,默认按12MHz算。一旦题目给了11.0592MHz,多半和串口波特率有关,注意区分。
- 不要只在草稿纸上写代码,动手在答题纸上排版。每个函数单独成块,缩进对齐,这是提高印象分的零成本操作。
6. 其他必拿分考点与易错点复盘
前面五块已经把核心框架走完了。但这门课还有几个“边角料”知识点,单拎出来分值不高,但加起来也有10来分,丢了可惜。
6.1 复位、时钟与总线扩展概念题
- 复位方式:上电复位、按键复位、看门狗复位。RST引脚保持高电平2个机器周期以上,内部完成复位。复位后PC=0000H、SP=07H、P0~P3=FFH,中断系统禁用。这些初始值,填空题常考。
- ALE信号:ALE是地址锁存允许信号。访问外部存储器时,ALE下降沿把P0输出的低8位地址锁存到外部锁存器(如74LS373)中。这个与总线扩展相关,常以简答或选择形式出现。
- PSEN信号:外部程序存储器读选通信号。区分PSEN和RD:前者读ROM,后者读RAM。
6.2 扩充外部存储器:地址锁存器的逻辑
“画出8051扩展一片2764(8KB EPROM)的连接图”是很多学校的必考画图题。关键点:P0口复用地址/数据,必须用74LS373锁存低8位地址;P2口提供高8位地址(片选线常用P2.7等高位);控制信号用ALE锁存、PSEN读ROM。EA接地时CPU从外部ROM取指。
这部分如果平时实验课没做过的同学理解起来略吃力,我的建议是把教材上那张总接线图抄三遍,一边抄一边标注每个引脚连到哪,基本就能应对。
6.3 看门狗与低功耗(增强型STC单片机)
如果教材是STC系列,看门狗(WDT)和低功耗模式偶尔也会出题。STC的看门狗实际上是一个15位计数器,溢出时复位MCU。软件要周期性地“喂狗”清零,防止程序跑飞后系统死机。低功耗有IDLE和STOP两种模式。这些概念题分值不高,但属于“老师上课讲过、你不看就吃亏”的分数。
6.4 易错点清单:最容易扣分的五个细节
我总结了历年带人复习时大家错得最多的几个地方:
- TMOD不能按位操作。TMOD不支持位寻址,必须整体赋值。很多人写
TMOD |= 0x01后还指望保留高四位不变,但标准51的TMOD通常不可位寻址。所以要先清相关位再置位,或一次性整体赋值。 - 中断服务函数里忘了重装初值。使用方式1时,每次中断进入后TH/TL不会自动重装(方式2才会),忘了重装会导致定时时间混乱。
- 串口方式1的波特率计算中SMOD的取值。SMOD是PCON的最高位,默认0。如果题目说SMOD=1,波特率翻倍,初值要重新算。
- P0口作I/O使用时必须加上拉电阻。判断题最爱出“P0口内部有上拉电阻,可直接用作输出”这种表述,显然错误。
_crol_与> >移位方向混淆。题目要求循环左移,写成右移,效果完全反了。
6.5 从历年真题中提炼出来的高频简答题
以下是我整理过历年试卷后归纳的简答题“题库”,出现的概率很高:
- 单片机与微型计算机的区别是什么?(体积、集成度、控制功能、应用领域)
- MCS-51单片机内部由哪些功能部件组成?
- 什么是机器周期?12MHz晶振下的机器周期是多少?(1μs)
- 简述中断响应的过程。
- 定时器方式1和方式2有什么区别?各自适合什么场景?
- 波特率是什么?为什么12MHz晶振常用,11.0592MHz晶振也常用?
- 为什么P0口要接上拉电阻?
- 动态扫描显示的原理是什么?
- 什么是看门狗?作用是什么?
这些题与其背诵,不如理解着用自己的话写一遍。理解了背后的“为什么”,换个问法也能答出来。
7. 后记
4.5小时的速成复习,能覆盖的知识范围终究有限。如果只是想及格,靠上面这些内容足够;但如果想考90分以上,除了这些高频考点,还要把教材里的课后习题认真过一遍。尤其是实验题部分,很多老师喜欢从实验指导书里原封不动地抽题——毕竟,实验做没做过,一考便知。
最后再分享一个考试小技巧:拿到卷子先花5分钟把所有题目扫一遍,标记出自己会做的题。先拿稳基础分,再花时间啃难题。如果编程题一时没有思路,先在草稿纸上把要用的寄存器列出来,理清“用什么模块→配哪些寄存器→写什么顺序”。很多时候写着写着,思路就通了。
祝各位期末顺利。单片机这门课,真心不难,别被厚厚的教材吓住。