案例解说单片机C语言开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 PIC16F87XA的体系结构

PIC16F87XA系列单片机的主要特点如下:

PIC16F87XA系列单片机包括PIC16F873A、PIC16F874A、PIC16F876A和PIC16F877A等型号,各个型号的对比如表1.1所示。

表1.1 PIC16F87XA系列单片机

● 采用RISC结构,速度快,性能高。

● 仅有35条单字指令,除了程序分支指令需要两个执行周期之外,都仅需要一个执行周期。

● 最高支持20MHz的时钟输入频率。

● 内置4KB/8KB的14位Flash程序存储器、368/192字节的数据存储器、128/256字节的E2PROM数据存储器。

● 提供14个中断源的中断系统。

● 内置8级深度的硬件堆栈。

● 内置上电复位(POR)、上电定时器(PWRT)和振荡启动定时器(OST)。

● 内置三个定时/计数器,包括带预分频的8位定时/计数器Timer0;带预分频的、可以使用外部晶体振荡时钟的16位定时/计数器 Timer1;带有8位周期寄存器、预分频器和后分频器的8位定时/计数器Timer2。

● 内置2个16位最大分辨率为12.5ns的捕捉器;

● 内置2个16位最大分辨率为200ns的比较器。

● 内置2个最大分辨率为10位的PWM模块。

● 内置5~8通道的10位多通道A/D模块。

● 内置带有SPI(主模式)和I2C(主/从)模式的SSP。

● 内置带有9位地址探测的通用同步异步发送/接收器(USART/SCI)。

● 内置带RD(读)、WR(写)、CS(使能)的并行端口。

● 内置支持降压复位的降压检测模块。

● 内置监视定时器(WDT)和片内RC振荡器。

● 支持在线串行编程ICSP和单5V电压供电的内部电路串行编程。

● 支持2.0~5.5V的宽电压工作。

PIC16F87XA系列单片机提供28/40引脚的PDIP、SOIC、PLCC和QFP封装可供用户选择,图1.1是40引脚的PDIP封装PIC16F877A/PIC16F874A引脚示意,部分说明如下。

图1.1 40引脚PDIP封装的PIC16F877A/PIC16F874A引脚示意

外部I/O引脚RA~RE:具有第二或者第三功能的I/O引脚,详细可以参考3.1节。

● MCLR/Vpp/THV:复位输入、可编程电压输入或者高电压测试模式控制引脚,当用作复位输入的时候,为Active Low动作。

● OSC1/CLKI:振荡器输入/外部时钟源输入引脚。

● OSC2/CLKO:振荡器输出引脚,在振荡模式下该引脚应该连接到外部晶体/晶振,在RC模式下,该引脚输出为OSC1上频率四分频的时钟信号CLKOUT。

● Vss:电源地引脚。

● VDD:电源输入引脚。

PIC16F877A/PIC16F874A单片机的组成结构如图1.2所示,它由 ALU、通用寄存器、Flash程序存储器、RAM数据存储器、中断模块和其他扩展资源组成。

图1.2 PIC16F877A/PIC16F874A单片机的组成结构

注意:本书通常使用PIC16F877A/PIC16F874A作为讲解示范,关于PIC16F873A/PIC16F876A读者可以自行参阅相应的资料。

1.1.1 PIC16F87XA的内核

PIC16F87XA的内核由算术逻辑单元ALU、工作寄存器W、状态寄存器组成。

1.算术逻辑单元ALU和工作寄存器W

算术逻辑单元(ALU)是PIC16F87XA单片机内核中负责执行各种算术和逻辑运算操作的部件,其基本操作包括加、减、乘、除四则运算(算术运算),与、或、非、异或等逻辑操作(逻辑预算),以及移位、比较和传送等操作。

ALU可以对PIC16F87XA单片机的工作寄存器W(Working Register)中的数据和其他寄存器中的数据进行数学和逻辑操作,同时它也会修改状态寄存器S(STATUS Register)中的相应状态位,包括全零标志Z(Zero Flag)、进位/借位标志C(Carry Flag)及数字进位/借位标志DC(Digit Carry Flag)。

PIC16F87XA单片机的工作寄存器W也通常被称为W寄存器,它是一个独立于数据存储器之外的8位寄存器,只能通过相应的指令进行操作,无法通过寻址的方式进行操作。

