微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC单片机16F84的内部硬件资源

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

时间:02-22 来源:互联网 点击:

  成都 卫东

  知识竞赛试题:
  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单片机指令识读中的实例。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top