PIC单片机C语言非常入门与视频演练
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 PIC单片机介绍

1.1.1 PIC单片机的特色

世界上有一些著名计算机芯片制造公司,其单片机产品是在其原有的微型计算机CPU基础上改造而来的,在某种程度上自然存在一定的局限性。而Microchip公司是一家专门致力于单片机开发、研制和生产的制造商,其产品设计起点高,技术领先,性能优越,独树一帜。目前,已有多家著名半导体公司仿照PIC系列单片机,开发出与之引脚兼容的系列单片机。例如,美国SCENIX公司的SX系列、中国台湾EMC公司的EM78P系列、中国台湾MDT公司的MDT系列等。可以说,PIC单片机代表着单片机发展的新动向。以下分几个方面介绍它的优越之处。

1.采用了哈佛总线结构

51单片机的总线结构是冯·诺依曼型,如图1-1(a)所示,计算机在同一个存储空间取指令和数据,两者不能同时进行;而PIC单片机的总线结构是哈佛结构,如图1-1(b)所示,指令和数据空间是完全分开的,一个用于指令,一个用于数据,由于可以对程序和数据同时进行访问,所以,提高了数据吞吐率。正因为在PIC单片机中采用了哈佛双总线结构,所以,与常见的微控制器不同的一点是,程序和数据总线可以采用不同的宽度。数据总线都是8位的,但指令总线位数分别为12位、14位、16位。

2.驱动能力强

PIC单片机的I/O端口驱动负载强,每个I/O引脚吸入和输出电流的最大值可分别达到25mA和20mA,能够直接驱动发光二极管(LED)、光电耦合器或者微型继电器等。

3.外接电路简洁

PIC单片机片内集成了上电复位电路、I/O引脚上拉电路、看门狗定时器等,可以最大程度地少用或不用外接器件,以便实现“纯单片”应用。

4.功耗低

PIC单片机是世界上功耗最低的单片机品种之一,在4MHz时钟下工作时耗电不超过2mA,在睡眠模式下耗电可以低到1μA以下。

图1-1 冯·诺依曼和哈佛结构

5.指令精简

PIC单片机的指令系统只有35条指令,常用约20条,绝大多数为单周期指令,执行速度快。而51系列单片机指令系统却有111条指令。

6.流水线结构

51单片机的取指和执行采用单指令流水线结构,即取一条指令,执行完后再取下一条指令,如图1-2(a)所示;而PIC的取指和执行采用双指令流水线结构,当一条指令被执行时,允许下一条指令同时被取出,如图1-2(b)所示,这样就实现了单周期指令。

图1-2 51单片机与PIC单片机的指令执行过程

PIC单片机还有一些优点,这里不再一一介绍。

1.1.2 PIC16F87X单片机的结构

PIC16F87X单片机是一种高速度、低功耗、功能齐全的微处理芯片,内部含有Flash ROM、RAM、E2PROM、I/O端口、A/D转换器、捕捉/比较器/PWM、串行通信端口、定时器/计数器、中断控制器和中央处理器等。

PIC16F87X单片机的引脚分为两种:一种为40脚(包括871,874,877,877A);另一种为28脚(包括870,872,873,876等)。在本书中,主要以PIC16F877A单片机为例进行介绍,其内部结构如图1-3所示。

图1-3 PIC16F877A单片机内部结构

1.1.3 PIC16F877A单片机的外部引脚

PIC16F877A单片机主要有3种封装形式,本书介绍使用最普遍的DIP40封装形式。其外围引脚分布如图1-4所示。

图1-4 PIC16F877A单片机的外部引脚分布

PIC16F877A单片机和51系列单片机一样,其引脚除电源VDD、Vss为单一功能外,其余的信号引脚一般有多个功能,即引脚的复用功能,PIC16F877A引脚符号和功能如表1-1所示。

表1-1 PIC16F877A引脚符号和功能

1.1.4 PIC16F877A的内部存储器

1.程序存储器

程序存储器是专门用来存放程序和常数的,PIC16F877A单片机内部配置了8KB×14位的闪速(Flash)程序存储器,可以很方便地进行在线擦除和烧写,寿命可达1000次以上。PIC16F877A程序存储器具有13位宽的程序计数器(PC)。PC指针所产生的13位地址最大可寻址的程序存储器空间为8KB,相应的地址编码范围为0000H~1FFFH。

PIC16F877A单片机的复位向量为0,复位向量指的是当由于各种原因产生单片机复位时,程序是从复位向量,即0x0000开始执行的。

PIC16F877A单片机的中断向量为0x0004。中断向量指的是当单片机产生中断时,硬件将PC指针强制指向该中断向量,即程序自动跳转到0x0004。

如图1-5所示是程序存储器结构图。

2.数据存储器

数据存储器是单片机中一个非常重要的部件,专门用于存储程序运行时的中间数据、结果数据等。PIC16F877A的数据存储器结构如图1-6所示。