2.状态寄存器S

PIC16F87XA单片机的状态寄存器S(STATUS Register)用于展示单片机的相应状态,其内容包括 ALU计算结果的状态、单片机的复位状态及数据存储器的选择位状态,其内部结构如表1.2所示。

表1.2 状态寄存器S的内部结构

需要注意的是,TO和PD两位是只读的,而并不是所有的操作指令都会影响到 Z、DC和C标志位。

3.程序计数器PC

PIC16F87XA的程序计数器(Program Counter)用来记录下一条需要执行的指令在程序存储器中的地址,其宽度为13位,可以寻址8KB的程序空间。当单片机执行完当前的指令后,会将下一条指令的地址放入PC中。

13位的PC计数器可以分为PCL[7~0]和PCH[13~8]两部分,前者是一个存储器映像寄存器,地址为0x02,而后者则不能直接进行操作。

在通常情况下,PC内值的变化情况为以下三种情况之一:

● 连续递增,此时PC的值自动增加。

● 调用Goto和Call指令进行跳转,此时PC中[10~0]位由指令给出,而PC中[12~11]位由PCLATH寄存器的[4~3]位给出。

● 使用 PCL寄存器作为操作数和目的寄存器,此时单片机使用查表操作,PC[7~0]来自PCL寄存器,而PC[12~8]则来自PCLATH[4~0]。

4.堆栈Stack

PIC16F87XA内部集成了一个宽度为13位、8层深的硬件堆栈,用于放置当程序中有中断或者子程序调用时程序计数器PC的内容。

注意:PIC16F87XA的堆栈空间是一个独立的空间,并不属于任何存储器空间,其指针(堆栈指针SP)也不能被读取或者控制。

当 PIC16F87XA的中断发生的时候,PC的值被压入堆栈中,然后将中断矢量的地址(0x04)送入 PC,应用代码从中断服务子程序开始执行;当中断服务子程序执行完成后,从堆栈中取出之前的PC值并且继续执行。

除了 PC值之外,在中断发生或者调用子程序的时候,还需要将相应的参数值压入堆栈中,这个动作被称为压栈(PUSH),将参数从堆栈中取出的动作称为弹出(POP),但是PIC16F87XA并没有提供相应的指令,所以用户需要自己保护相应的值。

由于PIC16F87XA的堆栈有8层深度,按照先进后出、后进先出的规则实现进栈和出栈操作。8层深度通常来说是够用的,但是如果已经 PUSH了8个PC值之后继续 PUSH,则会出现第9个值占据了第1个值位置的情况,此时PIC16F87XA并不会有任何溢出或者警告标志,因此如果有多层程序调用时,需要注意堆栈的溢出问题。

5.选择寄存器OPTION_REG

选择寄存器OPTION_REG用于设置输入/输出端口(PORTB)的特殊功能及定时计数器(Timer0)的相应功能,包括预分频、外部中断设置,TMR0和弱上拉等,表1.3是选择寄存器的内部结构说明。

表1.3 PIC16F87XA选择寄存器的内部结构

● RBPU:PORTB上拉电阻设置位,当设置为“1”时,禁止 PORTB的上拉电阻;当设置为“0”时,使能独立的上拉电阻位。

● INTEDG;外部中断触发电平设置位,当设置为“1”时,设置为上升沿触发中断;当设置为“0”时,设置为下降沿触发中断。

● T0CS:TMR0的时钟源选择位,当设置为“1”时,选择 RA4/T0CK1引脚上的输入信号为时钟源;当设置为“0”时,使用内部时钟CLKOUT为时钟源。

● T0SE;TMR0的时钟边缘选择位,当设置为“1”时,选择 RA4/T0CK1引脚上的下降沿作为时钟的触发信号;当设置为“0”时,选择 RA4/T0CK1引脚上的上升沿为时钟的触发信号。

● PSA:分频器设置位,当设置为“1”时,将分频器分配给WDT(看门狗)使用;当设置为“0”时,将分频器分配给TMR0使用。

● PS2~PS0:分频器分频选择位,如表1.4所示。

表1.4 PIC16F87XA的分频器分频选择位

1.1.2 PIC16F87XA的存储器体系

