8051硬件结构

主要功能方框图

这个方框图必须要看懂,各部分解释如下:

  1. 左边 CPU:中央处理单元(8位
  2. 左上 时钟:计算机的心脏,驱动着其他部分工作
  3. 中上 ROMRAM:ROM 的全称是 Read-Only Memory,用来存放程序,在单片机运行时不能改变,所以叫 Read-Only;RAM 的全称是 Random Access Memory,用于存放程序运行中产生的数据,可以随便读写,故叫 Random Access。
  4. 右上 定时器计数器:顾名思义,一个用来定时,时间到了后执行相应的程序;另一个则是计数,当计到某个数时执行相应的程序。
  5. 左下 中断:顾名思义,中断当前执行的程序,转去执行中断子程序。中断分为内部中断(由内部软件引起)与外部中断(由I/O口引起)
  6. 中下 I/O口:与外界交换数据的引脚。分为并行口 1 和串行口 1
  7. 中间 总线:传输数据、指令的线

下面这些数字都是要记住的:

  • 8位CPU
  • 128B 片内 RAM
  • 4×8个并行 IO 口
  • 2×16位定时/计数器
  • 5个中断源(2 个外部,3 个内部)
  • 22个特殊功能寄存器(SFR)
  • 128 位的位寻址区

具体后面会详细解释。

CPU

  CPU 里面有负责运算的 ALU 单元。ALU 可以用来加减乘除、与或非异或、移位、位处理。这里特别值得注意的是“位处理” ,这是 51 特有的。

  负责暂存数据的 工作寄存器。我们需要先将数据从 ram 或 rom 中读到工作寄存器,才能用 ALU 进行运算。一共有 4 个工作寄存器区,每个区有 8×8位工作寄存器(R0~R7,Register)。分区有点类似于多线程,可以用于快速切换到不同的程序。

  还有其他特殊功能的寄存器。比如8位的 累加器Acc(Accumulate,有时简称寄存器A),用于存放计算结果。寄存器B 用于与累加器A 配合完成乘除法。

  程序状态字PSW 是用于存放运算状态的特殊寄存器。每个 bit 都有意义。

  然后还有三个指针,用于告诉程序、数据在哪。数据指针 DPTR(Data Pointer)用于存放片外存储器地址,是 16 位的,也可以分成两个 8 位寄存器使用。堆栈指针 SP 指向 RAM 内的栈顶。程序计数器 PC 也是 16 位的,用于指示指令位置,会自增,所以叫计数器。

rom、ram 与 外部存储

  51可以存东西的有三栋楼。楼里每个房间就是一个 字节,而每个房间都有一个房间号称为 地址,从地址找到数据的过程称为 寻址。下面我们来解释上面三栋楼。

rom

  第一栋楼是 程序存储器 ROM。这栋楼最多可以有 $2^{16}$ 个字节(64K),从 0000H 到 0FFFFH(F 前面加 0 用来区分十六进制与变量)。然而 51 自带的只有 4KB(0000H 到 0FFFH),想要用完所有空间,需要外部扩展。

注意

  • 最多可以外部扩展 64KB,但内部 rom 和外部 rom 不能同时用;
  • 复位后,程序从 0000H 开始执行;
  • 中断后,程序从对应的 入口地址 开始执行。

ram

  中间那栋楼是最重要的 内部数据存储器 RAM。51 和 52 都有底下有 128 个字节,但上面 128 个字节是 52 独有的,51 只能通过外部扩展,两者加起来共 256B(00H~0FFH)。注意到上面两个都是 80H~0FFH,我们可以通过寻址方式来区分,也就是房间号虽然相同,但寻找的路径不同。

注意

  • 从 00H~1FH 的 32B 是 4 个工作寄存器组,每组都有 8 个寄存器(R0~R7)
  • 从 20H~2FH 的 16B 是可位寻址的RAM区,称为 位寻址区
  • 剩下 80B 是只能按字节寻址的内部 RAM,为用户区,用于放堆栈

  注意到上面还有一个 SFR 特殊功能寄存器区,主要有下面这些:

PC、Acc、B、DPTR(DPTR=DPH+DPL)上面已经介绍过了。下面主要介绍 PSW。

PSW 是一个 8 位寄存器,每一位都有意义(可以暂时不理解用处,但要记住什么时候为1):

  1. P 奇偶标志位(Acc 中的数有奇数个 “1” 时为1)
  2. / 无定义
  3. OV 溢出标志(有溢出为1)
  4. RS0 寄存器组选择位
  5. RS1 寄存器组选择位(和3.一起用)
  6. F0 用户标志位(用户自己用)
  7. AC 辅助进位标志位(低四位向高四位进位或借位时为1)
  8. CY 进位标志位(最高位进位或借位时为1)

  另外,虽然列出了地址,但我们只需要记名字即可。

注意

有些寄存器可以按位寻址,这些寄存器有一个特征:地址末尾以 0H 或 8H 结尾。


指令

这里介绍如何将 ROM 中的数据移到 RAM:

MOVC A, @A+DPTR ;将 [A+DPTR] 内的数据移到 A
MOVC A, @A+PC ;将 [A+PC] 内的数据移到 A

  在 51 中,寄存器前面加 @ 表示寄存器所指向的地址内的数据。而解释里面,我们用 [地址] 表示地址内的数据。

外部存储

  既然可以扩展 ROM,那么也可以扩展 RAM,也就是我们的第三栋楼。这个与rom类似,都是最大扩展 64KB。

指令

如何在内部 RAM 与 外部 RAM 之间交换数据

MOVX A, @Ri ;外部移到内部
MOVX A, @DPTR ;外部移到内部
MOVX @Ri, A ;内部移到外部
MOVX @DPTR, A ;内部移到外部

你可能会问为什么 @Ri@DPTR 指的是外部而不是内部,这是因为 Ri=R1 或 R0,DPTR 都是 16位的,寻址范围是 64KB,只能指向外部ram地址(内部ram地址是8位的)

这里 X 表示 eXternal(外部的)。

IO端口(管脚)

  IO端口就是你买到单片机后,像毛毛虫的脚的那部分。每一个脚叫 管脚。最常用的是端口线,有如下特点:

  • 51 有 4 个双向的 8位并行 IO 口:P0~P3(每个IO口对应8个管脚)
  • 每一个口有一个 8 位的锁存器
  • 复位后的初始状态为全“1”

  此外,还有电源线(VCC,VSS)、数据线(ALE/PROG,EA/VPP,PSEN,XTAL1/XTAL2),下面来介绍一下各个管脚的硬件特点。

P0

  • 可用作并行 IO 口,也可作为数据总线低 8 位或程序总线高 8 位
  • 可以有三种状态:0、1、高阻态
  • 无上拉电阻

P1

  • 供用户使用的 IO 口,是准双向口
  • 有上拉电阻

P2

  • 准双向口
  • 可用作并行 IO 口,也可作为数据总线高8位

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 外部数据写信号
    • P3.7 RD 外部数据读信号

复位电路(RST脚)

  复位电路的功能:在系统上电时提供复位信号,即在复位管脚 RST 加一段时间的高电平(24个时钟周期),直到系统电源稳定后,撤销复位信号。

具体细节可以参考:单片机复位电路原理介绍

复位后:

  • PC 为 0000H,即程序入口地址是 0000H
  • PSW=00H
  • SP=07H,即栈底是07H
  • P1、P2、P3 口为全 1 状态
  • 内部 RAM 不受影响

CPU时序(XTAL1/XTAL2)

  这里我们并不介绍电路原理,但要介绍几个重要概念:

  • 时钟周期(振荡周期):外部的时钟周期
  • 机器周期:机器执行一个指令的周期,一个机器周期对应12个时钟周期
  • 状态周期:一个机器周期分为 6 个状态周期,表示指令过程中的各个状态。

  一般51上采用的是 11.0592MHz,请计算一下 1s 能执行多少个指令?

工作方式

  单片机只有可能处于这几种工作方式:

  • 复位方式
  • 程序执行方式
    • 单步执行
    • 连续执行
    • 中断调试
  • 低功耗方式
    • 待机方式(退出:中断或复位)
    • 掉电保护方式(退出:复位)
  • 编程、校验方式
  1. 并行:能够同时收发多位数据;串行:每次只能收发一位数据。  2