图1-5 程序存储器结构图

图1-6 PIC16F877A的数据存储器结构

PIC16F877A单片机的数据存储器分为4个体(bank),即bank0~bank3,也称为体0~体3。图中已命名的寄存器为特殊功能寄存器,未命名的为通用寄存器,通用寄存器可供用户自由使用。图中体1~体3中“映射到70H~7FH”单元的寄存器,实际上就是70H~7FH单元中的寄存器,只是可以在不同的体中直接存取,便于编程。图中灰色单元不能使用,图中的特殊功能寄存器名称是在汇编程序中定义的,PIC单片机C语言编译软件PICC中定义的特殊功能寄存器绝大部分与之相同,但也有特殊情况,在用PICC的C语言编程时要引起注意。

在PIC16F877A单片机汇编编程中,数据存储器的分体及程序存储器的分页是学习PIC单片机中遇到的主要难点,不过,如果使用PICC编程,这个问题将由PICC自动完成,大大提高了编程效率,这也正是C语言的魅力所在。

1.1.5 PIC16F877A单片机的I/O口

PIC16F877A有33个I/O引脚,这33个I/O引脚均可以作为普通的I/O引脚使用,大部分I/O引脚还有两个以上的功能。有A、B、C、D、E共5个端口。其中,A端口有6个引脚,B、C、D端口各有8个引脚,E端口有3个引脚。

当作为普通引脚时,到底是作为输入还是输出,是由各自的方向控制寄存器控制的,A、B、C、D、E端口的方向控制寄存器分别为TRISA、TRISB、TRISC、TRISD、TRISE,相应的控制寄存器的位为0,则该I/O引脚作为输出;相应地,位1作为输入。

例如,语句TRISA=0b00000001,就设置了A端口的高7位为输出,最低位为输入。每个I/O引脚的最大输出电流(拉电流)为20mA,最大输入电流(灌电流)为25mA。

1.端口A

端口A有6个引脚,除了RA4外,其余5个口均可作为A/D转换的模拟电压输入口,还有部分引脚与比较器、SPI有关,RA4还与TMR0有关。因此,在使用RA口时,除了要设置TRISA外,有时相关寄存器也要设置。

在上电复位时,RA口的默认设置是作为模拟输入的,ADCON1寄存器中默认值为0b00xx0000,这个值的设置结果是除RA4以外的所有RA口都作为模拟输入口。在使用时要特别注意。

ADCON1寄存器定义如下:

ADCON1寄存器是可读写的,和I/O口相关的是低4位,用于定义ADC模块输入引脚的功能分配。复位时低4位状态全为0,定义RA和RE端口中的8个引脚RE2~RE0、RA5和RA3~RA0全部为ADC的模拟信号输入通道。只有当定义PCFG3~PCFG0=011x时,才会使RE2~RE0、RA5和RA3~RA0全部定义为普通数字I/O口。

注意:RA4是一个集电极开路结构,和A口的其他引脚有点不同,RA4作为普通数字I/O时,输入和其他端口一样是高阻抗,但没有上钳位二极管做限压保护;RA4作为输出时,须接一个上拉电阻才能输出高电平。

2.端口B

端口B有8个引脚,8个引脚具有内部弱上拉使能控制,由OPTION寄存器的第7位RBPU控制,如果弱上拉使能作为输入的RB口在端口悬空时,将被上拉到高电平。

OPTION寄存器定义如下:

当第7位RBPU=1时,RB的弱上拉电路全部禁止;RBPU=0时,RB的弱上拉电路全部使能。

B口的RB0/INT具有外部中断功能。RB的高4位还具有电平变化中断功能,当此4个引脚作为输入时,只要有一个引脚的电平发生变化,就会使RB电平中断标志位置1。这里所说的电平变化指的是逻辑电平变化,即从高变低或从低变高。

另外,需说明的是,如果使用ICD2作为调试工具,RB6、RB7引脚将被调试系统占用,因此,在调试时,此两个引脚暂不能使用。

3.端口C

端口C有8个引脚,是功能最多的一个端口,其功能详见表1-1。

4.端口D

端口D有8个引脚,除了作为普通I/O口外,还能作为并行从动口使用。

5.端口E

端口E是一个只有3个引脚的I/O口,它们都可以作为A/D转换的模拟电压输入口。

1.1.6 复位电路和系统时钟

1.复位电路

PIC16F877A的复位功能设计得比较完善,实现复位或引起复位的条件和原因可以归纳为以下4类。

① 人工复位:无论单片机处在正常运行程序,还是处在睡眠状态或出现死机状态,只要在人工复位端加入低电平信号,就会令其复位。

② 上电复位:每次单片机加电时,上电复位电路都要对电源电压VDD的上升过程进行检测,当VDD上升到规定值1.6~1.8V时,就产生一个有效的复位信号,经“72ms+1024个时钟周期”的延时,会使单片机复位。

