PIC16C5X系列单片机一览表 |
型号 |
EPROM |
RAM |
时钟频率 |
定时器 |
工作电压V |
I/O口数 |
封装形式 |
PIC16C52 |
384x12 |
25 |
DC-4MHz |
1 |
2.5-6.0 |
12 |
18DIP/SOIC |
PIC16C54 |
512x12 |
DC-20MHz |
1+WDT |
PIC16C55 |
20 |
28DIP/SOIC |
PIC16C56 |
1024 |
12 |
18DIP/SOIC |
PIC16C57 |
2048 |
72 |
20 |
28DIP/SOIC |
PIC16C58 |
73 |
12 |
18DIP/SOIC |
PIC16C5X系列单片机有两种封装形式,一种是双列直插方式,另一种是表面贴装方式。其引脚如上图所示。现对其功能引脚简述如下:
[1].RA0-RA3
I/O输入输出口A,对应内部的f5,是一个4位I/O端口,可位控。
[2].RB0-RB7
I/O输入输出口B,对应内部的f6,是一个8位I/O端口,可位控。
[3].RC0-RC3
I/O输入输出口C,对应内部的f7,是一个8位I/O端口,可位控。只有PIC16C55和PIC16C57才有。
[4].RTCC
实时时钟/计数器输入端,在此端口输入信号的上升沿或下降沿计数,边沿可通过软件选择。
[5].MCLR 主复位端,当MCLR为低电平时对单片机复位。
[6].OSC1
振荡信号输入端。这个端口用于外部振荡信号的输入,用RC振荡时,它接RC电路,用石英振荡电路时,接石英晶体一端。
[7].OSC2
振荡信号输出端。在用石英晶体振荡器或陶瓷振荡器时通过一个串联电阻R接振荡晶体一端,在RC振荡时常作CLKOUT输出(CLKOUT=1/4fosc)。
[8].VDD
电源电压。一般为5V,其范围在2.5-6.25V之间。
[9].Vss 地端。
[10].NC 空引脚。
|
PIC16C5X系列单片机是一个低功耗、高速、全静态CMOS单片机,含ROM、RAM、I/O及中央处理器单元。这种结构基于寄存器文件概念,有独立的数据和程序存储器总线。数据总线及数据器(RAM)是8位字宽,程序总线及程序存储器(ROM)是12位字宽。这种概念强调位、字节和寄存器操作,CPU能在指令读取和执行过程的重叠中高速工作,即当一条指令执行时,下一条指令已经从程序存储器读出,有效地提高CPU的运算速度,同时,通用寄存器和操作寄存器同属于一个数据存储区,采用相同的寻址方式,这样寄存器的存取就非常简单,这样的结构体系决定了其指令系统相对简单但功能却十分强大。
数据寄存器文件
PIC16C5X的8位数据总线连接两个基本的功能部件,由32个或80个可寻址的位寄存器与I/O端口组成的寄存器文件和一个8位字宽的算术逻辑单元(ALU),32字节的RAM可直接用块结构寻址,每个块为16个字节,如下图所示。使用文件选择寄存器(f4),数据可直接寻址或间接寻址。工作寄存器w可执行立即寻址,这种指令结构从程序存储器读取数据送入w寄存器。
PIC16C5X的寄存器文件分为两个功能组,操作寄存器和通用寄存器,操作寄存器包括实时时钟/计数器RTCC、PC、状态寄存器、I/O寄存器(PORTS)和文件选择寄存器,通用寄存器存放数据及控制数据。
|
 |
 |
