PIC单片机原理及应用_第1页
PIC单片机原理及应用_第2页
PIC单片机原理及应用_第3页
PIC单片机原理及应用_第4页
PIC单片机原理及应用_第5页
已阅读5页,还剩146页未读 继续免费阅读

下载本文档

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

文档简介

PIC单片机原理及应用1主讲:许辉邮箱:xuh@《PIC单片机原理及应用》实验内容安排:全校任选课(☆)PIC单片机原理介绍(10学时※)工具软件及实验 (4学时※)系统基本功能设计及实验(12学时※)综合设计实验 (4学时※)2西安电子科技大学国家电工电子教学基地西电-MICROCHIP公司联合实验室(E楼II-406)PIC单片机原理及应用第1章概述31.1PIC单片机简介什么是单片机?

单片机(MCU)是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。

PIC单片机是由MicrochipTechnologyInc.(美国微芯科技公司)推出的系列产品。41.2PIC单片机产品系列PICmicro®

单片机

Microchip的8位/16位/32位PIC单片机系列具有高性能、低成本和封装体积小等特点,是业界性价比最佳的产品。据业界权威研究机构Dataquest资料,全球8位单片机(MCU)付运量排名第一。dsPIC®

数字信号控制器

dsPIC®

数字信号控制器(DSC)系列具备一个完全实现的数字信号处理器(DSP)引擎。该系列dsPIC30F和dsPIC33F16位闪存DSC具有业界最高的性能,适用于电机控制、功率转换、传感器和通用应用等。51.2PIC单片机产品系列61.3主要应用领域77办公设备工业控制通信系统电子玩具金融电子仪器仪表汽车工业家用电器舰船设备航空航天1.4常见单片机比较51:通用性,用的最多,主要是内核是公布的,很多情况下,各个厂家做了自己特有的外设扩展,比如aduc51的ad,da,,高频发射模块,cpress的usb功能等等,PIC:工业稳定性,适用于用量大,档次低,价格敏感的产品.在办公自动化设备,消费电子产品,电讯通信,智能仪器仪表,汽车电子,金融电子,工业控制不同领域都有广泛的应用;MSP430:低功耗应用,经常被电池、仪表应用设计师所选用81.5PIC单片机特点91、结构1.5PIC单片机特点2、RISC技术/指令集(汇编指令)RISC技术(RedudedInstructionSetComputer--精简指令集计算机):改善结构,更加合理的提高运算速度。除判断转移指令,其他指令都是单周期指令。寻址方式简单,指令代码压缩率高101K字节的存储器空间——PIC系列单片机能够存放1024条指令——MCS-51系列单片机大约只能存放600条指令1.6PIC单片机特点3、内嵌DSP引擎: dsPIC®

数字信号控制器(DSC)系列内嵌DSP引擎,具备实现数字信号处理器的基本功能,如FFT、FIR滤波等。4、CMOS工艺特性功耗低电压范围宽工作温度范围宽:-40~

+125摄氏度5、驱动能力强每个输出引脚可以驱动多达20-25mA的负载一般端口总驱动能力约60-70mA111.5PIC单片机特点6、接口丰富,能实现各种功能I/O口具有20mA的驱动能力8路、10位的AD转换I2C,SPI,USART,USB,CAN,以太网接口WDT(看门狗)CCP(脉宽/捕捉/比较)内置EEPROM3路定时器多种中断源支持休眠的低功耗模式流式的并行接口内置LCD控制器芯片加密……121.6

PIC单片机命名规则1、PIC单片机编号包括下列5个部分:2、器件类型和代号关系

代号类型CCMOSLC低功耗CMOSCRCMOSROMLCR低功耗CMOSROMLV低电压FFLASH程序存储器FRFLEXROM13PICXXXXXXX-XXX/XXXXX

器件类型振荡频率温度封装存储器编程方式1.6

PIC单片机命名规则3、振荡方式/频率和代号关系:4、温度与代号关系:代号振荡方式/频率LP低频低功耗晶体振荡RC低成本阻容振荡XT标准晶体/陶瓷振荡HS高速晶体/陶瓷振荡022MHZ084MHZ2020MHZ2525MHZ3333MHZ代号温度空白0~

70I-40~+85E-40~

+125141.6

PIC单片机命名规则5、程序存储器编程方式EPROM:可反复擦写,紫外线照射20分钟以上除去片上信息E2PROM或FLASH:可在线进行程序的反复擦写OTP:一次编程方式:一个产品周期后降低成本用,专用设备完成烧写,适合小批量非定型产品QTP:快速批量编程SQTP:连续批量编程ICSP:电路内连续编程掩模ROM:一个产品周期后降低成本用,适合大批量定型产品,必须请制造商借助专用设备完成151.6

PIC单片机命名规则dsPIC30/33F产品器件编号规则161.7单片机开发流程确定任务确定待开发产品的功能、所实现的指标成本,进行可行性分析。完成时间总体设计机型选择

外型设计、功耗、使用环境软、硬件任务划分,方案确定硬件设计确定功能

绘制原理图及布线图选购元器件、焊接线路板、组装、调试软件设计建立数学模型,进行资源分配及结构设计

绘制流程图设计、编制个子程序模块

仿真、调试,固化样机联调软硬件结合起来调试

找错、修改软硬件进行软硬件测试,进行老化实验、高低温实验、振动实验产品定型17PIC单片机原理及应用第2章

结构182.1内部结构系统集成外设CPU内核CPU内核是器件运行所必需的基本部分。CPU数据存储器程序存储器DSP引擎中断19系统集成可以降低系统成本提高系统可靠性提高设计灵活性。振荡器复位看门狗定时器和低功耗模式闪存和EEPROM编程器件配置低电压检测

外设功能是允许器件与外界交换信息。1.I/O端口 2.定时器 3.输入捕捉模块4.输出比较模块 5.正交编码器接口(QEI)6.10位AD转换器7.12位AD转换器 8.UART模块 9.SPITM模块10.I2CTM模块 11.CAN模块 12.数据转换器接口(DCI)模块