PIC16F87XA的存储器体系由三部分构成:程序存储器、数据存储器以及E2PROM。

1.程序存储器

在1.1.1节中介绍过 PIC16F87XA的程序计算器为13位,所以最多可以寻址8KB×14的存储器空间,表1.5是PIC16F87XA系列单片机的程序空间大小列表。

表1.5 PIC16F87XA系列单片机的程序空间

PIC16F87XA的程序存储器以2KB的大小为单位分页,所以这四款单片机的存储器的分页数也不同,如果用户的程序代码比较大,有跨页的情况出现时,就必须做相应的寄存器设置,以保证程序代码可以跨页执行。

注意:MPLAB等综合开发工具可以自动进行相应的保护设置。

图1.3是PIC16F87XA的程序存储器的结构示意。

图1.3 PIC16F87XA的程序存储器的结构

程序存储器中有两个特殊地址,一个是复位矢量,一个是中断矢量。

● 复位矢量:地址为0x0000,是程序计数器 PC在PIC16F87XA 复位后的默认位置,是程序的起始地址。

●中断矢量:地址为0x0004,当 PIC16F87XA检测到一个中断并且中断被使能之后,程序计数器PC会自动跳转到该地址。

2.数据存储器

数据存储器用于存放PIC16F87XA的程序代码在执行过程所需要的数据,可以分为专用寄存器和通用寄存器两种,前者是PIC16F87XA的内核和外围模块所使用的寄存器,用于控制这些模块的工作并反映它们的工作状态,又被称为存储器映像寄存器;后者是给用户自行定义和使用的,用于存储程序执行中所需要存储的变量。

PIC16F87XA的数据存储器可以分为4个Bank,每个Bank大小为128字节,通过设置状态寄存器S中RP0和RP1位来选择使用哪个Bank空间。

注意:在使用不同Bank中的存储器地址时,必须先切换RP0和RP1位,但是对于部分常用的寄存器,相同地址、不同Bank的位置都会对应到相同的寄存器,所以可以忽略。

图1.4和图1.5分别是PIC16F876A/877和PIC16F873A/874的数据存储器空间示意。

图1.4 PIC16F876A/877的数据存储器空间

图1.5 PIC16F873A/874的数据存储器空间

以PIC16F876A/877为例,共有368个8位宽度的RAM单元,分为Bank0~Bank3共4个区间。

Bank0:由96字节单元组成,地址为0x020~0x07F。

Bank1:由80字节单元组成,地址为0x0A0~0x0EF。

Bank2:由96字节单元组成,地址为0x110~0x16F。

Bank3:由96字节单元组成,地址为0x190~0x1EF。

其中,Bank0中最高的16字节单元(0x070~0x07F)比较特殊,可以在Bank1~Bank3中通过最高的16个地址单元(0x0F0~0x0EF/0x170~0x17F/0x1F0~0x1FF)直接索引。

注意:这里讨论的368字节的空间是指通用寄存器,不包括每个Bank低地址端的专用寄存器。

表1.6~表1.9给出了PIC16F87XA的Bank0~Bank3中的专用寄存器列表。

表1.6 Bank0中的专用寄存器

表1.7 Bank1中的专用寄存器

表1.8 Bank2中的专用寄存器

表1.9 Bank3中的专用寄存器

3.Data E2PROM和Flash ROM

Flash ROM是PIC16F87XA的程序存储器,可以通过内置的Data E2PROM和相应的寄存器控制来实现读/写。其空间和数据存储器不同,不属于数据存储器,所以需要使用专用寄存器进行操作。与Data E2PROM和Flash ROM相关的寄存器包括:控制寄存器EECON1和EECON2、数据寄存器EEDATAH和EEDATA,以及地址寄存器EEADRH和EEADR。

注意:由于Data E2PROM的数据和地址都只有8位,使用EEDATA和EEADR寄存器即可;而对Flash ROM进行操作时,则需要EEDATH和EEADRH寄存器。

PIC16F87XA以字节为单位对Data E2PROM进行操作,它将Data E2PROM的地址存放到EEADR寄存器中,而将数据存放到EEDATA寄存器中。

