1、通过前面课程的学习,我们已知道了单片机的内部有 ROM、有 RAM、有并行 I/O 口,那么,除了这些东西之外,单片机内部究竟还有些什么?这些个零碎的东西怎么连在一起的?下面就让我们来对单片机内部作一个完整的分析吧! 从图中我们可以看出,在 51 单片机内部有一个 CPU 用来运算、控制,有四个并行 I/O 口,分别是 P0、P1、P2 、P3,有 ROM,用来存放程序,有 RAM,用来存放中间结果,此外还有定时/计数器,串行 I/O 口,中断系统,以及一个内部的时钟电路。在一个 51 单片机的内部包含了这么多的东西。对图进行进一步的分析,我们已知,对并行 I/O 口的读写只要将数据送入到相应
2、 I/O 口的锁存器就可以了,那么对于定时/计数器,串行 I/O 口等怎么用呢?在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。事实上,我们已接触过 P1 这个特殊功能寄存器了,还有哪些呢?看下表 符号 地址 功能介绍B F0H B 寄存器 ACC E0H 累加器 PSW D0H 程序状态字 IP B8H 中断优先级控制寄存器 P3 B0H P3 口锁存器 IE A8H 中断允许控制寄存器P2 A0H P2 口锁存器SBUF 99H 串行口锁存器 SCON 98H 串行口控制寄存器 P1 90H P1 口锁存器 TH1 8DH 定时器/计数器 1(高 8
3、位)TH0 8CH 定时器/计数器 1(低 8 位)TL1 8BH 定时器/计数器 0(高 8 位)TL0 8AH 定时器/计数器 0(低 8 位)TMOD 89H 定时器/计数器方式控制寄存器 TCON 88H 定时器/计数器控制寄存器 DPH 83H 数据地址指针(高 8 位)DPL 82H 数据地址指针(低 8 位)SP 81H 堆栈指针 P0 80H P0 口锁存器PCON 87H 电源控制寄存器下面,我们介绍一下几个常用的 SFR。 1、ACC-是累加器,通常用 A 表示。这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为
4、在运算器做运算时其中一个数一定是在 ACC 中的缘故吧。它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类指令都离不开它。自身带有全零标志 Z,若 A0 则 Z1;若 A0 则 z0。该标志常用作程序分枝转移的判断条件。 2、B-一个寄存器。在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。3、PSW-程序状态字。这是一个很重要的东西,里面放了 CPU 工作时的很多状态,借此,我们可以了解 CPU 的当前状态,并作出相应的处理。它的各位功能请看下表:D7 D6 D5 D4 D3 D2 D1 D0CY AC F0 RS1 RS0 OV P下面我们逐一介绍各位的用途
5、CY:进位标志。8051 中的运算器是一种 8 位的运算器,我们知道, 8 位运算器只能表示到0-255,如果做加法的话,两数相加可能会超过 255,这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。这样就没事了。有进、借位,CY1;无进、借位,CY0 例:78H+97H( 01111000+10010111)AC:辅助进、借位(高半字节与低半字节间的进、借位) 。 例:57H+3AH(01010111+00111010) F0:用户标志位,由用户(编程人员)决定什么时候用,什么时候不用。 RS1、RS0:工作寄存器组选择位。这个我们已知了。0V:溢出标志位。运算结果按补码运算理
6、解。有溢出, OV=1;无溢出,OV0。什么是溢出我们后面的章节会讲到。P:奇偶校验位:它用来表示 ALU 运算结果中二进制数位 “1”的个数的奇偶性。若为奇数,则 P=1,否则为 0。 运算结果有奇数个 1,P1;运算结果有偶数个 1,P0。例:某运算结果是 78H(01111000 ),显然 1 的个数为偶数,所以 P=0。4、DPTR(DPH、DPL)-数据指针,可以用它来访问外部数据存储器中的任一单元,如果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。 分成 DPL(低 8 位)和 DPH(高 8 位)两个寄存器。用来存放 16 位地址值,以便用间接寻址或变址寻址的方式对片外
7、数据 RAM 或程序存储器作 64K 字节范围内的数据操作。5、P0、P1 、P2、P3- 这个我们已经知道,是四个并行输入/输出口的寄存器。它里面的内容对应着管脚的输出。6、IE- 中断充许寄存器按位寻址,地址:A8HB7 B6 B5 B4 B3 B2 B1 B0EA - ET2 ES ET1 EX1 ET0 EX0EA (IE.7 ):EA=0 时,所有中断禁止(即不产生中断)EA=1 时,各中断的产生由个别的允许位决定- (IE.6 ):保留ET2(IE.5):定时 2 溢出中断充许(8052 用)ES (IE.4 ):串行口中断充许(ES=1 充许,ES=0 禁止)ET1(IE.3):
8、定时 1 中断充许EX1(IE.2 ):外中断 INT1 中断充许ET0(IE.1):定时器 0 中断充许EX0(IE.0 ):外部中断 INT0 的中断允许7、IP-中断优先级控制寄存器按位寻址,地址位 B8HB7 B6 B5 B4 B3 B2 B1 B0- - PT2 PS PT1 PX1 PT0 PX0- (IP.7):保留- (IP.6):保留PT2(IP.5):定时 2 中断优先( 8052 用)PS (IP.4):串行口中断优先PT1(IP.3):定时 1 中断优先PX1(IP.2 ):外中断 INT1 中断优先PT0(IP.1):定时器 0 中断优先PX0(IP.0 ):外部中断
9、 INT0 的中断优先8、TMOD-定时器控制寄存器不按位寻址,地址 89HB7 B6 B5 B4 B3 B2 B1 B0GATE C/T M1 M0 GATE C/T M1 MGATE :定时操作开关控制位,当 GATE=1 时,INT0 或 INT1 引脚为高电平,同时 TCON中的 TR0 或 TR1 控制位为 1 时,计时/计数器 0 或 1 才开始工作。若 GATE=0,则只要将TR0 或 TR1 控制位设为 1,计时/计数器 0 或 1 就开始工作。C/T :定时器或计数器功能的选择位。C/T=1 为计数器,通过外部引脚 T0 或 T1 输入计数脉冲。C/T=0 时为定时器,由内部
10、系统时钟提供计时工作脉冲。M1 :模式选择位高位M0 :模式选择位低位M1 M0 工作模式0 0 13 位计数/计时器0 1 16 位计数/计时器1 0 8 位自动加载计数/计时器1 1定时器 1 停止工作,定时器 0 分为两个独立的 8 位定时器 TH0 及TL09、TCON-定时器控制寄存器按位寻址,地址位 88H B7B6 B5 B4 B3 B2 B1 B0TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0IT0(TCON.0 ),外部中断 0 触发方式控制位。 当 IT0=0 时,为电平触发方式。 当 IT0=1 时,为边沿触发方式(下降沿有效)。IE0(TCON.1 ),
11、外部中断 0 中断请求标志位。IT1(TCON.2 ),外部中断 1 触发方式控制位。IE1(TCON.3 ),外部中断 1 中断请求标志位。TF1(TCON.7):T1 溢出中断请求标志位。T1 计数溢出时由硬件自动置 TF1 为1。CPU 响应中断后 TF1 由硬件自动清 0。T1 工作时,CPU 可随时查询 TF1 的状态。所以,TF1 可用作查询测试的标志。 TF1 也可以用软件置 1 或清 0,同硬件置 1 或清 0 的效果一样。 TR1(TCON.6):T1 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时,T1 停止工作。TR1 由软件置 1 或清 0。所以,用
12、软件可控制定时/计数器的启动与停止。TF0(TCON.5):T0 溢出中断请求标志位,其功能与 TF1 类同。 TR0(TCON.4):T0 运行控制位,其功能与 TR1 类同。10、SP-堆栈指针。堆栈介绍:日常生活中,我们都注意到过这样的现象,家里洗的碗,一只一只摞起来,最晚放上去的放在最上面,而最早放上去 的则放在最下面,在取的时候正好相反,先从最上面取,这种现象我们用一句话来概括:“先进后出,后进先出”。请大家想想,还有什么地方有这种现象?其实比比皆是,建筑工地上堆放的砖头、材料,仓库里放的货物,都是“先进后出,后进先出”这实际是一种存取物品的规则,我们称之为“堆栈”。在单片机中,我们
13、也可以在 RAM 中构造这样一个区域,用来存放数据,这个区域存放数据的规则就是“先进后出,后进先出”,我们称之为“ 堆栈” 。为什么需要这样来存放数据呢?存储器本身不是可以按地址来存放数据吗?对,知道了地址的确就可以知道里面的内容,但如果我们需要存放的是一批数据,每一个数据都需要知道地址那不是麻烦吗?如果我们让数据一个接一个地放置,那么我们只要知道第一个数据所在地址单元就可以了(看图2)如果第一个数据在 27H,那么第二、三个就在 28H、 29H 了。所以利用堆栈这种方法来放数据可以简化操作。那么 51 中堆栈什么地方呢?单片机中能存放数据的区域有限,我们不能够专门分配一块地方做堆栈,所以就
14、在内存(RAM)中开辟一块地方,用于堆栈,但是用内存的哪一块呢?还是不好定,因为 51 是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题?分不好干脆就不分了,把分的权利给用户(编程者),根据自已的需要去定吧,所以 51 单片机中堆栈的位置是可以变化的。而这种变化就体现在 SP 中值的变化,看图2,SP 中的值等于 27H 不就相当于是一个指针指向 27H 单元吗?当然在真正的 51 机中,开始指针所指的位置并非就是数据存放的位置,而是数据存放的前一个位置,比如一开始指针是指向 27H 单元的,那么第一个数据的位置是
15、28H 单元,而不是 27H 单元,为什么会这样,我们在学堆栈命令时再说明。如下图 803l 单片机共有 21 个字节的特殊功能寄存器 (SFR),起着专用寄存器的作用,用来设置片内电路的运行方式,记录电路的运行状态,并表明有关标志等。此外,特殊功能寄存器中,还有把并行和串行 IO 端口映射过来的寄存器,对这些寄存器的读写,可实现从相应IO 端口的输入、输出操作。21 个特殊功能寄存器不连续地分布在 128 个字节的 SFR 存储空间中,地址空间为 80H-FFH,见下图。带*的表明是有位地址的寄存器。在这片 SFR 空间中,包含有 128 个位地址空间,地址也是 80H-FFH,但只有 83 个有效位地址,可对 11 个特殊功能寄存器的某些位作位寻址操作。由此可见,在特殊功能寄存器中,也有两套地址:字节地址和位地址。两者在地址空间上都是 80H-FFH,但对字节地址只有 21 个字节是有效的,对位地址只有 83 位是有效的,可以说,它们是内部数据存储器中字节地址与位地址的不连续延伸。其他无效地址单元是不能被访问的,在使用时应加以注意。