2.2CPU内核CPU内核采用(8/16/32位数据)改良的哈佛架构,并带有增强型指令集,dsPIC系列包含对DSP的有力支持。CPU指令字带有长度可变的操作码字段。程序计数器(PC),可以寻址用户程序存储器空间。单周期指令预取机制用来帮助维持吞吐量并提供可预测的执行。222.2.1算术逻辑单元(ALU)ALU能进行加、减、单位移位和逻辑运算。除非特别指明,算术运算一般是以2进制补码形式进行的。根据所使用的指令模式,ALU可以执行8/16/32位操作。根据指令的寻址模式,ALU操作的数据可以来自W寄存器阵列或数据存储器,输出数据可以被写入W寄存器阵列或数据存储单元。根据不同的操作,ALU可能会影响SR寄存器中的进位标志位(C)、全零标志位(Z)、负标志位(N)、溢出标志位(OV)和辅助进位标志位(DC)的值。232.2.2DSP引擎DSP引擎由一个高速17位x17位乘法器、一个桶形移位寄存器和一个40位加法器/减法器(两个目标累加器、舍入逻辑和饱和逻辑)组成。dsPIC30/33

器件采用单周期指令流,可以执行DSP指令或MCU指令。许多硬件资源可以被DSP和MCU指令共用。DSP引擎的功能如下:

1.小数或整数DSP乘法(IF)。

2.有符号或无符号DSP乘法(US)。

3.常规或收敛舍入(RND)。

4.ACCA自动饱和使能/禁止(SATA)。

5.ACCB自动饱和使能/禁止(SATB)。

6.对于写数据存储器,自动饱和使能/禁止(SATDW)。

7.累加器饱和模式选择(ACCSAT)。24252.2.3除法支持16/16位有符号小数除法运算,以及32/16位、16/16位有符号和无符号整数除法运算,除法形式均为单指令迭代除法。支持以下指令和数据长度:

1.DIVF——16/16有符号小数除法

2.DIV.sd——32/16有符号除法

3.DIV.ud——32/16无符号除法

4.DIV.s——16/16有符号除法

5.DIV.u——16/16无符号除法262.2.4CPU寄存器描述SR:CPU状态寄存器低字节SRL包含了所有的MCUALU操作状态标志,加上CPU中断优先级状态位IPL<2:0>和REPEAT循环有效状态位RA(SR<4>)。高字节SRH包含DSP加法器/减法器状态位、DO循环有效位DA(SR<9>)和辅助进位标志位DC(SR<8>)。CORCON:内核控制寄存器CORCON寄存器包含控制DSP乘法器和DO循环硬件操作的位。还包含IPL3状态位,它与IPL<2:0>(SR<7:5>)相连形成CPU中断优先级。27MODCON:模控制寄存器MODCON寄存器用于使能并配置模寻址(循环缓冲)。XMODSRT,XMODEND:X模起始和结束地址寄存器XMODSRT和XMODEND寄存器保持X数据存储地址空间中执行模(循环)缓冲的起始和结束地址。YMODSRT,YMODEND:Y模起始和结束地址寄存器YMODSRT和YMODEND寄存器保持Y数据存储地址空间中执行模(循环)缓冲的起始和结束地址。XBREV:X模位反转寄存器XBREV寄存器用于设置位反转寻址的缓冲区大小。282.3数据存储器2.3.1数据地址空间数据宽度为8/16/32

位的单片机其内部寄存器、数据空间存储器都是以8/16/32位宽度组织的。dsPIC30/33

器件的数据存储器具有两个数据空间X和Y数据空间。数据空间可以看作是独立的或者看作是统一的线性地址范围。Y空间是X空间的子集,Y空间完全包含在X空间中。X和Y空间要有连续的地址。使用两个地址发生单元(AGU)和独立的数据路径访问这两个数据空间。290x0000到0x07FF之间的地址空间保留用于器件的特殊功能寄存器SFR,包含CPU和器件上的外设的控制和状态位。RAM从地址0x0800开始,分成两个区块,分别为X和Y数据空间。对于数据写操作,总是将X和Y数据空间作为一个线性数据空间访问。对于数据读操作,可以分别单独访问X和Y存储器空间或将它们作为一个线性空间访问。0x0000到0x1FFF之间8KB的地址空间称为Near数据存储器。可通过所有文件寄存器指令中的13位绝对地址字段直接对Near数据存储器寻址。30312.3.2数据存储器访问方式

2.4程序存储器程序地址空间程序存储器映射空间被划分为用户程序空间和用户配置空间访问程序空间有三种可用的方法:

1.通过23位PC。

2.通过读表(TBLRD)和写表 (TBLWT)指令。

3.通过把程序存储器的32KB

段映射到数据存储器地址空间。32

2.4.1程序计数器PC用在程序存储器空间中对连续指令字寻址。PC以2为增量,且LSb置为“0”以使之与数据空间寻址相兼容。程序存储器地址的LSb(PC<0>)保留为字节选择位,用于从使用程序空间可视性或表指令的数据空间访问程序存储器。33

2.4.2表指令方式读写表指令用于将字节或字大小的数据在程序空间和数据空间之间传送。读表指令用于把数据从程序存储器空间读入数据存储器空间。写表指令可以把数据从数据存储器空间写入程序存储器空间。程序存储器可以视作并排放置的两个16位字宽的地址空间,每个地址空间都有相同的地址范围,TBLRDL和TBLWTL访问程序存储器的LS数据字,而TBLRDH和TBLWTH访问高位字。34

2.4.3来自数据空间的程序空间可视性可选择将数据存储器地址空间的高32KB空间映射到任何16K字程序空间页,这种操作模式被称为程序空间可视性(PSV),它提供对存储在X数据空间的常数数据的透明访问,而无需使用特殊指令(即,TBLRD和TBLWT指令)。当PSV(CORCON<2>)使能时,在数据存储器映射空间上半部分的每个数据空间地址将直接映射到一个程序地址。35PIC单片机原理及应用第3章

系统集成36

3.1复位复位模块结合了所有复位源并控制器件的主复位信号SYSRST。以下列出了器件的复位源:.POR:上电复位。在检测到VDD电压上升时会产生内部上电复位脉冲。复位脉冲会产生10μs短时间的延时,以确保内部器件偏置电路稳定。.EXTR:引脚复位(MCLR)。只要MCLR引脚拉为低电平,输入脉冲比规定的最小宽度更长,当CLR引脚被释放后,在下一个指令时钟周期将产生SYSRST信号并开始复位向量取指。.SWR:RESET指令。只要何时执行了RESET指令,器件都会产生SYSRST信号,从而将器件置于特殊复位状态。37.WDTR:看门狗定时器复位。只要何时发生看门狗超时,器件将异步产生SYSRST信号。.BOR:欠压复位。主要用途是在发生欠压条件时产生器件复位。欠压条件通常由AC电源上的干扰信号或接入大负载时过电流造成电压下降产生的。.TRAPR:陷阱冲突复位。只要同时有多个硬陷阱中断源待处理,就会产生器件复位。.IOPR:非法操作码复位。.UWR:未初始化的W寄存器复位38393.2振荡器振荡器系统包含时钟源、时钟倍频器、可编程时钟后分频器、时钟监视器等模块。振荡源.带多时钟模式的主振荡器.辅助振荡器(低功耗的32kHz晶振).FRC振荡器:快速内部RC(8MHz).LPRC振荡器:低功耗内部RC(512kHz)40PLL时钟倍频器:.与XT或EC时钟模式的主振荡器配合工作.某些器件允许PLL与内部FRC振荡器配合工作.输入频率范围为4MHz-10MHz.4倍频增益模式(Fout=16MHz-40MHz).8倍频增益模式(Fout=32MHz-80MHz).16倍频增益模式(Fout=64MHz-120MHz).带有“失锁”陷阱选项的PLLVCO锁定提示.HS/2和HS/3主振荡器模式允许选择更高的晶振频率(在某些器件上提供)时钟分频选项:.器件时钟的通用后分频器(分频比为4、16和64)41423.3低压检测(LVD)LVD模块可应用于电池供电的应用场合。当电池消耗能量时,电池电压缓慢下降。电池的源阻抗也随着能量的损耗而不断增大。LVD模块用于检测电池电压(即器件的VDD电压)何时低于阈值,即通常所认为的接近是电池使用寿命的终点。这使应用程序有足够的时间关闭。LVD模块使用内部参考电压与供电电池电压进行比较。阈值电压VLVD,可在运行时编程。433.3看门狗定时器(WDT)和低功耗模式有两种低功耗模式,可以通过执行PWRSAV指令进入:

休眠模式:CPU、系统时钟源和任何依靠系统时钟源工作的外设都被禁止。这是器件的最低功耗模式。模式退出:中断源、器件复位。

空闲模式:CPU被禁止,但是系统时钟源继续工作。外设继续工作,但可以有选择地禁止。模式退出:中断源、器件复位、

WDT超时。WDT在使能时使用内部LPRC时钟源工作,而且如果WDT没有被软件清零,它可以通过复位器件来检测系统软件的异常情况。可以使用WDT后分频器选择不同的WDT超时周期。WDT也可用于将器件从休眠或空闲模式唤醒。44PIC单片机原理及应用第四章工具451、快速入门芯片数据手册:可在

查找及下载,目前大多数新的芯片均有中文数据手册免费的集成编译调试环境MPLABIDE

集成了工程管理、语法高亮显示的文本文件编辑器、汇编编译器、功能强大的软仿真调试器等,同时可外挂多种C编译器、硬件仿真调试器、烧写器等。下载地址:/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW0070023.主要的C语言编译器:

目前MPLAB支持所列的所有C编译器的内嵌调试,单步,全速都没问题。

不同的单片机系列必须使用不同的编译器,目前大多数编译器都有免费的试用版或限制版本下载,正版的也不贵。介绍及下载网址:/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en534868&page=wwwCompilers

4.低成本下载器、在线调试器:

PICKIT2:是廉价的产品,本身保护电路设计不完善,比较容易出问题。好处是可以支持脱机烧写和KEELOQ的片子烧写ICD2:现在市场上的都是国产授权的ICD2,价格中等,之前很多人采用,编程速度显的有点慢,连接上比较容易出现问题。PICKIT3是PICKIT2的升级版,可支持脱机编程,价格跟国产ICD2相当,编程速度方面有提高,性价比比较好的调试器。ICD3算是中端的调试器,采用FPGA内核,支持软件断点多,编程速度快,而且本身的稳定性比较好,可以看作是一款简化版的REAL

ICE。

2、MPLAB®C30C编译器MPLABC30是一个遵循标准的优化C编译器,它包括针对dsPIC嵌入式控制应用的语言扩展。MPLABC30带有一个完整的ANSI标准函数库。这个函数库包括字符串处理、动态存储器分配、数据转换、计时和数学函数(三角、指数和双曲线函数)、用于文件处理的标准I/O函数。MPLABC30对C源文件进行编译,生成汇编语言文件。由编译器生成的文件与其他目标文件和库文件进行汇编和链接以产生最终的应用程序。与编译器有关的目录假定编译器安装在c:驱动器的pic30-tools目录中处理器头文件定义了每个dsPIC器件中可用的特殊功能寄存器(SpecialFunctionRegister,SFR)。处理器头文件指定了每个器件的所有SFR,但并未定义SFR的地址。链接描述文件定义了SFR的地址。举例:两数相加的简单C程序#include<p30f4011.h> /*这个头文件提供了该器件的所有特殊功能寄存

器的定义*/intmain(void); /*可无*/unsignedintAdd(unsignedinta,unsignedintb); /*函数定义*/unsignedintx,y,z;Intmain(void) /*主程序*/{x=2;y=5;z=Add(x,y);return0;}unsignedintAdd(unsignedinta,unsignedintb) /*函数调用*/{return(a+b);}举例:编译多个文件文件1/*ex1.c*/#include<p30f4011.h>intmain(void);unsignedintAdd(unsignedinta,unsignedintb);unsignedintx,y,z;intmain(void){x=2;y=5;z=Add(x,y);return0;}

通过库管理器和链接器,可以将两个文件编译链接生成可执行文件文件2/*add.c*/#include<p30f4011.h>unsignedintAdd(unsignedinta,unsignedintb){return(a+b);}3、MPLABIDE工具语言入门安装MPLABIDE(集成开发环境)8.56

要求:系统用户账户名为英文,

安装文件夹路径中不能有中文

存放文件名必须为英文安装C30编译器MPLABC30V1.30MPLABC30V2.00Upgrade

三、MPLABIDE工具语言入门MPLABIDE软件环境使用分为下面几步骤进行:

创建文件使用项目向导 •使用项目窗口 •设置编译选项3. 编译项目 •编译错误疑难解答使用MPLABSIM软件模拟器进行调试使用MPLABICD2进行在线调试

1、生成源程序文件新建源文件:选择File>New打开一个新的空白的源文件。保存源文件

创建文件使用项目向导 •使用项目窗口 •设置编译选项(可以选择默认)3. 编译项目 •编译错误疑难解答使用MPLABSIM软件模拟器进行调试使用MPLABICD2进行在线调试选择Project>ProjectWizard来创建新项目。将出现一个欢迎页面。点击Next>继续。在“StepOne:SelectaDevice”中,通过下拉菜单选择dsPIC30F6014芯片,点击Next>继续。在“StepTwo:Selectalanguagetoolsuite”中,选择“MicrochipC30Toolsuite”在“StepThree:Nameyourproject”中,键入项目名MyProject并点击BROWSE进入MPLABC30安装目录下的\examples文件夹。然后点击NEXT>继续在“StepFour:Addanyexistingfilestoyourproject”中,将添加两个文件到项目中。在Summary(摘要)窗口中重新检查“项目参数”,验证芯片、工具包和项目文件的位置是否正确设置编译选项现在已经可以用dsPIC30F工具来编译项目,但是,需要检查项目和工具编译选项。选择Project>BuildOptions并点击“Project”显示整个项目的BuildOptions(编译选项)对话框。

创建文件使用项目向导 •使用项目窗口 •设置编译选项(可以选择默认)3. 编译项目 •编译错误疑难解答使用MPLABSIM软件模拟器进行调试使用MPLABICD2进行在线调试选择Project>BuildAll对项目进行编译、汇编和链接。如果有任何错误或警告消息,会显示在输出窗口中。如果在项目编译后出现错误,可双击显示错误消息的行直接进入导致该错误的源代码行。如果您使用的是例子中的代码,那么最常见的错误就是拼写错误、漏掉了分号或大括号不匹配创建文件使用项目向导 •使用项目窗口 •设置编译选项(可以选择默认)3. 编译项目 •编译错误疑难解答使用MPLABSIM软件模拟器进行调试使用MPLABICD2进行在线调试通过选择Debugger>SelectTool>MPLABSIM将MPLABSIM软件模拟器作为调试工具。设置断点:方法一:在源文件中,将光标移动到行上,然后通过鼠标右键选择“SetBreakpoint”设置断点。方法二:将光标移动到行上,双击设置断点。选择View>Watch打开Watch窗口。从AddSymbol旁边的下拉扩展菜单中选择counter,然后点击AddSymbol。点击工具栏中的RUN运行程序。

程序将在执行设置了断点的语句之前停下。源代码窗口左边空白处的绿色箭头指向下一个要执行的语句。Watch窗口中红色字体显示,表明变量的值发生了变化。创建文件使用项目向导3. 编译项目

使用MPLABSIM软件模拟器进行调试使用MPLABICD2进行在线调试 ICD2连接 ICD2设置及目标板配置在集成开发环境中选择Debugger>SelectTool>MPLABICD2选择Debugger>MPLABICD2SetupWizard安装ICD2对ICD2设置:选择Debugger>Setting对目标板配置:选择Configure>ConfigureBitsPIC单片机原理及应用第五章I/O端口66671、I/O端口特点1、所有I/O输入端口都是施密特触发器输入,以便增强抗干扰性。2、外设复用:所有的器件引脚(除VDD、VSS、MCLR和OSC1/CLKI之外),均为外设与I/O端口所共用。

如果外设使能,并且外设正在使用相关引脚时,该引脚将不再作为通用I/O引脚使用。3、优先级:I/O与多个外设复用时I/O引脚的名称定义了与该引脚相关的各个功能的优先级,如:I/O引脚与两个外设复用(“外设A”和“外设B”)外设A对引脚的控制具有最高优先权,若外设A和外设B同时使能,外设A将控制I/O引脚。684、电平变化通知引脚:电平变化通知引脚(CN)内接输入电平变化通知模块,使得dsPIC30F器件能够向处理器发出中断请求,以响应所选输入引脚上的状态变化。即使是在休眠模式下、时钟被禁止时,该模块也能检测输入的状态变化。692、I/O引脚及连线70713、I/O端口控制寄存器所有的端口引脚,都有三个与端口引脚的操作直接相关的寄存器。TRISx:数据方向寄存器。决定各个引脚是输入引脚还是输出引脚。若某个I/O引脚的TRIS位为“1”,则该引脚是输入引脚。某个I/O引脚的TRIS位为“0”,则该引脚被配置为输出引脚。复位以后,所有端口引脚被定义为输入。PORTx:I/O端口寄存器。访问的是I/O引脚上的数据。读的是端口引脚值;写端口引脚,写的是端口数据锁存器(LATx)。LATx:I/O端口锁存寄存器。读的是数据锁存器里锁存的值;写锁存值,写的是端口数据锁存器(LATx)72举例1:第38引脚(RE0)接发光LED;

点LED灯,持续一定时间后灭掉。

#include"p30f4011.h“intmain(){ unsignedlonginti=0;

TRISE=0x00;//RE0-RE5设置为输出;1输入,0输出

PORTE=0x01; //RE0输出高电平+5V,点灯 for(i=0;i<650000;i++){}//延时

PORTE=0x00; //RE0输出低电平0V,灭灯}73RE8RE5RE4RE3RE2RE1RE0TRISE=(0000000000000000)2RE8RE5RE4RE3RE2RE1RE0PORTE=(0000000000000001)2举例2、RE0-RE5配置为输出,连接6个LED;循环点亮#include"p30f4011.h“

intmain(void){

intled=0x01; unsignedlonginti=0; TRISE=0x00; //RE0-RE5配置为输出 PORTE=led; //点亮第一个灯(连接RE0的灯) while(1) {

PORTE=led; for(i=0;i<65000;i++){};//延时

led=led<<1; //当第6个LED灯亮后,重新从第1个LED灯点亮if(led==0x40) led=0x01; } return0;}RE8RE5RE4RE3RE2RE1RE0TRISE=(0000000000000000)2RE8RE5RE4RE3RE2RE1RE0PORTE=(0000000000000010)2PORTE=(0000000000000100)2PORTE=(0000000000001000)2PORTE=(0000000000010000)2PORTE=(0000000000100000)2RE8RE5RE4RE3RE2RE1RE0PORTE=(0000000000000001)275举例3、硬件描述:RE0-RE5配置为输出,连接LED,RE8配置为输入连接按键S8

功能描述:RE8按键按下时循环点亮LED灯

#include"p30f4011.h“intmain(void){ intled=0x00; while(1) {

TRISE=0x0100; //将RE0-RE5配置为输出0,RE8配置为输入 1

if((PORTE&0x0100)==0x0000) //查询按键S8是否按下

{ for(i=0;i<10000;i++){} //延时消抖

if((PORTE&0x0100)==0x0000)//再次查询按键S8是否按下 led=led+1; } if(led==0x40) //当第6个LED灯亮后,重新从第1个LED灯点亮

led=0x01;

PORTE=led; } return0;}

RE8

RE5RE4RE3RE2RE1RE0TRISE=(0000000100000000)2

RE8RE5RE4RE3RE2RE1RE0PORTE=(00000000/1?00000001)2PIC单片机原理及应用第六章中断77

4.1中断概述1、中断的定义:中断是指如下过程:CPU与外设同时工作,CPU执行主程序,外设做准备工作,当外设准备好时向CPU发中断请求信号,若条件满足,则CPU终止主程序的执行,转去执行中断服务程序,在中断服务程序中CPU与外设交换信息,待中断服务程序执行完后,CPU再返回刚才终止的主程序继续执行。

2、中断源:⑴中断源的定义:中断源是指引起中断请求的来源。⑵中断源的分类:①软中断和②硬中断3、中断处理的全过程中断处理的全过程分成3个阶段:中断请求、中断响应和中断服务。4、多重中断与中断优先级⑴当系统中有多个设备提出中断请求时,多个外设的中请信号要通过门电路送到CPU的中请输入端,使CPU能收到多个外设提出的中请。⑵CPU在收到多个外设的请求后,按优先级原则处理中断。通过指令引起的中断。可以发中断请求信号的外设或过程。如打印机、驱动器、故障源和A/D转换器等。中断请求1.CPU都有中请输入线。中请输入线有2类:非屏蔽中请输入线和可屏蔽中请输入线;2.CPU的开、关中断。

CPU内有1个中断请求触发器IF,当IF=1时,称CPU开中断,此时CPU可以处理收到的可屏蔽中请;当IF=0时,称CPU关中断,虽然CPU收到了可屏蔽中请,但不处理(响应)它。3.CPU内有中断请求检测电路。

CPU每执行一条指令,其内的中断请求检测电路都要检测中断请求输入端的状态对于非屏蔽中请输入线上的中请,CPU无条件的响应。对于可屏蔽中请输入线上的中请,只有在CPU和中断源都开中断的情况下才能响应。中断响应1.中断响应定义

中断源向CPU发出中断请求,若其优先级别最高,CPU在满足一定的条件下,可以中断当前程序的运行,保护好被中断的主程序的断点及现场信息。然后,根据中断源提供的信息,找到中断服务子程序的入口地址,转去执行新的程序段,这就是中断响应。2.中断响应条件

CPU响应中断是有条件的,如内部允许中断、中断未被屏蔽、当前指令执行完等。3.任何CPU在中断响应阶段一定做如下工作:①保护断点和②给出中断服务程序入口地址(将中断服务程序的首地址送给PC,为CPU执行装段服务程序创造条件);有的CPU还会做自动关中断等操作4.给出中断服务程序入口地址的方法有2种:⑴固定入口式(中断服务程序的首地址固定,直接将此规定地址送给PC)⑵矢量式。中断服务

中断服务子程序是由用户根据自己的需要编制的,编制时要注意如下问题:1.保护现场:

