单片机原理期末速成:4.5小时复习核心考点与编程实战
2026/9/7 7:33:36 网站建设 项目流程

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各位的含义(必须会算):

名称功能
D7GATE(T1)门控位=1时受INT1引脚控制,=0时不受
D6C/T#(T1)=1计数器模式,=0定时器模式
D5、D4M1、M0(T1)工作方式选择
D3GATE(T0)门控位=0时不受INT0控制
D2C/T#(T0)=1计数器模式,=0定时器模式
D1、D0M1、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
方式18位UART,可变波特率由T1溢出率决定
方式29位UART,固定波特率fosc/64或fosc/32
方式39位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; // 循环回来 } }

答题时必须写清楚的几个点:

  1. 延时函数的来源——12MHz晶振下,机器周期1μs,两层循环实现约1ms延时。考官不要求精确,但希望你解释清楚。
  2. 流水效果的核心是移位运算led << 1和补0x01
  3. 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); }

这题最关键的三件事:

  1. SCON=0x50:0101 0000,SM0=0、SM1=1(方式1)、REN=1(允许接收)。
  2. T1用方式2自动重装,初值0xFD对应9600波特率(11.0592MHz晶振)。
  3. 发送流程:把数据放入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 易错点清单:最容易扣分的五个细节

我总结了历年带人复习时大家错得最多的几个地方:

  1. TMOD不能按位操作。TMOD不支持位寻址,必须整体赋值。很多人写TMOD |= 0x01后还指望保留高四位不变,但标准51的TMOD通常不可位寻址。所以要先清相关位再置位,或一次性整体赋值。
  2. 中断服务函数里忘了重装初值。使用方式1时,每次中断进入后TH/TL不会自动重装(方式2才会),忘了重装会导致定时时间混乱。
  3. 串口方式1的波特率计算中SMOD的取值。SMOD是PCON的最高位,默认0。如果题目说SMOD=1,波特率翻倍,初值要重新算。
  4. P0口作I/O使用时必须加上拉电阻。判断题最爱出“P0口内部有上拉电阻,可直接用作输出”这种表述,显然错误。
  5. _crol_> >移位方向混淆。题目要求循环左移,写成右移,效果完全反了。

6.5 从历年真题中提炼出来的高频简答题

以下是我整理过历年试卷后归纳的简答题“题库”,出现的概率很高:

  • 单片机与微型计算机的区别是什么?(体积、集成度、控制功能、应用领域)
  • MCS-51单片机内部由哪些功能部件组成?
  • 什么是机器周期?12MHz晶振下的机器周期是多少?(1μs)
  • 简述中断响应的过程。
  • 定时器方式1和方式2有什么区别?各自适合什么场景?
  • 波特率是什么?为什么12MHz晶振常用,11.0592MHz晶振也常用?
  • 为什么P0口要接上拉电阻?
  • 动态扫描显示的原理是什么?
  • 什么是看门狗?作用是什么?

这些题与其背诵,不如理解着用自己的话写一遍。理解了背后的“为什么”,换个问法也能答出来。

7. 后记

4.5小时的速成复习,能覆盖的知识范围终究有限。如果只是想及格,靠上面这些内容足够;但如果想考90分以上,除了这些高频考点,还要把教材里的课后习题认真过一遍。尤其是实验题部分,很多老师喜欢从实验指导书里原封不动地抽题——毕竟,实验做没做过,一考便知。

最后再分享一个考试小技巧:拿到卷子先花5分钟把所有题目扫一遍,标记出自己会做的题。先拿稳基础分,再花时间啃难题。如果编程题一时没有思路,先在草稿纸上把要用的寄存器列出来,理清“用什么模块→配哪些寄存器→写什么顺序”。很多时候写着写着,思路就通了。

祝各位期末顺利。单片机这门课,真心不难,别被厚厚的教材吓住。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询