PIC16F87XA同样以字节为单位对 Flash OM进行操作,由于其地址空间超过256字节,所以必须使用EEADRH和EEADR寄存器来组成一个16位的寄存器,才能对 Flash ROM进行寻址;而且 Flash ROM中的数据也不仅只有8位,所以也必须使用EEDATH和EEDATA来配合读/写数据。

注意:写入Flash ROM的数据不一定是指令码,也可以是查表的数据、编号等,如果程序计数器PC误指向了这些地址空间,这些无效的地址码会被做空指令(NOP)来执行。

1.1.3 PIC16F87XA的系统时钟

系统时钟的频率决定了PIC16F87XA单片机的运行频率,单片机所有的动作都是以此时钟为基准的;PIC16F87XA最高的时钟频率是20MHz,它支持4种不同的系统频率输入方式,可以通过配置寄存器CONFIG的FOSC1和FOSC0位来选择,如表1.10所示。

表1.10 振荡器类型选择

PIC16F87XA的LP、XT和HS三种振荡方式都可以采用类似的电路组成方式,如图1.6所示,当使用 HS和XT方式的时候需要在其中接入电阻 RS(100Ω<RS<1000Ω),同时需要建一个晶体或者陶瓷谐振器连接到 PIC16F87XA的 OSC1/CLKIN和OSC/CLKOUT 引脚上。振荡电路中C1和C2两个电容器的大小选择如表1.11和表1.12所示。

图1.6 LP、XT和HS振荡方式的电路

表1.11 陶瓷谐振器C1和C2的选择

表1.12 外接晶体振荡器时C1和C2的值

当PIC16F87XA工作于LP、XT或者HS振荡器模式下时,可以从OSC1引脚接入外部晶振时钟,此时OSC2引脚应该开路,如图1.7所示。

图1.7 外部晶振作为时钟源的电路

除了以上两种时钟源方式,PIC16F87XA还支持使用RC振荡电路作为时钟源,如图1.8所示。在这种时钟源方式下,在OSC1引脚连接阻容器件,此时OSC2引脚上会输出时钟源的4分频信号,可以作为其他电路的时钟源。RC电路的电阻值最好在3~100kΩ之间选择,电容最好选择20pF以上。

使用RC振荡电路的优点是成本非常低廉,缺点是时序频率的精确度和稳定性很差。

图1.8 RC振荡电路作为时钟源

1.1.4 PIC16F87XA的电源管理和休眠模式

PIC16F87XA使用PCON寄存器(Power Control Register)来对单片机的电源工作进行管理,其内部结构如表1.13所示。

表1.13 PIC16F87XA的PCON寄存器

PCON寄存器中使用了POR和BOR两位来对PIC16F87XA的电源工作状态进行相应控制,其说明如下。

● POR:单片机上电复位(Power-on Reset Status)功能控制位,当设置为“1”时单片机在上电的时候不产生复位,当设置为“0”的时候在上电时产生一个复位。

● BOR:单片机掉电复位(Brown out Reset),当设置为“1”时在单片机掉电时不产生复位,当设置为“0”的时候在掉电时产生一个复位。

1.1.5 PIC16F87XA的复位

PIC16F87XA的复位会使单片机回到一个初始化的已知状态,一切重新开始,在实际使用中,可以使用复位来规避或者解决一些不确定的问题。根据复位的发生原因,可以把PIC18F87X复位分为以下几种:

● 上电复位(POR)。

● 电源掉电复位(BOR)。

● 正常工作模式下的MCLR引脚复位。

● 休眠模式下的MCLR引脚复位。

● 正常工作模式下的看门狗定时器复位。

● 休眠模式下的看门狗定时器复位。

1.上电复位

当PIC16F87XA在电源引脚(VDD)上检测到电压上升到1.5~1.7V以上时,且PCON控制寄存器中的 POR位被设置为“0”时,产生一次复位。通常把 PIC16F87XA的 MCLR引脚直接连接到电源引脚上是比较好的选择。

PIC16F87XA内部有一个使用内部RC振荡器定时的上电延时定时器(Power-up Timer, PWRT),可以提供一个72ms的固定定时长度。当单片机检查到电源电压上升时,PWRT开始计时以等待电源电压上升到一个稳定的状态。

注意:在上电复位发生之后,POR位会被设置为“0”。