目的是为了保护那些与主程序中有冲突的寄存器,如果中断服务子程序中所使用的寄存器与主程序中所使用的寄存器等没有冲突的话,这一步骤可以省略。2.开/关中断:对相应中断位置1或置0实现。目的是为了能控制中断。3.中断服务:与中断源实现信息交换。4.恢复现场:是与保护现场对应的,但要注意数据恢复的次序,以免混乱。5.返回:返回主程序中断服务子程序结构图保护现场开中断与外设交换信息恢复现场中断返回中断服务子程序结构图中断处理原则1.当多个中断源同时提出中请时,CPU按优先级的高低有高到低依次为外设服务。2.当CPU正为某外设服务又有新外设提出中请时,⑴若新外设级别高则CPU终止为原外设服务转去为新外设服务,为新外设服务完后,再为原外设服务。⑵若新外设级别低或与原外设同级,则CPU继续为原外设服务,为原外设服务完后,再为新外设服务。84中断向量表(IVT)IVT位于程序存储器中,起始单元地址是0x000004。IVT包含62个向量,这些向量由8个不可屏蔽陷阱向量和最多54个中断源组成。每个中断源都有自己的向量。每个中断向量都包含24位宽的地址。即每个中断向量单元的值是有关中断服务程序(ISR)的起始地址。2、dsPIC30F中断特性85中断优先级可以为每个外设中断源分配7个优先级之一。可用的优先级从1开始为最低优先级,7级为最高优先级。如果与中断源有关的IPC位被全部清零,则中断源被有效禁止。由于特定的优先级会被分配给一个以上的中断请求源,所以在给定的用户分配级别内提供了一种解决优先级冲突的方法。根据每个中断源在IVT中的位置,它们都有一个自然顺序优先级。中断向量的编号越低,自然优先级越高,而向量的编号越高,自然优先级越低。任何待处理的中断源的总优先级都首先由该中断源在IPCx寄存器中用户分配的优先级决定,然后由IVT中的自然顺序优先级决定。86中断控制和状态寄存器INTCON1和INTCON2寄存器:全局中断控制功能来自这两个寄存器。IFSx中断标志状态寄存器:所有中断请求标志都保存在IFSx寄存器中,每个中断源由各自的外设和外部信号置1并通过软件清零。IECx中断允许控制寄存器:所有中断允许控制位都保存在IECx寄存器中,这些控制位用于分别允许来自外设或外部信号的中断。IPCx中断优先级控制寄存器:每个用户中断源都可以分配为7个优先级之一。IPC寄存器用于为每个中断源设置中断优先级。SRCPU状态寄存器:它包含IPL<2:0>状态位(SR<7:5>),该位显示当前CPU的优先级。用户可以通过写IPL位改变当前CPU的优先级。

CORCON内核控制寄存器:它包含IPL3状态位,该位显示当前CPU的优先级。IPL3是只读位,因此陷阱事件就不能被用户软件屏蔽。使用方法:查数据手册例:模板文件的元素#include"p30F4011.h“ /*针对处理器特殊功能寄存器定义的头文件*/#defineCONSTANT110 /*常量定义*/intarray1[CONSTANT1]__attribute__((__space__(xmemory),__aligned__(32))); /*数组定义,表明了如何定义数组的各种属性,指定

其在存储器中的段,以及它在dsPIC的存储器结构中

的对齐方式*/intarray5[CONSTANT2]; /*个简单的数组*/intvariable1__attribute__((__space__(xmemory))); /*为变量指定属性*/intvariable3; /*不指定属性*/intmain(void) { /*Applicationcodegoeshere*/}void__attribute__((__interrupt__(__save__(variable1,variable2))))_INT0Interrupt(void) /*中断的代码结构*/{ /*InterruptServiceRoutinecodegoeshere*/}关键字__attribute__用来指定变量或结构位域的特殊属性。关键字后的双括弧中的内容是属性说明。举例:外部中断INT0

描述:RE8当做外部中断,无中断时执行流水灯,来中断时6个灯全亮89#include"p30f4011.h“unsignedintLed=0x01;voidInitializeint0(){ IFS0bits.INT0IF=0; //清除INT0的中断标志

IPC0bits.INT0IP=7; //中断优先级为7}void__attribute__((__interrupt__))_INT0Interrupt(void){

IFS0bits.INT0IF=0; //清INT0中断标志

PORTE=0x3f; //6个LED灯全亮 for(i=0;i<65000;i++){}; //延时}intmain(){ Initializeint0(); TRISE=0x0100; //设置RE0~RE5为输出

Led=0x01;

IEC0bits.INT0IE=1; //使能中断