③ 看门狗复位:如果打开看门狗,只要没有对看门狗定时器WDT进行及时清零,WDT就会出现超时溢出,也就会引发单片机复位。

④ 欠压复位:为了确保程序可靠运行,当电源电压VDD出现跌落并下降到4V以下时,内部欠压复位电路产生一个复位信号,使CPU进入并保持在复位状态,直到VDD恢复到正常范围,之后再延长72ms,CPU才能从复位状态回到正常状态。

外部复位电路的几种接法如图1-7所示。

最简单的接法是将直接接VDD脚,如图1-7(a)所示。

接一个按钮开关和一个电阻则便于手工复位操作,如图1-7(b)所示。

针对电压VDD上升缓慢的应用场合,图1-7(c)可以延长复位时间,确保单片机可靠运行。

在另一些应用中可能需要对VDD严密监视,一旦发现VDD跌落到某一门限值(VDD<Vz+0.7V,Vz是稳压管的稳定电压)时,就令芯片复位,以免系统失控,这时可按图1-7(d)设计复位电路。

图1-7 外部复位电路的几种接法

2.系统时钟

单片机内部的各种功能电路几乎全部是由数字电路构成的。数字电路的工作离不开时钟信号,每一步细微动作都是在一个共同的时间基准信号协调之下完成的。作为时基发生器的时钟振荡电路,为整个单片机芯片的工作提供系统时钟信号,也为单片机与其他外接芯片之间的通信提供可靠的同步时钟信号。

PIC16F877A芯片可以在以下4种不同类型的振荡方式下工作(具体工作在哪种方式,可通过配置字进行设置):

● LP方式:低功耗晶体振荡器方式。

● XT方式;晶体/陶瓷谐振器方式。

● HS方式:高速晶体(等于或大于4MHz)/陶瓷谐振器方式。

● RC方式:阻容振荡器方式。

把以上4种振荡方式,按外接元件及其接线方法的不同,分为外接晶体/陶瓷、外接RC、外接时钟3种情况进行讲解。

(1)外接晶体振荡器/陶瓷谐振器(LP/XT/HS)

这种情况对应LP、XT和HS三种振荡方式,采用基本相同的接线方法,如图1-8所示。

图1-8 外接阻容振荡器接线图

其中,只有HS和XT振荡方式才有可能需要另外接入一个电阻RS(其RS值满足100Ω<RS<1000Ω),一般情况下较少使用RS。

在如图1-8所示的PIC系列单片机的时钟振荡器电路中,由片内的一个反相器G1(借助于一个偏置电阻RF使其工作于放大器模式),与外接的一个石英晶体和两个电容共同构成一个电容三点式自激多谐振荡器。

构成振荡器的反相器G1是一个具有受控端的三态门,当执行睡眠指令SLEEP时,该三态门输出端呈现高阻状态,令时钟电路停振,从而迫使单片机的大部分片内电路停止工作,进入低功耗模式,达到节电的目的。时钟信号经过反相器G2或G3进行隔离和缓冲后,被输送到内部各功能电路。

外接电路中所需的两个电容器C1,C2的参数如表1-2所示。

表1-2 外接电路中所需的两个电容器C1,C2的参数

注:表中电容值越大越有利于振荡器稳定工作,但是会加大振荡器延时起振的时间。

(2)外接阻容器件(RC)

这种情况对应着RC振荡方式。其最大的优点是成本低廉;缺点是时基频率的精确度和稳定性都较差,原因是电阻R和电容C的参数存在着误差率大、分散性大和温度稳定性差的问题。RC振荡方式下的时基频率原则上由电阻R和电容C的大小决定(图1-9中的R和C),但还是会随着电源电压及环境温度的变化而变化,并且单片机芯片不同该频率也可能不同。RC阻容振荡接线图如图1-9所示。

从中可以看出,RC振荡器电路主要由片内的一个相同施密特触发器G1和一个N沟道场效应管,以及片外的阻容器件构成。

RC振荡方式所需外接的阻容器件参数必须注意:电阻Rext的阻值如果低于2.2kΩ,会使振荡器工作不稳定,甚至不能起振。但是,如果该阻值大于1MΩ时,又会使振荡器容易受到干扰。所以,该电阻值最好在3~100kΩ范围内选取。理论上,电容Cext的电容值为0,振荡器是不能工作的,但是实际上却相反,振荡器也能够起振,只是不稳定,并且容易受到干扰。所以,该电容值应选取20pF以上为好。

图1-9 RC阻容振荡接线图

(3)引入外来时钟源(LP/XT/HS)

当PIC16F87X系列单片机(或PIC其他系列单片机)工作于LP、XT或HS振荡器模式时,可以从OSC1引脚(同时也是CLKIN引脚)连接外来时钟源,这时OSC2引脚开路。电路如图1-10所示。

图1-10 外来时钟源接线图