算术/逻辑运算单元
8位算术/逻辑运算单元ALU连接一个工作寄存器(w寄存器),它是通过w寄存器对数据进行算术和逻辑运算,也可对w寄存器或任何文件寄存器进行操作。
|
PIC16C5X系列单片机内部有一定容量的程序存储器和数据存储器,程序存储器的字节宽度为12位,用于存放用户程序和数据表格。PIC16C52有384字节的程序存储空间,PIC16C54/55的ROM空间为512字节,PIC16C56的地址空间为1024字节,PIC16C57/58则为2048个字节。PIC16C5X单片机采用的是分页寻址方式,每页位512字节,页面地址由状态寄存器f3的PA0、PA1选择。512字节的12位页内可直接寻址,较大的程序存储器可通过选择4个页、每页512字节页面来寻址,如下图所示。
但当页面之间跳转(GOTO
CALL指令)必须先把f3的PA0、PA1设置为相应的页面。需要注意的是:在系统复位时,程序计数器PC将指向程序存储器最后一个页面的最后一个单元。例如PIC16C54/55指向1FFH,PIC16C56指向3FFH,PIC16C57/58则指向7FFH。状态寄存器f3的PA0、PA1指向零页空间,所以程序员在编程时需要在程序存储器底部放置一条跳转指令,跳到程序入口。
单片机执行程序时,程序计数器(PC)自动加1,程序操作支持直接、间接、相对寻址方式,能由测试、跳转指令、子程序调用指令、转移指令或把算出的地址装入PC来实现程序的跳转。片内两级堆栈为子程序嵌套提供服务。
|
 |
堆栈
PIC16C5X系列单片机提供两级堆栈,参考上图。CALL指令把程序计数器加1压入堆栈1,栈1自动压入栈2,当多于两级子程序调用指令执行时,堆栈中只有存储最近两个返回地址,所以主程序中调用的子程序最多只能嵌套一次,当执行一条CALL指令,PIC16C56/57/58的f3之页面选择位PA1、PA0被装入程序计数器的最高两位,第9位清“0”,也就是子程序入口地址必须位于存储页的低半页000-0FF、200-2FF、400-4FF、600-6FF地址。但这里指的是子程序主体的起始位置,而子程序体是可以延伸到下半页面的。
PIC16C56/57/58,由于程序空间分别为1k和2k,可能存在跨页面子程序调用,所以调用子程序前须先把f3的PA1、PA0设置成该子程序所在页面地址。诚然,如果子程序与调用程序同在一个页面,则无需这个步骤。由于堆栈和PC的宽度是一样的,所以可在程序的任何地方执行CALL指令来调用子程序。当然跨页面的调用还须考虑页面地址PA1、PA0。
RETLW(子程序返回指令)把栈1内容送到程序计数器PC,同时栈2内容复制到栈1,多于两个RETLW指令运行时,栈1只会装入先前存在栈2的地址,对于PIC16C56/57,程序总是返回调用它的同一页面,不管它是处在哪个页面,也不管f3的页面选择位的设置状态如何。但是执行RETLW指令并不会改变f3中的PA1、PA0的值。w寄存器会被装入RETLW指令中所指向的数值,即立即数。这在程序存储器中实现数据查表时就非常有用。
|
|
|
数据存储器分为操作寄存器、I/O寄存器、通用寄存器和专用寄存器四种。由于专用寄存器地址对用户不透明,我们将在后面的章节中论述。操作寄存器和I/O寄存器占用的物理地址是01H—07H,通用寄存器从地址08H开始。
1.操作寄存器文件
操作寄存器文件是寄存器文件的一种,它是专用的寄存器。它和通用寄存器文件有很大的区别。通用寄存器文件是用于存放数据的,而操作寄存器文件则用于寻址、定时等各种特殊用途。操作寄存器文件包括间接数据寻址寄存器f0、实时时钟/计数器f1(RTCC)、程序计数器f2(PC)、状态寄存器f3(STATUS)、文件选择寄存器f4(FSR)等。下面我们分别介绍这些寄存器。
[1].间接寻址寄存器f0
这不是一个物理寄存器,寻址f0则会读出文件选择寄存器f4的内容,并对f4所指定的文件寄存器进行间接寻址操作。f0常用作间接寻址指针。例如指令ADDWF
f0,W把f4(FSR)所指的寄存器的内容和W寄存器相加,结果存于w,f0本身不存任何价值。
[2].实时时钟/计数器f1(RTCC)
该寄存器和其它寄存器一样,可通过程序写入和读出。它用于对加在RTCC引脚上的脉冲计数(用作计数器)或对内部时钟计数(对fOSC4分频后计数,做定时器用)。RTCC的结构框图如下图所示。
|
 |
