PIC单片机16F84的内部硬件资源

发布者:WanderlustHeart最新更新时间:2011-02-22 手机看文章 扫描二维码
随时随地手机看文章
上期笔者介绍的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倍。

成都 卫东

  知识竞赛试题:
  15简述PIC系列单片机助记符指令中操作数f、d、b、k取值的可能范围,并简要说明其依据。
  16指出PIC16F84单片机框图(上文图1)中寄存器的类型和不能访问的寄存器名称?

 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中的状态字,但写入的数据是无效的。 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

  成都 卫东

  知识竞赛试题:
  21根据本版左下文介绍,请以表的形式列出PIC16C8X单片机(有两个存储体和A、B两口)至少11个专用寄存器的名称和地址。

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堆栈
  单片机执行程序时,常常要执行调用子程序。这样就产生了一个问题:如何记忆是从何处调用的子程序,以便执行子程序之后正确返回。此外,在程序执行过程中,还可能会发生中断,转而执行中断子程序,这时,又如何记忆从何处中断,以便返回呢?
  满足上述功能的方法就是“堆栈”技术。
  “堆栈”是一个用来保存临时数据的栈区。当主程序调用子程序时,单片机执行到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的管脚功能图。

 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。需要某过程延续多长时间,可将其“拨入”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单片机指令识读中的实例。

 成都 卫东

知识竞赛试题:
  23用简单的实例说明中断在PIC单片机中的用途。
  编后语:“PIC单片机系列专题”至今已刊登了十五期,余下还将刊载十期,共计二十五期。以后的内容将主要围绕PIC单片机的汇编和实际应用及开发来展开介绍,欢迎广大读者对本专题多提意见和建议。为配合本专题,“《电子报》单片机公共实验室”还为读者及会员准备一系列性价比高,适合初学者的PIC单片机、编程器、仿真器,以后本栏目将逐步加以介绍。另外,本专题的“知识竞赛”试题将于今年8月13日第32期《电子报》刊载完毕,欢迎读者踊跃参加。参加的读者务请在9月5日前,将所有试题按编号回答好后,寄往本报编辑部,或E-mail至dzb12@netdzb.com。我们将评出一、二、三等奖若干名,分别奖以奖金、PIC开发器、书刊等(详情见今年《电子报》第8期第十一版)。

 10  复位
  复位是单片机的初始化操作。其主要功能是把程序计数器PCL初始化为000H,可使16F84单片机从000H单元开始执行程序。
  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有关的寄存器。
  WDT的定时周期在不加分频器的情况下,其基本定时时间是18ms,这个定时时间还受温度、VDD和不同元器件的工艺参数等的影响。如果需要更长的定时周期,还可以通过软件控制OPT/ON寄存器把预分频器配置给WDT,这个预分频器的最大分频比可达到1∶128。这样就可把定时周期扩大128倍,即达到23秒。
  如果把预分频器配置给WDT,用CLRWDT和SLEEP指令可以同时对WDT和预分频器清零,从而防止计时溢出引起芯片复位。所以在正常情况下,必须在每次计时溢出之前执行一条CLRWDT指令(即喂一次“狗”),以避免引起芯片复位。当系统受到严重干扰处于失控状态时,就不可能在每次计时溢出之前执行一条CLR WDT指令,WDT就产生计时溢出,从而引起芯片复位,从失控状态又重新进入正常运行状态。
  当WDT计时溢出时,还会同时清除状态寄存器中的D4位T0,检测T0位即可知道复位是否由于WDT计时溢出引起的。  

成都 卫东


  知识竞赛试题:
  24简述PIC单片机中看门狗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,以启动读、写操作,但不能用软件清零,原因是防止不恰当的软件操作会使写入失败。当读写操作完成后由硬件自动清零,表示此刻未对E2PROM进行读写操作。当WREN位被置1时,允许进行写操作,而在上电时该位被清零。在正常操作时,一旦有MCLR或WDT复位,WRERR位就置1,表示写操作被中止。当写操作完成时,EEIF被置1(需由软件清零);当写操作未完成或尚未启动时,EEIF为“0”。
  EECON2仅是一个逻辑上的寄存器,而不是一个物理上存在的寄存器,读出时将总是为零。它只在写操作时起作用。
  (1)E2PROM的读操作
  为进行一次E2PROM读操作,需执行如下步骤:
  1)将E2PROM的单元地址放入EEADR。2)置RD(EECON的D0位)=1。3)读取EEDATA寄存器。
  程序段举例,读取25H处的E2PROM存储器数据:
  …
  BCF   STATUS,RP0 ;选Bank0
  MOVLW 25H
  MOVWF EEADR   ;地址25H→EEADR
  BSF   STATUS,RP0 ;选Bank1
  BSF EECON1,RD ;启动读操作
  BCF STATUS,RP0 ;选Bank0
  MOVF EEDATA,W ;将E2PROM数据
        …   ;读入W寄存器
  (2)E2PROM的写操作
  要进行一次E2PROM写操作,需执行如下步骤:
  1)将E2PROM单元地址放入EEADR;2)将写入数据放入EEDATA;3)执行一段控制程序段。
  例如:将数据99H写入E2PROM的25H单元,需执行下列程序:
       …
  BCF   STATUS,RP0 ;送Bank0
  MOVLW 25H
  MOVWF EEADR    ;地址→EEADR
  MOVLW 99H
  MOVWF EEDATA   ;写入数据→EEDATA
  BSF   STATUS,RP0 ;选Bank1
  BSF   EECON1,WREN;写操作功能允许
  1 BCF   INTCON,GIE ;关闭总中断
  2 MOVLW 0x55
  3 MOVWF EECON2
  4 MOVLW 0xAA
  5 MOVWF EECON2 ;操作EECON2
  6 BSF  EECON1,WR;启动写操作
  7 BSF   INTCON,GIE ;开放总中断
    …
  注意:上列程序中的2~6条各语句必须严格执行,否则不能启动E2PROM的写操作。而1~7条则是我们建议用户执行的操作,即在E2PROM写操作序列步骤中要关闭所有中断,以免这个序列被中断打断。
  另外,WREN(EECON1的D2位)是用来保证E2PROM不会被意外写入而设置的,所以,在平时,用户程序应保持WREN=0以禁止写操作。只有当需对E2PROM写入时才置WREN=1,并在写入完成后将其恢复为0。用户只有置WREN=1后才能置WREN=1启动写操作。上电复位后WREN位自动清零。
  E2PROM写操作约需10ms的时间才能完成。用户程序可通过查询WR位的状态(当WR=0时表示操作已完成),或者用E2PROM写入完成中断来判断E2PROM写操作是否完成。如要使用中断,应先置EEIF(INTCON的D6)为1,以开中断。E2PROM写完成要中断标志位EEIF,只能用软件清零。

  

引用地址:PIC单片机16F84的内部硬件资源

上一篇:PIC16C84单片机介绍
下一篇:PIC 8位单片机的电源和时钟

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved