550 likes | 713 Views
第 2 章 新系列单片机 PIC16F8XX. PIC 单片机的学习比一般编程要困难得多,其设计关键在于完成一个 PIC 单片机系统,不仅需要掌握编程技术,更为重要的是要知道如何针对实际系统需要选择合理的单片机方案和外围器件,并以此为基础设计硬件电路。可以说硬件电路的设计是 PIC 单片机设计开发的基础。 目前市场上有种类繁多的 PIC 芯片,本章以其中最典型的 PIC16F8 系列的单片机为研究对象,从单片机内部结构、主要电路、主要接口等方面做重点阐述。 PIC16F8 系列的单片机主要有 PIC16F84A 、 PIC16F873 、 PIC16F877 等。.
E N D
第2章 新系列单片机PIC16F8XX • PIC单片机的学习比一般编程要困难得多,其设计关键在于完成一个PIC单片机系统,不仅需要掌握编程技术,更为重要的是要知道如何针对实际系统需要选择合理的单片机方案和外围器件,并以此为基础设计硬件电路。可以说硬件电路的设计是PIC单片机设计开发的基础。 • 目前市场上有种类繁多的PIC芯片,本章以其中最典型的PIC16F8系列的单片机为研究对象,从单片机内部结构、主要电路、主要接口等方面做重点阐述。 • PIC16F8系列的单片机主要有PIC16F84A、PIC16F873、PIC16F877等。
2.1 PIC16F84A单片机 2.1.1 PIC16F84A基本特征 PIC16F8X是一种18引脚、Flash/EEPROM 8比特的微单片机系列.PIC16F8X这种系列又有多种型号,如 PIC16F83、PIC16F84、PIC16CR83和 PIC16CR84,和工作电压范围大的PIC16LF8X,PIC16LCR8X等。 PIC16F84A单片机是PIC16F系列中比较简单的一种。它仅具有18引脚,具有微处理器基本的功能,如输入输出口,定时计数器和外部中断输入。但不具有一些特殊功能。因此该PIC单片适合于要求体积小,要求简单的应用场合。 任何处理器要工作就必须给其提供一个时钟信号,确保单片机按照一定时钟节拍一步一步地执行应用程序。时钟的产生,一般有两种方式。一种是使用外部时钟源,主要通过OSC1/CLKIN 引脚引入即可。该外部时钟还可以通过内部4分频后由OSC2/CLKOUT引脚输出,使其可能被其它功能部件使用。时钟产生的另一种方式是使用外部石英晶体或陶瓷谐振器方式,它是单片机产生时钟的经典方式。
在PIC16F84A芯片上有再起动输入(inv)引脚,输入低电平L就能使单片机实现再启动。任何单片机应用最多的接口就是输入输出口,PIC16F84A也不例外,具有RA0-RA3; RA4/T0CK1;RB0/INT;RB1-RB7等输入输出接口。其中RA4/ TOCK1属于多功能复用引脚,除了作为输入引脚外,还可作为定时计数器信号输入口。RB0除作为输出引脚外,还可作外部中断信号输入口。Vss为接地端。VDD为电源端,其电压范围在+2.0V~+5.5V,在此范围内单片机均可正常工作。PIC16F84A芯片具体引脚分布图如图2.1所示。 图2.1 PIC16F84A单片机引脚
PIC16F84A芯片采用高性能的精简指令计算机系统(RISC CPU),高性能特点具体表现如下: • 全部命令都是单字节命令,命令数有35个。 • 除跳转分支命令外(2时钟),均为1时钟命令。 • 工作速度 DC~10 MHZ 时钟输入 • DC~400ns 命令循环。 • 14 位宽命令,8 位 数据。 • 特殊功能寄存器有15个。 • 硬堆栈 8 级。 • 中断源4种 • 外部RB0/INT 引脚 输入中断信号 • TMR0 定时器的溢出中断 • PORTB<7:4> 引脚输入信号变化中断 • 数据 EEPROM 写入完成中断 • Flash 程序存储器写入,可消去1000次。 • EEPROM 随机数据存储器写入,可消去1000次,数据保存 > 40年。 • 表2.1是PIC16F8X系列单片机的主要性能参数比较。
表2.1为PIC16F8X单片机系列的性能参数比较 PIC16F84A外部功能特征也很独特,主要集中如下: 输入输出口数有13引脚。 输入输出电流 (LED直接驱动I/O),输入最大电流 25mA,输出最大电流 20 mA。 定时器TMR0为8位定时器/计数器。 另外PIC16F84A具备特殊功能:开机再初始化功能POR(Power-on reset)、开机定时功能PWRT(Power up Timer)、时钟开始定时功能OST、看门狗定时功能WDT(Watch Dog Timer) 等。
2.1.2 PIC16F84A 内部结构 PIC16F84A的内部功能框图如图2.2所示。功能框架图主要由程序存储器、随机存储器、可擦除只读存储器、特殊功能存储器、程序计数器、8级堆栈、指令寄存器、指令译码控制、多重控制和算术逻辑单元等组成。以下对具体的功能框进行详细说明如下: 1.程序存储器(Flash Program Memory) PIC16F84A程序存储器使用了Flash存储器。其内部实装1024字节,每1个字节由14位组成。Flash存储器在掉电的情况下其记忆的信息也不会消去。另外存储器内容可通过程序写入器(Writer)进行置换。 图2.3 Flash 存储器 图2.2 PIC16F84A内部功能框图
1)复位(Reset)处理先头存储器 (地址1000h) 在上电时,由于看门狗定时器WDT溢出和其它原因引起PIC重新置位时,PIC运行都从此程序地址开始执行。 2)中断处理先头存储器 (地址0004h) 定时器(Timer)溢出中断或外部输入中断时程序运行从该地址执行。 3)执行状态字节 (2007h) 该存储器单元存有该PIC运行的基本设置。比如,上电定时器的要否,看门狗定时器的要否,或时钟晶振的选择等设定。该存储器单元地址通常在程序存储器以后,这里不能用程序来设定,必须是用写入器(Writer)写入来设定。 图2.4 2007h程序存储单元(14 位) R : 只读出不能写入 位 P : 可编程位 -n : 上电后的逻辑 u : 无变化 位 13-4 : 程序码保护设定位 CP 1 -不保护程序代码 0 -保护全部程序代码。 一但设成该模式,PIC的程序存储器的程序代码不能读出。 位 3 : Power up 定时器指定位 (PWRTE inv) 1 -Power up定时器不使用 0 -Power up定时器使用 该定时器在上电后约72ms间PIC Reset。 通常设定为使用 位 2 : WDT看门狗定时器设定位 (WDTE) 1 -WDT定时器使用 0 -WDT定时器不使用 位 1-0 : 时钟类型指定位
2.随机存储器RAM (Random Access Memory) RAM是以相同速度高速地、随机地写入和读出数据(写入速度和读出速度可以不同)的一种半导体存储器。RAM的优点是存取速度快、读写方便,缺点是数据不能长久保持,断电后自行消失,因此主要用于计算机主存储器等要求快速存储的系统。随机存储器结构如图2.4所示。随机存储器分为两部分。管理结构是以称为存储块(Bank)方式的结构。每个存储块的最初部分12 位(地址 00h-0Bh)部分称为特殊功能寄存器区SFR。它包括了PIC的动作状态,I/O输入输出口的状态和其它各类程序动作的状态。13位后的68位(地址 0Ch-4Fh)部分称为通用寄存器GPR (General Purpose Registers)。它们用于寄存程序运行过程中的中间数据、中间状态以及最终结果等。 图2.5 RAM 随机存储器
3.可擦除只读存储器EEPROM (Electrically Erasable Programmable Read Only Memory) 与RAM相比,EEPROM存储器在关电源后,存储器内数据不会丢失。EEPROM存储器可通过程序再写入置换。该存储器容量64字节。使用寿命100万次。它们不能用于存储程序运行途中的数据,通常用于存储常量,变化较少的数据等。虽然100万次不是个小数,但与程序运行速度比较就不算多了。该存储器数据可保持40年。 4.特殊功能寄存器SFR (Special Function Registers) 在存储块切换动作的基础上,SFR特殊寄存器共有16种。详细寄存器分配如图2.3所示。虽通过存储块切换寄存器数可达到160字节,但是带箭头的寄存器在不同的存储块中都是同样的寄存器。另有一部分寄存器在存储块切换时,寄存器是不相同的。灰色部分的寄存器是不存在的。
5.程序计数器(Program Counter) 为读出存于程序存储器中的程序数据而设置的地址计数器。它是13位计数器。 通常在执行完一个命令后自动加1使之指向下一执行命令。但是在遇到跳转命令时,该计数器的值被写为跳转目的地址。 6.八级硬堆栈 被称为堆栈的硬件其实也是存储器。主要用于存储程序因各种原因跳转后且在执行完规定程序后返回地址。比如,同样的处理可能存在于整个程序多个地方,这个处理程序通常用子程序的方式来实现。 在子程序最后用返回RETURN命令来返回主程序。这种子程序的做法可以达到节省程序存储器的目的。 在主程序中用CALL命令来调用子程序,为了从子程序返回主程序,此刻在堆浅中应该存储好返回地址。程序的这个动作通常叫压栈(PUSH)。在子程序处理完RETURN命令后,程序运行从存储于堆浅中的返回地址开始运行,这个动作通常叫出栈(POP)。在整个程序中,可以有子程序中套子程序,这样需要多级堆栈。在此,八级堆栈就是子程序套子程序最多到八级。 编写程序不能超八级堆栈使用,子程序必须以RETURN命令结束。其原理图请见图2.6,跳转命令是不使用堆栈的,也不需返回地址。 7.指令寄存器(Instruction Register) 程序计数器所指向的程序命令(Instruction)被写入该指令寄存器,这个流程通常称为FECTCH。 8.指令译码 换行控制部对指令存储器的数据(指令)进行解读、分析并对其代表的指令内容进行相应的动作。
9.多重控制和算术逻辑单元(Multiplexer and Arithmetic Logic Unit) 多重控制和算术逻辑单元就是PIC芯片中进行计算动作的部分。是运算器和控制的核心。几乎所有的算术运算、逻辑运算和移位操作由此单元控制完成。如果CPU芯片中没有该部分,该芯片就不能称之为单片机。 10.工作寄存器 工作寄存器也称为W Register寄存器。它通常用于存储算术逻辑单元的计算结果。它是计算过程中必须使用的寄存器。该寄存器存储的数据可转存到其他寄存器或通过I/O口输出。 11.状态寄存器(Status Register) 状态寄存器中各位单元存储有存储算术逻辑单元的计算结果的状态(如结果正或负,零或非零等状态指示),定时计数器状态 及存储块寄存器的切换状态等。 12.文件选择寄存器FSR (File Select Register) 地址的指定,有间接地址方式和直接地址方式二种。FSR寄存器通常用于RAM寄存器的地址在使用间接地址方式指定时使用。直接地址方式是在命令码中直接指定寄存器的地址。在此情况下,地址指定有7位,指定地址可从0到127。这个指定范围只有一个存储块的范围。要指定另一存储块,使用状态寄存器的RP0 位来区分。FSR寄存器是8位寄存器,它能指定各存储块的范围。所以可方便地用它来象表格式的连续指定地址。这样地址的指定、 处理就方便简洁。PIC16F84A芯片没有从80(50h)到127(7Fh)范围的存储器。
13.地址合成译码器(Address Multiplexer) 在RAM寄存器的地址指定时,直接地址方式是需用命令的动作码(7位)和状态寄存器的RP0位的组合形成真实地址。间接地址方式是需命令的动作码(7 位)和FSR寄存器的组合形成真实地址。这些地址的组合都是在地址合成译码器中完成。 14.EEDATA 寄存器 EEDATA寄存器是在对EEPROM进行数据写入时或数据读出时使用的寄存器。 15.EEADR 寄存器 EEADR寄存器是EEPROM的地址指定寄存器。它是8位寄存器,可指示从0到255的地址范围。PIC16F84A芯片内部只有64位,只用6 位就能指定完整EEPROM范围。 16.定时器(Timer) PIC16F84A芯片内部有一个8位的定时计数器称为TMR0。8位定时计数器计数范围256。即当输入256脉冲后,定时计数器溢出归零。同时在SFR的INTCON寄存器的TOIF 位置 1。在定时计数器溢出时也可使用中断处理功能。为激活中断功能,SFR的INTCOM寄存器的GIF位及TOIE位必须先置1。
17.I/O 输入输出口 PIC16F84A芯片输入输出口有13位。每一个输入输出口引脚又可通过程序设置为输入口或输出口,但两者不能同时兼用。13 引脚分为5引脚和8引脚两组。5引脚组称为A口,8 引脚组称为B口。在控制系统设计中,由于需不同的定时信号,这13 引脚都可单独进行设定与控制。 18.时钟脉冲速度控制 时钟脉冲速度决定PIC单片机的动作速度,PIC内部包含了时钟脉冲速度控制单元。通过石英晶体振荡器或陶瓷振荡器与起振电容连接就能产生时钟脉冲信号。如果系统需要稳定度高的时钟,通常采用水晶振子。另外,振子与发振用电容经常可做成单一部件以方便使用。PIC的动作也可用外部输入时钟来控制。 PIC16F84A采用的是串行控制结构,通常执行一个命令(1循环)需4个时钟脉冲。但跳转命令由于需要地址变换需要8时钟(2循环)。以20MHz的时钟为例,脉冲周期是1/20MHz,50ns,通常执行一命令需200ns。PIC在1秒间可执行500万条命令。
2.1.3 PIC16F84A 初始化 PIC16F84A初始化,主要指对其内部多种控制电路进行初始设置。其初始化步骤明细如下: • 定时器上电(Power-on ) • 上电时,为保证PIC正常上电运行所设置的定时器。目的是使电源电压稳定前PIC不动作。 • 开始定时器(Oscillator Start-up Timer):上电时,为保证时钟正常起振所设置的定时器。目的是使时钟稳定正常后PIC才动作。 • 再初始化(Power-on Reset):上电时,PIC内部电路进行初始化。 • 看门狗(Watchdog)定时器:该定时器是用于时常监视PIC程序运行状态的定时器。PIC程序需定时对该定时器进行处理设置。如PIC程序未对该定时器进行处理设置,PIC将重新再上电初始化。这就使得在程序运行不正常或动作异常时,PIC能自动进行复原动作。
2.2 PIC16F873单片机 2.2.1 PIC16F873硬件结构 在上节中介绍了PIC家族中体积小,功能较低的芯片PIC16F84A,但在实际的运用中需要功能更强大,内存容量更大,功能类别更多的芯片。本节所涉及到的PIC16F873芯片就是其中的一种。以下介绍PIC16F873芯片与PIC16F84A功能不同的部分。基本功能部分可参照前节的内容。 PIC16F873是一种比PIC16F84A性能更高、功能更全的单片机芯片。它的内部程序存储器容量有4 K 字节,随机存储器RAM 容量有192字节,EEPROM有128字节。另外定时计数器有三种类型以满足不同的需要。也装配有模拟数字(A/D)转换功能及通用通信输入输出口。与PIC16F84A同样采用程序存储器,这使得能方便兼容PIC16F84A程序写入器来进行程序开发写入。 图2.7是PIC16F873芯片引脚图,在此先介绍它的引脚功能如下: RA0-5 : 输入输出口 A MCKLR : Master Clear (低电平有效) RB0-7 : 输入输出口 B Vpp : 程序写入控制 RC0-7 : 输入输出口 C THV : Test Mode 测试模式控制 AN0-4 : 模拟输入 VREF+/‐: 基准电压 (A/D转换) RX : USART非同步接收口 SS : Sleep 选扯
TX : USART非同步发送口 T0CK1 : 定时计数器0时钟输入 SCK : 同步串行输入口 T1OSO : 定时计数器1发振器输出口 SCL : SPI,I2Cmode输出 T1OSI : 定时计数器1发振器输入口 DT : 同步数据 T1CK1 : 定时计数器1时钟输入 CK : 同步时钟 PGD : 编程数据输入 SDO : SPI数据输出 PGC : 编程时钟输入 SDI : SPI 数据输入 PGM : 编程低电压输入 SDA : 数据输入输出(I2Cmode) INT : 外部中断输入 OSC1/CLKIN : 时钟输入 VDD : 电源 OSC2/CLKOUT: 时钟输出 Vss : 接地 (Ground) CCP1,2 : Capture输入 / 比较输出 / PWM输出
1.PIC16F873的特殊功能寄存器SFR (Special Function Register) PIC16F873的RAM寄存器空间分为4 存储块(Bank)。每一个存储块拥有128位容量。特殊寄存器SFR分别占用每个存储块的上32位容量。33 字节以后的空间均为用户可自由使用空间。每一个存储块中有96位。第2和第3存储块与第0和第1存储块是镜象相同的,所以实际能使用的容量只有2 存储块的空间192 字节。 2.PIC16F873的配置(Configuration)字 PIC16F837内部程序存储器中有一特殊区域为配置区域。它的地址为2007h。通常的程序不能对该配置区域进行读写。只能由写入器在进行程序写入时进行读写。 配置的设置决定PIC的动作环境。图2.9为配置字的各位功能及设置。 图2.9 配置字结构及各控制位
2.2.2 PIC16F873输入输出接口 PIC16F837芯片的输入输出有A、B、C三个口。A口有6个,B口有8个,C口有8个。共有输入输出口22个。作为数字信号的输入输出口,A、B、C口都可以使用。PIC16F873芯片A,B,C各输入输出口不仅可用于数字信号的输入和输出,还兼有其它功能,比如A/D模拟信号输入输出,定时计数器的时钟输入等。以下详细介绍PIC16F873芯片的各输入输出口。
1.输入输出A口 输入输出A口由RA0-RA5等6个口构成。该输入输出口可用于输入输出数字信号,模拟信号输入,模拟信号的基准信号输入及定时计数器0的外部时钟输入。具体电路类似于PIC16F84A,但其中增加有模拟信号的处理部分电路。 如输入输出信号是数字信号,输入输出模式(Mode)的指定由TRISA寄存器中设定位来指定。在非数字信号输入输出模式时,其设定由ADCON0和ADCON1寄存器指定。既使在模拟信号输入模式下,TRISA寄存器的设置依然有效。如需设定为模拟信号模式时,一定要在TRISA寄存器中对应位设为输入模式(1)。输入输出A口的电原理图如图2.10所示。 图2.10 输入输出A口逻辑图
2.输入输出B口 输入输出B口由RB0-RB7等8个端口构成。该输入输出口可用于数字信号的输入输出。也作为程序数据的写入口。在作为程序数据写入口时,不存在设定寄存器。在线串行编程 (ICSP)模式下,B口自动作为编程口使用。PIC16F873的ICSP和PIC16F84A具同样结构。 RB4-RB7的4端口还具有状态变化检测功能。在使用该功能时,B口方向寄存器TRISA是一个4位寄存器,有4个端口,4个端口的设置位设为输入模式。端口的状态变化结果通过INTCOM寄存器的RBIF位体现,同时程序运行计数器强制置为0004h,进入中断处理状态。 另外,RB0/INT这个端口同样具有中断功能。在使用此功能时,INTCON寄存器的INTE 位需置为1。该中断是脉冲上升沿还是下降沿中断,由OPTION寄存器的RBPU位设定。该位为1时,上升沿中断,0时为下降沿中断。 图2.11 输入输出B口逻辑图
3.输入输出C口 输入输出C口同B口一样由8个输入输出端口构成。C口不仅用作数字信号的输入输出口,还兼用作定时计数器1的时钟输入口,以及各种外部通信用的信号输入输出口。 RC0端口可作为定时计数器1的外接振荡器的接续端口和它的外部时钟输入口。两者功能的切换由T1CON寄存器来设定。RC1端口也可作为定时计数器1的外部振荡器的接续端口和CCP2 (Capture2 input/Compare2 output/Pulse Width Modulation2 (PWM2) output)口兼用。定时计数器1功能的切换由T1CON寄存器来设定。关于CCP2的功能切换将由CCP2CON寄存器来设定。 图2.12 输入输出C口逻辑图
2.2.3 PIC16F873定时计数器 PIC16F837具有3种定时计数器。各定时计数器的特征、性能不尽相同,下面分别介绍。 定时计数器0 PIC16F873的定时计数器0同PIC16F84A的定时计数器0基本功能相同,相比较具有以下特定功能: 定时计数器0是8位定时计数器,计数最大可达255。 允许对定时计数器进行读写。 可做为8位长的程序Pre-scale使用。 可使用内部或外部时钟。 定时计数器溢出中断(溢出后定时计数器由FFh清为00h) 在使用外部时钟时,对时钟前沿和后沿计数均可。
定时计数器1 定时计数器1如图2.13所示,是具有16位长的计数器 (TMR1H,TMR1L)。可分为2个8位定时计数器使用。各自具有独立的Pre-scale,可设置为1,2, 4,8段使用。在TMR1IE寄存器PIE 位置1时,定时计数器溢出中断有效。计数器数据由FFFFh清为0000h时由TMR1IF表示溢出,同时产生中断。 定时计数器1可作为定时器或计数器使用。两种模式的切换由T1CON寄存器TMR1CS位设置。TMR1CS位置0时,作定时器。置1时作为计数器使用。另外在两种模式下又有不同定时器模式和计数器模式的设置。 图2.13 定时计数器1电逻辑图
定时计数器2 定时计数器是一个具有8 位长的计数器 (TMR2) 和周期寄存器构成的定时计数器。 它具有独立的4位长的可编程的预分频器和4位长的可编程的后分频器。 预分频器有1,4,16三段控制功能。后分频器具有1至16为止16段的分段控制功能。 定时计数器电原理逻辑如图2.14所示。定时计数器的计数值与周期寄存器所存值相等时,下一次计数时从00h开始计数。 由于有该功能使得定时计数器2能从0到周期寄存器所存值为止反复计数。周期寄存器所存初始值在上电时为FFh。可通过程序改写。在计数器和周期寄存器所存值一致时输出信号到后分频器,再由它进行中断控制。例如后分频器设置为5,计数器和周期寄存器所存值一致5回后,第一外设中断屏蔽寄存器(PIR1)TMR2IF位置1后产生中断。 定时计数器2也可通过T2CON寄存器TMR2ON位来控制它的动作或停止。 图2.14 定时计数器2电逻辑图
2.2.4 PIC16F873 CCP功能 CCP功能是PIC16F873特有的功能。CCP缩写由英文Capture,Compare和PWM (Pulse Width Modulation) 的开头英文字母组成,分别代表输入捕捉、输出比较和脉冲宽度调制。PIC16F873有二个CCP模块。 表2.3 CCP1和CCP2功能及制约条件
以下详细介绍 CCP三种功能模式 1.输入捕捉(Capture)模式 在输入捕捉模式下,RC2/CCP1 引脚(13引脚)的电平变化时定时计数器的计数值读入CCPR1 (CCPR1L和CCPR1H) 寄存器中。在TRISC寄存器中必须把RC2/CCP1 引脚设为输入模式。 详细功能框图见图2.15。 关于RC2/CCP1 引脚 (引脚 13) 的电平变化检测有多种方式。它的指定由CCP1CON寄存器的CCP1M 0 位到CCP1M 3 位共4位来控制。 图2.15 CCP的输入捕捉功能
2.输出比较(Compare)模式 输出比较模式就是CCPR1寄存器的内容和定时计数器1(TMR1)的内容进行比较功能模式。 其功能原理框图如图2.16所示。 当两者内容一致时,根据CCP1寄存器的CCP1M0 位到CCP1M3 位的不同设置完成不同的控制功能。 其详细的功能表请见表2.5。 设置时,必须由TRISC寄存器设置RC2/CCP1端(引脚 13)为输出模式。 同时定时计数器1必须设置为同步定时器模式。 如果设为非同步定时器模式,输入捕捉的功能不动作。 图2.16 CCP的输出比较功能
PWM模式 在设置为PWM (Pulse Width Modulation) 模式时,通过CCP1端口 (引脚 13) 可输出连续的脉冲。 其功能框图和脉冲信号见图2.17所示。为使用PWM模式,由CCP1CON寄存器的CCP1M3 位和CCP1M2 位置1来设定。 图2.17 PWM模式功能框图及脉冲信号
以下着重介绍PWM周期和脉冲Duty时间的计算设置以下着重介绍PWM周期和脉冲Duty时间的计算设置 1) PWM周期 Pulse脉冲周期是TRM2和PR2的值一致时所需时间,可通过以下公式计算 PWM脉冲周期 = (PR2的值 + 1)*4*振荡器周期*定时计数器2的预分频值 计算例1 (10MHz时的最大周期) 条件 PR2 = 255 振荡器周期 = 0.1 μs (10MHz时钟) 定时计数器2的Prescaler值 = 16 PWM周期 = (255+1)*4*0.1*1E-06*16 = 1.6384 ms(610Hz) 2) PWM的高电平持续时间 高电平持续时间是输出Pulse脉冲高电位时间,可通过以下公式计算 计算例3 (10MHz时最大Duty时间) 条件 CCPR1L+ CCP1X +CCP1Y =1023 振荡器周期 = 0.1 μs (10MHz时钟) 定时计数器2的Prescaler值 = 16 PWM 高电平持续时间 = 1023*0.1*1E-06*16 = 1.6368 ms
最后总结以下,PWM模式设置方式及顺序: • 用PR2寄存器设置PWM周期。 • 用CCPR1L寄存器和CCP1CON寄存器设置PWM Duty值。 • 用TRISC寄存器设置CCP1 (引脚 13) 为输出模式。 • 用T2CON寄存器设置定时计数器设置Prescaler值。 • 用CCP1CON寄存器CCP1M3位和CCP1M2位设置PWM模式 (11XX)。
2.2.5 PIC16F873 模数转换(A/D)功能 模数转换功能就是能对输入模拟信号进行测量,且测量结果变成数字信号的功能。 PIC16F873具有10位长的模数转换功能,测量的最大范围内具有1/1024的测量精度。 最大测量范围在0 V到+5 V之间。如最大为+5V,测量精度可达5/1024 V,即0.004883 V (约5 mV)。 1.输入端口设置 虽然PIC16F873芯片最大可指定用5个模拟信号输入端口 (AN0-AN4),模数转换功能却只有一种。某一时刻PIC16F873只能对1个端口进行测量。如设计对各端口进行轮流测量程序,可实现对多个端口的模拟信号的测量功能。1次测量需时间约40us,对变化不是很快的模拟信号可进行多端口的轮流测试。但不能测量高频率的信号。 哪些端口作为模拟信号输入口由ADCON1寄存器PCFG0位到PCFG3位的4 位来设定。 PIC对哪个模拟输入端口进行处理由ADCON0寄存器的CHS0位,CHS1位及CHS2位来指定设置。 被指定的端口还得由TRISA寄存器的该位置1使之为输入模式。其电原理框图如图2.18所示。
2测量档和测量精度调整 虽然芯片测量范围在Vss (0V) 到VDD (5V) 之间,但也可根据VREF- (下限电平) 和VREF+ (上限电平) 来重新设定测量范围。虽如此,VREF-和VREF+ 必须设置在从Vss到VDD之间。 比如,低电平设置在Vss,高电平设置在3V时,测量范围为3V。在此范围里测量精度为它的1/1024,即3/1024=0.002929 (约3mV)。 VREF-和VREF+的使用,设置由ADCON1寄存器PCFG0位到PCFG3位组合来设定。 一旦VREF-和VREF+被设置后,测量范围就为AN2端口和AN3端口输入电压差。 如仅设定了VREF+,VREF-自动设置为Vss。如两者均未设定,下限电平为Vss,上限电平为VDD。 图2.19 测量范围设定及测量精度
3模数转换结果存储 模数转换结果存储在ADRESH和ADRESL寄存器中。其存储原理图如图2.20所示。由图所示两个8位长的寄存器组成了16位长的寄存器。ADRESH为高位,ADRESL为低位。模数转换后的10位结果可存储在16 位长的寄存器的上10位或下10位中,可由ADCON1寄存器的ADFM命令位来设置。如图2.20所示,ADFM为0,存上10位,1时存下10位。 图2.20 模数转换结果存储
模拟电平测量原理 如图2.21示,首先在采样开关ON时,在模拟信号输入口ANx输入的模拟电压首先对采样保持电容CHOLD充电,然后开关断开后模数转换功能块才对电容的电压进行测定、 数字信号的转换。由于此原因,在由ADCON0寄存器CHS0,CHS1和CHS2位指定输入口后,电容的充电完成需要一定时间,所以模数转换功能块需要等待。该时间也不会自动识别,输入口的指定到模数转换开始的时间的处理要由应用程序控制。 这个时间大约20 us。 充电完成后即可开始模数转换。 转换时间长短因变换时钟不同也不同,最短需约20 us。 转换中,输入口与模数转换功能块是断开的,所以转换过程中输入口电压变动时不影响转换结果。 图2.21 模拟电平测量输入口电原理图
5模数转换的时钟问题 模数转换必须在模数转换时钟控制下动作。变换1位需要1.6us (TAD)。模数转换时钟可通过ADCON0寄存器的ADCS0位和ADCS1位来控制选择。2位控制即可有4种时钟选择。 虽然可用1.6 us以上的转换时间,但模数转换时钟来自于PIC工作时钟,转换时间尽量做到1.6 us为好。以上表中,RS选择应采用在SLEEP模式时的模数转换。 图2.22 模数转换
6.模数转换软件处理方法 模数转换软件处理方法通长有两种:不使用中断功能和使用中断功能。 SLEEP模式下的模数转换 为避免PIC动作时产生的干扰信号对模数转换的影响,可采用在SLEEP模式下的模数转换功能。在使用该功能时需使用RC振荡器,也就需设置ADCON0寄存器ADCS0位和ADCS1位置1。1 位转换时间需4 us。ADCON0寄存器GO位置1后SLEEP命令执行使PIC处于SLEEP模式。SLEEP模式的解除需要中断方式来确认,该方法需使用中断功能。其程序控制流程图如图2.23所示。 图2.23 SLEEP模式下的模数转换流程
2.2.6 PIC16F873 串行通信接口USART PIC16F873装配有两种类型不同的串行通信模块,即通用同步/异步收发器USART (Addressable Universal Synchronous Asynchronous Receiver Transmitter)模块和主控同步串行端口MSSP(Master Synchronous Serial Port)模块。USART口可选择以下三种动作模式:非同步通信 (全双工通信)、同步通信-主Master (半双工通信)和同步通信-从 Slave (半双工通信)。 USART通信通常传输数据是以数据块为单位。通常每个数据块由8位构成。为实现多终端处理,多加一位地址指定位,则每数据块就可由9位构成。
1.异步通信 数据通信时,数据发送口输出的数据1或0必须在接收口被识别,这样才能正确地进行双向通信。非同步通信原理就是在被传送数据块 (8 位 或9位长) 的开头加上开始认知位,在块末加上传送结束位来实现通信。开始识别位采用低电位信号,传送结束位采用高电位信号。在通信线路上,传数据时线路处于H电位。这样线路由H电位变为L低电位 (START) 时,收信口就能识别数据传送开始,随后,系统根据事先设置好的通信速率开始接收数据。最后检出STOP 位 (H电位) 完成整个数据块的传送。USART通信中,数据传送速率在送信端和收信端由不同的定时计数器控制,如果两者设置等出现误差将不能实现正确有效地通信。另外,非同步通信发送线路Tx和收信线路Rx为独立线路,可实现同时收发功能 (全双工通信)。
2指定输入输出数据口 异步通信使用RC6/TX/CK (17 引脚) 作为数据输出口,RC7/RX/DT (18 引脚)为数据输入口。由于这两端口作为USART通信端口,TX 和RX口的输入输出设置由TRISC寄存器设定,即C端口第6 位设置为0 (输出模式),第7位设置为1(输入模式)。另外RC6和RC7作为USART端口用,接收状态兼控制寄存器(接收状态兼控制寄存器)SPEN 位需置位,且清TXSRA寄存器SYNC 位。USART通信原理如图2.24所示。 图2.24 USART 通信原理
3 USART通信速率设置 USART通信速率由波特率发生器BRG (Baud Rate Generator)控制。且非同步通信和同步通信均由BRG控制。控制寄存器有波特率寄存器SPBRG,它是个8位的定时器控制寄存器。在非同步USART模式下,发送状态兼控制寄存器(TXSTA)的BRGH位用来控制设置通信速率。
4.USART发送电路工作原理 USART异步通信时,接收状态兼控制寄存器SPEB位使RC6端口作为TX端口。在TXREG寄存器设置发送数据后,由硬件读取到TSR (Transmit Shift Register) 寄存器后由TX端口发送。另外通过发送状态兼控制寄存器(TXSTA)的TXEN 位置1来实施数据发送。数据由最低位开始逐位发送。 图2.25 USART非同步通信发送电路原理
图2.26 单字节USART送信时间示意图 图2.27 多字节连续USART发送时序示意图
5.USART接收电路工作原理 图2.28所示为USART异步通信接收电路原理。在设置USART异步通信时,首先需设置接收状态兼控制寄存器的SPEN 位为1使端口RC7为USART的接收端口RX。图中所示,从RX端口接收数据通过数据补偿电路后送入RSR寄存器。接收数据的高低电平的判断,对每位接收数据要进行3次采样。接收数据按SPBRG寄存器与发送状态兼控制寄存器(TXSTA)的BRGH 位设置的通信速率存入RSR寄存器。存储的格式为RSR寄存器格式。在检测出STOP 位后,存入RSR寄存器的数据转存入RCREG寄存器。数据转存入RCREG寄存器后,PIR1中断控制寄存器的RCIF 位置1发生中断响应。为产生中断响应,得先使第一外设中断标志寄存器(PIE1)的RCIE 位置1开放。 如图2.28所示,RCREG寄存器具有2段先入先出FIFO 缓冲寄存器结构,其中能存入2块数据。目的是在软件读取数据时如出现迟后时能对数据进行保护。另外请注意,RCIF 位为专读取位,在RCREG寄存器数据全部读出后,由硬件自动清0。 图2.28 USART异步通信接收电路原理
接收数据存入RSR寄存器完成后,如RCREG的2段先入先出FIFO (First In First Out) 缓冲寄存器均存有数据时RCSTA寄存器的OERR 位自动置位表示产生了Overlay溢出错误。产生此错误会使得RSR寄存器中的接收数据丢失。此后中断USART数据接收。如要恢复正常接收状态,必须对RCSTA寄存器的CREN 位清位,再设置。CREN位设置后OERR位自动清位。 另外前些章节中介绍了USART异步通信可使用奇偶校验检测位发送。在接收端自然就需要进行奇偶校验帧检测。如检测出RSR寄存器数据出现帧错误,RCSTA寄存器的FERR 位置位以示帧错误。于是RERR 位和存入RCSTA寄存器的RX9D 位的情况反应了当前接收的1块数据的正确与否。由于此功能,在RCREG寄存器数据读出前需读出RCSTA寄存器的数据并对其FERR 位进行检查。
2.3 PIC16F877单片机 众所周知PIC系列单片机是由美国Microchip公司生产的单片机产品,具有较好的抗干扰性能、简洁的指令集,所需硬件配置较少的特点。PIC16F877单片机是其开发的新产品,具有Flash编程的功能,用户可以直接在单片机上进行如暂停CPU执行、观察寄存器内容等操作,非常适用于教学和进行新产品的开发。PIC16F877单片机是目前应用最广泛的一种PIC单片机。在电脑的外设、家电控制、电信通信、智能仪器、汽车电子以及金融电子等各个领域得到了广泛的应用。
2.3.1 PIC16F877特性 • PIC16F877具有PIC16F87X系列单片机的共同特点,主要性能如下: • 高性能RISC CPU • 35条单字指令 • 除程序分支指令为2个周期外,其余为单周期指令 • 运行速度:DC~20MHZ时钟输入,DC ~200ns指令周期 • 8K*14个FLASH程序存储器 • 中断能力(达到14个中断源) • 8级深度的硬件堆栈 • 直接、间接和相对的寻址方式 • 上电复位(POR)、上电定时器、振荡启动定时器 • 可编程的代码保护 • 全静态设计 • 在线串行编程(ICSP)
其外围特征 • Timer0:带有预分频器的8位定时器/计数器 • Timer1:带有预分频器的16位定时器、计数器,在使用外部晶振时,在Sleep期间仍能工作 • Timer2:带有8位周期寄存器,预分频器和后分频器的8位定时器/计数器 • 10个多通道A/D转换器 • 带有SPI(主模式)和I2C(主/从)模式的SSP • 带有9位地址探测的通用同步异步接收/发送器(USART/SCI) • 带有RD,WR和CS控制(只40/44引脚)8位字宽的并行端口 • 带有降压复位的降压检测电路
PIC16F877具有 Flash program 程序内存功能,可以重复烧录程序,而其内有 ICD(In Circuit Debug)功能,可以让使用者直接在单芯片电路或产品上,进行如暂停微处理器执行、查看缓存器内容等新功能,PIC16F877单芯片有PLCC(Plastic Leaded Chip Carrier)与 QFP(Quad Flat Package)两种形式的包装,依照不同的需求,寻找不同的包装形式。 PIC16F877(见图2.30) 属于闪控式(Flash)单芯片,可以重复烧录,其 ROM 的容量总共是 8K 字节,以 2K 为一页,区分为 4页;内部 RAM 总共有 512 个字节(00f~1FFh),以 128 个字节为一个存储块,共区分为 4 个存储块,每个存储块 的前半段都具有特殊用途,分别连接到特殊功能模块,例如 I/O、CCP、Timer、USART、MSSP 等。
2.3.2 特殊内嵌功能 • PIC16F877 属于内嵌功能较多的单芯片,除了 CPU、POM、RAM、I/O 等基本构造外,还包括以下各种功能,简介如下: • A/D converter:模拟数字转换器,最多可以读取 8 组模拟输入信号。 CCP:输入捕捉、输出比较、PWM,用于控制直流马达。 • Timer,内部定时器,有 Timer0、Timer1、Timer2 等3个。 • USART:Universal Synchronous Asynchronous Receiver Transmitter,同步∕异步串行传输,如 RS232、RS485 等。 • MSSP;Master Synchronous Serial Port,两线式(I2C)与三线式(SPI)标准同步 • 串行传输协定,常用于 EEPROM 内存资料的烧录与读取,或是与其他集成电路沟通与联系,形成多芯片网络。