除了上电延时定时器,PIC16F87XA内部还有一个振荡器起振定时器(Oscillator Start-up Timer,OST),同样提供一段时间的延时,目的是让振荡器在这段时间内达到稳定状态,它在PWRT延时结束之后紧接着来了一个1024时钟周期(以OSC1引脚的信号作为基准)的时间延迟。需要注意的是这个OST定时器所产生的时间延迟只有在XT、LP和HS时钟模式下才存在,而且仅仅发生在上电复位及从休眠模式中恢复之后,也就是说,只有当振荡时钟需要重新激活的时候才会使用OST定时器。

2.掉电复位

当 PIC16F87XA电源引脚上的电压低于4.0V 时,会产生一个“电源电压低”的信号,即所谓的电源掉电(Brown-out),如果此时 PCON寄存器里的BOR 也被设置为“0”,会产生电源掉电复位事件。

注意:在掉电复位发生之后,BOR位会被设置为“0”。

在单片机复位之后,PC程序计数器会从复位矢量地址0x0000开始重新执行,如果在此时读取 POR位和 BOR位的状态,则可以判别单片机的复位是由上电复位还是电源掉电造成的。

3.MCLR引脚复位(正常工作和休眠模式)

MCLR引脚复位是由该引脚引入的复位信号,正常情况下该引脚应该保持一个高电平,当该电平变为低电平时,单片机会进入复位状态,无论是在正常工作还是休眠模式下,通常可以将该引脚同时通过一个电阻连接到电源(VDD),将一个按键连接到电源地(GND),当按键被按下时,一个低电平加在该引脚上,PIC16F87XA单片机被复位。

4.看门狗定时器复位(正常工作和休眠模式)

在PIC16F87XA的看门狗被开启时,无论单片机处于正常工作还是休眠模式下,如果没有对看门狗的定时器 WDT进行周期性的清零,都会产生一个看门狗定时器复位,关于看门狗的具体使用方法,将在第3章中进行详细介绍。

1.1.6 PIC16F87XA的外部引脚封装

本小节给出PIC16F87XA的DIP封装形式的引脚功能说明,供用户进行设计和参考。

1.PIC16F873A/876

PIC16F873A/876的引脚封装如图1.9所示,其引脚功能说明如表1.14所示。

图1.9 PIC16F873A/876的引脚封装

表1.14 PIC16F873A/876的引脚功能说明

引脚名称

引脚编号

OSC1/CLKI 9 OSC2/CLKO 10

MCLR/Vpp 1

RA0/AN0 2

RA1/AN1 3

RA2/AN2/VREF-4

RA3/AN3/VREF+5

RA4/T0CKI 6

RA5/SS/AN4 7 RB0/INT 21 RB1 22 RB2 23 RB3/PGM 24 RB4 25 RB5 26 RB6/PGC 27 RB7/PGD 28 RC0/T1OSO/T1CKI 11 RC1/T1OSI/CCP2 12 RC2/CCP1 13 RC3/SCK/SCL 14 RC4/SDI/SDA 15 RC5/SDO 16 RC6/TX/CK 17 RC7/RX/DT 18

Vss

8,19 VDD 20电平类型

说 明

ST/COMS

时钟输入

ST/COMS振荡器输入引脚,在外部时钟模式下连接到外部时钟源,在RC时钟模式下此引脚输出4分频的时钟信号

ST复位输入引脚/可编程电压输入引脚/高电压测试模式控制引脚

TTL

双向I/O引脚RA0和模拟电压输入引脚0

TTL

双向I/O引脚RA1和模拟电压输入引脚1

TTL双向I/O引脚RA2和模拟电压输入引脚2/模拟参考负电压

TTL双向I/O引脚RA3和模拟电压输入引脚2/模拟参考正电压

ST

双向I/O引脚RA4和Timer0的外部时钟输入

TTL双向I/O引脚RA5和模拟电压输入4/SSP的从动选择引脚

TTL/ST

双向I/O引脚RB0和外部中断输入引脚

TTL

双向I/O引脚RB1

TTL

双向I/O引脚RB2

TTL

双向I/O引脚RB3和低电压烧写输入引脚

TTL

双向I/O引脚RB4和电平变化中断引脚

TTL

双向I/O引脚RB5和电平变化中断引脚

TTLST双向I/O引脚RB6和电平变化中断引脚/ICD引脚串行可编程时钟