while(1) {PORTE=led; for(i=0;i<65000;i++){};//延时

led=led<<1; //循环点灯if(led==0x40) led=0x01; }}寄存器位操作中断标志IFS0bits.INT0IF寄存器位操作中断优先级IPC0bits.INT0IP寄存器位操作中断使能IEC0bits.INT0IE关键字__attribute__用来指定变量或结构位域的特殊属性。关键字后的双括弧中的内容是属性说明。PIC单片机原理及应用第七章定时器9016位定时器功能:16位定时器/计数器区别:Timer1A类型定时器:•可以使用器件的低功耗32kHz振荡器作为时钟源工作•可以在使用外部时钟源的异步模式下工作Timer2B类型定时器:可以和C类型定时器相连形成32位定时器Timer3C类型定时器:可以和B类型定时器相连形成32位定时器Timer4B类型定时器Timer5C类型定时器1、工作模式(1)定时器模式定时器的输入时钟由内部系统时钟(FOSC/4)提供。当使能为该模式时,对于1:1的预分频器设置,定时器的计数值在每个指令周期都会加1。(2)使用外部时钟输入的同步计数器模式定时器的时钟源由外部提供所选的定时器在TxCK引脚上的输入时钟的每个上升沿进行加1计数。对外部时钟高电平和低电平有最短时间的要求。通过在一个指令周期内的两个不同时间对外部时钟信号进行采样,可以实现外部时钟源与器件指令时钟的同步。(3)使用外部时钟输入的A类型定时器异步计数器模式通过使用连接到TxCK引脚的外部时钟源,A类型时基能够在异步计数模式下工作。外部时钟输入不与器件系统时钟源同步。该时基继续进行与内部器件时钟异步的递增计数。异步工作的时基对于以下应用是有益的:

时基可以在休眠模式下工作,并能够在发生周期寄存器匹配时产生中断,将唤醒处理器。在实时时钟应用中,可以使用低功耗32kHz振荡器作为时基的时钟源。(4)门控时间累加模式定时器时钟源来自于内部系统时钟。当加在TxCK引脚上的信号出现上升沿时,门控控制电路开始工作;当加在TxCK引脚上的信号出现下降沿时,门控控制电路终止工作。当外部门控信号为高电平时,对应的定时器将进行递增计数。引脚状态从高电平到低电平的转变会将TxIF中断标志位置1。门控信号的下降沿会终止计数工作,但是不会复位定时器。如果想让定时器在门控输入信号的下一个上升沿出现时从零开始计数,用户必须复位该定时器。门控信号的下降沿产生中断。2、定时器预分频器什么是定时器预分频器

就是把对应模块的时钟的频率按倍数减小,那么其周期就变大。比如说TMR0模块,原本是4个时钟周期(1个指令周期)计一次数,如果把它的预分频器设为1:4后,那它就是16个时钟周期计一次数所有16位定时器的输入时钟(FOSC/4或外部时钟)的预分频比选项为1:1、1:8、1:64和1:256。预分频器计数器清零:

写TMRx寄存器;TON(TxCON<15>)清零;

任何器件复位3、定时器中断根据工作模式的不同,16位定时器可以在发生周期匹配或外部门控信号的下降沿出现时产生中断。即TxIF位置1。TxIF位必须用软件清零。通过对应的定时器中断使能位TxIE,可以将定时器使能为中断源。为了使该定时器成为中断源,必须对中断优先级位(TxIP<2:0>)写入非零值4、与定时器模块相关的特殊功能寄存器定时器开控制位1=启动定时器0=停止定时器定时器门控时间累加使能位1=门控时间累加使能0=门控时间累加禁止定时器输入时钟预分频选择位11=预分频比是1:25610=预分频比是1:6401=预分频比是1:800=预分频比是1:1定时器门控时间累加使能位1=门控时间累加使能0=门控时间累加禁止定时器外部时钟输入同步选择位当TCS=1时:1=同步外部时钟输入0=不同步外部时钟输入当TCS=0时,Timer1使用内部时钟。B类型中:32位定时器模式选择位1=TMRx和TMRy形成32位定时器0=TMRx和TMRy为独立的16位定时器1005、定时器周期值计算1、当外部晶振为fosc=20MHz,此时单片机的指令周期为0.2us:

指令周期=1/(fosc/4)

2、如果采用以上的设置,则定时器的周期值可以这样计算:

定时器周期值=所需定时时间/(指令周期×分频比)3、具体初值还需要经过硬件的测试后才能最终使用,在软仿真状态下可以采用下面的方法来测试举例:循环点亮六个贴片发光二极管,时间间隔1s#include<p30f4011.h>unsignedintLed=1;voidInitializeTMR1(){TMR1=0;//定时器1计数寄存器TMR1=0T1CON=0x0030; //关闭定时器,使用内部时钟,预分频比为1:256PR1=0x1c20;//定时器Timer1周期寄存器值1s

IFS0bits.T1IF=0;//清除TMR1的中断标志

IPC0bits.T1IP=7;//中断优先级为7IEC0bits.T1IE=1;//使能中断}void__attribute__((__interrupt__))_T1Interrupt(void){TMR1=0; IFS0bits.T1IF=0;//清定时器中断标志

Led=Led<<1;if(Led==0x40)Led=1;}intmain(){InitializeTMR1();TRISE=0x00;

T1CONbits.TON=1;while(1){PORTE=Led;}}外部晶振为fosc=7.3728MHz指令周期=1/(fosc/4)=1/1843200≈0.00000054s定时器周期值=所需定时时间/(指令周期×分频比)=1s/(1/1843200*256)=7200=0x1c20102菜单Debuger>stopwatch调出秒表来观察执行时间103实验四、定时器实验一、实验目的实验三的主要目的是进一步了解掌握PIC单片机的结构和定时器功能,学习通过定时器寄存器的控制完成的定时/计数及中断响应的编程技巧,用C语言编写外部中断程序,并在MPLAB开发环境中对工程进行编译链接和进行调试。二、实验要求了解掌握PIC单片机的结构和定时器功能。应熟练掌握MPLAB开发环境的使用方法。熟练掌握PIC单片机的程序编写方法。掌握MPLABIDE硬件调试的技巧。104三、练习:1、循环点亮六个贴片发光二极管:(1)在软仿真模式下练习调试程序(2)用ICD2调试程序2、在上面程序基础上修改程序,调试并在实验板运行。要求:定时时间为1秒根据不同的时间级别分别在LED上点灯,如:第1个红灯表示10秒时间到(累计定时器时间)第2个红灯表示10秒时间到第3个红灯表示10秒时间到调试程序,在实验板运行PIC单片机原理及应用第八章输入扑捉105106什么是输入捕捉?

输入捕捉模块用于在输入引脚上有事件发生时,捕捉来自两个可选时基之一的定时器值。定时器可以选择TMR2、TMR3。定时器可以被设置为使用内部时钟源(FOSC/4)或使用在TxCK引脚上外接的同步外部时钟源。

每个dsPIC30F器件可能有一个或多个输入捕捉通道。如何应用?

输入捕捉功能在需要进行频率(时间周期)和脉冲测量的应用中是相当有用的。107输入捕捉事件模式