OPTION寄存器的PSA位控制预分频器(prescaler)的分配对象,当PSA位为“0”,8位可编程预分频器分配给RTCC,这时外部或内部信号经过预分频器分频后再输出给RTCC。预分频器的分频比由OPTION寄存器的PS0-PS2位决定。OPTION寄存器不在数据存储器内,是一个可由“OPTION”指令寻址的特别寄存器,如果预分频器被分配给RTCC,则写f1会对预分频器清“0”,但OPTION寄存器内容保持不变,则分配对象、分频比等均不变。
OPTION寄存器的RTS位决定是对外部还是内部计数,当RTS=1时,对来自RTCC引脚的信号计数,当RTS=0时,对fOSC/4计数。OPTION寄存器的RTE位决定RTCC脚的信号是上升沿(RTE=0)还是下降沿(RTE=1)时增1。当RTS=0,内部时钟(频率为fOSC/4)作为计数对象,RTE位、RTCC引脚与内部电路无关。为减少功耗,RTCC脚必须连接VDD或Vss。
当预分频器分配给计数器/定时器RTCC后,RTCC将计数到预分频器值后加1,例如,如预分频器值为1:4,则RTCC将计数4次加1。
无论内部还是外部时钟是否连接预分频器,一旦有时钟供给RTCC,f1将加1。在计数到达FFH时,在下一个计数发生后将自动清零,重新开始计数,一直循环下去。所有令f1(RTCC)加1的脉冲都将延时2个指令周期。例如在写f1后,随后的两个指令周期就不加1。这独立于外部或内部时钟的选取。如预分频器分配给RTCC,预分频器的输出将在f1(RTCC)加1前延时两个指令周期。对于写或读RTCC的指令(例如MOVF
RTCC,W或CLRF RTCC)都是一样的,在应用RTCC时,在不影响其计数情况下测试,可用MOVF f1,W指令。
应注意外部时钟用于RTCC时钟的有关情况。
当外部时钟用于RTCC时,它与内部时钟同步。所以,外部时钟必须符合一定的要求,同样在外部时钟输入边沿到RTCC加1,存在着延时,在预分频后实现同步。在每个指令周期,PSOUT的输出被采样两次以检测上升或下降沿。因此,这需要PSOUT至少保持2TOSC高电平和至少保持2TOSC低电平。TOSC是振荡周期。
当不用预分频器时,PSOUT输出与RTCC时钟输入一样,要求如下:
TRTH=RTCC 高电平时间≥2TOSC+20ns
TRTL=RTCC 低电平时间≥2TOSC+20ns
当用预分频器时,RTCC输入被异步脉冲计数器型的预分频器分频,预分频器输出是对称的。
PSOUT=RTCC 高电平时间=PSOUT低电平时间=N.TRT/2
当TRT是RTCC输入周期和N是预分频器的值(2,4,8,……256)时,要求:
N.TRT/2≥2TOSC+20ns
或
TRT≥2(TOSC+20ns)/N
用户不需要确定RTCC高、低电平时间,但是如果RTCC的高、低电平持续时间太小,脉冲有可能不被采集。一般要求最小的高、低电平时间为10ns。RTCC输入要求为:
TRT=周期≥(4TOSC+40ns)/N
TRTH=RTCC 高电平时间≥10ns
TRTL=RTCC 低电平时间≥10ns
外部时钟的延时,预分频器的输出由内部时钟同步,RTCC在Q4时加1,从外部时钟边沿出现到RTCC实际加1,存在着一个较小的延时,在3TOSC至
7TOSC之间。例如,测量两个边沿之间的时间间隔,其精度在±4TOSC之间。 |
|
|
3.程序计数器f2(PC)
程序计数器给出片内2048x12的ROM地址,不同的型号程序计数器与它们的两层堆栈为9-11位寛,如表1所示。
|
表1 程序计数器PC与堆栈大小 |
型号 |
PC宽度/位 |
堆栈宽度/位 |
PIC16C54/55 |
9 |
9 |
PIC16C56 |
10 |
10 |
PIC16C57 |
11 |
11 |
系统复位后,PC为全“1”,程序执行每一条指令PC自动加“1”,除非程序指令本身改变PC的内容(例如程序跳转,中断服务等),下面的指令将改变PC的值。
[1].“GOTO”指令:允许直接装入程序计数器的低8位,对于PIC16C56/57/58,PC的最高位由PA0、PA1两个页面选择位(也即状态寄存器的5、6位确定),此指令允许跳到任一页的任意位置。
[2].“CALL”指令:先把当前PC的值压入堆栈,然后使第9位清“0”,并把低8位装入程序计数器PC,对于PIC16C56/57/58,PC的高两位被装入页面选择位PA0、PA1。
[3].“RETLW”指令:该返回指令直接把栈顶内容重装入PC。
[4].程序计数器可由某位指令改变(例如MOVWF f2,ADDWF
f2或BSF
f2,5)计算结果将装入PC低8位,第9位清“0”。对于PIC16C56/57/58,PC的高两位被装入页面选择位PA0、PA1。
需要注意的是:在执行“CALL”或其它改变PC值指令时,第9位会被清“0”,所有子程序调用指令和需要计算的跳转指令时,要把分支程序放在任何页面(512字节)的前256个单元(地址分别为000-0FFH、200-2FFH、400-4FFH、600-6FFH)。
多个程序存储器页面选择(对PIC16C56/57/58有效)情况下,当程序计数器指向所在存储页的最后地址时,它仍能加1,并继续执行到下一页面,但PA0,PA1页面选择位不会改变,以后的“GOTO”、“CALL”、“ADDWF
f2”、“MOVWFf2”等指令会返回原来的页面,除非页面选择位在程序中被更改。例如NOP指令位于1FFH(0页),PC加1变为200(1页),一条在200的“GOTO
XXX”指令将返回0页的XXX地址(若f3的页预选位“0”)。
RESET状态下,PA0、PA1清“0”,0页会成为预选页。同时程序计数器PC会对最后一页的最后一个单元寻址。因此,在这个位置的“GOTO”指令会自动返回至0页执行。
|
4.状态寄存器f3
该寄存器包含有ALU的算术状态位,RESET状态位、大于512字节程序存储器的页面预选位。
状态寄存器f3可以用作目标寄存器。某些标志位通过相应的写来设定,而另外一些位是不能通过指令来改变的。TO、PD位是不可写的。因此一条指令对状态寄存器执行的结果会有所不同。例如CLR
f3被除了TO和PD位之外的所有位清“0”,并把“Z”位置“1”,所以得到的状态寄存器内容为“000UU100”,其中,U表示不变化。
建议用BCF、BSF或MOVWF指令来改变状态寄存器的内容,这些指令只改变相应的位,而不影响其它状态位。
其它影响状态位的指令可参考指令系统的说明。
状态寄存器包含8位数据位,其中低5位是状态标志位,高3位中的最高位PA2未用。PA0和PA1是存储器页面选择位,其结构如下表所示。
|
表1 状态寄存器的结构 |
PA2 |
PA1 |
PA0 |
TO |
PD |
Z |
DC |
C |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
下面我们介绍各位的意义。
[1].C(D0):进位/借位标志位。在执行ADDWF和SUBWF指令时,最高位产生进位或借位时,C=“1”,在减法采用补码运算。
[2].DC(D1):辅助进位位。当执行ADDWF和SUBWF指令时,低4位产生进位或借位时,DC=“1”。
[3].Z(D2):零标志位。当算术操作结果为0时,Z="1"。
[4].PD(D3):低功耗标志位。上电或执行CLR WDT指令时,PD=“1”。执行SLEEP指令时,PD=“0”。
[5].TO(D4):WDT溢出标志位。当上电或执行CLR
WDT、SLEEP指令时,TO=“1”,WDT溢出时,TO=“0”。
[6].PA0,PA1(D5,6):程序存储器页面选择位。对于PIC16C56单片机,PA0是程序存储器页面选择位。PA1是通用读写位。在PA=0时,选择0页面,即000H-1FFH。PA0=1时,选中1页,地址为200H-3FFH。
对于PIC16C57/58单片机,PA0、PA1是程序存储器页面选择位。它们的值从00-11H分别选中0-3页,即地址为000-1FFH、200H-3FFH、400H-5FFH、600H-7FFH。
[7].PA2(D7):通用读写位,未使用。
在复位时,PA2,PA1,PA0被清“0”,上电或执行CLR WDT指令时,TO、PD都被置“1”,这两位的变化如表2所示。上电复位时,Z、DC、C标志位状态不定。在其它复位情况下(如WDT溢出)Z、DC、C状态不变。上电复位TO、PD的状态见表3。 |
表2 事件对TO、PD标志位的影响 |
事件 |
TO |
PD |
说明 |
上电 |
1 |
1 |
不影响PD标志位 |
WDT超时溢出 |
0 |
X |
SLEEP指令 |
1 |
0 |
CLR WDT指令 |
1 |
1 |
表3 复位后TO、PD标志位的状态 |
TO |
PD |
复位原因 |
0 |
0 |
WDT超时溢出使SLEEP唤醒 |
0 |
1 |
WDT超时溢出(不在SLEEP状态时) |
1 |
0 |
MCLR加低电平使SLEEP唤醒 |
1 |
1 |
上电时 |
X |
X |
MCLR加低电平 |
ADDWF指令后,进位位C=1表示产生进位,执行SUBWF指令后,进位位C=0表示借位,执行ADDWF或SUBWF指令也将影响辅助进位位DC状态。DC表示低半字节到高半字节的进位和借位。
|
通用寄存器文件是用于存放数据的寄存器。一般用于中间数据或结果数据存放。所有的通用寄存器构成了通用寄存器文件。
专用寄存器是单片机内的物理寄存器,它们与数据存储器无关,专用寄存器用于特殊用途,例如I/O断口控制等。
1.通用寄存器
PIC16C52/54/56的通用寄存器地址分配为F07H—F1FH,PIC16C55则为F08H—F1FH,这些地址组成了通用寄存器文件。PIC16C57/58的通用寄存器地址分配如下:
F08H—F0FH:常用的并与存储器块无关的通用寄存器文件。
F10H—F1FH:Bank0的通用寄存器文件。
F20H—F2FH:等同于F00—F0FH。
F30H—F3FH:Bank1的通用寄存器文件。
F40H—F4FH:等同于F00—F0FH。
F50H—F5FH:Bank2的通用寄存器文件。
F60H—F6FH:等同于F00—F0FH。
F70H—F7FH:Bank3的通用寄存器文件。
2.专用寄存器
[1].W工作寄存器
在两个操作量的指令中用于存放第二个操作量,同时,也用于内部数据传送。
[2].TRISA:A口(f5)I/O控制寄存器0-3位有效,对应于I/O(f5)4位宽度。
[3].TRISB:B口(f6)I/O控制寄存器。
[4].TRISC:C口(f7)I/O控制寄存器。
执行TRIS指令时,w寄存器的内容将传送至I/O控制寄存器,以此来定义各I/O口的输入/输出状态。
I/控制寄存器的某位为“1”,使相应的I/O线置于高阻抗状态,即输入态,某位为“0”,使相应的I/O线置输出态。I/O控制寄存器是只写寄存器,复位时全为“1”。
[5].OPTION:预分频器/RTCC选择寄存器。
分配预分频器(prescaler)给RTCC或WDT。预分频器只能分配给RTCC或WDT其中之一使用,不能同时使用。OPTION寄存器是用于定义预分频器的预分频系数,RTCC信号源及作用于RTCC的信号边缘。OPTION寄存器是一个只写6位宽度寄存器。执行OPTION指令时,会把W寄存器内容传送至OPTION寄存器中。在复位时,OPTION寄存器被置为全“1”。
|
RTS |
RTE |
PSA |
PS2 |
PS1 |
PS0 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
寄存器OPTION各位定义如下:
[1].
RTS(D5):RTCC信号选择位,RTS=0时,选中内部指令周期时钟(CLKOUT)为输入信号,在RTS=1时,选中RTCC引脚输入的信号。
[2]. RTE(D4):RTCC信号边沿选择位,RTE=0时,选中RTCC引脚输入信号的上升沿计数,RTE=1时,RTCC引脚输入信号下降沿触发。
[3].
RTS(D3):预分频器分配位。PSA=0时,把预分频器分配给RTCC,PSA=1时,把预分频器分配给WDT。
[4].
PS0-PS2(D2-D0):预分频值,它用于确定分频器的分频比,定义如下表所示。
预分频值 |
RTCC时分频比 |
WDT时分频比 |
0 0 0 |
1:2 |
1:1 |
0 0 1 |
1:4 |
1:2 |
0 1 0 |
1:8 |
1:4 |
0 1 1 |
1:16 |
1:8 |
1 0 0 |
1:32 |
1:16 |
1 0 1 |
1:64 |
1:32 |
1 1 0 |
1:128 |
1:64 |
1 1 1 |
1:256 |
1:128 |
|