PIC单片机学习中.doc_第1页
PIC单片机学习中.doc_第2页
PIC单片机学习中.doc_第3页
PIC单片机学习中.doc_第4页
PIC单片机学习中.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PIC单片机特殊功能寄存器定义问题菜鸟向高手赐教,比如像STATUS,它在RAM 中的位置不是固定是02H吗?为什么还要在程序中用EQU定义:status equ 02h 我的问题是,假如这条定义取消,CPU 就不知道STATUS的地址是02H 了吗?答:你的假如是对的,但是主要不是CPU不知道STATUS代表02H了(CPU当然也不知道,CPU除了机器语言什么也不知道),而是编译软件不知道STATUS代表02H了。 取消了当然不行!“status EQU 02H”就是定义STATUS代表02H 定义了之后MOVF STATUS,W 就相当于MOVF 02H,W EQU定义之后,上两句话功能是一样的!STATUS被定义是便于我们人直观理解。 你估计是刚学,刚开始教你定义是为了便于你理解,以后会教你引用编译软件里的头文件,你就不需要一个一个写了。PIC单片机16F84的内部硬件资源上期笔者介绍的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(81024)的程序存储器空间,但16F84实际上只使用了1k的空间(单元地址为03FFH)。当访问超过这些地址空间的存储单元时,将导致循环回到有效的存储空间。对于用过其它单片机的用户,可能会感到16F84的片内存储器容量太少了。实际上并非如此,因为16F84的指令系统都是由单字指令构成的,相应于其它由二字节、三字节甚至四字节指令的单片机而言,PIC单片机的程序存储器有效容量要比标称值扩大25倍到3倍。3 数据存储器在单片机PIC16F84中,除了有存放程序的程序存储器外,还有数据存储器。单片机在执行程序过程中,往往需要随时向单片机输入一些数据,而且有些数据还可能随时改变。在这种情况下就需用数据存储器。由于数据存储器不但要能随时读取存放在其各个单元内的数据,而且还需随时写进新的数据,或改写原来的数据。因此,数据存储器需由随机存储器RAM构成。RAM存储器在断电时,所存数据随即丢失,这在实际应用中有时会带来不便。但是,在16F84单片机中有648位E2PROM数据存储器。存放在E2PROM中的数据在断电时不会丢失。16F84单片机中的RAM数据存储器如表1所示,该RAM分为两个存储体:即存储体0(Bank0)和存储体1(Bank1)。每个存储体均可以直接用内部总线传送信息,所以它们都是以寄存器方式工作和寻址。这些八位寄存器,又可分为通用寄存器和专用寄存器两个部分。通用寄存器存放数据,专用寄存器存放控制单片机运作的信息。每个存储体最大可扩展到7FH(128个字节)。在每个存储体中,专用寄存器被安排在低位地址空间,通用寄存器被安排在高位地址空间。通用寄存器用法单一,但专用寄存器却各有各的用处,现将较基本的专用寄存器作一简单介绍。(1)程序计数器(PCL、PCLATH)。程序计数器PC是对程序进行管理的计数器。PIC16F84的程序计数器为13位宽,最大可寻址的存储空间为8k14位。实际上16F84只使用前1k14位(000003FFH)存储空间。因程序计数器有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。执行加、减运算指令表2IRPRP1RP0TOPDZDCC后,若结果有进位或借位,则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(00H7FH);01选中Bank1(80HFFH),16F84只有两个存储体。故10、11不用。7)第7位IRP。这是间接寻址的寄存体选择位。0选中Bank0、1(00HFFH),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(30)位为输入;RA 54位为输出 ;TRISA 76位未用在使用I/O口时应注意:(1)当需要一个I/O口一会做输入、一会又做输出时,输出值会不确定。(2)I/O引脚输出驱动电路为CMOS互补推挽输出。当其为输出状态时,不能与其它输出脚接成“线或”或“线与”,否则,会因电流过载烧坏单片机。(3)当对I/O口进行写操作后不宜直接进行读操作,一般要求在两条连续的写、读指令间至少加入一条NOP指令。例:MOVWF 6 ;写I/ONOP;稳定I/O电平 MOVF 6,W;读I/O5堆栈单片机执行程序时,常常要执行调用子程序。这样就产生了一个问题:如何记忆是从何处调用的子程序,以便执行子程序之后正确返回。此外,在程序执行过程中,还可能会发生中断,转而执行中断子程序,这时,又如何记忆从何处中断,以便返回呢?满足上述功能的方法就是“堆栈”技术。“堆栈”是一个用来保存临时数据的栈区。当主程序调用子程序时,单片机执行到CALL指令或发生中断时,就自动将下一条指令的地址“压栈”保存到栈区。当子程序结束,单片机执行返回指令时,就自动地把栈区的内容“弹出”,作为下步指令执行的新地址。PIC16F84单片机芯片内有一个8级13位宽(与PC同宽)的硬件堆栈,此堆栈既不占用程序存储空间,也不占用数据存储空间。当执行一条CALL指令或一个中断被响应后,程序计数器PC中的断点地址就自动被压栈(PUSH)保护,而当执行RETURN、RETLW或者RETFIE指令时,堆栈中的断点地址会弹回(POP)程序计数器PC中。无论是PUSH还是POP操作,都不影响PCLATH寄存器的内容。6定时器/计数器TMROPIC单片机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内部计数器发生计数溢出(从FFh00h)时,溢出位送入中断控制寄存器INTCON。由附图可知,预分频器也是一个8位计数器。其分频数是由OPTION寄存器中的PS2PS0三位值来改变。分频数可以是以下8种之一:11、12、14、18、116、132、164和1128。当分频器用于TMRO时,所有写入TMRO的指令,如CLRF 1、MOVWF 1、BSF 1、等都将对预分频器清零。需要注意的是,预分频器是不能读写的。此分频器可用于TMRO,也可用于WDT,其切换由软件控制。为了避免意外的芯片复位,当需要切换时,必须执行相应的一段程序,以下是从WDT切换到TMRO时所需执行的程序:CLRWDT; 对WDT和预定标器清零BSF STATUS,RP0 ;选中存储体1MOVLWBxxxx0xxx;PSA=0,选中TMROMOVWFOPTION ;送入OPTION寄存器BCFSTATUS,RP0;复位存储体07 延时和定时在设计单片机应用系统时,经常会遇到需要使某一过程(如加温、加压等)持续一段时间的情况,如连续加压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 ;以下为延时子程序 MOVLWD50 MOVWF 8LOOP1:MOVWF 9LOOP2:DECFSZ 9,F GOTO LOOP2 DECFSZ 8,FGOTO LOOP1RETLW 0由清单1可知,当主程序开始时,首先将工作寄存器W清零,然后将W寄存器的内容送TRISA寄存器,使其清零,以设置RA口为输出。接着又将RA口的第5位清零,使LED开始时处于熄灭状态。随之持续一段时间,即执行延时子程序,再将RA口取反,变为高电平输出,LED发光,再延时,又使RA口取反,LED熄灭。这样,LED就一暗一亮,持续交替进行。在这里,使LED亮、暗持续一段时间是通过单片机执行延时子程序DELAY来实现的。此延时程序的核心就是让单片机的CPU反复执行使寄存器内容减1的指令DECFSZ。即将十进制数50分别装入通用寄存器F8、F9,以进行5050=2500次的减1操作。如果执行一次DECFSZ指令需1个指令周期(跳转时需2个周期),若设振荡频率为100kHz,即指令周期为40s,则延时时间为250040=100000s=100ms,即01秒。实际上还略为大些。此延时时间已超过人眼的视觉保留时间。因而能看清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口的D7D0引脚上一旦有电平变化,就会把RBIF(INTCON的D0位)置1。这个中断可以通过对RBIE(INTCON的D3位)置1或清零来控制该中断是否开放。(4)中断的现场保护。在发生中断时,只有返回断点的地址被压栈保护。若用户还希望保护关键的寄存器(如W寄存器和STATUS寄存器)。这需要由软件来实现。有关中断的现场保护,请参看本报第15期有关PIC单片机指令识读中的实例。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,这个预分频器的最大分频比可达到1128。这样就可把定时周期扩大128倍,即达到23秒。如果把预分频器配置给WDT,用CLRWDT和SLEEP指令可以同时对WDT和预分频器清零,从而防止计时溢出引起芯片复位。所以在正常情况下,必须在每次计时溢出之前执行一条CLRWDT指令(即喂一次“狗”),以避免引起芯片复位。当系统受到严重干扰处于失控状态时,就不可能在每次计时溢出之前执行一条CLR WDT指令,WDT就产生计时溢出,从而引起芯片复位,从失控状态又重新进入正常运行状态。当WDT计时溢出时,还会同时清除状态寄存器中的D4位T0,检测T0位即可知道复位是否由于WDT计时溢出引起的。12 E2PROM的使用方法在PIC16F84单片机中,除了可直接寻址的由SRAM构成的数据存储器外,还另有可电擦、电写的E2PROM数据存储器。该E2PROM共有64字节,其地址为003FH单元。由于E2PROM具有在线改写,并在掉电后仍能保持数据的特点,可为用户的特殊应用提供方便。16F84的E2PROM在正常操作时的整个VDD工作电压范围内是可读写的,典型情况下可重写100万次,数据保存期大于40年。PIC16F84单片机的E2PROM并未映象在寄存器组空间中,所以它们不能像SRAM通用寄存器那样用指令直接寻址访问,而需要通过专用寄存器进行间接寻址操作。因此,在16F84单片机中增加了以下四个专用寄存器,即EECON1、EECON2、EEDATA、EEADR,专门用于片内对E2PROM的操作。该专用寄存器中,EEDATA存放8位读/写数据,EEADR存放正在被访问的E2PROM存储单元的地址。EECON1是只有低五位的控制寄存器,其高三位不存在,读作“0”。具体见下表。D7D6D5D4 D3 D2D1 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 ;选Bank0MOVLW 25HMOVWF EEADR ;地址25HEEADRBSF STATUS,RP0 ;选Bank1BSF EECON1,RD ;启动读操作BCF STATUS,RP0 ;选Bank0MOVF EEDATA,W ;将E2PROM数据 ;读入W寄存器(2)E2PROM的写操作要进行一次E2PROM写操作,需执行如下步骤:1)将E2PROM单元地址放入EEADR;2)将写入数据放入EEDATA;3)执行一段控制程序段。例如:将数据99H写入E2PROM的25H单元,需执行下列程序:BCF STATUS,RP0 ;送Bank0MOVLW 25HMOVWF EEADR ;地址EEADRMOVLW 99HMOVWF EEDATA ;写入数据EEDATABSF STATUS,RP0;选Bank1BSF EECON1,WREN;写操作功能允许1 BCF INTCON,GIE;关闭总中断2 MOVLW 0x553 MOVWF EECON24 MOVLW 0xAA5 MOVWF EECON2 ;操作EECON26 BSF EECON1,WR;启动写操作7 BSF INTCON,GIE ;开放总中断注意:上列程序中的26条各语句必须严格执行,否则不能启动E2PROM的写操作。而17条则是我们建议用户执行的操作,即在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系列单片机的振荡器配置方法PIC资料库 2006-09-01 21:22:26 阅读15 评论0 字号:大中小 PIC系列单片机可工作于不同的振荡器方式。用户可以根据其系统设计的需要,选择下述四种振荡方式中的一种,其振荡的频率范围在DC20/25MHz之间,如表1所示。用户可以根据不同的应用场合,从表1所示的四种振荡方式中选择一种(使用PIC编程器时也需作这种选择的操作),以获得最佳的性能价格比。其中,LP振荡器方式可以降低系统功耗,RC振荡器方式可节省成本。建立PIC单片机源程序时,其振荡器方式由配置寄存器CONFIG的D1位和D0位来决定,如表2所示。1内部晶体振荡器/陶瓷振荡器在LP、XT和HS这三种方式下,需要在单片机引脚OSC1/CLKIN和OSC2/CLKOUT的两端接一石英晶体或陶瓷谐振器。如图1中,只 有在HS方式下才需要在振荡回路中加入电阻Rs(100Rs1k)。2外部时钟源或外部晶体振荡器在LP、XT和HS这三种振荡器方式下,各种PIC单片机芯片既可以用集成在内部的振荡器,也可以接受外部输入的时钟源或外接晶体振荡器。若用外部时钟源或外接晶体振荡器,可把外部振荡器输出接芯片的OSC1/CLKIN引脚,此时OSC2/CLKOUT引脚开路即可。图2是外接时钟源的形式,外部晶体独立的振荡器与图2相似。3外部RC振荡器RC振荡器主要应用于对时间精度要求不太高的场合。RC振荡器是在OSC1/CLKIN引脚接一串联电阻电容,如图3所示。厂家推荐电阻Rext取值在5k100k之间。当Rext小于22k时,振荡器的工作可能会变得不稳定或停振;当Rext取值大于1M时,振荡器易受到干扰。RC振荡器产生的振荡频率fosc,经内部4分频电路分频后从OSC2/CLKOUT输出fosc/4振荡信号,此信号可以用作测试或作其它逻辑电路的同步信号。表3给出了使用陶瓷或晶体振荡器时所需的电容器值。表4给出了使用RC振荡器的电阻器和电容器的值。此数据供设计时参考。PIC 8位单片机的电源和时钟 单片机是一种超大规模集成电路,在该集成电路内有成千上万个晶体管或场效应管,因此,要单片机正常运行,就必须为其提供能量,即为片内的晶体管或场效应管供给电源,使其能工作在相应的状态。PIC16F84单片机需要一个5V电源(实际工作电压为40V60V)。因此,最简单的办法是用三节15V的电池串联供电,也可用整流、稳压方式供电,如图1所示。图1a为三节电池串联,可得45V左右的电压;图1b为四节电池串联,又用一硅二极管降压,实际输出电压为54V左右。图1c为经整流后(整流器图中未画出)将市电交流变为7V20V的直流电压,再经集成稳压器7805稳压后得到稳定的5V电压。图1d与图1c类似,只是不用集成稳压器,改用价廉的稳压二极管来稳压。PIC16F84本身耗电仅1mA(低时钟耗电更小),若PIC要驱动发光二极管LED或其它大电流器件,则单片机电源也必须为这类器件供电。因此,图1d的电路是用齐纳二极管来稳压的,它不能驱动LED等器件,这一点应注意。在图1中,四种电源电路都需要在PIC16F84单片机的引脚14(V)与地之间接一电容01F,而且,此电容应紧靠单片机安装,以滤除电源的纹波,并使PIC和相邻元件不受噪声干扰。这里要强调的是,不论电源如何“纯净”,均必须安装此电容。注意:这里的PIC16F84单片机除了引脚14(V或VDD)直接接至电源外,引脚4(MCLR复位输入脚)通常也通过一个10k的电阻接至电源V。MCLR是低电平有效,如将其接地,将使PIC复位,并将RAM清零。如果上电很慢,则PIC可能会处于一种不定状态。这时,应当在MCLR与地之间装接一个常开复位按键。与任何微处理器一样,PIC16F84的运作是有节奏的,因此,就需要一个节拍发生器时钟,以控制CPU的运行速度,步进执行各种操作。16F8404P的最大时钟速变为4MHz。降低时钟频率,可节省能源,并使PIC执行速度减慢,当时钟频率为30kHz时只耗电01mA。PIC单片机最常用的时钟电路示于图2,图2a为直接输入外部时钟,即钟信号由外部振荡电路产生。图2b是用PIC的内部时钟电路,再从外部接上确定时钟频率的元件,即电阻R和电容C。图中给出了三种不同阻值的电阻,它们和100pF的电容配用,可产生15MHz、600kHz或100kHz三种不同的时钟频率。图2c仍利用PIC单片机片内振荡电路,但外接石英晶体,因而能产生更精确、更稳定的时钟信号,但石英晶体通常比电阻、电容贵,若利用电视机上常用的晶体(如358MHz晶体),则价格仍较低廉。PIC16C84单片机介绍PIC16C84是8位CMOS EEPROM单片机。它有高性能的类似于RISC 的指令,共有35条单字节的指令,所有的指令除程序分支指令需要两个指令周期外,都只需要一个指令周期。当主振频率为10MHZ时一个指令周期为400ns。程序指令的宽度为14位,在芯片内有1K14的EEPROM程序存储器 。数据的宽度为8位,在芯片内有368的静态RAM的通用寄存器,648的EEPROM的数据存储器。8级深度的硬堆栈。具有直接、间接、相对寻址方式。有4个中断源;外部RBOINT引脚;TMRO计时器溢出,PORTB7: 4引脚上信号的改变;数据写入EEPROM完成。数据存储器的擦写可达1000000次,数据的保持大于40年。有13位的IO引脚,可以单独直接控制。每一个IO引脚均可承受25mA的输入输出电流,这样就可以直接驱动LED。有8位的计时计数器(TMRO)并带有8位可编程的预分频。有通电复位(POR);功耗上升(POWERUP)计时器(PWRT); 振荡器起动计时器(OST);看门狗计时器(WDT),为了能可靠工作 ,它有自己的RC振荡器。有代码保证功能。有SLEEP(睡眠)方式,以节者功耗。有4种可供选择的振荡器:RC(低成本的RC振荡器);XT(标准的晶体谐振器);HS(高速晶体谐振器);LP(低功耗,低 频率的晶体)。工作电压的范围宽20V 60V。PIC16C84单片机最大的特点是具有1K14位的电可擦除的程序存储器和648位的电可擦除的数据存储器,这将为系统开发和各种应用提供了 更多的方便。时钟和指令周期从OSCI来的时钟输入在内部经4分频。产生互不叠加的时佛周期,每4个时钟周期(1,2,3,4)组成一个指令周期。在内部、程序计数内对每一个1加1,然后从程序存储器取指令,取出的指令在4时放入指令寄存内。在下一个1利4期间指令被执行。取指令和执行指令采用流水线技术,一个指令周期取指令,下一个指令周期执行已取出的指令,同时又取出下一条指令。所以每条指令执行,CPU的时间是一个指令周期。当某条指令要改变程序计数器的 内容时(如分支指令),则需要两个指令周期才能完成。被取出的指 令在执行指令周期的1时放入指令寄存器,在2,3,4时译码 并执行指令。在2期间读操作在4期间写操作数。存贮器的结构在PIC16C84单片机中有两个存储器块。即程序存储器和数据存储器。每一块具有它自己的总线,即可在同一时钟周期访问每一块。数据存储器被进一步分成通用RAM和专用功能寄存器(SFRs)。专 用功能寄存器用于控制外设模式。数据存储器也包含有数据EEPROM存 储器。这个存储器并不直接映象到数据存储器,而是间接映象的。即由一个间接寻址的指针指明要读写的数据EEPROM的地址。64个字节 的数据EEPROM具有的地址是03FH。31程序存储器的结构PIC16C84单片机具有13位程序计数器,寻址能力为8K14位的程序存储器空间。实际上对于PIC16C84能供使用的只有1K14位的程序存储器(地址为0000 03FFH)。寻址上述单元,如超过了上述地址范围, 地址将卷绕。例对20H单元与地址420H,820H,C20H,1020H,1420H, 1820H,1C20H都将访问到它。系统复位时PC的值为0000H,中断向量是 0004H。PC12:0CALL,RETURN 13RETFIE,RETLW 1级堆栈8级堆栈复位地址 0000H外部中断向量 0004H用户存贮空间 3FFH1FFFH图42程序存储的映象和堆栈32数据存储器的结构数据存储器被分成两个区域。第一个是专用功能寄存器(SFR)区域,第二是通用寄存器区域(GPR)。SFR控制着器件的操作。数据存储器被分成0块和1块。通过程序时状态寄存器STATUS中的RP1: RP0位 的设置来选择0块(RP10,RP00)或1块(RP01)。其中带有斜线的部分是实际不存在的单元,带有号的单元没有物理寄存。指令MOVWF和MOVF可以把W寄存器的值(W寄存器是器件内部的工作 寄存器)传送到寄存器文件(“F”)中的任何单元,反之也可以。整个数据存储器可以直接寻址或通过文件选择寄存器(FSR)进行间接寻址。间接寻址要根据状态寄存器的RP1:RP0位的状态决定访问数据存 储器的某一块,数据存储器的两块中都被分成通用寄存器和专用寄存 器。其中每块低地址单元留作专用寄存器,专用寄存器以上地址的单 元为通用寄存器,它们是静态RAM。1通用寄存器文件 寄存器文件可以直接寻址或通过FSR间接寻址。所有器件都有一定 数量的通用寄存器(GPR),它们的数据宽度是8位。PIC16C84只有36个字节的通用寄存器,地址为0CH 2FH,对1块对应的8CH AFH的访问都将实际访问0CH 2FH(地址的高位被忽略)。文件地址00 间接寻址地址() 间接寻址地址() 8001 TMRO OPTION 8102 PCL PCL 8 203 STATUS STATUS 8304 FSR FSR 8 405 PORTA TRISA 8506 PORTB TRISB 8607 8708 EEDATA EECON1 8809 EEADR EECON2() 890A PCLATH PCLATH 8A0B INTCON INTCON 8B36个通用寄 映象到 存器(SRAM) 0块 2F AF 7F FF 0块 1块2专用功能寄存器CPU和外设使用专用寄存器以控制器件的操作。专用寄存是静态RAM。下面介绍几个重要的专用寄存器状态寄存器状态寄存器包含有ALU(复术逻辑运算单元)的算术状态,复位状态和对数据存储器的块选择,与任何寄存器一样,状态寄存器可以作为任何指令的目的寄存器。如果状态寄存器作为某指令的目的寄存器 ,而那条指令要影响Z、DC,C位的状态,则禁止写这三位。图44是 状态寄存器及其状态。RW RW RW R R RW RW RWIRP RP1 RP0 TO PD Z DC C bit7 bit0其中C是进位位,对ADDWF和ADDLW指令,当这一位为1,表示指令 运算的结果的最高有效位产生了进位输出。减法指令执行的是加第二 操作数的新码。对于循环指令(RRF,RLF),这一位即可以来自于源寄存器的高位,也可以来自于低位。如果这一位为0,表明结果的最高有效位没有产生进位输出。对于减法,这一位的极性取反。DC是数字进位或数字借位位。当这一位为1时,结果的D3位向D4位有进位,否则无进位。对于减法,这位的极性取反。Z是结果为0标志。当这一位为1时,表明算术运算和逻辑运算的结果为0,否则这一位为0,表明运算结果不为0。PD:低功耗位。当这一位为1表明电源加上按正常供电或执行了C LRWDT指令以后,这一位为0表示执行了SLEEP指令(即器件进入了低功 耗状态)。TO超时位。当这一位为1时,表明电源加上,进入了正常供电,且执行了CLRWDT和SLEEP指令,这一位为0表明产生了看门狗计时器超时。RP1:RP0,作为直接寻址的数据存储器的块选择位。RP1:RP00状态,选择0块(地址00H7FH)。RP1:RP001状态,选择1块(地址80HFFH)。RP1:RP010选择2块(地址100H17FH)。RP1:RP011选择3块(地址180H1FFH)。每块128个字节,PIC16C84只使用RP0位,RP1编程时设置为0。不允许使用RP1为通用读写位,这可能影响与将来产品的兼容性。IRP寄存器块选择位(作为间接寻址),当这一位设置为0,选择 01块(地址00HFFH),当这一位为1时,选择23块(地址100H1FFH)。PIC16C84不使用IRP位,IRP位在编程时为0。状态寄存器中的Z、DC,C位是根据器件的逻辑来置1或清0。而TO,PD位是不可写入的。状态寄存器作为目的寄存器的指令的结果将有不同的内容。例如CLRF STATUS(清0状态寄存器)。结果状态寄存器的内容为000uuluu。其中u表示不改变。只有BCF,BSF,SWAPF和MOVW F这些指令可以用来改变STATUS寄存器的内容,因为这几条指令不影响任何状态位。OPTION寄存器OPTION寄存器是可读,可写的寄存器,它包含了各种控制位以配 置TMROWDT的预分频器,外部INT中断,TMRO和在PORTB的微弱上拉。图45是OPTION寄存器各位的功能。 RW RW RW RW RW RW R W RWRBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 bit7 bit0其中PS2,PS1,PS0为预分频器的值的选择。(与PIC16C6X的规定 相同)。PSA位是将预分频器分配给WDT(看门狗计时器,或TMR0)。TOSE是为TMRO选择跳变信号INTEDG是为INT中断引脚选择跳变信号。RBPU用来打开或关闭PORTB内部的上拉电阻。OPTION的所有位的定义同P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论