TTL/ST双向I/O引脚RB6和电平变化中断引脚/ICD引脚串行可编程时钟

ST

双向I/O引脚RC0和Timer1振荡器输出或者时钟输入

ST双向I/O引脚RC1和Timer1振荡器输入/CCP2模块的输入、输出引脚

ST

双向I/O引脚RC2和CCP1模块的输入、输出引脚

ST双向I/O引脚RC3和SPI与I2C模式的同步串行时钟引脚

ST双向 I/O引脚 RC4和SPI数据输入引脚,I2C模式的数据引脚

ST

双向I/O引脚RC5和SPI数据输出引脚

ST

双向I/O引脚RC6和USART异步输出/同步时钟引脚

ST

双向I/O引脚RC7和USART异步输出/同步数据引脚

电源地引脚—

电源引脚

2.PIC16F874A/877

PIC16F874A/878的引脚封装如图1.10所示,其引脚功能说明如表1.15所示。

图1.10 PIC16F874A/877A的引脚封装

表1.15 PIC16F874A/877A的引脚功能说明

注意:表1.13和表1.14中的电平类型一列,ST表示为斯密特触发输入,TTL为TTL电平输入。

1.1.7 PIC16F87XA的中断系统

PIC16F87XA中断允许单片机停止执行当前的操作,插入一个由中断事件引发的处理操作,它能较快地实现“实时性”。PIC16F87XA提供了14个中断源。

1.中断源

PIC16F87XA单片机提供了14个中断源,其中有11个属于外围模块的中断,这些中断由外围中断允许位PEIE统一控制;其余的3个中断和这个外围中断允许位PEIE加起来由一个全局中断允许位GIE控制,如图1.11所示。

图1.11 PIC16F87XA的中断系统

PIC16F87XA各个成员提供的中断如表1.16所示。

表1.16 中断列表

每一个中断都有一个中断标志位和一个中断允许位,中断标志位表示中断源是否产生这个中断,用于提供给用户判别中断的产生来源;中断允许位则用于决定是否要使用这个中断,用户可以关闭不需要使用的中断。

这些PIC16F87XA提供的中断源有:

● 并行从动口(PSP)中断。

● A/D转换完成中断。

● USART接收中断。

● USART发送中断。

● 同步串行口(SSP)工作完成中断。

● CCP1中断。

● TMR2中断。

● TMR1中断。

● EE中断。

● BCL中断。

● CCP2中断。

中断标志位和中断允许位都位于INTCON、PIRx和PIEx寄存器中,其详细分布说明如下所述。

● INTCON寄存器:包括Timer0、外部中断、RB中断的中断标志位和中断允许位,还有GIE和PEIE两个标志位。

● PIRx寄存器:外围中断允许位。

● PIEx寄存器:外围中断标志位。

2.中断使用方法和中断服务子程序

PIC16F87XA的中断使用方法如下:

● 初始化中断系统,设置好对应的中断允许位。

● 清除中断标志位。

● 中断事件发生,进入中断服务子程序。

● 执行中断服务子程序。

● 中断服务子程序执行完成退出,恢复到原来的程序执行断点继续执行。

中断服务子程序的执行过程说明如下:

● 首先需要保护相应的寄存器内容以备恢复原来程序执行断点时使用,需要备份的寄存器主要是在程序中共享的寄存器,通常包括W寄存器、STATUS寄存器、CLPATH寄存器和FSR寄存器。

注意:备份寄存器的重要原则是中断服务子程序和主程序不会相互干扰,凡是在中断服务子程序中需要使用的寄存器都需要备份。

● 其次要判断中断源,由于PIC16F87XA的中断都指向0x0004这个中断矢量,所以必须通过对中断标志位的读取来确定产生中断事件的中断,在这个过程中,没有打开的中断自然是不需要检查的,也可以通过检查中断标志位的顺序等方法来人为设定中断优先级。

● 最后是根据判别的中断源进行相应的操作并且退出。

3.中断相关寄存器

中断相关寄存器包括INTCON、PIE1、PIR1、PIE2、PIR2,如表1.17~1.21所示。

表1.17 PIC16F87XA的INTCON寄存器

INTCON是中断控制寄存器,其各位的详细说明如下。

