PIC16C5X单片机应用与设计中国工控网Word下载.docx
《PIC16C5X单片机应用与设计中国工控网Word下载.docx》由会员分享,可在线阅读,更多相关《PIC16C5X单片机应用与设计中国工控网Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
-军工级:
2.5V~6.0V
内部自振式看门狗(WDT)
低功耗模式(Sleep),耗电小于10uA。
内部复位电路
内带一个8位定时器/计数器(RTCC)
具备保密位。
保密熔丝可在程序烧写时选择将其熔断,则程序不能被读出拷贝。
提供四种可选振荡方式
-低成本的阻容(RC)振荡-RC
-标准晶体/陶瓷振荡-XT
-高速晶体/陶瓷振荡-HS
-低功耗,低频晶体振荡─LP
12~20根双向可独立编程I/O口。
每根I/O口都可由程序来编程决定其输入/输出方向。
低功耗
<
2mA @5V,4MHz
15uA @3V,32KHz
3uA 低功耗模式 @3V,0°
C~70°
C
第二节PIC16C5X型号介绍及引脚介绍
PIC16C5X有五种型号,见下表:
PIC16C5X管脚图如下:
图1.1PIC16C5X管脚图
表1.2描述了各引脚的功能:
注:
RTCC设置成内部定时器时(由程序设定),这时应将RTCC端接VSS或VDD,以避免干扰。
采用RC振荡时,OSC2端输出一OSC1的4分频信号。
第三节PIC16C5X 内部结构
PIC16C5X在一个芯片上集成了一个8位算术逻辑单元ALU和工作寄存器(W);
384~2K的12位程序存储器(ROM);
32~80个8位数据寄存器(RAM);
12~20个I/O口端;
8位计数器及预分频器;
时钟、复位、及看门狗计数器等。
内部结构如图1.2所示:
图 1.2 PIC16C5X 内部结构
从图中可以看到,PIC16C5X有个特点,就是把数据存储器RAM当作寄存器来寻址使用以方便编程。
寄存器组按功能分成二部分,即特殊寄存器组和通用寄存器组。
特殊寄存器组包括实时时钟计数器RTCC,程序计数器PC,状态寄存器Status,I/O口寄存器以及存储体选择寄存器FSR。
这些寄存器稍后我们还要详细论述。
PIC总线结构采取数据线(8位)和指令线(12位)独立分离的哈佛(Harvard)结构。
这样可使单片机的指令速度得到提高。
当一条指令在ALU中执行时,下一条指令已经被取出放到指令寄存器等待执行了。
算术逻辑单元ALU和工作寄存器(W)承担算术逻辑操作任务。
PIC16C5X提供二级堆栈(Stack),所以子程序调用只有二层。
使用时一定要注意这点,否则程序运行将失去控制。
第四节程序存储器及堆栈
PIC16C5X内部有384~2K的只读程序存贮器,下面论述其结构和堆栈。
§
1.4.1 程序存储器结构
PIC16C5X程序存储器结构如图1.3所示:
从上图可看出,PIC程序存储器采用分页结构,每页长0.5K。
因此对于PIC16C52程序存储器在1页之内,而对于PIC16C54和PIC15C55程序存储器容量为1页,PIC16C56和PIC16C57的容量则分别为2页和4页。
页面地址由状态寄存器f3的第5位和第6位(PA0、PA1)确定。
程序转移时,在本页内可直接进行;
在需跨页跳转时(GOTO、CALL指令),则必须根据将要跳转去的页面,把f3中的PA0、PA1位置成相应的值。
具体请参考f3寄存器描述及§
2.7.2程序设计基础的程序技巧例子。
1.4.2 堆栈
PIC16C5X设有二层堆栈,堆栈1和堆栈2,供子程序调用。
涉及堆栈操作的指令有二条。
1、CALL--在主程序中第一次执行CALL指令时,将PC值加1后推入堆栈1,堆栈1原有的内容则被推入堆栈2中。
这时子程序中还可再做一次子程序嵌套,即再执行一次CALL指令。
如果子程序调用多于二层时,堆栈中只存放最近的二个返回地址。
当执行一条CALL指令时,状态寄存器f3中的将页面寻址位PA1、PA0将被置入到PC的最高二位(第11位和第10位),而PC的第9位总是被置为0,如图1.3所示。
所以这时PC值将是
这意味着在PIC16C5X中,子程序起始地址只能放在每个程序存储页面的上半页,即低地址的那一半(000-0FF、200-2FF、400-4FF、600-6FF)。
注意,这里指的是子程序的起始地址,即子程序头。
而子程序体是可以延伸到下半页去的。
对于PIC16C56和PIC16C57,由于程序空间分别为1K和2K,可能存在跨页面子程序调用。
所以调用子程序前必须先把f3中的PA0、PA1设置成该子程序所在的页面地址。
返回后再将其恢复成当前的页面值。
当然如果这时子程序是在同一页面,则可省去这一过程。
2、RETLW--该指令把栈顶(堆栈1)的值写入PC,同时还把堆栈2的值拷贝到堆栈1去。
子程序总是返回到调用它时所在的地方,不管它是处在什么页面,也不管f3寄存器中的PA0、PA1这时是指在什么页面。
但是执行RETLW(子程序返回)指令并不会改变f3中PA0、PA1的值,所以当你从一次跨页面的子程序调用返回时,不要忘了恢复f3中的原先的PA0和PA1值。
请参考上面关于CALL指令的叙述。
由于堆栈和PC的宽度是相同的,所以你可以在程序的任何地方执行一条CALL指令来调用子程序。
但是对于跨页面的调用,你要小心处理f3中的页面地址位PA0和PA1,请参考第二章指令详解中的CALL实例。
第五节数据存储器
PIC16C5X把数据存储器RAM都当作寄存器来使用以使寻址简单明洁,它们功能上可分为操作寄存器、I/O寄存器、通用寄存器和特殊功用寄存器。
它们的组织结构如图1.4所示:
这些寄存器用代号F0~F79来表示。
F0~F4是操作寄存器,F5-F7是I/O寄存器,其余为通用寄存器。
特殊功用寄存器地址对用户不透明。
1.5.1 操作寄存器
1、F0 间址寄存器
寻址F0实际上意味着间址寻址。
实际地址为寄存器选择寄存器F4的内容。
例:
MOVLW10
MOVWF f4 ;
10→f4
MOVLW 55
MOVWF f0 ;
55→f10
2、F1 实时时钟/计数寄存器(RTCC)
此寄存器是一个8位计数器。
和其他寄存器一样可由程序进行读写操作。
它用于对外加在RTCC引脚上的脉冲计数,或对内部时钟计数(起定时器作用)。
图1.5 RTCC 方块图
上图中可看出RTCC工作状态由OPTION寄存器控制(参见§
1.5.4),其中OPTION寄存器的RTS位用来选择RTCC的计数信号源,当RTS为"
1"
时,信号源为内部时钟,RTS为"
0"
时,信号源为来自RTCC引脚的外部信号。
OPTION寄存器的PSA位控制预分频器(Prescaler)分配对象,当PSA位为"
,8位可编程预分配给RTCC,即外部或内部信号经过预分频器分频后再输出给RTCC。
预分频器的分频比率由OPTION内的PS0~PS2决定。
这时涉及写f1(RTCC)寄存器的指令均同时将预分频器清零。
但要注意OPTION寄存器内容仍保持不变,即分配对象、分频比率等均不变。
OPTION的RTE位用于选择外部计数脉冲触发沿。
当RTE为"
时为下降沿触发,为"
时为上升沿触发。
RTCC计数器采用递增方式计数,当计数至FFH时,在下一个计数发生后,将自动复零,重新开始计数,以此一直循环下去。
RTCC对其输入脉冲信号的响应延迟时间为2个机器周期,不论输入脉冲是内部时钟、外部信号或是预分频器的输出。
响应时序见图1.6。
RTCC对外部信号的采样周期为2个振荡周期。
因此当不用预分频器时,外加在RTCC引脚上的脉冲宽度不得小于2个振荡周期,即1/2指令周期。
同理,当使用预分频器时,预分频器的输出脉冲周期不得小于指令周期,因此预分频器最大输入频率可达N.fosc/4,N为预分频器的分频比,但不得大于50MHZ。
当RTCC使用内部时钟信号时,如果没有预分频器,则RTCC值随指令节拍增1。
当一个值写入RTCC时,接下来的二个指令节拍RTCC的值不会改变,从第三个指令节拍才开始递增,见下图。
图1.6ARTCC时序图:
内部时钟/无预分频器
图1.6BRTCC时序图:
内部时钟/预分频比1:
2
应注意的是尽管PIC对外部加于RTCC信号端上的信号宽度没有很严格的要求,但是如果高电平或低电平的维持时间太短,也有可能使RTCC检测不到这个信号。
一般要求信号宽度要大于是10nS。
3、F2 程序计数器(PC)
程序计数器PC可寻址最多2K的程序存储器。
表1.3列出了PIC16C5X各种型号的PC长度和堆栈的长度。
表1.3PC及堆栈的宽度
单片机一复位(RESET),F2的值全置为"
。
除非执行地址跳转指令,否则当执行一条指令后,F2(PC)值会动加1指向下一条指令。
下面这些指令可能改变PC的值:
a、"
GOTO"
指令。
它可以直接写(改变)PC的低9位。
对于PIC16C56/57/58,状态寄存器F3的PA1、PAO两位将置入PC的最高二位。
所示"
指令可以跳转到程序存储器的任何地方。
b、"
CALL"
它可以直接写PC低8位,同时将PC的第9位清零。
对于PIC16C56/57/58,状态寄存器F3的PA1、PAO两位将置入PC的最高二位(第10、11位)。
c、"
RETLW"
它把栈项(堆栈1)的值写入PC。
d、"
MOVWFF2"
它把W寄存器的内容置入PC。
e、"
ADDWFF2"
它把PC值加1后再和W寄存器的值相加,结果写入PC。
在以上b、d和e中,PC的第9位总是被清为零。
所以用这三条指令来产生程序跳转时,要把子程序或分支程序放在每页的上部地址(分别为000-0FF、200-2FF、400-4FF、600-6FF)。
4、F3 状态寄存器(STATUS)
如图1.7所示F3包含了ALU的算术状态、RESET状态、程序存储器页面地址等。
F3中除PD和TO两位外,其他的位都可由指令来设置或清零。
注意,当你执行一条欲改变F3寄存器的指令后,F3中的情况可能出乎你的意料。
CLRFF3;
清F3为零
你得到的结果是F3=000UU100(U为未变)而不是想像中的全零。
UU两位是PD和TO,它们维持不变,而2位由于清零操作被置成"
所以如果你要想改变F3的内容,建议你使用BCF、BSF和MOVWF这三条指令,因为它们的执行不影响其他状态位。
MOVLW0 ;
0→W
MOVWFF3;
把F3除PD和TO以外的位全部清零,则你可得到F3=000UU000。
有关各条指令对状态位的影响请看第二章介绍。
在加法运算(ADDWF)时,C是进位位。
在减法运算(SUBWF)时,C是借位的反(Borrow)。