当ICx引脚上有事件发生时,输入捕捉模块捕捉所选的时基寄存器的16位值。可以被捕捉的事件分为下列3类:简单捕捉事件模式在ICx引脚输入电平的下降沿捕捉定时器值在ICx引脚输入电平的上升沿捕捉定时器值每个边沿(上升和下降)都捕捉定时器值预分频捕捉事件模式在ICx引脚输入电平的第16个上升沿捕捉定时器值在ICx引脚输入电平的第4个上升沿捕捉定时器值108(1)简单捕捉事件模式输入捕捉逻辑电路根据内部相位时钟检测和同步捕捉引脚信号的上升或下降沿。如果出现上升/下降沿,捕捉模块逻辑将会把当前时基值写入捕捉缓冲器并发信号给中断产生逻辑。当发生的捕捉事件的数量与ICI<1:0>控制位指定的数量匹配时,那么相应的捕捉通道中断标志位ICxIF将会在捕捉缓冲器写事件之后2个指令周期置1。如果捕捉时基在每个指令周期都加1的话,捕捉到的计数值将会是ICx引脚有事件发生后1或2个指令周期出现的值。109(2)边沿检测模式和简单捕获事件模式一样,输入捕捉逻辑电路根据内部相位时钟检测和同步捕捉引脚信号的上升和下降沿。如果发生上升或下降沿,捕捉模块逻辑电路将当前的时基值写到捕捉缓冲区,然后向中断产生逻辑电路发出信号。相应的捕捉通道中断状态标志ICxIF,在捕捉缓冲写事件后的2个指令周期后被置1。110(3)预分频器捕捉事件在预分频捕捉模式下,捕捉模块每计数引脚的4或16个上升沿才发生一次捕捉事件。当预分频计数器等于4或16个计数(取决于所选择的模式)时,计数器将输出一个“有效的”捕捉事件信号,随后将该信号与指令周期时钟同步。该同步了的捕捉事件信号将触发一个捕获缓冲写事件,同时向中断产生逻辑电路发出信号。各个捕捉通道中断状态标志ICxIF,在捕捉缓冲写事件后的2个指令周期后被置1。如果捕捉时基在每个指令周期加1,捕捉到的计数值将是同步捕捉事件发生后1或2个指令周期出现的值。111输入捕捉寄存器dsPIC30F器件中的每个捕捉通道都有以下寄存器,ICxCON:输入捕捉控制寄存器ICxBUF:输入捕捉缓冲寄存器输入捕捉定时器选择位1=捕捉事件时捕捉TMR2的内容0=捕捉事件时捕捉TMR3的内容每次中断的捕捉次数选择位11=每4次捕捉事件中断一次10=每3次捕捉事件中断一次11=每2次捕捉事件中断一次10=每1次捕捉事件中断一次ICM<2:0>:输入捕捉模式选择位111=当器件处于休眠或空闲模式时,输入捕捉仅用做中断引脚功能(只检测上升沿,所有其他控制位都不适用。)110=未使用(模块禁止)101=捕捉模式,每16个上升沿捕捉一次100=捕捉模式,每4个上升沿捕捉一次011=捕捉模式,每1个上升沿捕捉一次010=捕捉模式,每1个下降沿捕捉一次001=捕捉模式,每个边沿(上升沿和下降沿)捕捉一次000=输入捕捉模块关闭次功能描述:测量从捕捉输入端口输入的信号的周期#include"p30f6014.h"#include"PulsePeriodMeasure.h"intmain(){InitializeSys();InitializeIC();InitializeTMR1();while(1){PORTD=PORTD&0xfff8; //RD2~RD0为000,KEYA=0,选通U24 PORTD=PORTD&0xfff8|0x0002; //RD2~RD0为000,LEDA=0,选通U27}}//文件名:PulsePeriodMeasure.h**//功能描述:函数原型的声明,外部变量与常量的声明和初始化**unsignedcharTable0[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};//不带小数点的显示段码表unsignedintfailmemory[40];unsignedintCaptureValue[5]={0,0,0,0,0};//连续五次捕捉值暂存数组unsignedintCaptureDiffValue[4]={0,0,0,0};//保存相邻两次捕捉值的一阶差分值voidInitializeSys();//初始化系统voidConfigIO_IN();//输入捕捉通道组成的配置voidInitializeIC();//初始化输入捕捉通道voidInitializeTMR1();//定时器1初始化voidInitializeTMR3();//定时器3初始化,TMR3的值为IC1捕捉时基void__attribute__((__interrupt__))_T1Interrupt(void);//声明定时器T1中断服务子程序void__attribute__((__interrupt__))_IC1Interrupt(void);//输入捕捉通道IC1中断服务子程序voidInitializeSys(){INTCON1=0x0000;

INTCON2=0x0000; //关中断

IEC0=0x0000;

IEC1=0x0000;IEC2=0x0000;//IECx中断禁止

}voidConfigIO_IN(){TRISD=TRISD&0xfdf8; //RD0~RD2,RD9配置为输出

TRISD=TRISD|0x0100; //RD8配置为输入

PORTD=PORTD&0xfff8; //RD2~RD0为000,KEYA=0,选通U24}voidInitializeIC(){ConfigIO_IN();InitializeTMR3();

IC1CON=0x0002; //捕捉Timer3,每1次捕捉事件中断一次,每一个下降沿捕捉一次

IFS0bits.IC1IF=0; //清IC1中断标志

IEC0bits.IC1IE=1; //使能中断

IPC0bits.IC1IP=6; //设置中断优先级6}voidInitializeTMR1(){TMR1=0; //定时器1计数寄存器TMR1=0T1CON=0x0000; //使用内部时钟,预分频比为1:1PR1=0x4e20; //定时器Timer1周期寄存器PR1=0x4e20,10ms初值

IFS0bits.T1IF=0; //清除TMR1的中断标志

IPC0bits.T1IP=7; //中断优先级为7IEC0bits.T1IE=1; //使能中断

T1CONbits.TON=1; //打开定时器TMR1}voidInitializeTMR3(){TMR3=0; //定时器3计数寄存器TMR3=0T3CON=0x0000; //使用内部时钟,预分频比为1:1T3CONbits.TON=1; //打开定时器TMR3}void__attribute__((__interrupt__))_IC1Interrupt(void){unsignedinti=0;unsignedlongCaptureDiffValueTemp=0;for(i=0;i<4;i++) //求一阶差分值

{CaptureDiffValue[i]=(CaptureValue[i+1]-CaptureValue[i]);if(CaptureDiffValue[i]==0){CaptureDiffValueTemp=0xffff+CaptureDiffValue[i+1]-CaptureDiffValue

温馨提示

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

评论

0/150

提交评论