● GIE:全局中断控制位,当设置为“1”时允许 PIC16F87XA的所有中断,设置为“0”时关闭所有的中断。

● PEIE:外设中断控制位,当设置为“1”时允许 PIC16F87XA的第二级中断,设置为“0”时候关闭第二级中断。

● T0IE:TMR0溢出中断控制位,当设置为“1”时允许PIC16F87XA的TMR0溢出中断,设置为“0”时候关闭TMR0溢出中断。

● INTE:外部中断引脚 INT中断控制位,当设置为“1”时允许 PIC16F87XA的外部中断,设置为“0”时候关闭外部中断。

● RBIE:RB4~RB7电平变化中断控制位,当设置为“1”时允许PIC16F87XA的电平变化中断,设置为“0”时候关闭电平变化中断。

● T0IF:TMR0溢出中断标志位,当该位为“1”时说明发生了 TMR0溢出中断,当该位为“0”时说明没有TMR0溢出中断。

● INTF:外部中断INT中断标志位,当该位为“1”时说明发生了外部中断INT,当该位为“0”时说明没有外部中断INT发生。

● RBIF:R4~R7引脚电平变化中断标志位,当该位为“1”时说明外部引脚 R4~R7上有电平变化发生,当该位为“0”时说明外部引脚R4~R7上没有电平变化发生。

表1.18 PIC16F87XA的PIR1寄存器

PIR1是第一外围设备中断标志寄存器,其各位的详细说明如下。

● PSPIF:并行端口中断标志位(只有40引脚封装格式的芯片此位有效,对于28引脚封装格式芯片此位一直为“0”),当该位为“1”时说明并行端口发生了读/写中断请求,当该位为“0”时说明并行端口没有发生读/写中断请求。

● ADIF:模拟/数字转换中断标志位,当该位为“1”时说明发生了模拟/数字转换中断,当该位为“0”时说明没有发生模拟/数字转换中断。

● RCIF:串行通信接口接收中断标志位,当该位为“1”时说明接收缓冲区满,当该位为“0”时说明接收缓冲区为空。

● TXIF:串行通信接口发送中断标志位,当该位为“1”时说明发送缓冲区为空,当该位为“0”时说明发送缓冲区不为空。

● SSPIF:同步串行端口中断标志位,当该位为“1”时说明同步串口发送/接收完成(这个标志位必须用软件清除),当该位为“0”时说明没有同步串口发送/接收事件。

● CCP1IF:输入捕捉/输出比较/脉宽调制 CCP1模块中断标志位,当该位为“1”时说明发生了捕捉中断/比较输出中断事件(也必须用软件清除),当该位为“0”时说明没有对应事件发生。

● TMR2IF:定时计数器 TMR2溢出中断标志位,当该位为“1”时说明发生了定时计数器 TMR2溢出(也必须用软件清零),当该位为“0”时说明没有对应的溢出事件。

● TMR1F:定时计数器TMR1溢出中断标志位,当该位为“1”时说明发生了定时计数器TMR1溢出(也必须用软件清零),当该位为“0”时说明没有对应的溢出事件。

表1.19 PIC16F87XA的PIE1寄存器

PIE1是第一外围设备中断屏蔽寄存器,其各位的详细说明如下。

● PSPIE:并行端口中断控制位(只有40引脚封装格式的芯片此位有效),当该位为“1”时允许并行端口读/写中断请求,当该位为“0”时禁止并行端口的读/写中断请求。

● ADIE:模拟/数字转换中断控制位,当该位为“1”时允许模拟/数字转换中断,当该位为“0”时说禁止模拟/数字转换中断。

● RCIE:串行通信接口接收中断控制位,当该位为“1”时允许接收缓冲区满中断事件,当该位为“0”时禁止接收缓冲区满中断事件。

● TXIE:串行通信接口发送中断控制位,当该位为“1”时允许发送缓冲区为空中断事件,当该位为“0”时禁止发送缓冲区空中断事件。

● SSPIE:同步串行端口中断控制位,当该位为“1”时允许同步串口发送/接收完成中断事件,当该位为“0”时禁止同步串口发送/接收中断事件。

● CCP1IE:输入捕捉/输出比较/脉宽调制 CCP1模块中断控制位,当该位为“1”时允许捕捉中断/比较输出中断事件,当该位为“0”时禁止对应中断事件发生。

