单片机原理及应用复习资料
电信专业的单片机原理及应用复习资料。这是51单片机,所以只用背就好了。
第一章
📚 第一章:微机与嵌入式系统的发展及基础(纯概念入门)
1. 到底什么是“嵌入式系统”?(必考定义)
- 官方定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
- 人话翻译(重点背这一句):
嵌入式系统 = 专门干某一件事的“小电脑”。 它不是用来打游戏、写Word的(那是PC),它是用来控制洗衣机、空调、手机、MP3播放器的。
- 三大特点:
- 专用性:只干特定的活(比如空调遥控器只负责调温)。
- 可裁剪:不需要的功能可以砍掉(比如低端遥控器不需要显示动画)。
- 严苛约束:省电、便宜、体积小。
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位) |
💡 应试技巧
- 判断纠错题:只要说“微型计算机就是微处理器”,一定是错的。差着层级呢。
- 填空题:如果问“计算机内部用什么码进行运算?”,脑子里第一时间弹出来 补码。
- 进制题:如果看到
xxxH,那表示这是十六进制数(H代表Hex)。
第一章的核心就是建立概念框架,你不需要理解CPU怎么造的,只需要知道它叫什么名字、是干什么的、里面有什么。 掌握上面这张表,第一章满分到手。
第二章
📘 第一部分:数制(你从小到大的数字游戏)
1. 三种进制长什么样?(认脸)
| 进制 | 后缀字母 | 数字组成 | 举例 |
|---|---|---|---|
| 二进制 | B (Binary) | 只有 0 和 1 | 1010B |
| 十进制 | D (Decimal) | 0~9 | 255D(通常省略D) |
| 十六进制 | H (Hexadecimal) | 0 | 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转成十六进制。- 从右往左分组:
1110101(左边缺1位,补0变成01110101) 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。
- 5 →
- 注意区分:
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。
- 先写原码:
- +25:原码 =
必考填空:计算机内部一切算术运算均采用 补码 进行。
📙 第三部分:逻辑电路基础(玩开关)
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(三态缓冲) | 高阻态,防止总线冲突 |
📝 典型例题(按考试原题风格)
- (填空)
3F H= ______ B。- 解:3 = 0011,F = 1111 → 00111111B。
- (计算) 将
110011B转成十进制。- 解:1×2⁵ + 1×2⁴ + 0 + 0 + 1×2¹ + 1×2⁰ = 32+16+0+0+2+1 = 51D。
- (判断) 负数的反码就是它的补码。(错,反码加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个到多个机器周期 组成。
大小排序(必考填空/选择):
时钟周期 < 机器周期 < 指令周期。
记忆口诀:心(时钟)跳一下,做个动作(机器),完成一件事(指令)。
📒 第四部分:程序是怎么跑起来的?(简单串一下)
虽然教材没单独列标题,但理解这个对后面中断、指令系统极有帮助:
- 取指:CPU通过地址总线告诉内存"把地址XX的指令给我"。
- 译码:控制器拿到指令,翻译成电路能懂的信号。
- 执行:运算器动手算,或者通过数据总线读写数据。
- 跳转:算完了,PC(程序计数器)自动加1,指向下一条指令地址。
你看,数据总线来回搬数据,地址总线单向指路,控制总线在旁边喊"开始搬!停!",三者配合天衣无缝。
🧠 第三章速记卡片(考前5分钟救命)
| 考点 | 必背结论/数值 |
|---|---|
| CPU两大核心部件 | 运算器(ALU) + 控制器 |
| 累加器(A)作用 | 数据的中转站(最忙的寄存器) |
| 地址总线(AB)方向 | 单向(CPU输出) |
| 数据总线(DB)方向 | 双向 |
| 控制总线(CB)方向 | 部分双向 |
| 16位地址线寻址范围 | 64KB(2的16次方) |
| 时钟周期 | 晶振周期(最小单位) |
| 机器周期(12MHz下) | 12个时钟周期 = 1μs(必记数值!) |
| 三大周期大小排序 | 时钟周期 < 机器周期 < 指令周期 |
📝 典型例题(按考试原题风格)
- (填空) 80C51单片机外部地址总线为16位,其最大可直接寻址的外部存储器空间为 ______ KB。
- 解:2^16 = 65536 字节 = 64KB。
- (判断) CPU中的控制器主要完成算术逻辑运算。( 错,控制器负责译码和控制,运算器才负责算术逻辑运算。)
- (选择) 在下列总线中,属于双向传输的是( )。
- A. 地址总线 B. 数据总线 C. 控制总线 D. 电源总线
- 答案:B。
- (简答/计算) 若80C51单片机晶振频率为6MHz,则一个机器周期是多少微秒?
- 解:机器周期 = 12 × 时钟周期 = 12 × (1/6MHz) = 12 × (1/6) μs = 2 μs。
- 结论:晶振越慢,机器周期越长。
- (排序题) 请将"指令周期、时钟周期、机器周期"按时间从短到长排列。
- 答案:时钟周期 < 机器周期 < 指令周期。
第三章搞定了。关键就是分清三个总线的方向,记住机器周期=1μs(12MHz下)。这节内容直接为第5章(80C51结构)打地基。
第四章
📘 第一部分:到底什么是"中断"?(请死磕这个生活类比)
想象一下你在家写数学作业(这是CPU正在执行的主程序):
- 突然门铃响了(这是中断请求——外部来了紧急事件)。
- 你合上作业本,在合上的那一页夹一支笔做记号(这是中断保护/压栈——保存当前做到哪了)。
- 你跑去开门,接过快递(这是中断处理——执行服务程序)。
- 快递员走了,你回到书桌前,翻开刚才夹笔的那一页,继续往下写(这是中断返回/出栈——恢复现场继续执行)。
官方定义翻译:
中断 = 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) |
| 中断嵌套条件 | 只有高优先级打断低优先级,同级不行 |
📝 典型例题(按考试原题风格)
- (填空) 中断处理过程中,保护断点和现场是通过 ______ 操作完成的。
- 答案:压栈(PUSH)
- (判断) CPU在任何一个时钟周期结束时都会去查询中断请求。( 错,是在每条指令执行完后去查询,不是每个时钟周期。)
- (选择) 关于中断优先级,下列说法正确的是( )。
- A. 高优先级中断可以被低优先级中断打断
- B. 同级中断可以互相嵌套
- C. 低优先级中断正在执行时,高优先级中断可以打断它
- D. 中断优先级只能通过硬件固定,不可改变
- 答案:C。A反了,B同级不行,D软件可改(IP寄存器)。
- (简答) 简述CPU响应中断的必要条件。
- 答:① 有中断源发出有效请求;② 该中断总允许位和对应分允许位均开启(EA=1且对应EX/ET/ES=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组(Bank0 | 临时变量、快速运算。当前使用哪一组由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分区 | 00 |
| 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 $ ; 原地死循环($表示当前地址)
逐行大脑模拟:
R0 = 40H(R0里存的是房间号40)。- 去房间
40H,把08H塞进去。 - 根据R0里的房间号
40H,去把08H取出来放到A里。 B = 05H。A × B = 08 × 05 = 40D = 28H。低字节28H放A,高字节00H放B。- 把A里的
28H存到地址40H(把原来的08覆盖了)。 - 停在这里。
最终答案:
- 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(简答):sbit 和 bit 在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μs。
- 每次计数的个数 = 256 - 156 = 100。
- 溢出时间 = 100 × 1μs = 100μs。
- 编程时,每次溢出翻转一次引脚(P1.2 = ~P1.2)。
- 方波的一个完整周期 = 高电平100μs + 低电平100μs = 200μs。
- 频率 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中使用)。
- REN:
1=允许接收,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) | ALE、PSEN、RD、WR等 | 部分双向 | 负责发号施令(“锁存地址!”“读!”“写!”) |
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综合应用,代码包含所有核心套路。
题目需求:
- LED1做秒闪指示灯(亮0.5秒,灭0.5秒)。
- 按键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 = 1400H,IP = 1200H。请问此时CPU执行的指令在内存的哪个物理地址?
解:
- 段地址左移1位(十六进制):
1400H× 16 =14000H(相当于后面添个0)。- 加上偏移地址:
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 = 1A00H,IP = 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怎么分配?
解:
- 物理地址 = 8 × 4 = 32(十进制)= 20H。
- 在内存的
00020H处取出的 低16位 是 IP(偏移地址)。- 在
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(通用串行总线)是现在最常用的外设接口。
- 核心特性(必背):
- 串行传输:数据排成一排走(不像PCI那样并排走,所以线少、便宜)。
- 支持热插拔:不需要关机就能直接插拔设备(U盘即插即用)。
- 总线供电:可以从接口直接取电(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。 - 扩展:
0000CH和0000DH存的是 IP,0000EH和0000FH存的是 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章的全部“白痴级”复习资料。接下来的任务就是翻回去,死磕第九章的定时器初值计算和第十七章的中断向量地址计算,这两道大题算对了,期末基本稳了。