NW' Blog
2026年7月11日 · 内容页面

单片机原理及应用复习资料

电信专业的单片机原理及应用复习资料。这是51单片机,所以只用背就好了。

第一章

📚 第一章:微机与嵌入式系统的发展及基础(纯概念入门)

1. 到底什么是“嵌入式系统”?(必考定义)

  • 官方定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
  • 人话翻译(重点背这一句)

    嵌入式系统 = 专门干某一件事的“小电脑”。 它不是用来打游戏、写Word的(那是PC),它是用来控制洗衣机、空调、手机、MP3播放器的。

  • 三大特点
    1. 专用性:只干特定的活(比如空调遥控器只负责调温)。
    2. 可裁剪:不需要的功能可以砍掉(比如低端遥控器不需要显示动画)。
    3. 严苛约束:省电、便宜、体积小。

2. 三个极易混淆的核心术语(必考辨析)

在教材里,微处理器、微型计算机、微型计算机系统 是三个层级递进的概念。想象成做菜:

  • 微处理器(CPU):就像核心食材(比如一块牛肉)。只有它什么都做不了,太生。
    • 教材定义:运算器+控制器集成在一个芯片上。
  • 微型计算机(裸机):就像备好的菜(牛肉+锅+灶台)。有了CPU,配上存储器(内存)I/O接口(输入输出通道),再加上总线(数据线) 把它们连起来。
    • 人话:这就是一块电路板,插上电它能跑,但你没法跟它交互,因为没键盘没屏幕。
  • 微型计算机系统(MCYS):就像端上桌的牛肉大餐。在微型计算机(电路板)的基础上,配上外部设备(键盘、鼠标、显示器)系统软件(Windows或Linux操作系统)
    • 人话:你现在面前能用的这台电脑

记忆口诀

CPU是核心,加上内存和外设叫裸机,裸机配上键盘鼠标和系统,才叫完整的计算机系统。


3. 计算机中的“数制”与“编码”(只记结论)

虽然第一章提了数制,但重点不是让你算,而是记住计算机内部到底存的是什么

  • 计算机内部一切算术运算均采用什么码?
    • 答案:补码。(判断题常客)
    • 原理:原码算减法会出错,反码有正负零的歧义,只有补码能让加减法统一处理。记住结论就行。
  • 正数和负数的补码怎么变的?
    • 正数:原码 = 反码 = 补码(一模一样)。
    • 负数:补码 = 反码 + 1(符号位1不动)。
    • 如果你实在分不清:记住负数的补码就是把数字取反再加1
  • BCD码(二十进制编码)是什么?
    • 人话:为了让你看得懂十进制,用4个二进制位表示1个十进制数字。
    • 例题:BCD码 0100 1001 代表十进制多少?
      • 拆开:0100 是 4,1001 是 9。
      • 答案:49。(把二进制当十进制读就行了)
  • 常用的ASCII码(背下这两个数值,选择和填空)
    • ‘A’ = 十六进制 41H = 十进制 65
    • ‘0’(数字零) = 十六进制 30H = 十进制 48
    • 推论:知道‘A’是65,那么‘B’就是66,‘C’就是67;知道‘0’是48,那么‘1’就是49。

4. 逻辑电路基础(看见名字能对上号就行)

  • 基本门电路
    • 与门(AND):必须两个都是1,结果才是1(相当于串联开关,都闭合灯才亮)。
    • 或门(OR):只要有一个是1,结果就是1。
    • 非门(NOT):输入1输出0,输入0输出1(颠倒黑白)。
    • 异或门(XOR):两个输入不一样时输出1,一样时输出0。

      记忆口诀:相同为0,相异为1。

  • 锁存器(74LS373)
    • 作用暂存数据
    • 实际意义:在单片机中,P0口既要传地址又要传数据,忙不过来。锁存器就像一个临时记事本,先把地址记下来,P0口再去传数据。
  • 三态缓冲器(74LS244)
    • 三种状态高电平、低电平、高阻(悬空/断开)
    • 作用:防止多个设备同时往总线上发数据造成“撞车”(总线冲突)。不需要它说话时,它就处于“高阻态”,相当于把线拔了。

🧠 第一章高频考点速记卡片(考前抱佛脚专用)

概念 关键词/必背结论
嵌入式系统定义 专用计算机系统(不是通用PC)
微处理器(CPU) 运算器 + 控制器
微型计算机(裸机) CPU + 内存 + I/O接口 + 总线
微机系统 裸机 + 外设 + 软件
计算机内部运算 统统用补码
‘A’的ASCII码 65(或41H)
‘0’的ASCII码 48(或30H)
BCD码 0100 1001 十进制 49
三态缓冲器三态 高电平、低电平、高阻态
锁存器作用 锁存地址(低8位)

💡 应试技巧

  1. 判断纠错题:只要说“微型计算机就是微处理器”,一定是错的。差着层级呢。
  2. 填空题:如果问“计算机内部用什么码进行运算?”,脑子里第一时间弹出来 补码
  3. 进制题:如果看到 xxxH,那表示这是十六进制数(H代表Hex)。

第一章的核心就是建立概念框架,你不需要理解CPU怎么造的,只需要知道它叫什么名字、是干什么的、里面有什么。 掌握上面这张表,第一章满分到手。

第二章

📘 第一部分:数制(你从小到大的数字游戏)

1. 三种进制长什么样?(认脸)

进制 后缀字母 数字组成 举例
二进制 B (Binary) 只有 0 和 1 1010B
十进制 D (Decimal) 0~9 255D(通常省略D)
十六进制 H (Hexadecimal) 09 和 **AF**(A=10, B=11, C=12, D=13, E=14, F=15) 3F H

人话:十六进制是为了方便看二进制而发明的。因为4个二进制位正好对应1位十六进制数(比如 1111B = F H)。


2. 进制转换 —— 三板斧(必考,拿满分)

考试只考三种转换,死磕下面三个套路,错不了。