● TMR2IE:定时计数器 TMR2溢出中断控制位,当该位为“1”时允许定时计数器TMR2溢出事件,当该位为“0”时禁止溢出事件。

● TMR1E:定时计数器 TMR1溢出中断控制位,当该位为“1”时允许定时计数器TMR1溢出,当该位为“0”时禁止溢出事件。

表1.20 PIC16F87XA的PIR2寄存器

PIR2是第二外围设备中断标志寄存器,其各位的详细说明如下。

● EEIF:E2PROM写操作中断标志位,当该位为“1”时说明发生了 E2PROM 写完成中断,当该位为“0”时说明E2PROM写操作中断未发生。

● BCLIF:I2C总线冲突中断标志位,当该位为“1”时说明发生了I2C总线冲突中断,当该位为“0”时说明I2C总线冲突中断未发生。

● CCP2IF:输入捕捉/输出比较/脉宽调制 CCP2模块中断标志位,当该位为“1”时说明发生了捕捉中断/比较输出中断事件(也必须用软件清除),当该位为“0”时说明没有对应事件发生。

表1.21 PIC16F87XA的PIE2寄存器

PIR2是第二外围设备中断屏蔽寄存器,其各位的详细说明如下。

● EEIF:E2PROM写操作中断控制位,当该位为“1”时允许 E2PROM 写完成中断,当该位为“0”时禁止E2PROM写操作中断。

● BCLIF:I2C总线冲突中断控制位,当该位为“1”时说明允许I2C总线冲突中断,当该位为“0”时说明禁止I2C总线冲突中断。

● CCP2IF:输入捕捉/输出比较/脉宽调制 CCP2模块中断控制位,当该位为“1”时允许捕捉中断/比较输出中断事件,当该位为“0”时禁止对应事件。

1.1.8 PIC16F87XA的配置寄存器

PIC16F87XA单片机内部有一个特殊的程序存储器单元,用于配置或者定义单片机内部的功能电路电源的性能选项,其内部地址为0x2007,被称为系统配置字,如表1.22所示。

表1.22 PIC16F87XA的配置寄存器

D13~D12(D5~D4)对应的 CP1和CP0用于对 PIC16F87XA程序存储器中的用户代码进行保护,不同的单片机型号对应的功能不同,对于 PIC16F877A/876而言其说明如下所述。

● 11:不使用代码保护。

● 10:受到保护的代码空间范围是0x1F00~0x1FFF。

● 01:受到保护的代码空间范围是0x1000~0x1FFF。

● 00:保护所有的代码空间。

对于PIC16F874A/873而言其说明如下。

● 11:不使用代码保护。

● 10:受到保护的代码空间范围是0x0F00~0x0FFF。

● 01:受到保护的代码空间范围是0x0800~0x0FFF。

● 00:保护所有的代码空间。

D11对应的 DEBUG位用于控制片上调试,当设置为“1”时禁止片上调试,设置为“0”时允许片上调试。

D9对应的 WRT位是Flash程序存储器烧写使能位置,当设置为“1”时允许烧写对应的程序存储器,设置为“0”禁止烧写。

D8对应的CPD位用于E2PROM存储器中的数据保护,当设置为“1”时对E2PROM的数据进行保护,设置为“0”放弃保护。

D7对应的 LVP位用于使能低电压烧写变成使能,当设置为“1”时 PIC16F87XA的RB3引脚具有PGM功能,使能低电压编程,当设置为“0”时必须加高电压烧写编程。

D6对应的 BODEN位用于掉电复位(BOR)的使能控制,当设置为“1”时使能 BOR功能,设置为“0”时禁止BOR功能。

D3对应的PWRT位用于上电延时器PWRT启用控制,当设置为“1”时禁止PWRT功能,设置为“0”时启用PWRT功能。

D2对应的 WDTE位用于控制看门狗的使用,当设置为“1”时启用看门狗功能,设置为“0”时禁止看门狗功能。

D1和D0对应的FOSC1和FOSC0位用于选择系统时钟工作模式,其说明如下。

● 11:RC振荡模式。

● 10:HS高频振荡方式。

● 01:XT标准振荡方式。

● 00:LP低频振荡方式。