PIC单片机16F84的内部硬件资源(1)
上期笔者介绍的 PIC16F84 点亮一只发光二极管的源程序实例是为了说明 PIC 单片机 16F84 具体应用时的基本格式。 现在我们已经知道要单片机工作,就需用汇编语言编制程序。而对某个 PIC 单片机编程时,还需对选用的 PIC 单片机内部硬件资源有所了解。这里介绍 PIC16F84 单片机的内部结构,如图 1 所示的框图。由图 1 看出,其基本组成可分为四个主要部分,即运算器 ALU 和工作寄存器 W;程序存储器;数据存储器和输入/输出(I/O)口;堆栈存储器和定时器等。现分别介绍如下。
1. 运算器 ALU 及工作寄存器 W 运算器 ALU 是一个通用算术、逻辑运算单元,用它可以对工作寄存器 W 和任何通用寄存器中的两个数进行算术(如加、减、乘、除等)和逻辑运算(如与、或、异或等)。16F84 是八位单片机,ALU 的字长是八位。在有两个操作数的指令中,典型的情况是一个操作数在工作寄存器 W 中,而另一个操作数是在通用寄存器中,或者是一个立即数。在只有一个操作数的情况下,该数要么是在工作寄存器 W 中,要么是在通用寄存器中。W 寄存器是一个专用于 ALU 操作的寄存器,它是不可寻址的。 根据所执行的指令,ALU 还可能会影响框图中状态寄存器 STATUS 的进位标志 C、全零标志 Z 等。
2. 程序存储器单片机内存放程序指令的存储器称为程序存储器。PIC16F84 的所有指令字长为 14 位。所以程序存储器的各存储单元是 14 位宽。一个存储单元存放一条指令。16F84 的程序存贮器有 1024(28)个存储单元(存储容量为 1k)。这些程序存储器都是由 FPEROM 构成的。 程序存储器是由程序计数器 PC 寻址的。16F84 的程序计数器为 13 位宽,可寻址 8K(8×1024)的程序存储器空间,但 16F84 实际上只使用了 1k 的空间(单元地址为 0~3FFH)。
当访问超过这些地址空间的存储单元时,将导致循环回到有效的存储空间。 对于用过其它单片机的用户,可能会感到 16F84 的片内存储器容量太少了。实际上并非如此,因为 16F84 的指令系统都是由单字指令构成的,相应于其它由二字节、三字节甚至四字节指令的单片机而言,PIC 单片机的程序存储器有效容量要比标称值扩大 2?5 倍到 3 倍。 3 数据存储器在单片机 PIC16F84 中,除了有存放程序的程序存储器外,还有数据存储器。
单片机在执行程序过程中,往往需要随时向单片机输入一些数据,而且有些数据还可能随时改变。在这种情况下就需用数据存储器。由于数据存储器不但要能随时读取存放在其各个单元内的数据,而且还需随时写进新的数据,或改写原来的数据。因此,数据存储器需由随机存储器 RAM 构成。RAM 存储器在断电时,所存数据随即丢失,这在实际应用中有时会带来不便。但是,在 16F84 中有 64×8 位 E2PROM 数据存储器。
存放在 E2PROM 中的数据在断电时不会丢失。 16F84 中的 RAM 数据存储器如表 1 所示,该 RAM 分为两个存储体:即存储体 0(Bank0)和存储体 1(Bank1)。每个存储体均可以直接用内部总线传送信息,所以它们都是以寄存器方式工作和寻址。这些八位寄存器,又可分为通用寄存器和专用寄存器两个部分。通用寄存器存放数据,专用寄存器存放控制单片机运作的信息。每个存储体最大可扩展到 7FH(128 个字节)。
在每个存储体中,专用寄存器被安排在低位地址空间,通用寄存器被安排在高位地址空间。 通用寄存器用法单一,但专用寄存器却各有各的用处,现将较基本的专用寄存器作一简单介绍。
(1)程序计数器(PCL、PCLATH)。程序计数器 PC 是对程序进行管理的计数器。PIC16F84 的程序计数器为 13 位宽,最大可寻址的存储空间为 8k×14 位。实际上 16F84 只使用前 1k×14 位(0000~03FFH)存储空间。因程序计数器有 13 位宽,而专用寄存器只有 8 位。因此 PC 由两个专用寄存器构成。其低八位 PCL 是一个可读/写寄存器(地址为 02H 或 82H),而高字节 PCH(有效位 5 位)不能直接进行读/写操作,它是通过一个 8 位的保持寄存器 PCLATH(地址为 0A 或 8AH)把高 5 位地址传送给程序计数器的高字节。当执行 CALL、GOTO 指写 PCL 时,PC 值的高字节就从 PCLATH 寄存器中装入。
(2)状态寄存器 STATUS。状态寄存器 STATUS 含有算术逻辑单元 ALU 运算结果的状态(如有无进位等)、复位状态及数据存储体选择位。有关位位的设定如表 2 所示,功能如下:
1)第 0 位。进位/借位位 C。执行加、减运算指令表 2 IRP RP1 RP0 TO PD Z DC C 后,若结果有进位或借位,则 C 被置 1,否则置 0。在执行移位指令时,也要用到这一位。
2)第 1 位。辅助进位/借位位 DC。执行加、减运算指令后,若结果的低四位向高四位有进位或借位,则 DC 置 1,否则置 0。
3)第 2 位。零标志位运算结果为零,Z 被置 1;运算结果不为零,Z 被清零。
4)第 3 位。低功耗标志位 PD。上电复位或执行 CLRWDT 指令后置 1,执行 SLEEP 指令后被清零。
5)第 4 位。定时时间到标志位 TO。上电复位或执行 CLRWDT、SLEEP 指令后被置 1,监视定时器的定时时间到被清零。
6)第 5 位和第 6 位(RP0、RP1)。这两位是用于直接寻址时的寄存器体选择位。即 00——选中 Bank0(00H~7FH);01——选中 Bank1(80H~FFH),16F84 只有两个存储体。故 10、11 不用。
7)第 7 位 IRP。这是间接寻址的寄存体选择位。0——选中 Bank0、1(00H~FFH),1——选中 Bank2、3。16F84 只有 Bank0、1,所以此 IRP 位应被置为 0。
(3)间接寻址 INDF 和 FSR 寄存器 INDF 寄存器不是一个物理寄存器,而是一个逻辑功能的寄存器(地址为 00H 或 80H),当对 INDF 寄存器进行寻址时,实际上是访问 FSR 寄存器内容所指的单元,即把 FSR 寄存器作为间接寄存器使用。FSR 称为“寄存器选择”寄存器,地址为(04H 或 84H)。对 INDF 寄存器本身进行间接寻址访问,将读出 FSR 寄存器的内容,例如当 FSR=00H 时,间接寻址读出 INDF 的数据将为 00H。
用间接寻址方式写入 INDF 寄存器时,虽然写入操作可能会影响 STATUS 中的状态字,但写入的数据是无效的。 4 I/O 口单片机作为一个控制器件必定有数据输入和输出。输入量可能是温度、压力、转速等,而输出量可能是开关量和数据,以保证受控过程在规定的范围内运行。数据的输入和输出都需通过单片机内部有关电路,再与引脚构成输入/输出(I/O)端口。PIC16F84 芯片有两个 I/O 端口(PROTA 和 PORTB)。
端口 A 为 5 位口,端口 B 为 8 位口,共占用 13 位引脚。每个端口由一个锁存器(即数据存储器中的特殊功能寄存器 05H、06H 单元)、一个输出驱动器和输入缓冲器等组成。当把 I/O 口作输出时,数据可以锁存;作输入口时,数据可以缓冲。 16F84 PORTA 口中的 RA4 是斯密特触发输入、漏极开路输出。而其它的 RA 口引脚都是 TTL 电平输入和全 CMOS 驱动输出。端口 PORTB 是一个八位双向可编程 I/O 口。
各端口虽然也由锁存器、驱动器、缓冲器等构成,但因功能略有不同而导致电路亦存在差别。现以 PORTA 口的 RA0 ~RA3 的电路(见左图)为例,说明其基本工作原理。 图中 RA 口的 I/O 引脚是由数据方向位(寄存器 TRISA)来定义数据流向。当 TRISA 寄存器的位置为“1”时,其输出驱动器(由 P 沟道和 N 沟道 MOS 管串接而成)呈高阻态,即两个 MOS 管均截止,I/O 口被定义为输入。此时,数据由 I/O 端输入,经 TTL 输入缓冲器到 D 触发器。
当执行读指令时,此 D 触发器使能,数据经三态门进入数据总线。 当 TRISA 的位置为“0”时,I/O 口被定义为输出,此时输出锁存器的输出电平就是 I/O 口的输出电平。 读 PORTA 寄存器的结果就是读取 I/O 引脚上的电平,而写 PORTA 寄存器的结果是写入 I/O 锁存器。所有的写 I/O 口的操作都是一个“读入/修改/写入”的过程,即先读 I/O 引脚电平,然后由程序修改(按要求给定一个值),再置入 I/O 锁存器。
PIC16F84 的输出可提供 20mA 的电流,所以它可直接驱动 LED。PORTA 和 PORTB 各个位均可分别定义为输入和输出。下面以 PORTA 口初始化程序的实例,说明选择 I/O 口的方法。 CLRF PORTA;端口 A 被清零 BSF STATUS;状态寄存器 STATUS 的 RPO 位置为 1,选 BANK1。 MOVLW 0xCF;将定向值;11001111 置入 W 工作寄存器 MOVWF TRISA;置 RA(3~0)位为输入;RA5?4 位为输出;TRISA7?6 位未用在使用 I/O 口时应注意:
(1)当需要一个 I/O 口一会做输入、一会又做输出时,输出值会不确定。
(2)I/O 引脚输出驱动电路为 CMOS 互补推挽输出。当其为输出状态时,不能与其它输出脚接成“线或”或“线与”,否则,会因电流过载烧坏单片机。
(3)当对 I/O 口进行写操作后不宜直接进行读操作,一般要求在两条连续的写、读指令间至少加入一条 NOP 指令。 例:MOVWF 6;写 I/O NOP;稳定 I/O 电平 MOVF 6,W;读 I/O
5. 堆栈单片机执行程序时,常常要执行调用子程序。这样就产生了一个问题:如何记忆是从何处调用的子程序,以便执行子程序之后正确返回。此外,在程序执行过程中,还可能会发生中断,转而执行中断子程序,这时,又如何记忆从何处中断,以便返回呢? 满足上述功能的方法就是“堆栈”技术。 “堆栈”是一个用来保存临时数据的栈区。当主程序调用子程序时,单片机执行到 CALL 指令或发生中断时,就自动将下一条指令的地址“压栈”保存到栈区。
当子程序结束,单片机执行返回指令时,就自动地把栈区的内容“弹出”,作为下步指令执行的新地址。 PIC16F84 芯片内有一个 8 级 13 位宽(与 PC 同宽)的硬件堆栈,此堆栈既不占用程序存储空间,也不占用数据存储空间。当执行一条 CALL 指令或一个中断被响应后,程序计数器 PC 中的断点地址就自动被压栈(PUSH)保护,而当执行 RETURN、RETLW 或者 RETFIE 指令时,堆栈中的断点地址会弹回(POP)程序计数器 PC 中。
无论是 PUSH 还是 POP 操作,都不影响 PCLATH 寄存器的内容。 ?成都卫东知识竞赛试题:19?简述 PIC 单片机 I/O 口的功能。
20. PIC16C64A/RL64 与 PIC16C65 的管脚数相等,管脚功能相近,但 PIC16C64A/RL64 的{16}脚无 CCP2、{25}脚无 TX/CK、{26}脚无 RX/DT 等功能,试绘出 PIC16C64A/RL64 的管脚功能图。