上海齐济电子有限公司 (21) 65630199 Website: www.chipgem.com.cn 书籍与教程
PIC16F84 单片机的内部硬件资源
学些 PIC 单片机,在 Microchip 尚未推出其他 Flash 系列的情况下,很多菜鸟都是从 PIC16F84 开始
的,我们把它整理了一份中文资料供大家学习。
首先介绍 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 倍。
--------------------------------------------------------------------------------------------------------------
电子元器件代理销售,提供整体解决方案……
第 1 页
上海齐济电子有限公司 (21) 65630199 Website: www.chipgem.com.cn 书籍与教程
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。用间接寻址方
--------------------------------------------------------------------------------------------------------------
电子元器件代理销售,提供整体解决方案……
第 2 页
上海齐济电子有限公司 (21) 65630199 Website: www.chipgem.com.cn 书籍与教程
式写入 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)位为输入
;RA 5 4 位为输出
;TRISA 7 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 堆栈
--------------------------------------------------------------------------------------------------------------
电子元器件代理销售,提供整体解决方案……
第 3 页
上海齐济电子有限公司 (21) 65630199 Website: www.chipgem.com.cn 书籍与教程
单片机执行程序时,常常要执行调用子程序。这样就产生了一个问题:如何记忆是从何处调用
的子程序,以便执行子程序之后正确返回。此外,在程序执行过程中,还可能会发生中断,转而执
行中断子程序,这时,又如何记忆从何处中断,以便返回呢?
满足上述功能的方法就是“堆栈”技术。
“堆栈”是一个用来保存临时数据的栈区。当主程序调用子程序时,单片机执行到 CALL 指令或
发生中断时,就自动将下一条指令的地址“压栈”保存到栈区。当子程序结束,单片机执行返回指
令时,就自动地把栈区的内容“弹出”,作为下步指令执行的新地址。
PIC16F84 芯片内有一个 8 级 13 位宽(与 PC 同宽)的硬件堆栈,此堆栈既不占用程序存储空间,
也不占用数据存储空间。当执行一条 CALL 指令或一个中断被响应后,程序计数器 PC 中的断点地址
就自动被压栈(PUSH)保护,而当执行 RETURN、RETLW 或者 RETFIE 指令时,堆栈中的断点地址会弹回
(POP)程序计数器 PC 中。无论是 PUSH 还是 POP 操作,都不影响 PCLATH 寄存器的内容。
6 定时器/计数器 TMRO
PIC 单片机 16F84 中有一个定时器,此定时器也可用于计数,因此称为定时器/计数器,符号为
TMRO。TMRO 可用于定时控制、延时、对外部事件计数和检测等场合。TMRO 是一个 8 位增量(加 1)计
数器。它在数据存贮器中的地址为 01。定时器所用的时钟源可以是内部系统时钟(OSC/4,即四倍振
荡周期),也可以是外部时钟。若 TMRO 对内部系统时钟的标准脉冲系列进行计数时,就成为定时器;
对外部脉冲进行计数时 TMRO 就成为计数器。
不管是定时还是计数方式,TMRO 在对内部时钟或对外部事件计数时,都不占用 CPU 时间,除非
TMRO 溢出,才可能中断 CPU 的当前操作。可见,定时器是单片机 16F84 中效率高且工作灵活的部件。
为了扩大定时或计数的范围,配合 TMRO 的使用,还有一个可编程预定标器。此定标器实际上是
一个可编程分频器。
TMRO 的内部结构示意图如附图所示。其工作方式由数据存储器中的项选寄存器 OPTION 控制。
OPTION 是一个可读/写的寄存器,如附表所示。它含有配置 TMRO/WDT 预定标器、外部 INT 中断、TMRO
等的各种控制位。
TMRO 的定时、计数方式是由 OPTION 寄存器中的 D5(即 TOCS 位)确定。当 TOCS=0 时,工作于定
时器方式;当 TOCS=1 时,工作于计数器方式。作定时器时,每个指令周期加 1(无预分频时);而作
计数器时,则在每个 RA4/TOCKI 引脚上电平变化时加 1。OPTION 寄存器的位 4(TOCS 位)决定外部脉
冲的触发方式,当 TOSE=1,下降沿触发;TOSE=0,上升沿触发。当 TMRO 内部计数器发生计数溢出(从
FFh→00h)时,溢出位送入中断控制寄存器 INTCON。
由附图可知,预分频器也是一个 8 位计数器。其分频数是由 OPTION 寄存器中的 PS2~PS0 三位
值来改变。分频数可以是以下 8 种之一:1∶1、1∶2、1∶4、1∶8、1∶16、1∶32、1∶64 和 1∶128。
当分频器用于 TMRO 时,所有写入 TMRO 的指令,如 CLRF 1、MOVWF 1、BSF 1、 等都将对预分
频器清零。需要注意的是,预分频器是不能读写的。此分频器可用于 TMRO,也可用于 WDT,其切换
由软件控制。为了避免意外的芯片复位,当需要切换时,必须执行相应的一段程序,以下是从 WDT
切换到 TMRO 时所需执行的程序:
CLRWDT ;
对 WDT 和预定标器清零
BSF STATUS,RP0 ;选中存储体 1
MOVLW B′xxxx0xxx′ ;PSA=0,选中 TMRO
MOVWF OPTION ;送入 OPTION 寄存器
BCF STATUS,RP0 ;复位存储体 0
--------------------------------------------------------------------------------------------------------------
电子元器件代理销售,提供整体解决方案……
第 4 页
上海齐济电子有限公司 (21) 65630199 Website: www.chipgem.com.cn 书籍与教程
7 延时和定时
在设计单片机应用系统时,经常会遇到需要使某一过程(如加温、加压等)持续一段时间的情
况,如连续加压 1 分钟,通电 2 分钟等。单片机如何正确确定这段时间呢?这里可通过两种方式,
即延时和定时来实现。试看下例。
在应用系统中要求 PIC16F84 的 RAO 端控制一个发光二极管按一定频率闪亮,可通过右图的电路
来实现。同时还必须为 16F84 编制一个程序。由电路图可知,要使发光二极管 LED 按一定的频率闪
亮,只要使 RAO 端输出一个变化的高→低→高……电平即可。由此设计出如下的源程序(清单 1):
list P=16F84,F=INHX8M
;……
ORG 0
MOVLW 0 ;主程序开始
TRIS 5 ;置 RA 口为输出
BCF 5,0 ;RA 口 0 位清零
LOOP:CALL DELAY;闪动延时
COMF 5 ;RA 口求反,亮—灭交替
GOTO LOOP ;循环
;……
DELAY ;以下为延时子程序
MOVLW D′50
MOVWF 8
LOOP1:MOVWF 9
LOOP2:DECFSZ 9,F
GOTO LOOP2
DECFSZ 8,F
GOTO LOOP1
RETLW 0
由清单 1 可知,当主程序开始时,首先将工作寄存器 W 清零,然后将 W 寄存器的内容送 TRISA
寄存器,使其清零,以设置 RA 口为输出。接着又将 RA 口的第 5 位清零,使 LED 开始时处于熄灭状
态。随之持续一段时间,即执行延时子程序,再将 RA 口取反,变为高电平输出,LED 发光,再延时,
又使 RA 口取反,LED 熄灭……。这样,LED 就一暗一亮,持续交替进行。
在这里,使 LED 亮、暗持续一段时间是通过单片机执行延时子程序 DELAY 来实现的。此延时程
序的核心就是让单片机的 CPU 反复执行使寄存器内容减 1 的指令 DECFSZ。即将十进制数 50 分别装入
通用寄存器 F8、F9,以进行 50×50=2500 次的减 1 操作。如果执行一次 DECFSZ 指令需 1 个指令周期
(跳转时需 2 个周期),若设振荡频率为 100kHz,即指令周期为 40μs,则延时时间为
2500×40=100000μs=100ms,即 0 1 秒。实际上还略为大些。此延时时间已超过人眼的视觉保留时
间。因而能看清 LED 的明、暗交替变化。
如果我们需要更长的延时时间,可仿照上例,装入更大的数或引入多重循环。因此,在原则上,
延时时间可根据需要任意延长。
不过,采用延时程序来持续某一过程的方式有缺陷。延时就是使 CPU 在某几条指令上“转圈”,
延时越长,“转圈”数越多,这时,CPU 不能再去执行其它操作,如监视温度、湿度等。这在某些实
时控制系统中,不允许这样做。为此,在单片机 16F84 中,专门设置了一个“闹钟”——定时器 TMR0。
--------------------------------------------------------------------------------------------------------------
电子元器件代理销售,提供整体解决方案……
第 5 页
上海齐济电子有限公司 (21) 65630199 Website: www.chipgem.com.cn 书籍与教程
需要某过程延续多长时间,可将其“拨入”TMR0,到时它会发生“中断”,告诉 CPU 定时时间到。
要 CPU 暂停其它工作,转过来执行“中断子程序”,完成输出开、关信号之类的任务后,再回去执
行其中断的工作。这样,就使 CPU 的工作效率提高。因而,延时的使用有局限性,采用定时器 TMR0
则可用于各种场合中。
8 中断
PIC 单片机 16F84 具有实时处理功能,能对外界异常发生的事件由中断技术作及时处理。
当单片机的 CPU 正在处理某事件时,若外部发生了某一事件(如定时器溢出、引脚上电平变化),
请求 CPU 迅速去处理,于是 CPU 就暂时中止当前的工作,转去处理所发生的事件。中断处理完该事
件后,再回到原来被中止的地方,继续执行原来的工作,如图 1 所示。实现这种功能的部件称为中
断系统。产生中断的请求源称为中断源。中断源向 CPU 提出的处理请求,称为中断请求或中断申请。
CPU 暂时中断自身的事务,转去处理事件的过程,称为 CPU 的中断响应过程。对事件的整个处理过程,
称为中断服务(或中断处理)。处理完毕,再回到原来被中止的地方,称为中断返回。
PIC16F84 芯片有 4 种中断源,其逻辑电路如图 2 所示。
9 中断控制
中断主要由中断控制寄存器 INTCON(图 3)来控制。INTCON 是一个可读/写寄存器,含有定时器
TMRO 溢出、RB 口的变化和外部 INT 引脚中断等各种允许控制和标志位。
全局中断允许位 GIE(D7)置 1,将开放所有未被屏蔽的中断,如将该位清零,将禁止所有的中断。
在响应中断时,GIE 位将被清零,以禁止其它中断,返回的断点地址被压栈保护,接着把中断入口地
址 0004h 装入程序计数器 PC。在中断服务程序中,通过对中断标志位进行查询,确定中断标志位必
须在重新开放中断之前用软件清零,以避免不断地中断申请而反复进入中断。
(1)INT 中断。RBO/INT 引脚上的外部中断由边沿触发,当 INTEDG 位(OPTION 寄存器第 6 位)被置
1 时,选用上升沿触发,如该位被清零,则由下降沿触发。当检测到引脚上有规定的有效边沿时,便
把 INTE 位(INTCON 的 D4 位)置 1。在重新开放这个中断之前,必须在中断服务程序中对 INTE 位清零。
(2)TMRO 中断。当定时器 TMRO 的计数器计满溢出(即由 FFH 变成 00H)时,硬件自动把 TOIF(INTCON
的 D2 位)置 1。其中断可以通过对 TOIE(INTCOND 的 D5 位)置 1 或清零来控制该中断是否开放。
(3)PORTB 口引脚电平变化中断。在 PORTB 口的 D7~D0 引脚上一旦有电平变化,就会把
RBIF(INTCON 的 D0 位)置 1。这个中断可以通过对 RBIE(INTCON 的 D3 位)置 1 或清零来控制该中断是
否开放。
(4)中断的现场保护。在发生中断时,只有返回断点的地址被压栈保护。若用户还希望保护关键
的寄存器(如 W 寄存器和 STATUS 寄存器)。这需要由软件来实现。有关中断的现场保护,请参看本报
第 15 期有关 PIC 单片机指令识读中的实例。
10 复位
复位是单片机的初始化操作。其主要功能是把程序计数器 PCL 初始化为 000H,可使 16F84 单片
机从 000H 单元开始执行程序。
--------------------------------------------------------------------------------------------------------------
电子元器件代理销售,提供整体解决方案……
第 6 页
上海齐济电子有限公司 (21) 65630199 Website: www.chipgem.com.cn 书籍与教程
PIC16F84 芯片有下列几种不同的复位方式。
(1)芯片上电复位 POR。
(2)正常工作状态下通过外部 MCLR 引脚加低电平复位。
(3)在省电休眠状态下通过外部 MCLR 引脚加低电平复位。
(4)监视定时器 WDT 超时溢出复位。
PIC16F84 片内集成有“上电复位”POR 电路,对于一般应用,只要把 MCLR 引脚接高电位即可。
在正常工作或休眠状态下用 MCLR 复位,只需在 MCLR 引脚上加一按键瞬间接地即可。
单片机 16F84 复位操作,对其它一些寄存器会有影响,如表 1 所示。
11 监视定时器 WDT
单片机系统常用于工业控制,在操作现场通常会有各种干扰,可能会使执行程序弹飞到一种死
循环,从而导致整个单片机控制系统瘫痪。如果操作者在场,就可进行人工复位,摆脱死循环。但
操作者不能一直监视着系统,即使监视着系统,也往往是引起不良后果之后才进行人工复位。由于
PIC16F84 中具有程序运行自动监视系统,即监视定时器 WDT(Watch Dog Time),直译为“看门狗”
定时器。这好比是主人养了一条狗,主人在正常干活时总不忘每隔一段时间就给狗喂食,狗就保持
安静,不影响主人干活。如果主人打嗑睡,不干活了,到一定时间,狗饿了,发现主人还没有给它
吃东西,就会大叫起来,把主人唤醒。由此可见,WDT 有如下特性:
(1)本身能独立工作,基本上不依赖 CPU。
(2)CPU 在一个固定的时间间隔中和 WDT 打一次交通(如使其清零,即喂一次狗),以表明系统目
前工作正常。
(3)当 CPU 落入死循环后,能被 WDT 及时发觉(如 WDT 计数溢出),并使系统复位。
PIC16F84 内的 WDT,其定时计数的脉冲序列由片内独立的 RC 振荡器产生,所以它不需要外接任
何器件就可以工作。而且这个片内 RC 振荡器与 OSC1/CLKIN(引脚{16})上的振荡电路无关,即使 OSC1
和 OSC2 上的时钟不工作,WDT 照样可以监视定时。例如:当 PIC16F84 在执行 SLEEP 指令后,芯片进
入休眠状态,CPU 不工作,主振荡器也停止工作,但是,WDT 照样可监视定时。当 WDT 超时溢出后,
可激活(唤醒)芯片继续正常的操作。而在正常操作期间,WDT 超时溢出将产生一个复位信号。如果不
需要这种监视定时功能,在固化编程时,可关闭这个功能。附图是监视定时器的结构框图。表 2 是
与 WDT 有关的寄存器。
--------------------------------------------------------------------------------------------------------------
电子元器件代理销售,提供整体解决方案……
第 7 页
上海齐济电子有限公司 (21) 65630199 Website: www.chipgem.com.cn 书籍与教程
WDT 的定时周期在不加分频器的情况下,其基本定时时间是 18ms,这个定时时间还受温度、VDD
和不同元器件的工艺参数等的影响。如果需要更长的定时周期,还可以通过软件控制 OPT/ON 寄存器
把预分频器配置给 WDT,这个预分频器的最大分频比可达到 1∶128。这样就可把定时周期扩大 128
倍,即达到 2 3 秒。
如果把预分频器配置给 WDT,用 CLRWDT 和 SLEEP 指令可以同时对 WDT 和预分频器清零,从而防
止计时溢出引起芯片复位。所以在正常情况下,必须在每次计时溢出之前执行一条 CLRWDT 指令(即
喂一次“狗”),以避免引起芯片复位。当系统受到严重干扰处于失控状态时,就不可能在每次计时
溢出之前执行一条 CLR WDT 指令,WDT 就产生计时溢出,从而引起芯片复位,从失控状态又重新进入
正常运行状态。
当 WDT 计时溢出时,还会同时清除状态寄存器中的 D4 位 T0,检测 T0 位即可知道复位是否由于
WDT 计时溢出引起的。
12 E2PROM 的使用方法
在 PIC16F84 单片机中,除了可直接寻址的由 SRAM 构成的数据存储器外,还另有可电擦、电写
的 E2PROM 数据存储器。该 E2PROM 共有 64 字节,其地址为 00~3FH 单元。由于 E2PROM 具有在线改
写,并在掉电后仍能保持数据的特点,可为用户的特殊应用提供方便。16F84 的 E2PROM 在正常操作
时的整个 VDD 工作电压范围内是可读写的,典型情况下可重写 100 万次,数据保存期大于 40 年。
PIC16F84 的 E2PROM 并未映象在寄存器组空间中,所以它们不能像 SRAM 通用寄存器那样用指令
直接寻址访问,而需要通过专用寄存器进行间接寻址操作。因此,在 16F84 中增加了以下四个专用
寄存器,即 EECON1、EECON2、EEDATA、EEADR,专门用于片内对 E2PROM 的操作。该专用寄存器中,
EEDATA 存放 8 位读/写数据,EEADR 存放正在被访问的 E2PROM 存储单元的地址。
EECON1 是只有低五位的控制寄存器,其高三位不存在,读作“0”。具体见下表。
D7 D6 D5 D4 D3 D2 D1 D0
- - - EEIF WRERR WREN WR RD
控制位 RD 和 WR 分别用于读写操作的启动,这两位可以由软件置 1,以启动读、写操作,但不能
用软件清零,原因是防止不恰当的软件操作会使写入失败。当读写操作完成后由硬件自动清零,表
--------------------------------------------------------------------------------------------------------------
电子元器件代理销售,提供整体解决方案……
第 8 页