① 二进制 → 十进制(按权展开法
  • 口诀:每一位数字 × 2的(位置编号)次方,再相加。
  • 位置编号:从小数点往左,从0开始编号(... 3, 2, 1, 0)。
  • 例题:将 1011B 转成十进制。
    • 展开:1×2³ + 0×2² + 1×2¹ + 1×2⁰
    • 计算:8 + 0 + 2 + 1 = 11
    • 搞定。

② 十进制 → 二进制(除2倒取余法
  • 口诀:十进制数连续除以2,记下每次的余数,直到商为0。最后把余数从下往上倒着写
  • 例题:将 13D 转成二进制。
    • 13 ÷ 2 = 6 余 1
    • 6 ÷ 2 = 3 余 0
    • 3 ÷ 2 = 1 余 1
    • 1 ÷ 2 = 0 余 1
    • 余数从下往上:1101B。验算:8+4+0+1=13。正确。
③ 二进制 ↔ 十六进制(8421分组法,最快)
  • 二进制转十六进制:从小数点开始,向左每4位一组,不够4位左边补0。每组直接换成对应的十六进制数字(0~F)。
  • 例题:将 1110101B 转成十六进制。
    • 从右往左分组:111 0101(左边缺1位,补0变成 0111 0101
    • 0111 = 7,0101 = 5。
    • 结果:75H
  • 十六进制转二进制:把每一位十六进制数写成4位二进制,拼起来。
  • 例题2F H 转二进制。2 = 0010,F(15) = 1111,拼起来 = 00101111B

3. BCD码(考概念,不考计算)

  • 全称:二-十进制编码。
  • 本质:用4位二进制强行表示1位十进制,不管进位。
  • 例题:十进制 58 的BCD码是多少?
    • 5 → 0101,8 → 1000,拼起来 = 01011000
  • 注意区分01011000 作为纯二进制等于 88,但作为BCD码它就是58。考试就考这种区分。

📗 第二部分:原码、反码、补码(计算机算数的秘密)

1. 为什么要发明这三种码?

  • 原码最直观(符号位0正1负),但算减法会出错(比如 1 + (-1) = 0,原码算出来是 -2)。
  • 反码解决了减法,但有“正负零”两个零(+0 和 -0)的尴尬。
  • 补码统一了零,加减法全用加法器搞定。所以 CPU内部只用补码

2. 怎么求补码?(死记规则)

  • 对于正数(符号位为0):

    原码 = 反码 = 补码(三者一模一样)。

  • 对于负数(符号位为1):

    反码 = 原码符号位不变,其他位取反(0变1,1变0)。
    补码 = 反码 + 1(末位加1)。

3. 手把手例题(以8位二进制为例)

  • 例题:求 +25-25 的补码。
    • +25:原码 = 00011001(符号位0,后面是25的二进制)。因为是正数,补码 = 00011001
    • -25
      • 先写原码:10011001(符号位1,后面是25)。
      • 求反码:符号位不变(1),其他位取反 → 11100110
      • 求补码:反码 + 1 → 11100110 + 1 = 11100111
      • 答案:11100111

必考填空:计算机内部一切算术运算均采用 补码 进行。


📙 第三部分:逻辑电路基础(玩开关)

1. 四大基本门电路(记住它们的“脾气”)

门名称 中文逻辑 简单记忆口诀 真值表(输入A B 输出Y)
与门(AND) 全1出1,有0出0 一票否决(都同意才过) 00→0,01→0,10→0,11→1
或门(OR) 有1出1,全0出0 一票通过(有人同意就过) 00→0,01→1,10→1,11→1
非门(NOT) 输入反过来 颠倒黑白 0→1,1→0
异或门(XOR) 相同出0,不同出1 找不同 00→0,01→1,10→1,11→0

考试技巧:给你一个逻辑表达式(如 Y = A AND (B OR C)),只要按照真值表一层层算就行,别慌。


📒 第四部分:锁存器与三态缓冲器(考功能配对)

这两个芯片在单片机扩展中经常出现,不考内部电路,只考作用是啥

  • 锁存器(代表芯片 74LS373)
    • 功能暂存数据/地址
    • 为什么用:51单片机的P0口既要传地址又要传数据,忙不过来。用锁存器先把低8位地址锁存住(记在小本本上),然后P0口再去传数据。
    • 考场关键词:见到 “锁存地址低8位”,选它。
  • 三态缓冲器(代表芯片 74LS244)
    • 功能控制信号是否通过,有 高电平、低电平、高阻态 三种状态。
    • 为什么用:防止多个设备同时往总线上发数据撞车。当芯片不工作时,输出高阻态(相当于把线断开)
    • 考场关键词:见到 “高阻态”“防止总线冲突”,选它。

🧠 第二章速记卡片(考前5分钟救命)

考点 必背结论/数值
十六进制字母对应值 A=10, B=11, C=12, D=13, E=14, F=15
二进制→十进制 按权展开(2的次方相加)
十进制→二进制 除2倒取余
十六进制→二进制 每位拆成4位二进制
正数补码 = 原码 = 反码
负数补码 反码 + 1(符号位不变)
计算机内部运算 全部采用补码
异或门特点 相同出0,不同出1
74LS373(锁存器) 锁存低8位地址
74LS244(三态缓冲) 高阻态,防止总线冲突

📝 典型例题(按考试原题风格)

  1. (填空) 3F H = ______ B。
    • :3 = 0011,F = 1111 → 00111111B
  1. (计算)110011B 转成十进制。
    • :1×2⁵ + 1×2⁴ + 0 + 0 + 1×2¹ + 1×2⁰ = 32+16+0+0+2+1 = 51D
  1. (判断) 负数的反码就是它的补码。(,反码加1才是补码)
  1. (选择) 单片机系统中,用于防止总线冲突的器件是( )。
    • A. 锁存器 B. 译码器 C. 三态缓冲器 D. 寄存器。
    • 答案:C

第二章的核心就是手算,拿起笔算两遍,考场绝对全对。

第三章

📘 第一部分:CPU内部结构(把大脑切开看)

教材里把CPU分成两大块:运算器控制器。你可以把CPU想象成一个厨房

1. 运算器(ALU核心区)—— 厨房里的"厨师手"

  • 职责:专门负责算数(加减乘除)和逻辑(与或非比较)。
  • 核心部件
    • ALU(算术逻辑单元):这就是厨师的手,所有计算都在这里捏合。
    • 累加器(A):这是一个临时小桌板。所有要算的数据必须先放到这个"桌板"上,算完的结果也先放这里。它是CPU里最忙的寄存器。
    • 暂存器:辅助小桌板,临时放一下中间结果。

2. 控制器(Control Unit)—— 厨房里的"大脑/指挥"

  • 职责:专门负责解读指令发号施令(告诉厨师手下一步干嘛)。
  • 核心部件
    • 指令寄存器(IR):把当前正在执行的这条指令"抓"进来放着。
    • 指令译码器(ID):翻译这条指令到底是什么意思(比如是"炒"还是"炖")。
    • 时序发生器:打节拍,告诉所有部件"现在该动一下了"。

人话必背结论
运算器 = 干活的手(执行)
控制器 = 发令的嘴(控制)


📗 第二部分:三总线结构(CPU的"高速公路网")

CPU要跟内存(ROM/RAM)和外设打交道,数据怎么走?全靠总线。你可以把CPU想象成一座大仓库(CPU),外面有三条路:

1. 地址总线(AB,Address Bus)—— 快递单/门牌号

  • 方向单向,只能由CPU发出去。
  • 干嘛用:指定"我要去哪个房间拿东西"。比如CPU喊一句"把地址2000H的内容给我"。
  • 宽度决定寻址范围:80C51有16根地址线,所以最大能找 2^16 = 65536 个房间,也就是 64KB

2. 数据总线(DB,Data Bus)—— 快递员手里的货

  • 方向双向,既能从CPU拿出去,也能从外面拿进来。
  • 干嘛用:真正传输数据内容。
  • 宽度:80C51有8根,所以一次只能搬一个字节(8位)。

3. 控制总线(CB,Control Bus)—— 红绿灯/对讲机

  • 方向部分双向(有的线是CPU发出,有的线是外设反馈给CPU)。
  • 干嘛用:发送控制信号(比如"读/写"),以及接收外设的应答(比如"我准备好了")。
  • 典型信号RD(读)、WR(写)、ALE(地址锁存允许)。

必考判断纠错点

题目说"数据总线是单向的"—— !(数据总线是双向的)
题目说"地址总线是双向的"—— !(地址总线是单向的,由CPU发出)


📙 第三部分:CPU的工作节拍(三大周期)

CPU执行一条指令,不是一瞬间完成的,而是分步骤走。就像你在学校上一节课的节奏:

1. 时钟周期(振荡周期)—— 心脏跳一下

  • 定义:晶振振荡一次的时间。这是CPU最最最基础的时间单位。
  • 计算:如果晶振是 12MHz,那么时钟周期 = 1 / 12MHz = 1/12 微秒 (μs)
  • 人话:这就是CPU的"一次心跳"。

2. 机器周期—— 完成一个基本动作(如读一次数据)

  • 定义:CPU完成一个独立操作(比如从内存读一个字节)所需要的时间。
  • 在51单片机中1个机器周期 = 12个时钟周期
  • 重大结论:如果晶振是12MHz,则 1个机器周期 = 1微秒 (μs)。(这个数值极其重要,贯穿全书计算)

3. 指令周期—— 完成一条完整的指令

  • 定义:CPU把一条指令(比如 MOV A, #20H)从头到尾执行完所用的时间。
  • 关系:一条指令周期由 1个到多个机器周期 组成。

大小排序(必考填空/选择)

时钟周期 < 机器周期 < 指令周期

记忆口诀:心(时钟)跳一下,做个动作(机器),完成一件事(指令)。


📒 第四部分:程序是怎么跑起来的?(简单串一下)

虽然教材没单独列标题,但理解这个对后面中断、指令系统极有帮助:

  1. 取指:CPU通过地址总线告诉内存"把地址XX的指令给我"。
  2. 译码:控制器拿到指令,翻译成电路能懂的信号。
  3. 执行:运算器动手算,或者通过数据总线读写数据。
  4. 跳转:算完了,PC(程序计数器)自动加1,指向下一条指令地址。

你看,数据总线来回搬数据,地址总线单向指路,控制总线在旁边喊"开始搬!停!",三者配合天衣无缝。


🧠 第三章速记卡片(考前5分钟救命)

考点 必背结论/数值
CPU两大核心部件 运算器(ALU) + 控制器
累加器(A)作用 数据的中转站(最忙的寄存器)
地址总线(AB)方向 单向(CPU输出)
数据总线(DB)方向 双向
控制总线(CB)方向 部分双向
16位地址线寻址范围 64KB(2的16次方)
时钟周期 晶振周期(最小单位)
机器周期(12MHz下) 12个时钟周期 = 1μs(必记数值!)
三大周期大小排序 时钟周期 < 机器周期 < 指令周期

📝 典型例题(按考试原题风格)

  1. (填空) 80C51单片机外部地址总线为16位,其最大可直接寻址的外部存储器空间为 ______ KB。
    • :2^16 = 65536 字节 = 64KB
  1. (判断) CPU中的控制器主要完成算术逻辑运算。( ,控制器负责译码和控制,运算器才负责算术逻辑运算。)
  1. (选择) 在下列总线中,属于双向传输的是( )。
    • A. 地址总线 B. 数据总线 C. 控制总线 D. 电源总线
    • 答案:B
  1. (简答/计算) 若80C51单片机晶振频率为6MHz,则一个机器周期是多少微秒?
    • :机器周期 = 12 × 时钟周期 = 12 × (1/6MHz) = 12 × (1/6) μs = 2 μs。
    • 结论:晶振越慢,机器周期越长。
  1. (排序题) 请将"指令周期、时钟周期、机器周期"按时间从短到长排列。
    • 答案:时钟周期 < 机器周期 < 指令周期。

第三章搞定了。关键就是分清三个总线的方向,记住机器周期=1μs(12MHz下)。这节内容直接为第5章(80C51结构)打地基。

第四章

📘 第一部分:到底什么是"中断"?(请死磕这个生活类比)

想象一下你在家写数学作业(这是CPU正在执行的主程序):

  1. 突然门铃响了(这是中断请求——外部来了紧急事件)。
  2. 合上作业本,在合上的那一页夹一支笔做记号(这是中断保护/压栈——保存当前做到哪了)。
  3. 跑去开门,接过快递(这是中断处理——执行服务程序)。
  4. 快递员走了,你回到书桌前,翻开刚才夹笔的那一页,继续往下写(这是中断返回/出栈——恢复现场继续执行)。

官方定义翻译
中断 = CPU在执行当前程序时,被内部或外部的紧急事件打断,转去执行对应的服务程序,处理完后再自动回到原来的断点继续执行。


📗 第二部分:中断处理五步走(必考排序填空)

教材明确给出了五个步骤,顺序绝对不能错,考试就考这个流程:

步骤序号 名称 人话翻译 关键动作
1 中断请求 外设喊了一嗓子:"CPU大哥,我有急事!" 硬件自动把请求标志位(如IE0)置1
2 中断响应 CPU听到了,并且答应:"行,你等着,我马上来。" CPU在当前指令执行完后,才会响应(不会半截停)
3 中断保护 CPU把自己的"草稿纸"(关键寄存器数据)存到堆栈里。 执行压栈(PUSH) 操作,保存断点地址
4 中断处理 CPU跑去执行那个紧急任务的代码(服务函数)。 程序员写的中断服务函数体
5 中断返回 干完了,从堆栈里把草稿纸拿出来,回到断点继续写作业。 执行出栈(POP)RETI 指令

考点提示

  • 填空题最爱考:中断处理过程的正确顺序是 请求 → 响应 → 保护 → 处理 → 返回
  • 判断题陷阱:"CPU一接到中断请求就立刻响应" —— !必须等当前指令执行完才响应。

📙 第三部分:CPU凭什么"答应"你?(中断响应三条件)

不是随便谁喊一声CPU都会停下手里的活。必须三个条件同时满足,中断才会被响应。像极了进公司大楼需要三把钥匙

条件 人话 教材术语
第一把钥匙 你这个紧急事件确实发生了(确实有人在按门铃)。 中断源有请求(对应的中断标志位为1)
第二把钥匙 大楼总电闸和你这层楼的分电闸都合上了。 总中断允许位(EA)和分项允许位(EX/ET/ES)都开启
第三把钥匙 没有比你更高级的领导正在讲话(你不能插嘴)。 无更高优先级的中断正在执行

必考填空/判断:中断响应的三个必要条件是 、____。(答案:有请求、允许位开启、无高优先级在执行)


📒 第四部分:中断优先级与嵌套(高级打断低级)

如果两个紧急事件同时发生怎么办?或者你正在处理一个紧急事件,又来了一个更紧急的怎么办?这就涉及到优先级

1. 自然优先级(硬件默认的排位)

80C51有5个中断源,系统默认给他们排了座次(从高到低):

INT0(外部中断0) > T0(定时器0) > INT1(外部中断1) > T1(定时器1) > 串口中断(RI/TI)

这个顺序是硬编码的,改不了。你只需要记住:INT0 是最尊贵的,串口最卑微

2. 可编程优先级(软件可以改)

  • 通过寄存器IP,可以把某一个中断设为高优先级低优先级
  • 中断嵌套规则
    • 高优先级可以打断低优先级(正在处理低优先级时,来了高优先级,CPU立刻跳过去处理高优先级,处理完再回来继续低优先级)。
    • 同级不能互相打断(正在处理INT0时,又来了一个INT0或T0,CPU不理睬,等当前处理完再说)。

人话:领导(高优先级)讲话时,小兵(低优先级)得闭嘴;但大领导(高优先级)来了,小领导(低优先级)得马上让位。


🧠 第四章速记卡片(考前5分钟救命)

考点 必背结论
中断定义 暂停当前程序,转去处理紧急事件,处理完返回
中断处理五步顺序 请求 → 响应 → 保护(压栈)→ 处理 → 返回(出栈)
响应三条件 有请求 + 允许位开启 + 无更高优先级在执行
响应时机 当前指令执行完后(不是立即)
中断保护动作 压栈(保存断点和现场)
中断返回动作 出栈 + RETI指令
80C51自然优先级最高 INT0(外部中断0)
中断嵌套条件 只有高优先级打断低优先级,同级不行

📝 典型例题(按考试原题风格)

  1. (填空) 中断处理过程中,保护断点和现场是通过 ______ 操作完成的。
    • 答案:压栈(PUSH)
  1. (判断) CPU在任何一个时钟周期结束时都会去查询中断请求。( ,是在每条指令执行完后去查询,不是每个时钟周期。)
  1. (选择) 关于中断优先级,下列说法正确的是( )。
    • A. 高优先级中断可以被低优先级中断打断
    • B. 同级中断可以互相嵌套
    • C. 低优先级中断正在执行时,高优先级中断可以打断它
    • D. 中断优先级只能通过硬件固定,不可改变
    • 答案:C。A反了,B同级不行,D软件可改(IP寄存器)。
  1. (简答) 简述CPU响应中断的必要条件。
    • :① 有中断源发出有效请求;② 该中断总允许位和对应分允许位均开启(EA=1且对应EX/ET/ES=1);③ 当前没有正在执行的更高优先级的中断服务程序。
  1. (排序题) 将以下中断处理过程按正确顺序排列:A.中断返回 B.中断响应 C.中断保护 D.中断处理 E.中断请求
    • 答案:E → B → C → D → A

第四章搞定。核心就三句话:中断就是插队处理紧急事;五步流程顺序不能错;响应要有三个条件同时满足。

中断基础概念是后面第9章(外设单元)的"地基"。地基扎稳了,定时器、串口的代码你一看就懂。

第五章

📘 第一部分:80C51总体架构(一张图看懂"五脏俱全")

教材说80C51集成了以下部件。你不用背全部,但要知道它"麻雀虽小五脏俱全":

部件名称 规格 人话翻译
8位CPU 8位数据总线 一次只能处理一个字节(8位)
片内ROM 4KB 出厂时固化的程序存储空间(掉电不丢)
片内RAM 128B 运行时的临时草稿纸(掉电全丢)
定时器/计数器 2个16位(T0和T1) 两个闹钟/计数器
串行口 1个全双工 一根线发、一根线收,同时进行
中断源 5个 5种紧急插队事件
并行I/O口 4个8位(P0~P3) 32根引脚,用于输入输出

必背结论:80C51 = 8位CPU + 4KB ROM + 128B RAM + 2个定时器 + 1个串口 + 5个中断源 + 4个I/O口


📗 第二部分:核心寄存器 —— PC、SFR、SP(三个极易混淆的家伙)

1. PC(程序计数器)—— 地址指针

  • 本质:一个独立的16位计数器,不属于特殊功能寄存器(SFR),没有字节地址,无法通过指令访问
  • 作用:始终指向下一条要执行的指令的地址。每取完一条指令,PC自动加1。
  • 寻址范围:16位 → 0000H ~ FFFFH,一共 64KB
  • 复位值:单片机通电后,PC = 0000H(从最开头执行程序)。

必考判断陷阱
"PC属于特殊功能寄存器(SFR)" —— !PC在CPU内部,没有地址,无法寻址访问。
"PC复位后值为0000H" ——

2. 特殊功能寄存器(SFR)—— 控制面板

  • 本质:一堆有明确字节地址的寄存器(80H~FFH),专门用来控制单片机各个外设。
  • 常见SFR:P0~P3(端口)、SP(堆栈指针)、PSW(程序状态字)、TMOD、TCON、IE、IP、SCON等。
  • 与PC的区别:PC无地址,SFR有地址。PC不是SFR

3. SP(堆栈指针)—— 书包的拉链

  • 本质:指向堆栈顶部位置的一个8位寄存器(属于SFR)。
  • 复位初值07H
  • 堆栈生长方向向上生长(地址越来越大)。
  • 入栈(PUSH)操作:SP先加1,再把数据压入SP指向的新地址。
  • 出栈(POP)操作:先把数据弹出,再把SP减1。

必考填空:复位后SP = 07H。入栈时SP先加1再存数据。


📙 第三部分:片内RAM低128字节分区(重中之重)

80C51片内RAM地址范围 00H ~ 7FH(低128字节),分为三个功能区域。这是填空题重灾区

地址范围 区域名称 大小 特性 用途
00H ~ 1FH 工作寄存器区 32字节 分为4组(Bank03),每组8个(R0R7) 临时变量、快速运算。当前使用哪一组由PSW中的RS1/RS0位决定
20H ~ 2FH 位寻址区 16字节 既可字节寻址,也可位寻址(128个位,位地址00H~7FH) 存放状态标志、位变量
30H ~ 7FH 通用RAM区 80字节 只能字节寻址 用户数据缓冲区、堆栈区(SP默认从这里开始往上长)

关键考点

  • 工作寄存器组切换:PSW的RS1和RS0两位,00→Bank0,01→Bank1,10→Bank2,11→Bank3。复位后默认Bank0。
  • 位寻址区:地址20H的第一个位(D0)叫位地址00H,2FH的最后一个位(D7)叫位地址7FH。20H单元的D0位 = 位地址00H,这个对应关系填空会考。
  • 堆栈实际位置:复位后SP=07H,第一次入栈会先加到08H,所以堆栈实际从08H开始。但为了安全,常把SP改到30H以后(因为08H属于工作寄存器区,容易被覆盖)。

📒 第四部分:I/O端口特性(P0~P3大比拼)

四个8位并行I/O口,看似一样,实则天差地别。选择题必考

端口 内部上拉电阻 准双向口? 特殊之处 驱动能力(LSTTL门)
P0 是(漏极开路) 作为通用I/O时必须外接上拉电阻;作为地址/数据总线时是标准双向口 最强,驱动8个门
P1 最普通,无特殊功能 弱,驱动4个门
P2 访问外部存储器时作高8位地址总线 弱,驱动4个门
P3 功能复用,每个引脚都有第二功能(如RXD、TXD、INT0、INT1、T0、T1、WR、RD) 弱,驱动4个门

重点解释"准双向口":

  • 定义:作为输入时,必须先向该口写"1"(拉高内部MOS管截止),才能正确读取外部引脚电平。如果之前输出了低电平,直接读引脚会读错。
  • P0的特殊性
    • 当P0作为通用I/O时,内部无上拉电阻,输出高电平必须外接上拉电阻(比如10kΩ)。
    • 当P0用作地址/数据复用总线时(访问外部存储器),内部自动切换为标准双向口,无需外接上拉。

必背结论

  • 驱动能力排序:P0 > P1 = P2 = P3(P0最强)。
  • 只有P0是漏极开路,必须接上拉电阻。
  • P3口每个引脚都有第二功能,要用前先配置。

P3口第二功能表(背前两个就行)

引脚 第二功能 作用
P3.0 RXD 串行接收
P3.1 TXD 串行发送
P3.2 INT0 外部中断0输入
P3.3 INT1 外部中断1输入
P3.4 T0 定时器0外部计数输入
P3.5 T1 定时器1外部计数输入
P3.6 WR 外部RAM写信号
P3.7 RD 外部RAM读信号

📕 第五部分:时序与时钟(算时间的核心)

晶振频率决定了单片机的"心跳速度"。12MHz是经典值,记住它的一切

关键时间单位:

术语 定义 12MHz下的值 6MHz下的值
时钟周期(振荡周期) 晶振振荡一次的时间 1/12 μs = 0.0833μs 1/6 μs ≈ 0.167μs
机器周期 CPU完成一个基本动作(如读一次数据) 12个时钟周期 = 1μs 12个时钟周期 = 2μs
指令周期 执行一条指令所需的时间 1~4个机器周期 1~4个机器周期

必背结论

80C51中,1个机器周期 = 12个时钟周期。这是铁律,不是1个也不是6个。
若晶振为12MHz,则 1个机器周期 = 1微秒(μs)。这个数值是全书定时器计算的基石。


📗 第六部分:复位电路与最小系统(硬件入门)

1. 复位后的初始状态(填空选择必考)

寄存器/端口 复位值
PC 0000H(从0地址开始执行)
SP 07H
P0 ~ P3 FFH(全部口输出高电平)
其他SFR(ACC、PSW、B等) 大多清零(00H)
EA引脚(8051) 内部ROM使能,接高电平

考点:复位后P0~P3全部为 FFH(高电平),不是00H。

2. 最小系统电路(三件套)

要让80C51跑起来,至少需要:

① 时钟电路

  • XTAL1和XTAL2接12MHz晶振。
  • 晶振两端各接一个30pF的瓷片电容到地。
  • 电容作用
    • 提供相移和负阻,使晶振稳定起振
    • 滤波,抑制高频杂波。
  • 选值原因:常用10pF~30pF。太大了起振慢甚至不起振,太小了频率漂移。30pF是经典折中。

② 复位电路

  • 高电平复位:VCC接10μF电解电容正极,电容负极接RST引脚,同时RST接10kΩ下拉电阻到地。
  • 上电瞬间RST得到高电平,电容充电完毕后变为低电平。
  • 要求:RST高电平持续时间 ≥ 2个机器周期(12MHz下 = 2μs)。
  • 计算:τ = R × C = 10kΩ × 10μF = 100ms >> 2μs,可靠复位。

③ EA引脚(外部存储器允许)

  • 8051(有片内ROM):EA接 VCC(高电平),从片内4KB ROM开始执行。
  • 8031(无片内ROM):EA接 GND(低电平),强制从外部ROM执行。

判断陷阱:"8031的EA引脚应接高电平" —— !8031无片内ROM,必须接低电平。


📘 第七部分:低功耗工作方式(PCON寄存器)

80C51有2种低功耗模式,通过**PCON(电源控制寄存器,字节地址87H)**控制:

模式 触发位 进入条件 退出方式
待机(空闲)模式 IDL = 1(PCON.0) 执行指令使IDL=1 中断复位
掉电模式 PD = 1(PCON.1) 执行指令使PD=1 硬件复位(只能复位退出)

额外考点:PCON的最高位SMOD是串口波特率倍增位(1→波特率加倍)。复位后PCON = 00H(正常工作,既不休眠也不掉电)。

注意:若IDL和PD同时为1,则进入掉电模式(PD优先)。


📙 第五~七章综合例题(必考计算与设计)

例题1:LED限流电阻计算

题干:VCC=5V,LED正向压降1.8V,工作电流8mA,接P2口输出高电平点亮。求限流电阻。

R = (VCC - V_LED) / I_LED = (5 - 1.8) / 0.008 = 3.2 / 0.008 = 400Ω
选标称值 390Ω 或 470Ω 均可。

例题2:复位时间验证

题干:复位电路R=10kΩ,C=10μF,晶振12MHz。问能否可靠复位?

  • 机器周期 = 1μs,需要高电平 ≥ 2μs。
  • τ = RC = 10×10³ × 10×10⁻⁶ = 0.1s = 100ms
  • 100ms >> 2μs,能可靠复位

例题3:判断对错

"80C51复位后,P0口输出全为低电平。" —— ,复位后P0~P3均为 FFH(全高电平)


🧠 第五章速记卡片(考前10分钟救命)

考点 必背结论
80C51组成 CPU + 4KB ROM + 128B RAM + 2×定时器 + 串口 + 5中断 + 4×I/O
PC(程序计数器) 16位,非SFR,无地址,复位=0000H,寻址64KB
SFR(特殊功能寄存器) 字节地址80H~FFH,PC不属于SFR
SP(堆栈指针) 复位=07H,入栈先加1再存
片内RAM低128B分区 001F(工作寄存器),202F(位寻址),30~7F(通用RAM)
P0口特性 无上拉电阻,准双向/漏极开路,做I/O需外接上拉,驱动最强(8个门)
P1~P3口特性 有上拉电阻,准双向,驱动弱(4个门)
P3口第二功能 P3.0=RXD,P3.1=TXD,P3.2=INT0,P3.3=INT1,P3.4=T0,P3.5=T1
1个机器周期 = 12个时钟周期(12MHz下=1μs)
复位后P0~P3 全部为 FFH
EA引脚(8051) 接高电平(VCC),从片内ROM执行
EA引脚(8031) 接低电平(GND),从片外ROM执行
晶振匹配电容 通常选 30pF(10~30pF范围)
低功耗退出方式 待机(中断或复位),掉电(仅复位)
PCON寄存器 地址87H,SMOD(波特率倍增),IDL(待机),PD(掉电)

第五章就这么多了。重点:区分PC和SFR,记住SP复位值07H,牢记P0的特殊性(无上拉/漏极开路),机器周期=12个时钟周期=1μs(12MHz下),复位后P0~P3=FFH。

这章内容吃透了,后面第六章(指令系统)、第八章(C51语言)、第九章(外设)就是顺水推舟。

第六、七、八章

收到!第六、七、八章是**从"硬件认识"转向"软件编程"**的关键转折点。第六章教你怎么给CPU下指令(汇编),第七章教你怎么组织这些指令(程序设计),第八章教你怎么用C语言偷懒(C51)。

复习定位:第六章考寻址方式判断指令功能(选择/填空);第七章考伪指令配对(选择);第八章考C51关键字含义(选择/填空)。这三章是后面写代码的基础,不求全背,但求"看见认识"。


📘 第六章:80C51的指令系统(CPU的"单词本")

汇编指令就是CPU能听懂的"单词"。每条指令由两部分组成:

操作码 + 操作数
人话干什么 + 对谁干。比如"吃 苹果"——"吃"是操作码,"苹果"是操作数。

一、访问不同存储器的三大指令(必考辨析)

80C51有三块不同的存储区域:片内RAM、片外RAM、程序ROM(只读)。访问它们要用不同的"钥匙"

指令 全称含义 访问对象 使用场景
MOV Move 片内RAM(含SFR) 操作内部变量、寄存器
MOVX Move External 片外数据存储器(外部RAM) 访问扩展的外部内存芯片
MOVC Move Code 程序存储器(ROM) 查表、读取固定常数

记忆口诀

MOV住家里(片内),MOVX出远门(片外RAM),MOVC查字典(ROM只读)。

必考判断题

"MOVC指令用于访问外部数据存储器" —— !MOVC访问的是程序存储器ROM。
"MOVX指令可以访问片内RAM" —— !MOVX只能访问片外RAM。


二、七种寻址方式(操作数"躲猫猫")

寻址方式就是CPU找操作数的方式。操作数到底藏在哪?有七种藏法:

序号 寻址方式 特征标志 示例 人话翻译
1 立即寻址 数字前有 # MOV A, #20H 数字直接写在指令里,像"给我20块"
2 直接寻址 直接写数字(无#) MOV A, 30H 去地址30H这个房间拿东西
3 寄存器寻址 寄存器名(R0~R7, A, B等) MOV A, R0 去R0这个"抽屉"里拿东西
4 寄存器间接寻址 寄存器名前加 @ MOV A, @R0 R0里存的是房间号,去那个房间拿东西
5 基址+变址间接寻址 @A+DPTR 或 @A+PC MOVC A, @A+DPTR 基地址+偏移量,算出房间号再去拿(常用于查表)
6 相对寻址 跳转指令(SJMP、DJNZ等) SJMP 05H 以当前PC为基准,往前或往后跳几步
7 位寻址 位操作(SETB、CLR等) SETB P1.0 只操作某一位(0或1),不碰其他位

易混淆点(重中之重)

指令 MOV A, @R0 中,R0存放的是操作数的物理地址(房间号),而不是操作数本身。
这是"间接寻址"和"寄存器寻址"的本质区别。

考场判断技巧

  • 看见 # → 立即寻址。
  • 看见 @ → 间接寻址。
  • 看见 Rn(R0~R7) 且没有@ → 寄存器寻址。
  • 看见 SETB/CLR 操作位 → 位寻址。

三、核心指令功能速记表(只记最常考的)

指令 功能 影响CY(进位标志)? 人话
ADD A, #data 累加器A + 立即数 → A 影响 加法
SUBB A, #data A - 立即数 - CY → A 影响 带借位减法
INC A A = A + 1 不影响 自增1
DEC A A = A - 1 不影响 自减1
MUL AB A × B → 低8位在A,高8位在B 影响(CY=0,OV看结果) 乘法
RL A A循环左移1位(D7移到D0,不经过CY 不影响 循环左移
RR A A循环右移1位(D0移到D7,不经过CY) 不影响 循环右移
DJNZ Rn, rel Rn = Rn - 1;若Rn≠0则跳转 不影响 减1不为零则跳转(循环神器)

必考结论

INC(自增)不影响CY,而 ADD(加法)和 SUBB(减法)影响CY
RL A(循环左移)不经过CY,而 RLC A(带进位循环左移) 才经过CY。书上RL A就是不带CY转的。


四、汇编程序执行分析(完整例题手把手)

题干(教材Page 8原题):

MAIN: MOV R0, #40H    ; R0 = 40H
              MOV @R0, #08H   ; 把08H存入地址40H
              MOV A, @R0      ; 把地址40H的内容(08H)读入A
              MOV B, #05H     ; B = 05H
              MUL AB          ; A × B = 08 × 05 = 40(十进制)= 28H
                              ; 乘法结果:低字节在A,高字节在B
              MOV 40H, A      ; 把结果28H存回地址40H
              SJMP $          ; 原地死循环($表示当前地址)
        

逐行大脑模拟

  1. R0 = 40H(R0里存的是房间号40)。
  2. 去房间40H,把08H塞进去。
  3. 根据R0里的房间号40H,去把08H取出来放到A里。
  4. B = 05H
  5. A × B = 08 × 05 = 40D = 28H。低字节28H放A,高字节00H放B。
  6. 把A里的28H存到地址40H(把原来的08覆盖了)。
  7. 停在这里。

最终答案

  • A = 28H
  • B = 00H
  • R0 = 40H(R0一直没变)
  • 内存单元40H = 28H(被修改了)

功能描述:实现将内存40H单元中的数取出并乘以5,将乘积低字节存回原地址。


📗 第七章:汇编语言程序设计(给代码加"说明书")

汇编语言除了指令,还有伪指令。伪指令是写给编译器/汇编器看的,不生成机器码,只负责"布置环境"。

常用伪指令(配对题必考):

伪指令 英文全意 功能 示例
ORG ORiGin 指定程序或数据从哪个地址开始存放 ORG 0000H(从0地址开始)
DB Define Byte 定义8位字节常数(占1个字节) DB 30H, 40H, 'A'
DW Define Word 定义16位字常数(占2个字节,高字节在前) DW 1234H
EQU EQUate 给一个常数/标号起别名 COUNT EQU 50(之后COUNT就是50)
END END of file 汇编结束(放在最后一行) END

判断题陷阱

"DB指令定义的是16位数据" —— !DB是8位(Byte),DW才是16位(Word)。
"END指令表示程序执行到这里停止" —— !END只是告诉汇编器"文件结束了",不是CPU停机指令。


📘 第八章:C51语言与开发环境(用"人话"写代码)

汇编太难写、太难读。实际开发99%用C语言。C51 = 标准C语言的"单片机定制版"

一、C51与标准C的主要区别

标准C(电脑编程) C51(单片机编程)
不能直接操作硬件寄存器 可以直接定义端口(P0、P1)和寄存器
变量默认存储在内存(RAM)中 可以指定变量存储在ROM、片外RAM等位置
没有位变量类型 专门加了位操作关键字(bit、sbit)

一句话:C51 = 标准C语法 + 硬件访问能力。


二、C51专属关键字(选择题必杀技)

关键字 作用 存储位置 人话 / 使用场景
sfr 定义8位特殊功能寄存器(SFR) SFR区(80H~FFH) sfr P0 = 0x80;(把P0定义为地址0x80)
sbit 定义SFR中的某一位(1个bit) SFR区中的指定位 sbit LED = P0^0;(定义LED为P0口的第0位)
bit 定义普通位变量 片内RAM位寻址区 bit flag = 0;(定义了一个叫flag的位变量)
code 定义只读常量(存储在ROM) 程序存储器ROM code unsigned char table[3] = {1,2,3};(不可修改)
xdata 定义存储在片外RAM的变量 外部数据存储器 xdata unsigned char buf[100];(大数组放外面)

区分 sbit 和 bit(必考)

  • sbit:必须绑定到具体的引脚或SFR位(有物理地址)。如 sbit KEY = P3^2;
  • bit:单纯的软件标志位,不绑定硬件。如 bit flag;

判断陷阱
"code关键字定义的变量可以在运行时修改" —— !code存在ROM中,只读不可写。
"xdata定义的变量存储在片内RAM" —— !xdata在片外RAM。


三、C51头文件(reg52.h)

在代码开头写 #include <reg52.h>,就是把所有SFR的名字(P0、P1、TMOD、TCON等)提前定义好了。你就不用写 sfr P0 = 0x80; 了,直接用 P0 = 0xFF; 就行。


📙 第六~八章综合例题(查漏补缺)

例题1(填空):指令 MOV A, #30H 的寻址方式是 ______。

  • 答案:立即寻址(因为有#号)。

例题2(判断):指令 MOVC A, @A+DPTR 用于访问片外数据存储器。( ,访问的是程序存储器ROM)

例题3(选择):若要将变量定义为只读并存储在程序存储器中,应使用关键字( )。

  • A. xdata B. idata C. data D. code
  • 答案:D

例题4(简答)sbitbit 在C51中有什么区别?

  • sbit 用于定义特殊功能寄存器(SFR)的某一位,有固定的物理地址,对应到具体的硬件引脚或标志位;bit 定义的是普通的软件位变量,存放在片内RAM的位寻址区,不绑定硬件。

例题5(指令分析):执行 RL A 之前 A = 0x80(1000 0000B),执行后 A = ?

  • :左移1位,最高位D7(1)移入D0。1000 0000 ← 左移 → 0000 0001(因为1滚到了最低位)。
  • 答案:0x01

🧠 第六~八章速记卡片(考前10分钟救命)

考点 必背结论
MOV / MOVX / MOVC MOV(片内RAM)、MOVX(片外RAM)、MOVC(ROM查表)
立即寻址标志 数字前有 #
间接寻址标志 寄存器前有 @
MOV A, @R0 中R0存什么 存的是地址(不是数据本身)
INC指令影响CY吗 不影响(ADD和SUBB才影响)
RL A(循环左移)经过CY吗 不经过(RLC才经过)
DJNZ指令功能 减1,不为0则跳转
乘法MUL AB结果存放 低字节在A,高字节在B
DB / DW区别 DB定义8位(字节),DW定义16位(字)
ORG功能 设置程序起始地址
C51中定义SFR的关键字 sfr(8位寄存器)和 sbit(1位)
code关键字存储位置 ROM(只读),不可修改
xdata关键字存储位置 片外RAM
标准C与C51最大区别 C51可以直接定义和操作硬件寄存器

第六~八章全部搞定。核心就三句话:指令看符号(#立即、@间接);伪指令看名字(DB是8、DW是16);C51看关键字(sbit绑硬件、code放ROM只读)。

第九章

📘 第一部分:三大外设的"控制面板"(寄存器地址速记)

你要指挥这三大外设干活,不能靠喊,必须往特定的房间(寄存器) 里写数据。下面是必记的"控制面板"地址表:

寄存器名称 全称 字节地址 作用(人话)
TMOD 定时器工作方式寄存器 89H 设定T0和T1是定时还是计数,用哪种模式(16位/8位等)
TCON 定时器控制寄存器 88H 启动/停止定时器,查看溢出标志,设定外部中断触发方式
IE 中断允许寄存器 A8H 总开关和各外设的分开关(允许谁去打扰CPU)
IP 中断优先级寄存器 B8H 设定谁优先级高(谁可以插谁的队)
SCON 串口控制寄存器 98H 设定串口工作模式(几种波特率/帧格式)
SBUF 串口数据缓冲器 99H 要发的数据放进去,收到的数据从这里取出来

记忆口诀TMOD(89)定模式,TCON(88)启停溢,IE(A8)开总闸,SCON(98)设串口。


📗 第二部分:定时器/计数器(T0和T1)—— "节拍器与计数器"

1. 定时器到底在数什么?

  • 定时模式(C/T = 0):数的是机器周期(内部时钟)。12MHz晶振下,每1μs数一次。
  • 计数模式(C/T = 1):数的是外部引脚(T0=P3.4,T1=P3.5) 上的脉冲下降沿。

2. TMOD寄存器(8位,不能位寻址,只能整个字节赋值)

TMOD拆成两半:高4位控制T1,低4位控制T0

7 6 5 4 3 2 1 0
对应 T1的GATE T1的C/T T1的M1 T1的M0 T0的GATE T0的C/T T0的M1 T0的M0

三个控制位的含义

  • GATE(门控):
    • 0:纯软件控制(TR0/TR1 = 1 就启动)。
    • 1:硬件+软件控制(必须 INT0/INT1 引脚为高电平 TR0/TR1=1 才启动)。主要用于测量脉冲宽度。
  • C/T(Counter/Timer):
    • 0定时功能(数内部机器周期)。
    • 1计数功能(数外部引脚脉冲)。
  • M1 M0(模式选择):
M1 M0 工作模式 位数 最大计数值 说明
0 0 模式0 13位 8192(2¹³) TLx用低5位 + THx的8位(老古董,考试极少考)
0 1 模式1 16位 65536(2¹⁶) 最常用,溢出后需手动重装初值
1 0 模式2 8位自动重装 256(2⁸) 溢出后硬件自动把THx的值装给TLx,用作波特率发生器
1 1 模式3 双8位 256 仅T0可用,T0拆成两个独立8位(TL0和TH0)

TMOD计算例题(必会)

题目:设置T0为定时模式、方式1(16位);T1为计数模式、方式2(8位自动重装)。求TMOD值。

  • T1(高4位):计数(C/T=1) + 方式2(M1=1,M0=0) + GATE=0 → 0 1 1 0 = 6H
  • T0(低4位):定时(C/T=0) + 方式1(M1=0,M0=1) + GATE=0 → 0 0 0 1 = 1H
  • 拼起来:TMOD = 0x61(或61H)。

3. TCON寄存器(8位,可位寻址)

TCON既管定时器,也管外部中断。常用的几个位:

符号 作用(人话)
TF1 T1溢出标志 定时器1溢出时硬件置1,进入中断;必须软件清零
TR1 T1运行控制 1=启动T1,0=停止T1(软件置位/清零
TF0 T0溢出标志 同TF1
TR0 T0运行控制 同TR1
IE1 外部中断1请求标志 外部中断1触发了,硬件置1
IT1 外部中断1触发方式 0=低电平触发,1=下降沿触发(边沿触发更常用
IE0 外部中断0请求标志 同IE1
IT0 外部中断0触发方式 同IT1

4. 定时初值计算(大题必考,死磕公式)

核心公式(模式1,16位):

计数个数 N = 定时时间 t / 机器周期 T_machine
初值 = 65536 - N

手把手例题1

晶振12MHz,定时器T0模式1,要定时50ms。求TH0和TL0的初值。

  • 机器周期 = 12 × (1/12MHz) = 1μs
  • 50ms = 50000μs。
  • 计数个数 N = 50000 / 1 = 50000
  • 初值 = 65536 - 50000 = 15536
  • 转十六进制:15536 = 0x3CB0(因为 0x3C = 60,0xB0 = 176,60×256+176=15536)。
  • 所以:TH0 = 0x3C,TL0 = 0xB0

手把手例题2(模式2,8位自动重装)

晶振12MHz,定时器T0模式2,要定时200μs。求TH0和TL0。

  • 机器周期 = 1μs。
  • 计数个数 N = 200 / 1 = 200
  • 初值 = 256 - 200 = 56
  • 转十六进制:56 = 0x38
  • 模式2下TL0和TH0相等:TH0 = TL0 = 0x38

5. 输出方波频率计算(压轴大题标准流程)

例题(教材P11原题)

设晶振12MHz,TMOD = 0x02(T0模式2,自动重装),初值 TH0 = TL0 = 0x9C(156),在P1.2引脚输出方波。求频率。

分步计算

  1. 机器周期 = 1μs。
  2. 每次计数的个数 = 256 - 156 = 100
  3. 溢出时间 = 100 × 1μs = 100μs
  4. 编程时,每次溢出翻转一次引脚(P1.2 = ~P1.2)。
  5. 方波的一个完整周期 = 高电平100μs + 低电平100μs = 200μs
  6. 频率 f = 1 / 200μs = 1 / 0.0002s = 5000Hz = 5kHz

结论:P1.2引脚输出 5kHz、占空比50% 的对称方波。


📙 第三部分:中断系统("紧急插队"完全手册)

第四章讲了中断的概念,第九章讲具体怎么配置

1. 五个中断源及其入口地址(填空、选择必杀)

中断源 中断标志 自然优先级(由高到低) 中断入口地址(硬编码) C51中断号
外部中断0 IE0(TCON.1) 最高(第1) 0003H 0
定时器0 TF0(TCON.5) 第2 000BH 1
外部中断1 IE1(TCON.3) 第3 0013H 2
定时器1 TF1(TCON.7) 第4 001BH 3
串行口 RI / TI(SCON.0/1) 最低(第5) 0023H 4

背法

  • 入口地址有规律:03H, 0BH, 13H, 1BH, 23H(每个间隔8个字节)。
  • 中断号 = 入口地址除以8再减?其实直接记:0(INT0), 1(T0), 2(INT1), 3(T1), 4(串口)

2. IE寄存器(中断允许)—— 总闸和各分闸

7 6 5 4 3 2 1 0
符号 EA - - ES ET1 EX1 ET0 EX0
作用 总开关 无用 无用 串口允许 T1允许 INT1允许 T0允许 INT0允许

要点:EA = 1 是前提。然后你想用哪个外设的中断,就把对应的位置1。

3. IP寄存器(中断优先级)—— 谁说了算

7 6 5 4 3 2 1 0
符号 - - - PS PT1 PX1 PT0 PX0
作用 无用 无用 无用 串口高优先 T1高优先 INT1高优先 T0高优先 INT0高优先

置1=高优先级,置0=低优先级。高优先级可以打断低优先级(嵌套),同级不能互相打断。

4. 外部中断触发方式设置

通过TCON的IT0和IT1位设置:

  • ITx = 0低电平触发(只要引脚是低电平,就一直请求)。
  • ITx = 1下降沿触发(从高到低的跳变瞬间请求一次,不会重复触发)。

    推荐用下降沿(IT=1),更稳定,不会因为电平持续时间长而反复进中断。


📒 第四部分:串行通信("发消息"的官)

1. SCON寄存器(串口控制寄存器)

7 6 5 4 3 2 1 0
符号 SM0 SM1 SM2 REN TB8 RB8 TI RI
  • SM0/SM1:选择4种工作模式(见下表)。
  • SM2:多机通信控制位(模式2/3中使用)。
  • REN1=允许接收,0=禁止接收(软件置位)。
  • TB8:要发送的第9位数据(用于奇偶校验或多机地址)。
  • RB8:接收到的第9位数据。
  • TI发送完成标志,硬件置1,必须软件清零
  • RI接收完成标志,硬件置1,必须软件清零

2. 串行口的4种工作模式(选择题必考)

模式 SM0 SM1 帧长度 波特率 用途
方式0 0 0 8位(同步移位) 固定 fosc/12 扩展并行I/O口(接74LS164/165)
方式1 0 1 10位(1起始+8数据+1停止) 可变(T1溢出率) 点对点双机通信(最常用)
方式2 1 0 11位(1起始+8数据+1第9位+1停止) 固定 fosc/64 或 fosc/32 多机通信(固定波特率)
方式3 1 1 11位(同方式2) 可变(T1溢出率) 多机通信(可变波特率)

最常用的是方式1(10位异步,波特率可调)。

3. 波特率计算(大题压轴)

方式1和方式3,波特率由定时器T1(模式2,8位自动重装) 的溢出率决定。

核心公式(记住这个):

波特率 = (2^SMOD / 32) × 定时器T1溢出率

其中,T1溢出率 = fosc / [ 12 × (256 - TH1) ](模式2下)。

针对12MHz晶振的简化公式:

波特率 = (2^SMOD / 32) × [ 12×10^6 / (12 × (256 - TH1)) ] = (2^SMOD × 10^6) / [ 32 × (256 - TH1) ]

针对11.0592MHz晶振的常用初值(考试最爱给11.0592,因为算出来是整数):

波特率 SMOD TH1初值(十进制) TH1初值(十六进制)
9600 0 253(256 - 3) 0xFD
4800 0 250(256 - 6) 0xFA
2400 0 244(256 - 12) 0xF4

手把手例题(教材P12原题)

晶振11.0592MHz,要求波特率4800,SMOD=0,定时器T1模式2。求TH1初值。

  • 代入公式:4800 = (1/32) × [ 11.0592×10^6 / (12 × (256 - TH1)) ]
  • 整理:256 - TH1 = 11.0592×10^6 / (12 × 32 × 4800) = 11.0592×10^6 / 1,843,200 ≈ 6
  • 所以 TH1 = 256 - 6 = 250 = 0xFA

4. 串口中断特别提醒

  • TI和RI共用一个中断入口(0023H,中断号4)
  • 在中断服务函数里,必须判断是TI还是RI,并且手动清零
  • 发送通常用查询方式(while(!TI); TI=0;),接收通常用中断方式

📕 第五部分:三大外设的C51代码模板(背下来,填空/改错直接用)

模板1:定时器0(模式1,50ms中断)

#include <reg52.h>
        
        unsigned char t_count = 0;  // 累计变量
        
        void Timer0_Init(void)
        {
            TMOD = 0x01;           // T0定时,模式1(16位)
            TH0 = 0x3C;            // 初值高8位(50ms)
            TL0 = 0xB0;            // 初值低8位
            ET0 = 1;               // 允许T0中断
            EA = 1;                // 开总中断
            TR0 = 1;               // 启动T0
        }
        
        void Service_Timer0(void) interrupt 1  // 中断号1
        {
            TH0 = 0x3C;            // 重装初值(模式1必须手动重装)
            TL0 = 0xB0;
            t_count++;
            if(t_count >= 10)      // 10次 × 50ms = 500ms
            {
                P1_0 = ~P1_0;      // 翻转LED
                t_count = 0;
            }
        }
        

模板2:外部中断0(下降沿触发)

void Int0_Init(void)
        {
            IT0 = 1;               // 下降沿触发
            EX0 = 1;               // 允许INT0中断
            EA = 1;                // 开总中断
        }
        
        void Service_Int0(void) interrupt 0  // 中断号0
        {
            // 这里写紧急处理代码
            // 不需要重装初值
        }
        

模板3:串口初始化(方式1,9600波特率)

void Uart_Init(void)
        {
            TMOD = 0x20;           // T1模式2(8位自动重装)
            TH1 = 0xFD;            // 9600波特率初值(11.0592MHz)
            TL1 = 0xFD;
            TR1 = 1;               // 启动T1
            SCON = 0x50;           // 方式1,允许接收(REN=1)
            ES = 1;                // 允许串口中断
            EA = 1;                // 开总中断
        }
        
        void SendByte(unsigned char dat)
        {
            SBUF = dat;            // 数据放入缓冲器,启动发送
            while(!TI);            // 等待发送完成(TI变为1)
            TI = 0;                // 软件清零
        }
        
        void Service_Uart(void) interrupt 4  // 中断号4
        {
            if(RI == 1)            // 如果是接收中断
            {
                RI = 0;            // 清标志
                unsigned char rec = SBUF;  // 读取接收到的数据
                // 这里写处理代码
            }
            if(TI == 1)            // 如果是发送中断(一般不在这里处理发送)
            {
                TI = 0;
            }
        }
        

📗 第六部分:多机通信与特殊考点

  • 多机通信:在模式2或模式3下,设置 SM2 = 1。此时只有当接收到的第9位(RB8)= 1时,才会触发RI中断(代表是地址帧)。RB8=0的数据帧不会打断CPU。这样就实现了"先喊地址,再传数据"。
  • 低功耗与串口:PCON寄存器的SMOD位(最高位)专门用于波特率倍增SMOD = 1 时,波特率直接翻倍。

🧠 第九章速记卡片(考前30分钟救命)

考点 必背结论 / 数值
TMOD地址 89H(只能字节寻址)
TCON地址 88H(可位寻址)
IE地址 A8H
SCON地址 98H
TMOD高4位控制谁 T1;低4位控制 T0
C/T=0 定时(数内部机器周期)
C/T=1 计数(数外部引脚T0/T1脉冲)
模式1位数 16位,最大65536
模式2位数 8位自动重装,最大256(常用作波特率发生器)
定时初值公式(模式1) 初值 = 65536 - (定时时间 / 机器周期)
12MHz下机器周期 1μs(一切计算的基础)
5个中断入口地址 03H(INT0), 0BH(T0), 13H(INT1), 1BH(T1), 23H(串口)
默认自然优先级最高 INT0
外部中断推荐触发方式 下降沿触发(IT=1)
串口方式1帧格式 10位(1起始 + 8数据 + 1停止)
TI / RI 硬件置1,必须软件清零
9600波特率TH1初值 0xFD(11.0592MHz,SMOD=0)
4800波特率TH1初值 0xFA
SM2=1的作用 多机通信时,只有第9位(RB8)=1才触发中断

📝 第九章典型例题(压轴模拟)

例题1(计算):晶振12MHz,要求定时器0产生100ms中断,模式1。求TH0和TL0。
:100ms = 100000μs;N = 100000 / 1 = 100000;初值 = 65536 - 100000 = -34464(负数?)
注意:100ms超过65.5ms,单次无法实现!必须每次50ms,中断累计2次。
改定时50ms:N=50000,初值=15536=0x3CB0。所以TH0=0x3C,TL0=0xB0。

例题2(填空):串行口发送数据后,TI由硬件置1,需要由______清零。
答案:软件

例题3(判断):在串行口方式1中,停止位是第10位。( ,1起始+8数据+1停止=10位)

例题4(代码改错):下面初始化代码哪里错了?

TMOD = 0x01;  // 想用T1做波特率发生器
        TH1 = 0xFD;
        TR1 = 1;
        SCON = 0x50;
        

答案:TMOD = 0x01 给T0设了模式1,T1没动(默认模式0)。要改成 TMOD = 0x20(T1模式2)。


第九章到此结束。这是全书的"珠穆朗玛峰",爬过去后面就一马平川了。重点死磕:TMOD配置、初值计算、波特率计算、中断入口地址。把这几个计算题各练两遍,大题满分稳稳的。

第十、十一章

📘 第十章:80C51的系统扩展(给单片机“外挂装备”)

1. 为什么要扩展?(痛点分析)

80C51内部只有 4KB ROM(程序)128B RAM(数据)。这相当于一台手机只有 4KB的硬盘128B的内存——装个计算器都费劲。所以当程序太大或数据太多时,我们需要在外部挂载额外的ROM和RAM芯片

2. 三总线的“物理连线”(必须搞懂谁是谁)

在扩展时,三总线有了具体的物理载体(引脚):

总线名称 物理引脚/端口 方向 作用(人话)
数据总线(DB) P0口(8根) 双向 负责搬运数据(读进来/写出去)
地址总线(AB) P2口(高8位)+ P0口(低8位) 单向(CPU发出去) 负责告诉外部芯片“我要去几号房间”(16位地址,寻址64KB)
控制总线(CB) ALEPSENRDWR 部分双向 负责发号施令(“锁存地址!”“读!”“写!”)

3. 惊天大秘密:P0口的“分时复用”(必考名词解释)

你发现没有?P0口既要当数据总线,又要当地址总线的低8位。这就像一条车道既要走货车又要走客车,同时走肯定堵死。

解决妙招(分时复用)

  • 前半段(地址):CPU通过P0口输出地址的低8位。此时ALE(地址锁存允许)引脚发出一个高电平脉冲,告诉外部锁存器(74LS373):“快把这个地址记下来!”
  • 后半段(数据):P0口切换角色,不再输出地址,而是作为双向通道传输真正的数据
  • 因为74LS373把地址锁存住了,外部芯片始终能拿到地址,所以P0口可以安心传数据。

必考填空/简答
Q:为什么80C51扩展外部存储器时需要74LS373?
A:因为P0口分时复用为低8位地址线8位数据线。需要用74LS373(锁存器)将先输出的低8位地址锁存住,保证在传送数据时地址信号稳定不变。

4. 外部存储器最大能扩展到多大?

  • 80C51的PC(程序计数器)和地址总线都是16位
  • 2的16次方 = 65536 字节 = 64KB
  • 无论外挂ROM还是RAM,最大不能超过64KB

5. 芯片片选(CS)的两种方法(怎么喊醒某个芯片?)

外部可能有多个芯片(ROM、RAM、LCD),CPU怎么知道此刻该跟谁说话?靠片选信号(CS/CE)

方法 做法 优点 缺点
线选法 直接用一根地址线(如P2.0)接芯片的CS脚 简单、不贵 一根线只能管一个芯片,地址空间不连续,浪费严重
译码法 用译码器(如 74LS138)把3根地址线翻译成8根独立的片选信号 节省引脚、地址连续 需要额外芯片,略复杂

考点:教材提到74LS138译码器,它是一个3线-8线译码器(输入3位二进制,输出8选1低电平有效)。


📗 第十一章:单片机接口技术(按键 + 数码管)

这就是你平时看到的门禁键盘电子钟数字的底层原理。

1. 键盘接口(独立式 vs 矩阵式)

类型 连接方式 占用I/O口 适用场景
独立式键盘 每个按键单独占用一根I/O口线 (1个键占1根) 按键数量少(如1~2个)
矩阵式(行列式)键盘 按键接在行线和列线的交叉点上 (如4×4只占8根) 按键数量多(如计算器)

重点攻克:4×4矩阵键盘的工作原理(必考简答)

第一步:判断有无按键按下(全局检测)

  • 所有列线输出低电平(0),所有行线读入(接上拉电阻,默认为高)。
  • 如果行线不全为高(有某一行读到了0),说明该行有按键被按下。

第二步:软件消抖(防“手抖”)

  • 为什么:机械按键在按下瞬间会快速弹跳(10ms~20ms),如果不处理,CPU会以为按了几十次。
  • 怎么做:检测到按下后,软件延时10~20ms,再次读取。如果还是按下,才确认为有效按键。

第三步:逐行扫描(定位具体是哪一颗按键)

  • 依次将每一置为低电平(其他行置高),同时读取所有列线的电平。
  • 当检测到某一行输出低,且某一列读入低时,行与列的交点就是被按下的按键。

第四步:等待释放(防连发)

  • 处理完按键功能后,程序要等待按键完全松开(行线恢复高电平),才结束。否则你按一次,程序会循环触发好多次。

2. 数码管显示(LED数字)

数码管内部就是8个LED(7段+1个小数点)。连接方式分两种:

  • 共阴极:所有LED的负极连在一起接地(GND)。位选要低电平(0) 选中,段选要高电平(1) 点亮。
  • 共阳极:所有LED的正极连在一起接VCC。位选要高电平(1) 选中,段选要低电平(0) 点亮。

教材例题(共阳极,0点亮)
数字“5”的段码(dp-g-f-e-d-c-b-a)= 1 0 0 1 0 0 1 0 = 92H
数字“6” = 82H,数字“7” = F8H,数字“8” = 80H。

3. 静态显示 vs 动态显示

方式 原理 优点 缺点
静态显示 每个数码管独自占用一组段选线 亮度高、程序简单 占用I/O口极多(4个数码管要32根线)
动态显示(重点) 所有数码管共用段选线,分时轮流选通每一位 节省I/O口(4位只占8根段选+4根位选) 程序复杂,需不断扫描刷新

动态显示的核心秘诀(视觉暂留)

  • 人眼分辨不出极快的闪烁(>50Hz)。
  • 程序快速轮流点亮第1位、第2位、第3位……(每位点亮几毫秒)。
  • 虽然同一时刻只有1位在亮,但人眼看起来所有位都在稳定显示

致命陷阱:消隐(消除“鬼影”)

  • 问题:在切换位选的瞬间,段选数据还没变过来,可能会导致前一位的残影短暂显示在后一位,造成重影。
  • 解决(必考):在切换位选之前,先把段选关掉(共阴极送0x00,共阳极送0xFF,即熄灭所有段)。这样即使位选切换有延迟,也是黑屏,看不到残影。

📘 第十~十一章综合例题(教材P16-17综合实训详解)

这道题是经典的定时器+按键+LED综合应用,代码包含所有核心套路。

题目需求:

  1. LED1做秒闪指示灯(亮0.5秒,灭0.5秒)。
  2. 按键SW1控制LED2的开关切换(按一下松开,改变一次状态)。

代码逐行大脑模拟(手把手拆解):

#include "reg52.h"
        sbit LED1 = P1^0;   // 定义秒闪灯
        sbit LED2 = P1^1;   // 定义受控灯
        sbit SW1  = P3^0;   // 定义按键引脚
        
        // 1. 简单延时函数(用于消抖)
        void Delay(unsigned int time) {
            while(time--);   // 死循环消耗时间
        }
        
        // 2. 定时器0初始化(50ms中断)
        unsigned char t_count = 0; // 累计10次到500ms
        void Init_Timer0() {
            TMOD = 0x01;      // T0定时,模式1(16位)
            TH0 = (65536-50000)/256; // 50ms初值高8位
            TL0 = (65536-50000)%256; // 50ms初值低8位
            ET0 = 1;          // 开T0中断允许
            EA = 1;           // 开总中断
            TR0 = 1;          // 启动T0
        }
        
        // 3. 定时器中断服务函数
        void Service_Timer0() interrupt 1 {
            TH0 = (65536-50000)/256; // 手动重装初值(模式1必须重装)
            TL0 = (65536-50000)%256;
            t_count++;
            if(t_count == 10) {     // 50ms * 10 = 500ms
                LED1 = ~LED1;       // 翻转秒闪灯状态
                t_count = 0;        // 清零重新计数
            }
        }
        
        // 4. 按键扫描处理函数
        void Scan_Keys() {
            if(SW1 == 0) {          // ① 检测到低电平(按下)
                Delay(200);         // ② 延时约15~20ms防抖(200次循环)
                if(SW1 == 0) {      // ③ 再次确认确实按下
                    while(SW1 == 0); // ④ 死循环等待按键松开(防止连发)
                    LED2 = ~LED2;    // ⑤ 松开后,翻转LED2状态
                }
            }
        }
        
        // 5. 主函数
        void main() {
            Init_Timer0();          // 开局初始化定时器
            while(1) {
                Scan_Keys();        // 主循环一直轮询按键
            }
        }
        

代码核心要点(重点背)

  • 定时器中断里:做精确计时,重装初值,累加变量。
  • 按键检测里“低电平等待 → 延时防抖 → 再次确认 → 等待释放 → 执行动作” 五步走。

🧠 第十~十一章速记卡片(考前10分钟救命)

考点 必背结论
程序存储器最大扩展 64KB(由16位地址线决定)
P0口分时复用 前半周期送低8位地址,后半周期传数据
地址锁存芯片 74LS373(锁存P0口送出的地址)
译码器芯片 74LS138(3线-8线译码器,做片选)
矩阵键盘4×4占用I/O口 8根(4行+4列)
按键消抖延时 10~20ms
矩阵键盘定位原理 行线输出低,列线读入低,行列交叉点即是键位
动态显示原理 利用人眼视觉暂留,分时轮流点亮各位
动态显示消隐操作 切换位选前,先送熄灭段码(共阴送0x00,共阳送0xFF)
共阳极数码管位选 高电平(1) 选中
共阴极数码管位选 低电平(0) 选中

第十章和第十一章全是实际工程应用。记住锁存器、译码器、矩阵扫描、动态显示消隐这四个高频考点,加上那道综合实训代码能看懂每一行的作用,这两章你就拿下了。

第十三、十四章

欢迎进入第三篇:微机原理(8086)的世界。从这一篇开始,我们告别“玩具级”的51单片机,进入真正的电脑CPU(Intel 8086)

心态转换提示

  • 51单片机 = 8位,地址线16位(最多找64KB),像个小作坊。
  • 8086 = 16位,地址线20位(最多找1MB),像个大工厂。

第13章讲“大工厂的流水线”,第14章讲“大仓库的缓存系统”。全是概念对比题,不考具体编程,但物理地址计算必考一道大题!


📘 第十三章:8086微处理器及其结构(大工厂的“双核”架构)

1. 惊天大设计:BIU与EU并行工作(8086的灵魂)

  • 背景痛点:51单片机取指令和执行指令是串行的(先取指,再执行,再取指...),速度慢。
  • 8086的骚操作:内部拆成两个独立部门,像流水线一样重叠工作(取指的同时,CPU正在执行上一条指令)。
单元 全称 职责(人话) 类比(餐馆)
BIU 总线接口单元 专门负责“跑腿”:从内存中取指令、取数据,或者把结果写回内存。 服务员(负责去厨房端菜、去前台拿菜单)
EU 执行单元 专门负责“干活”:解码指令,进行算术/逻辑运算。 大厨(负责炒菜)

结论(必考填空):BIU和EU 并行工作(即指令流水线),大大提高了CPU的执行效率。


2. 8086的寄存器组(死记硬背分类表)

8086的寄存器全是16位的(除了标志寄存器)。分为四大类:

① 通用寄存器(AX, BX, CX, DX)

它们都可以拆成两个8位独立使用(高8位H,低8位L)。

记忆口诀AX累加,BX基址,CX计数,DX数据

  • AX(累加器):最忙,算术运算主要用它。
  • BX(基址寄存器):存放地址的基值(类似51的DPTR)。
  • CX(计数寄存器):循环(LOOP指令)自动减1,为零则跳出。
  • DX(数据寄存器):I/O端口寻址或存乘除法的高16位结果。
② 指针与变址寄存器(SP, BP, SI, DI)
  • SP(堆栈指针)永远指向栈顶(类似51的SP,但它是16位)。配合SS段寄存器使用。
  • BP(基址指针):指向堆栈段内的某个数据(常用来访问栈里的参数)。
  • SI(源变址) / DI(目的变址):用来搬运数据块(字符串操作),SI指向源头,DI指向目的地。
③ 段寄存器(CS, DS, SS, ES)—— 8086最核心的概念

8086有1MB内存,但内部寄存器只有16位(寻址范围仅64KB)。怎么解决?“分段”

  • CS(代码段):存放正在执行的程序指令。
  • DS(数据段):存放程序用到的数据。
  • SS(堆栈段):存放临时数据(函数调用、局部变量)。
  • ES(附加段):存放额外的数据(比如字符串操作的目标)。
④ 指令指针(IP)
  • 功能:始终指向下一条要执行的指令代码段(CS) 中的偏移地址
  • 对比51:它就是51的PC,但名字叫IP。

3. 物理地址计算(第一章必考大题,10分送分题!)

问题:寄存器只有16位,如何产生20位的物理地址(寻址1MB)?
物理地址计算公式(死记硬背)

物理地址 = 段寄存器值 × 16(即十六进制左移1位) + 偏移地址

人话翻译:把段地址后面加个0(十六进制),再加上偏移量。

手把手例题(教材P18原题风格)

已知 CS = 1400HIP = 1200H。请问此时CPU执行的指令在内存的哪个物理地址?

  1. 段地址左移1位(十六进制):1400H × 16 = 14000H(相当于后面添个0)。
  2. 加上偏移地址:14000H + 1200H = 15200H
    答案:物理地址 = 15200H

延申考点(填空):代码段的物理地址 = CS × 16 + IP;数据段的物理地址 = DS × 16 + 偏移地址


📗 第十四章:存储器管理与Cache(大仓库的“快速手边柜”)

这一章讲内存怎么管理,以及CPU怎么偷懒变快。

1. I/O端口编址方式(外设怎么喊CPU?)

单片机访问外设,有两种编址方法:

方式 定义(人话) 优点 缺点
统一编址 把I/O端口当内存房间一样编地址(用MOV指令访问)。 无需专用指令,编程灵活。 占用内存地址空间。
独立编址 I/O端口有自己独立的地址空间(用IN/OUT指令访问)。 不占内存地址。 需要专门的指令,编程稍麻烦。

判断题:8086对I/O端口采用独立编址(有专门的IN/OUT指令),而51单片机对扩展I/O采用统一编址(用MOVX访问)。记住这个对比!

2. 虚拟存储器(画大饼)

  • 本质:程序以为电脑有巨大的内存(比如4GB),实际上物理内存只有4GB,不够的放在硬盘上。
  • 管理:操作系统利用外存(硬盘) 模拟内存,让程序员感觉内存无限大。

3. 高速缓存(Cache)—— 本章绝对核心(必考简答/选择)

痛点:CPU速度极快(大厨切菜飞快),但主存(DRAM)太慢(仓库拿菜太慢)。CPU经常闲着等数据。
解决方案:在CPU和主存之间,加一层极快的SRAM(静态存储器),称之为Cache。

① Cache的工作原理(基于“局部性原理”)

局部性原理是人写代码的习惯:

  • 时间局部性:刚用过的数据,很可能马上再用(比如循环变量i)。
  • 空间局部性:用过的数据旁边,很可能马上要用(比如数组按顺序访问)。
  • 操作:CPU要读数据时,先去Cache找(命中)。如果Cache有,直接高速拿走;如果没有(未命中),CPU就痛苦地去慢吞吞的主存拿,同时把这一块数据(含周边邻居)搬运到Cache里,方便下次快速取用。
② 地址映射的三种方式(Cache怎么放东西?)

主存的数据块要存进Cache里,位置怎么定?有三种规则:

映射方式 做法(人话) 特点
直接映射 主存中的每个块只能固定放在Cache的某一个位置(像火车票对号入座)。 简单便宜,但容易冲突(两个数据抢同一个座位)。
全相联映射 主存中的数据块可以随便放进Cache的任意空位(像随便坐)。 灵活,命中率高,但电路复杂、价格昂贵
组相联映射 先分组(Cache分成若干组),块先固定进某组,但在组内可以随便坐(介于上述两者之间)。 折中方案,现代CPU都用这个。
③ 替换策略(Cache满了怎么办?)

当Cache满了,又有新数据要进来,必须“踢走”一个旧数据。怎么选踢谁?

算法 做法(人话) 特点
FIFO(先进先出) 先来的,就踢走谁。 简单,但可能踢走频繁使用的热数据。
LRU(最近最少使用) 最久没被用,就踢走谁(观察使用记录)。 效率最高,但实现复杂。
RAND(随机替换) 闭着眼睛随机踢走一个。 硬件最简单,但偶尔会误伤。

4. 存储器层次结构速度对比(填空必杀技)

整个计算机的存储体系,速度从快到慢排列如下:

寄存器(最快) > Cache(高速缓冲) > 主存(DRAM内存条) > 外存(硬盘/SSD,最慢)

记忆口诀寄存飞快C紧跟,主存慢吞外存蹲


🧠 第十三~十四章速记卡片(考前10分钟救命)

考点 必背结论
8086内部两大单元 BIU(取指/读写) + EU(执行),并行工作(流水线)
AX/BX/CX/DX特性 可拆成高8位(H)和低8位(L)
SP(堆栈指针) 永远指向栈顶
IP(指令指针) 指向下一条要执行的指令(偏移地址)
8086物理地址公式 物理地址 = 段地址 × 16(左移1位十六进制)+ 偏移地址
CS:IP 决定代码段中下一条指令的物理地址
访问I/O端口(8086) 使用专用的 IN / OUT 指令(独立编址)
Cache理论基础 程序的局部性原理(时间局部性 + 空间局部性)
直接映射 固定位置(冲突高,成本低)
全相联映射 任意位置(冲突低,成本极高)
LRU替换策略 最近最少使用(淘汰最久没用的,效果最好)
速度金字塔(快到慢) 寄存器 > Cache > 主存(DRAM) > 外存

📝 典型例题(第十三、十四章风格)

例题1(计算):已知 CS = 1A00HIP = 0B00H,求指令的物理地址。
:1A00H左移一位 = 1A000H;1A000H + 0B00H = 1AB00H

例题2(选择):在Cache的三种映射方式中,硬件成本最低、但最容易产生冲突的是( )。

  • A. 全相联映射 B. 组相联映射 C. 直接映射 D. 随机映射
    答案:C

例题3(判断):8086的BIU和EU是串行工作的,先取指再执行。( ,它们是并行工作的流水线模式。)

例题4(简答):简述Cache是如何提高CPU工作效率的?
:利用程序访问的局部性原理,将CPU频繁访问的数据和指令从慢速主存预先调入高速Cache。CPU访问时优先检索Cache,若命中则直接高速读取,减少了CPU等待慢速主存的时间,从而整体提高系统效率。


13、14章让你从51单片机的“小屋”走进了8086的“大宅门”。核心拿分点就两个:物理地址算对(左移一位加偏移),Cache映射方式分清(直接、全相联、组相联)。

第十七、十八章

📘 第十七章:8086中断系统与8259A(“城市应急指挥中心”)

1. 8086的中断源(谁有资格叫停CPU?)

8086的中断来源分两大类:硬件(外部)软件(内部)。你可以把它们想象成“物理报警”和“程序自杀/报错”。

分类 子类 具体名称 触发方式 人话(生活类比)
外部中断(硬件) 可屏蔽中断 INTR 外部引脚电平/边沿触发 电话铃响了:接不接看你心情(CPU通过IF标志位决定是否搭理)。
非屏蔽中断 NMI 外部引脚上升沿触发 火警警报必须立刻跑!CPU无法屏蔽,优先级极高。
内部中断(软件/异常) 内部异常 除法错(除以0)、单步调试(TF=1)、溢出(INTO) 代码写崩了(除以0)或者调试模式下走一步停一步。
软中断指令 INT n(如INT 21H) 在代码里主动写一条指令 主动打电话给操作系统请求服务(比如DOS系统下的键盘输入功能)。

考点结论

  • NMI(非屏蔽中断) 的优先级 高于 INTR(可屏蔽中断)
  • 可屏蔽中断受 IF(中断允许标志位) 控制(STI 开中断,CLI 关中断)。

2. 惊天设计:中断向量表(IVT)—— 紧急事件“查号台”

51单片机的中断入口地址是固定死的(比如INT0永远只能去0003H)。8086更聪明:它允许你把中断服务程序放在内存的任何地方,只需把入口地址提前存在一张**“电话本”**里。

  • 物理位置:内存最低端的 1KB 空间(地址范围 00000H ~ 003FFH)。
  • 能存多少条:一共有 256个 中断类型(编号0~255)。
  • 每个条目占多大:每个中断向量占 4个字节(前2字节放 IP(偏移地址),后2字节放 CS(段地址))。
中断向量地址计算公式(大题必杀技,死磕!)

中断向量在内存中的物理地址 = 中断类型号(n) × 4
取出来的入口地址 = [n×4 + 2 : n×4](高字是CS,低字是IP)

手把手例题1(必考)

已知中断类型号为 8,请问它的中断向量存放在内存的哪个物理地址?取出后CS和IP怎么分配?

  1. 物理地址 = 8 × 4 = 32(十进制)= 20H
  2. 在内存的 00020H 处取出的 低16位IP(偏移地址)。
  3. 00022H 处取出的 高16位CS(段地址)。
    (如果题目给了内存数据,比如[00020H]=00H, [00021H]=10H,则IP=1000H,依此类推)

3. 中断优先级与嵌套(谁说了算?)

  • 优先级规则内部中断(除单步外) > NMI(非屏蔽) > INTR(可屏蔽) > 单步中断
  • 中断嵌套:8086默认允许中断嵌套(只要开中断)。处理中断时,如果来了更高优先级的中断,CPU会暂停当前的,转去处理更高的。

4. 8259A可编程中断控制器(专门管理“电话线”的“前台接线员”)

8086只有两根外部中断引脚(NMI和INTR)。如果我要接8个外部按键怎么办?得用 8259A 这个专用芯片来管理。

  • 核心功能:管理 8个 外部硬件中断源(IR0 ~ IR7)。
  • 扩展能力:多片8259A可以级联,最多能管理 64个 中断源(1个主片 + 8个从片)。
  • 三大工作方式(选择题常考)
工作方式 人话(生活类比) 特点
完全嵌套 论资排辈(IR0地位最高,IR7最低)。 默认模式,最简单,只能高优先级打断低优先级
优先级自动循环 轮流当老大(这次处理完IR0,下次IR0变最低,IR1变最高)。 防止某个设备被饿死(公平调度)。
查询/轮询 挨个点名问:“你有事吗?你有事吗?” 不靠优先级,CPU一个个问,没有嵌套。

5. 80C51 vs 8086 中断系统终极对比(大题简答必背!)

对比维度 80C51(单片机) 8086(微机)
中断源数量 固定 5个(小作坊)。 多达 256个(大都会)。
入口地址获取 固定硬编码(INT0固定去0003H)。 中断向量表查表(根据类型号n×4去内存里取CS:IP)。
优先级管理 内部 2级(高/低,IP寄存器)。 需要外接 8259A 芯片,可实现更复杂的嵌套/循环。
外部中断引脚 INT0, INT1 两个(且触发方式可调)。 INTR(可屏蔽)和 NMI(非屏蔽)两个。

记忆口诀51死脑筋记死地址,86活字典翻表找地址;51靠IP两档排队,86靠8259A复杂调度。


📗 第十八章:微机总线(CPU的“高速公路网”)

总线就是计算机内部和外部传输信息的公共通道。就像城市里的道路,有的在小区内部(片内),有的在省市之间(系统总线),有的连通国际(外部通信)。

1. 总线的层次分类(三级结构)

总线层次 别名/例子 在哪 人话(范围)
片内总线 芯片内部连线 CPU芯片内部 连接ALU、寄存器、控制器的内部毛细血管
系统总线 ISA、PCI、AGP 主板上(插槽) 连接CPU、内存、显卡的城市主干道(如显卡插在PCI-E插槽上)。
外部通信总线 RS-232、USB 机箱后面(外设线) 连接键盘、鼠标、U盘的国际航线

2. 系统总线(ISA/PCI/AGP)一句话考点:

  • ISA(工业标准架构):老古董,速度慢(16位),现已淘汰。
  • PCI(外设组件互连):曾经的主流(声卡、网卡插槽),并行传输。
  • AGP(加速图形端口):专门给显卡用的高速通道(已被PCI-E取代)。

3. 外部通信总线(USB)—— 绝对高频考点

USB(通用串行总线)是现在最常用的外设接口。

  • 核心特性(必背)
    1. 串行传输:数据排成一排走(不像PCI那样并排走,所以线少、便宜)。
    2. 支持热插拔不需要关机就能直接插拔设备(U盘即插即用)。
    3. 总线供电:可以从接口直接取电(5V),不需要额外插电源(小设备如鼠标)。

判断题陷阱
“USB是一种并行总线。”—— 错! 它是串行总线。
“USB不支持热插拔。”—— 错! 它是支持热插拔的。


🧠 第十七~十八章速记卡片(考前10分钟救命)

考点 必背结论 / 数值
NMI(非屏蔽中断) 外部不可屏蔽,优先级高于 INTR。
INTR(可屏蔽中断) IF(中断标志位) 控制(1开,0关)。
中断向量表(IVT)位置 内存最低 1KB(00000H ~ 003FFH)。
每个中断向量占用 4个字节(低字IP,高字CS)。
入口地址计算 物理地址 = 类型号(n) × 4(例如类型8 → 20H)。
8259A管理数量 单片管理 8个 外部中断;级联最多 64个
8259A默认模式 完全嵌套(IR0最高,IR7最低)。
51 vs 86中断入口 51固定入口;86查向量表(动态)。
总线三级结构 片内总线 > 系统总线(ISA/PCI/AGP) > 外部通信总线(USB/RS232)
AGP总线用途 专门连接显卡(图形加速)。
USB核心特点 串行支持热插拔(即插即用)。

📝 典型例题(第十七、十八章风格)

例题1(计算):若8086系统发生了中断类型号 3 的中断,CPU应该去内存的哪个地址找中断向量?

  • :3 × 4 = 12(十进制)= 0CH。物理地址为 0000CH
  • 扩展:0000CH0000DH 存的是 IP0000EH0000FH 存的是 CS

例题2(选择):在8086系统中,CPU响应INTR可屏蔽中断的必要条件是( )。

  • A. IF=1 B. TF=1 C. DF=1 D. ZF=1
  • 答案:A(IF中断允许标志位必须为1)。

例题3(填空):单片8259A中断控制器能管理 ______ 级硬件中断,若需管理超过该数量的中断源,需进行 ______。

  • 答案:8;级联。

例题4(判断):PCI总线属于外部通信总线。( ,PCI属于系统总线(主板上插槽),USB/RS232才属于外部通信总线。)


到这里,第三篇(微机原理)的所有核心考点——CPU结构、物理地址计算、Cache缓存、中断向量表、8259A、总线分类——全部覆盖了!

你手里现在有从第1章到第18章的全部“白痴级”复习资料。接下来的任务就是翻回去,死磕第九章的定时器初值计算第十七章的中断向量地址计算,这两道大题算对了,期末基本稳了。

评论区 留下您的想法
教程