当前位置:文档之家› PIC——MCC18中断写法

PIC——MCC18中断写法

PIC——MCC18中断写法

PIC——MCC18中断写法

MPLABC18 不自动把中断服务程序放在中断向量处。通常将GOTO 指令

放在中断向量处,从而把控制权转交给相应的中断服务程序。PIC18 系列的低

优先级中断入口地址在0x0018 地址,下面的代码是在入口地址处放置一个向

量函数,这个向量函数里就是一个内嵌汇编的GOTO 指令,GOTO 到低优先级

的中断服务函数InterruptHandlerLow。//----------------------------低优先级中断入

口-----------------------------------1#pragmacodeInterruptVectorLow=0x18//用#pragma 伪指令定义一个名字叫InterruptVectorLow 的段,并把这个段放到0x18 地址起

始的代码空间2voidInterruptVectorLow(void)//低优先级中断向量函数3{4

_asm5gotoInterruptHandlerLow//内嵌汇编指令6_endasm7} 8#pragmacode//这里不是多余的,它是告诉连接器回到默认的代码段,如果不

加的话,连接器就会傻傻地把后面的代码紧跟着上面的代码一直放下去。而

LKR 文件里定义了向量区最多到0x29 地址,所以如果没加此行通常会报错

910#pragmainterruptlowInterruptHandlerLow//这里使用interruptlow 这个关键词

来声明InterruptHandlerLow 这个函数是低优先级中断服务函数,用了关键词后,这个函数将会由编译器自动产生基本的现场保护,并且这个函数的返回将是使

用RETFIE 返回的。111213voidInterruptHandlerLow(void)14{15/*低优先级服务

函数的代码写在这里*/16}PIC18 系列的高优先级中断入口地址在0x0008 地址,

下面的代码是在这个入口地址处放置一个向量函数,这个向量函数里就是一个

内嵌汇编的GOTO 指令,GOTO 到高优先级的中断服务函数InterruptHandlerHigh。

//----------------------------高优先级中断入口-----------------------------------

1#pragmacodeInterruptVectorHigh=0x08//用#pragma 伪指令定义一个名字叫

PIC——MCC18中断写法

PIC——MCC18中断写法 MPLABC18 不自动把中断服务程序放在中断向量处。通常将GOTO 指令 放在中断向量处,从而把控制权转交给相应的中断服务程序。PIC18 系列的低 优先级中断入口地址在0x0018 地址,下面的代码是在入口地址处放置一个向 量函数,这个向量函数里就是一个内嵌汇编的GOTO 指令,GOTO 到低优先级 的中断服务函数InterruptHandlerLow。//----------------------------低优先级中断入 口-----------------------------------1#pragmacodeInterruptVectorLow=0x18//用#pragma 伪指令定义一个名字叫InterruptVectorLow 的段,并把这个段放到0x18 地址起 始的代码空间2voidInterruptVectorLow(void)//低优先级中断向量函数3{4 _asm5gotoInterruptHandlerLow//内嵌汇编指令6_endasm7} 8#pragmacode//这里不是多余的,它是告诉连接器回到默认的代码段,如果不 加的话,连接器就会傻傻地把后面的代码紧跟着上面的代码一直放下去。而 LKR 文件里定义了向量区最多到0x29 地址,所以如果没加此行通常会报错 910#pragmainterruptlowInterruptHandlerLow//这里使用interruptlow 这个关键词 来声明InterruptHandlerLow 这个函数是低优先级中断服务函数,用了关键词后,这个函数将会由编译器自动产生基本的现场保护,并且这个函数的返回将是使 用RETFIE 返回的。111213voidInterruptHandlerLow(void)14{15/*低优先级服务 函数的代码写在这里*/16}PIC18 系列的高优先级中断入口地址在0x0008 地址, 下面的代码是在这个入口地址处放置一个向量函数,这个向量函数里就是一个 内嵌汇编的GOTO 指令,GOTO 到高优先级的中断服务函数InterruptHandlerHigh。 //----------------------------高优先级中断入口----------------------------------- 1#pragmacodeInterruptVectorHigh=0x08//用#pragma 伪指令定义一个名字叫

PIC单片机控制触摸屏心得

PIC单片机控制触摸屏 一、触摸屏基本原理: 触摸屏并非液晶显示屏,而是显示屏前面的透明薄膜。它有三层构成:X电极层、Y电极层、中间隔离层。两电极层平常是相互绝缘的,当手指触摸屏幕时,平常相互绝缘的两层导电层就在触摸点位置有了一个接触,因其中一面导电层接通Y轴方向的5V均匀电压场,使得侦测层的电压由零变为非零,控制器侦测到这个接通后,进行A/D转换,并将得到的电压值与5V相比即可得触摸点的Y轴坐标,同理得出X轴的坐标,这就是所有电阻技术触摸屏共同的最基本原理。 二、PIC单片机pic16f77简介: 1、我所使用的是40脚封装的芯片。管脚如下图: I/O口的方向有TRISX寄存器设置。0是输出1是输入,若为输出,则PORTX寄存器和RXw位可以控制引脚的高低电平。

2、AD转换模块:AD转换模块有三个寄存器:ADCON0、ADCON1、ADRES。

AD转换的步骤: 其中第4步中需要等待的采集时间有时不能按照文档中所说的16us左右。如果单纯的用一路AD通道,则16us的采集时间是可以的。但是若涉及到多通道之间的相互转换后,这个时间就不能保证采集的信号是正确的,应该延长采集时间。我看到网上有人说用1ms 的延时,具体延时应根据实际情况测量一下。AD转换结果位于ADRES寄存器中,8位。 3、通用串口USART: 建议大家调试程序的时候多用一下USART,太好用了。下面是有关寄存器:

TXREG :发送缓冲器,RCREG :接收缓冲器。 4、中断: 下面是与中断有关的寄存器:

中断编程需要注意的问题:PIC单片机的编程软件是MPLAB,它只有一个中断函数,并且有interrupt关键字。多个中断同时使能时,需要在中断函数里判断中断标志位,来判断是哪个外设发生了中断。 三、控制电路: 程序设计:(1)、检测是否有触控操作:首先使T1、T3导通,T2、T4截止,AD转换ADY 的电压值,若为0或某一范围内,则认为没有触控操作,否则有触控操作。 (2)、读X坐标:首先使T1、T3导通,T2、T4截止,AD转换ADY的电压值,得到X坐标。 (3)、读Y坐标:首先使T2、T4导通,T1、T3截止,AD转换ADX的电压值,得到X坐标。

在编写单片机的程序中中断服务程序中可以定义变量如果

在编写单片机的程序中,中断服务程序中可以定义变量,如果希望下一次再进入中断的时候还可以保留变量原来的值,就需要把它设置为static型的。比如,定义一个bit型变量作为某种判断的标志。关于好不好的问题,以我现有的知识,好像是解决不了的,很抱歉 一个中断的处理过程大概是这样的: 1、现行指令结束,且没有更紧急的服务请求。 2、关CPU中断,CPU不能再响应其他任何中断源的中断请求。 3、保存中断点,通常是指保存程序计数器PC中的内容,把它压入到系统堆栈中,以便在终端服务完成后返回到原来的程序中去。 4、撤销设备的中断服务请求,如果这个中断源的中断请求不撤销的话,那么在开CPU中断后,它必然将再次请求终端服务。 5、保存硬件现场。 6、识别中断源。 7、改变设备的屏蔽状态。 8、转向中断服务程序入口,一般还要在中断服务程序中通过软件才能找到具体中断源的中断服务程序入口。 9、保存软件现场,主要指保存将要被中断服务程序破坏的通用寄存器中的内容等。 10、开CPU中断,CPU可以响应其他更高级中断源的终端服务请求,中断源之间可以实现中断嵌套。 11、执行中断服务程序。 12、关CPU中断,CPU不响应任何中断源的中断服务请求。在下一次开CPU中断之前,正在运行的程序不允许被中断。 13、恢复软件现场,恢复被中断服务程序破坏的通用寄存器中的内容等。 14、恢复屏蔽状态。 15、恢复硬件现场,主要指恢复处理机状态字PSW及堆栈指针SP等中的内容,准备返回中断点。 16、开CPU中断。 17、返回到中断点。 其中红字的部分一般用硬件实现,蓝字的部分一般用软件实现,其他可以用硬件也可以用软件实现。 从上面这个过程似乎可以得到,在执行中断服务程序之前,很多东西都被保护起来了,所以执行中断程序的时候不必担心破坏什么东西。我们可以对全局变量进行操作,也可以定义一个新的变量,这只是占用了一定的存储空间和时间的问题。 恩,我也不知道自己理解的对不对,毕竟计算机系统结构是很复杂的哈,还希望大家帮忙理解一哈

PIC系列单片机的中断资源特点及其应用方法详解

PIC系列单片机的中断资源特点及其应用方法详解 1 PIC单片机简介PIC系列单片机是美国Microchip技术公司推出的高性能价格比的8位嵌入式控制器(Embedded Controller),它采用了精简指令集计算机RISC (Reduced Instruction Set Computer)和哈佛(Harvard)双总线以及两级指令流水线结构。具有高速度、低工作电压、低功耗等特点和优良的性能价格比,因而PIC系列单片机越来越受到单片机开发与应用工程技术人员的青睐。该系列独特的结构和中断资源使其在使用时与其它系列的单片机有许多不同之处。下面以PIC16CXX系列微控制器为例来介绍PIC 系列单片机的中断资源特点以及应用方法。 2 中断资源的开发与屏蔽图1是PIC16C64/64A/65/65A的中断逻辑电路图,其它型号芯睡的中断资源也大致相同,只是资源多少不一而已,但它们的中断入口只有一个(入口地址在004H)。PIC 单片机的中断大致可以分为两类。 第一类是由中断控制器INTCON直接控制的中断,包括外部引脚中断INT的RB口电平变化中断以及定时器TMRO溢出中断,它们的中断允许位和中断标志都在INTCON寄存器中。引脚中断INT和定时器TMRO溢出中断与其它微处理器相同。RB口电平变化中断是PIC 单片机特有的中断,当把RB口高4位I/O口线设置为输入时,只要这4位I/O 口线上的电平发生变化就会引起中断。RB口的电平中断特性对用户是非常有用的。用户可以直接利用这些口线的关键部位进行电平检测,并可利用中断进行保护性控制等操作;另一方面,电平中断特性还可以利用RB口的软件控制弱上拉特性组成一个矩阵键盘,并用按键唤醒CPU,这对于那些以电池供电的系统特别有用。 另一类是外围接口中断,包括定时器TMR1溢出中断、TMR溢出或匹配中断、同步串行口中断、异步串行口中断、并行从动口中断和CCP(Capture/Compare/PWM)中断等,而带A/D功能的PIC16C7X系列微处理器还有A/D转换完成中断。这些中断的允许位分别在PIE1和PIE2寄存器,而中断标志则分别在PIR1和PIR2中。 所有的中断都有自己的中断允许位和中断标志,外围接口中断不仅受各自的中断允许位控制,同时还共同受外围中断控制允许位的控制。全局中断允许位GID能够控制所有的中

单片机_C语言函数_中断函数(中断服务程序)

单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。 (1)中断源:中断请求信号的来源。(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效,上面的那个横杠不知道怎么加上去))(2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。期间涉及到CPU响应中断的条件,现场保护,现场恢复。 (3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。优先级是可以编程的,而优先权是固定的。 80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。 80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制 (1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1 (2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP 具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。 在这里我们讲下注意的事项 (1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。 (2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。 (3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。 (4)单片机复位后,TCON,SCON给位清零。 C51语言允许用户自己写中断服务子程序(中断函数) 首先来了解程序的格式: void 函数名() interrupt m [using n] {} 关键字 interrupt m [using n] 表示这是一个中断函数 m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。 n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3 中断号中断源 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1中断 4 串行口中断 (在上一篇文章中讲到的ROM前43个存储单元就是他们,这5个中断源的中断入口地址为: 这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不

中断服务程序流程图

第一讲: 第六章I/O接口原理-接口、端口、编址 回顾:微机系统的层次结构,CPU、主机、接口电路及外部设备之间的结构关联,输入/输出的一般概念。 重点和纲要:微机系统主机与外部设备之间的数据传送,包括I/O端口的寻址方式,输入/输出的传送控制方式。 讲授内容: 6. 1 输入/输出数据的传输控制方式 一、输入/输出的一般概念 1.引言 输入/输出是微机系统与外部设备进行信息交换的过程。输入/输出设备称为外部设备,与存储器相比,外部设备有其本身的特点,存储器较为标准,而外部设备则比较复杂,性能的离散性比较大,不同的外部设备,其结构方式不同,有机械式、电动式、电子式等;输入/输出的信号类型也不相同,有数字信号,也有模拟信号;有电信号,也有非电信号;输入/输出信息的速率也相差很大。因此,CPU与外部设备之间的信息交换技术比较复杂。 CPU与外设之间的信息交换,是通过它们之间接口电路中的I/O端口来进行的,由于同一个外部设备与CPU之间所要传送的信息类型不同,方向不同,作用也不一样(例如数据信息、状态信息、控制信息、输入/输出等),所以接口电路中可以设置多个端口来分别处理这些不同的信息。 2.输入/输出端口的寻址方式 微机系统采用总线结构形式,即通过一组总线来连接组成系统的各个功能部件(包括CPU、内存、I/O端口),CPU、内存、I/O端口之间的信息交换都是通过总线来进行的,如何区分不同的内存单元和I/O端口,是输入/输出寻址方式所要讨论解决的问题。

根据微机系统的不同,输入/输出的寻址方式通常有两种形式:(1).存储器对应的输入、输出寻址方式 这种方式又称为存储器统一编址寻址方式或存储器映象寻址方式。 方法:把外设的一个端口与存储器的一个单元作同等对待,每一个I/O端口都有一个确定的端口地址,CPU与I/O端口之间的信息交换,与存储单元的读写过程一样,内存单元与I/O端口的不同,只在于它们具有不同的的地址。优点: ①CPU对I/O端口的读/写操作可以使用全部存储器的读/写操作指令,也可 以用对存储器的不同寻址方式来对I/O端口中的信息,直接进行算术、逻辑运算及循环、移位等操作。 ②内存与外设地址的分配,可以用统一的分布图。 ③不需要专门的输入、输出操作指令。 缺点: ①内存与I/O端口统一编址时,在地址总线根数一定的情况下,使系统中 实际可以直 接寻址的内存单元数减少。 ②一般情况下,系统中I/O端口数远小于内存单元数,所以在用直接寻址方 式来寻址这些端口时,要表示一个端口地址,必须用与表示内存单元地址相同的字节数,使得指令代码较长,相应地读/写执行时间也较长,这对提高系统的运行速度是不利的。 Mortorola公司的M6800CPU等均采用这种寻址I/O端口的方式。 3. CPU与外设之间所传送的信息类型 CPU与I/O端口之间所交换的信息,可以有下列几种类型: ①数据信息:包括数字量、模拟量、开关量等,可以输入、也可以输出 ②状态信息:这是I/O端口送给CPU的有关本端口所对应的外设当前状态 的信息。供CPU进行分析、判断、决策。 ③控制信息:这是CPU送给I/O端口的控制命令,使相应的外部设备完成 特定的操作。 数据信息、状态信息和控制信息是不同类型的信息,它们所起的作用也不一样。但在8086/8088微机系统中,这三种不同类型的信息的输入、输出过程是相同的。为了加以区分,可以使它们具有不同的端口地址,在端口地址相同的情况下,可以规定操作的顺序,或者在输入/输出的数据中设置特征位。

PIC单片机各寄存器

1) 芯片的振荡模式选择。 2) 片内看门狗的启动。 3) 上电复位延时定时器PWRT的启用。 4) 低电压检测复位BOR模块的启用。 5) 代码保护。 __CONFIG_CP_OFF &_WDT_OFF &_BODEN_OFF &_PWRTE_ON &_XT_OSC &_WRT_OFF &_LVP_OFF &_CPD_OFF ; _CP_OFF 代码保护关闭 _WDT_OFF 看门狗关闭 _BODEN_OFF _PWRTE_ON 上电延时定时器打开 _XT_OSC XT振荡模式 _WRT_OFF 禁止Flash程序空间写操作 _LVP_OFF 禁止低电压编程 _CPD_OFF EEPROM数据读保护关闭 LVP Low Voltage Program 低电压编程 CP Code Protect 代码保护 Date EE Read Protect EEPROM数据读保护 Brown Out Detect Power Up Timer Watchdog Timer Flash Program Write 外部时钟输入(HS,XT或LP OSC配置)如下图: 陶瓷(ceramic)谐振器电容的选择如下表:

一般情况为:11 1111 0011 0001 0x3F31 或0x3F71 位13 CP:闪存程序存储器代码保护位1 1=代码保护关闭 0=所有程序存储器代码保护 位12 未定义:读此位为1 1 位11 DEBUG:在线调试器模式位1 1=禁止在线调试器,RB6和RB7是通用I / O引脚 0=在线调试功能开启,RB6和RB7专用于调试 位10:9 WRT1:WRT0:闪存程序存储器的写使能位11 PIC16F876A / 877A 11=写保护关闭,所有的程序存储器可能被写入由EECON控制 10=0000h-00FFh写保护,0100h-1FFFh写入由EECON控制 01=0000h-07FFh写保护,0800h-1FFFh写入由EECON控制 00=0000h-0FFFh写保护,1000h-1FFFh写入由EECON控制 位8 CPD:数据EEPROM存储器代码保护位(Code Protection bit) 1 1=数据EEPROM存储器代码保护关闭 0=数据EEPROM存储器代码保护功能开启 位7 LVP:低电压(单电源)在线串行编程使能位(Low V oltage Program) 0 1=RB3/PGM引脚有PGM功能,低电压编程启用 0=RB3是数字I / O 引脚,HV(高电压13V左右) 加到MCLR必须用于编程 位6 BOREN:欠压复位使能位(低电压检测复位)(Brown-out Reset(Detect)) 0 1=低电压检测复位BOR(BOD)模块启用 0=低电压检测复位BOR(BOD)模块关闭 位5:4 未定义:读此两位均为1 11 位3 PWRTEN:上电定时器使能位(上电复位延时定时器)(Power-up Timer) 0 1=上电定时器关闭 0=上电定时器开启 位2 WDT:看门狗定时器使能位0晶体振荡器电容的选择 1=看门狗开启如右图: 0=看门狗关闭 位1:0 Fosc1:Fosc0:振荡器选择位01 11=RC振荡器 10=晶体振荡器HS模式。参考振荡频率范围:>2 MHz 01=晶体振荡器XT模式。参考振荡频率范围:100 kHz ~ 4 MHz 00=晶体振荡器LP模式。参考振荡频率范围:<200 kHz

PIC单片机C语言指南

第一部分 为了对PIC单片机有更好的支持,PICC在标准C的基础上作了一些扩充: z定义I/O函数,以便在你的硬件系统中使用中定义的函数。 z用C语言编写中断服务程序 z用C语言编写I/O操作程序 z C语言与汇编语言间的接口 1-1 与标准C的不同 PICC只在一处与标准C不同:函数的重入。 因为PIC单片机的寄存器及堆栈有限,所以PICC不支持可重入函数。 1-2 支持的PIC芯片 PICC 支持很多PIC单片机,支持PIC单片机的类型在LIB目录下的picinfo.ini 文件中有定义。 1-3 PICC 包含一些标准库 1-4 PICC 编译器可以输出一些格式的目标文件,缺省设置为输出Bytecraft的'COD' 格式和 Intel的'HEX'格式。你可以用表1-1中的命令来指定输出格式。 表1-1格式名称描述PICC 命令文件类型Motorola HEX S1/S9 type hex file -MOT .HEX Intel HEX Intel style hex records(缺省) -INTEL .HEX Binary Simple binary image -BIN .BIN UBROF Universal Binary Image Relocatable Format -UBROF .UBR Tektronix HEX Tektronix style hex records -TEK .HEX American Hex format with symbols for American -AAHEX .HEX Automation HEX Automation emulators Bytecraft .COD Bytecraft code format(缺省) n/a(缺省) .COD Library HI-TECH library file n/a .LIB 1-5 符号文件 PICC -G 命令用于生成符号文件,有了符号文件,你就可以进行源程序调试. 命令格式为:PICC -16F877 -G test.c 在使用仿真器时必须使用-G命令。 1-6 配置字 PIC单片机的配置字可以用__CONFIG命令来定义: #include __CONFIG(x) 其中x是配置字,头文件中定义了相应的配置说明符,如: __CONFIG(WDTDIS & XT & UNPROTECT);

定时中断T0服务程序参考框图

软件程序: ORG 0000H LJMP MAIN ORG 000BH LJMP PIT0 ORG 001BH LJMP PIT1 ORG 0100H MAIN: MOV SP,#FH ;设堆栈指针 MOV SCON,#00H ;设置串行口为方式0 MOV TMOD,#11H ;T0和T1初始化为方式1 MOV TH0, #3CH ;置时间常数,T0和T1定时100ms MOV TL0, #OB0H MOV TH1, #3CH MOV TL1, #0B0H MOV 50H, #96H ;T0中断次数计数单元 MOV 51H,#14H ;T1中断次数计数单元 MOV R1, #00H MOV R2, #00H MOV R0, #40H ;显示缓冲单元起始地址 DISP0:MOV @R0, #00H ;显示缓冲单元清零 INC R0 CJNE R0, #4CH,DISP0 MOV 44H,#01H ;设置通道号的显示缓冲单元 MOV 48H,#02H MOV R7,#40H ;置当前通道显示缓冲单元首址 MOV 53H,#40H SETB ETO ;开中断 SETB ET1 SETB EA SETB TR0 ;启动定时器 SETB TR1 LP: MOV R7, 53H ;调显示子程序 ACALL DISP AJMP JP 定时器TO中断服务程序 PIT0: MOV TH0, #3CH ;重置时间常数 MOV TL0, #OBOH DJNZ 50H,#96H PUSH ACC PUSH 03H ACALL WDXJ ;调温度巡检子程序 POP 03H POP ACC

DH0: RET1 定时器T1中断服务程序 PIT1: MOV TH1,#3CH ;重置时间常数 MOV TL0, #OBOH DJNZ 51H,DH1 ;计数20次即定时2S MOV 51H,#14H INC R2 CJNE R2,#03H,CNL0 ;根据R2中的内容确定显示缓冲区首址 MOV R2,#00H CNL0: CJNE R2,#00H,CNL1 MOV 53H,#40H SJMP DH1 CNL1: CJNE R2,#01H,CNL2 MOV 53H,#40H SJMP DH1 CNL2: MOV 53H,#48H DH1: RETI 显示子程序 DISP: CLR P3.7 ;输出锁存 MOV R3,#01H ;置显示字位码 MOV DPTR,#TAB DISP1:MOV A,R3 MOV SBUF,A ;字位码送串行口 JNB T1,$ ;等待串行转送结束 CLR T1 ;清串行中断标志 MOV A,R7 MOV R0,A MOV A,@RO ;取代显示的数据 MOVC A,@R0 ;查表求字段码 MOV SBUF, A ;字段码送串行口, JNB T1,$ ;等待串行中断标志 SETB P3.7 ;允许输出显示 ACALL DEL ;调延时子程序 MOV A,R3 JB ACC.3,DISP2 ;4位显示完否 RL A MOV R3,A INC R7 CLR P3.7 ;输出锁存 AJNP DISP1 DISP2:RET TAB : DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH DEL: PUSH 07H ;延时子程序

PIC单片机定时中断

PIC单片机定时中断 #INCLUDE"P16F877.inc" ORG 000H GOTO A1 ORG 004H;定时中断入口地址 GOTO ZD01; ORG 0CH A1 MOVLW 1;位1显示数 MOVWF 50H; MOVLW 2;位2显示数 MOVWF 51H; MOVLW 3;位3显示数 MOVWF 52H; MOVLW 4;位4显示数 MOVWF 53H; MOVLW 4;显示位数 MOVWF 40H; MOVLW B'00000001';位码 MOVWF 41H; MOVLW 50H; MOVWF FSR ;间接寻址

BSF STATUS,RP0;选择体1 BCF STATUS,RP1; MOVLW 00H;1:2TMRO比例 MOVWF OPTION_REG;分频1/2 BCF STATUS,RP0;体0 BCF STATUS,RP1; MOVLW 0FFH; MOVFW TMR0;初值 BCF INTCON,T0IF;清定时中断标志 BSF INTCON,T0IE;开定时中断 BSF INTCON,GIE;开总中断 GOTO $ ZD01 BCF INTCON,GIE;关总中断 BTFSS INTCON,T0IF;判断是否产生定时中断 GOTO ZD03;否跳出是继续执行 BCF INTCON,T0IF BSF STATUS,RP0;体1 BCF STATUS,RP1; MOVLW 0; MOVWF TRISB;RB口设为输出口 MOVWF TRISD;RD口设为输出口

BCF STATUS,RP0;体0 BCF STATUS,RP1; MOVLW 0FFH; MOVWF PORTB;RB口输出高电平 MOVLW 0 MOVWF PORTD;RD口输出低电平起清屏作用 MOVFW INDF;间接寻址显示数据 CALL Q1;查数据表 MOVWF PORTB;显示断码输出到RB口 INCF FSR,1;间接寻址地址加1 MOVFW 41H ;位码 MOVWF PORTD;位码输出到RD口 RLF 41H,0;处理C RLF 41H,1;左移位码 DECFSZ 40H,1;判断是否显示完4位 GOTO ZD02;否则继续显示 MOVLW 4;显示位数 MOVWF 40H; MOVLW B'00000001';位码 MOVWF 41H; MOVLW 50H;

单片机外部中断详解及程序

单片机外部中断详解及程序 单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。 实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。电路结构和接线不变,仅把程序改为下面的形式。 #include ;

unsigned int t=500; //定义一个全局变量t,并设定初始值为500次 //===========延时子函数,在8MHz晶振时约 1ms============= void delay_ms(unsigned int k) { unsigned int i,j; for(i=0;i

定时器中断c语言程序

定时器中断c语言解析interrupt x using y interrupt 表示中断优先级,using表示所用工作寄存器组。 interrupt x using y 跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1 4 串行中断 其它的根据相应得单片机有自己的含义,实际上c在编译的时候就是把你这个函数的入口地址放到这个对应中断的跳转地址 using y 这个y是说这个中断函数使用的那个寄存器组就是51里面一般有4个r0 -- r7寄存器,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会弹出来节省代码和时间 外部中断INT0 void intsvr0(void) interrupt 0 using 1 定时/计数器T0 void timer0(void) interrupt 1 using 1 外部中断INT1 void intsvr1(void) interrupt 2 using 1 定时/计数器T1 void timer1(void) interrupt 3 using 1 串口中断 void serial0(void) interrupt4 using 1 单片机的C语言 HNBCC培训 电话:137******** 一,中断的概念 中断:当计算机执行正常程序时,系统中出现某些急需处理的异常情况和特殊请求. 中断的执行:当CPU正在执行某一程序时,若有中断响应,则CPU转而执行中断服务程序,当中断服务程序执行完毕后,CPU自动返回原来的程序继续执行. 中断服务程序的语句写法与函数的写法完全相同,所以,中断服务程序也是函数,只在函数头部有不同(后续). 中断服务程序的执行与函数的执行不同:函数的执行是有固定位置的,是通过函数的调用来完成的;而中断服务程序的执行是不固定位置的,只要有中断响应,在一定条件下都会去响应中断,即执行中断服务程序. 二,中断源 中断源:任何引起计算机中断的事件,一般一台机器允许有许多个中断源. 8051系列单片机至少有5个可能的中断(8052有6个,其它系列成员最多可达15个).下面以5个中断源为例.

pic单片机中断

PIC18系列的低优先级中断入口地址在0x0018地址,下面的代码是在入口地址处放置一个向量函数,这个向量函数里就是一个内嵌汇编的GOTO指令,GOTO到低优先级的中断服务函数InterruptHandlerLow。 //----------------------------低优先级中断入口----------------------------------- 1#pragma code InterruptVectorLow = 0x18 //用#pragma伪指令定义一个名字叫InterruptVectorLow的段,并把这个段放到0x18地址起始的代码空间 2void InterruptVectorLow (void) //低优先级中断向量函数 3 { 4_asm 5goto InterruptHandlerLow //内嵌汇编指令 6_endasm 7 } 8#pragma code //这里不是多余的,它是告诉连接器回到默认的代码段,如果不加的话,连接器就会傻傻地把后面的代码紧跟着上面的代码一直放下去。而LKR文件里定义了向量区最多到0x29地址,所以如果没加此行通常会报错 9 10#pragma interruptlow InterruptHandlerLow //这里使用interruptlow这个关键词来声明InterruptHandlerLow这个函数是低优先级中断服务函数,用了关键词后,这个函数将会由编译器自动产生基本的现场保护,并且这个函数的返回将是使用RETFIE返回的。 11 12 13void InterruptHandlerLow (void) 14 { 15/* 低优先级服务函数的代码写在这里*/ 16 }

PIC单片机中断模块详细介绍

PIC单片机中断模块详细介绍 PIC 单片机中断模块介绍: PIC16F87X 系列单片机可以接收多达14 个中断源。中断控制器寄存器INTCON 标记着各个中断源的请求,对各个中断设置屏蔽位,对全部中断设置 全局屏蔽位。 PIC16F87X 系列的中断包含:TMR0 溢出中断(TOIF)、外部中断(INTF)、端口B 变化中断(RBIF)、并行从动端口中断(PSPIF)、A/D 变换 中断、USART 异步接收中断(RCIF)和异步发送中断(TXIF)、同步串行端 口中断(SSPIF)、CCP1 中断(CCPIIF)、TMR2 中断(TMR2IF)、TMR1 中断、CCP1 中断(CCP2)、E2PROM 写中断(EEIF)、总线碰撞中断(BCLIF)。 各个中断采用查询方式进行,即当CPU 口向应中断时,事先要通过查 询中断标志位去判断是哪个中断产生中断请求,然后执行相应的中断服务程序。 RB0/INT 外中断仍遵守PIC16F87X 单片机的中断原则,当有中断时产 生中断标志位,由CPU 查询识别中断。根据这一原则,可以扩展多个外中断 源,CPU 响应中断后查询中断标志位识别中断。 RB0/INT 引脚上的外部中断由边沿触发,既可以是上升沿,也可以是 下降沿,这由选择寄存器OPTION_REG 的INTEDG 位(D6)决定。当 INTEDG=1 时,选择上升沿触发;当INTEDG=0 时,选择下降沿触发。一旦 检测到引脚上出现有效边沿,就把INTF 位(INTCON 的D1)置1。这个中断 由中断控制位INTE 设置允许或禁止。 为了防止错误的死循环执行同一个中断,在重新开放这个中断之前必须 在中断服务程序中用软件对INTF 位清0。如果INTE 位在进入休眠状态之前已

第5章 中断服务程序设计

第5章中断服务程序设计 中断服务程序(ISR)是嵌入式应用系统获取各种事件的基本手段,而“事件”是实时性问题的讨论基础和时间计算的起点。ISR的设计质量直接影响到系统的实时性指标和操作系统的工作效率。 只要没有关中断,中断服务程序可以中断任何任务的运行,可将中断服务程序可成比最高优先级(0级)还高的“任务”。 5.1中断优先级安排原则 中断源是系统及时获取异步事件的主要手段,其优先级安排原则如下: ●紧迫性:触发中断的事件允许耽误的时间越短,设定的中断优先级就越高。 ●关键性:触发中断的事件越关键(重要),设定的中断优先级就越高。 ●频繁性:触发中断的事件发生越频繁,设定的中断优先级就越高。 ●快捷性:ISR处理越快捷(耗时短),设定的中断优先级就越高。 中断服务程的功能应尽量简单,只要将获取的异步事件通信给关联任务,后续处理由关联任务完成。 5.2不受操作系统管理的中断服务程序 正常情况下,ISR应受操作系统的管理,因很多任务是靠ISR触发的。 但在两种情况下ISR不受操作系统管理:①没有必要;②操作系统没有对该ISR进行管理。 实时操作系统uC/OS-Ⅱ移植到ARM7体系的CPU上时,没有对FIQ进行处理,即FIQ 是不受操作系统管理的。 选用FIQ来响应实时性要求最高的高速采样操作是一个有效措施,保护现场的工作量很小(FIQ专有的8个寄存器不需要保护)。 在工程模板的系统启动文件Startup.s中,已经把汇编代码部分处理好,用户只需要用C 语言编写快速中断服务函数FIQ_Exception()即可,不需考虑保护现场和恢复现场的问题。 程序:Startup.s中队FIQ的处理 Reset ;异常向量表 LDR PC,ResetAddr ;跳转到复位入口地址 LDR PC,UndefinedAddr LDR PC,SWI_Addr ;跳转到软件中断入口地址 LDR PC,PrefetchAddr LDR PC,DataAbortAddr DCD 0xb9205f80 LDR PC,[PC,#-0xff0] ;跳转到向量中断入口地址(向量中断控制器) LDR PC,FIQ_Addr ;跳转到快速中断入口地址 ResetAddr DCD ResetInit UndefinedAddr DCD Undefined SWI_Addr DCD SoftwareInterrupt PrefetchAddr DCD PrefetchAbort Nouse DCD 0

PIC16F87X单片机中断系统应用须关注的问题

PIC16F87X单片机中断系统应用须关注的问题 发布时间:2009-7-21 阅读次数:210 字体大小: 【小】【中】【大】 作者:河北省邮电学校李学海 摘要:美国微芯公司研制的PIC系列单片机,其硬件结构和指令系统采用了与众不同的设计手法。在架构上和概念上对传统单片机进行了一些突破性的变革,但也给这类单片机的应用带来了一些特殊问题。本文针对PIC16F87X系列单片机中断的特点,及其在应用过程中应该注意的几个问题进行必要的说明。内容包括中断源、中断逻辑、中断相关的寄存器、中断的延时、中断的现场保护以及注意事项等。 关键词:单片机 PIC16F87X 中断系统中断源 目前在世界一些著名的单片机产品系列中,PIC16F87X系列单片机是芯片内部包含有外围设备模块数量最多的单片机品种之一。PIC16F874和PIC16F877单片机的芯片内部集成了15个外围设备模块;PIC16F873和PIC16F876单片机的芯片内部集成了12个外围设备模块。在最近推出的该系列的新型号中, PIC16F870单片机的芯片内部集成了10个外围设备模块;PIC16F871单片机的芯片内部集成了13个外围设备模块;PIC16F872单片机的芯片内部也集成了10个外围设备模块(比PIC16F870多了1个USART模块,少了1个SSP模块)。 这些外围设备模块在启用时以及在工作过程中,都或多或少地需要CPU参与控制、协调或交换数据等各种服务工作。由于CPU的运行速度非常高,而各个外围设备模块的工作速度却非常低,况且这些外围设备模块也不是频繁地要求CPU对其服务。因此,通常采取一种让众多外围设备模块共享1个CPU,并且能够及时得到CPU服务的调度方法——中断。 一、 PIC16F87X的中断源 PIC系列单片机是当今世界上很有影响力的精简指令集(RISC)微控制器,具有丰富的中断功能。其中功能强大的中、高挡型号的中断源有18种之多。在PIC单片机家族中,排位属于中上水平的PIC16F87X 子系列单片机具备的中断源多达14种。其中,单片机的型号不同,中断源的种类、个数也不同,如表1所列。其不足之处是:中断矢量只有1个,并且各个中断源之间也没有优先级别之分,不具备非屏蔽中断。 表1 PIC16F87X单片机的中断源及其数量

PIC单片机中断程序的设计技巧

PIC单片机中断程序的设计技巧 所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。 在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB 是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,一般都利用PIC单片机的引脚功能来检测按键,所以必须处理好按键消抖的问題。 2 引脚中断程序设计 在主程序里先设置有关的寄存器。 ◇设置TRISB寄存器,使RB7~RB4相关的引脚处于输入状态; ◇如果需要弱上拉,通过OPTION_REG的第7位设置; ◇RBIF=O; ◇RBIE=1; ◇GIF=1。 响应状态变化后的中断服务程序。 ◇检查RBIF是否为l,为l则是引脚变化引起的中断; ◇调用延时程序,延时20~30 ms,目的是为了按键去抖; ◇判断是引脚出现上升沿还是下降沿引起的中断; ◇调用按键处理程序; ◇读PORTB口的值,取消状态变化的硬件信号; ◇清除RBIF标志。 笔者认为上面程序设计最大的问题是在中断程序里调用延时程序。大家知道,中档PIC 单片机只有8层深度的硬件堆栈,在中断里调用于程序出现极易堆栈溢出的情况。另外,PIC单片机中断程序人口只有一个,在响应中断的请求时,PIC单片机就会自动把全局中断的使能位(INTCON的第7位GIF)清除,这样其他中断就暂时不能被响应(此时,如果别的中断发出的中断请求,标志位将一直保留着),直到这个中断程序退出后才会得到响应。这就要求我们设计中断程序的时候必须尽量短,避免调用子程序,更不要在中断里进行复杂的运算。 下面给出笔者设计程序时的思路。 当引脚状态变化引起中断时,在中断子程序里首先判断引起中断的原因是不是我们需要的变化引起的中断。如果是,不要在这里延时,而是设置一个标志位,接着清除中断标志,退出中断。中断程序如下: else if((RBIE&RBlF)==1){ //如果引脚变化引起中断 if(RB4==0){ //RB4上的按钮接地 key=1;//按键标志位置位 } RBIF=0;//清除引脚中断标志位 }

PIC单片机多中断处理技术的应用与研究

PIC单片机多中断处理技术的应用与研究 关键字:PIC单片机多中断处理技术 引言 PIC系列单片机中断源已经达到14个.可谓相当丰富;但同时也带来了一些难题:在处理多中断时不具备处理“高级优先处理”能力的问题,如此多的中断源在处理时很容易产生中断冲突,如何有效的处理中断到达时的时序,其算法应该如何实现成了首先需要解决的问题。 1 中断处理技术 对于PIC系列单片机,其设计上虽然有很多中断,但是并没有规定中断的优先级。当遇到中断的时候,不做任何判断,而是先把指针指向0004H(中断起始地址),至于接下来如何操作则完全交给用户“软处理”完成。其中断时序图如下: 图1 INT引脚中断时序图 中断现场的保护是中断技术中一个很重要的环节。对于PICl6F87X单片机,在进人中断服务程序期间,只有返回地址,即程序计数器Pc的值被自动压入硬件堆栈;而在中断处理程序中,一般必须像使用WReg、STATUS等寄存器一样,在中断处理程序开始处,就备份这些寄存器的内容,即进行所谓的现场保护。 PICl6F87X子系列单片机具备的中断源多达14种,中断矢量只有1个,并且各个中断源之间也没有优先级别之分,不具备非屏蔽中断。PIC单片机中采用的是硬件堆栈结构,不占用程序存储器空间,也不占用数据存储器空间,同时也无需用户去操作堆栈指针;但同时也就决定了它不具备其他单片机指令系统中的压栈(PUSH)和出栈(POP)指令。实现中断现场保护时,不能用堆栈来实现,而是通过变量的复制备份来实现。一般的实现办法是:先确定要保护的现场,一般包括WReg、STATUS等寄存器的内容,然后在各个页都定义与这些寄存器对应的变量。以备份现场。发生中断时,在中断处理代码开始处先将这些现场寄存器内容复制到备份变量,退出中断处理时再复制回去恢复现场: 2 基于PICl6F87X单片机的频率计设计 随着电子技术的迅速发展,以单片机为控制核心的控制器件,已经全面渗透到测试仪器和计量检定的各个方面。同时,频率计作为一种常用工具,在工程技术和无线电测量、计量等领域的应用十分广泛。设计的频率计主要用来测量脉冲频率。 2.1设计原理 PICl6F87X单片机内部集成有捕捉,比较,脉宽调制PWM(CCP)模块。当CCP工作在捕捉(capture)方式时,可捕捉外部输人脉冲的上升沿或下降沿,并产生相应的中断。 PICl6F87X单片机内部还集成了定时器肘数器模块,采用其中的TMRI作为定时器,该定时器的工作原理是通过TMR1“寄存器对”TMRlH:TMR1L从0000H递增到FFFFH。之后再返回0000H时,会产生高位溢出,并且将会设置溢出中断标志位TMR1IF为1,同时引起CPU中断响应。 在均匀的脉冲序列中,脉冲频率值等于单位时间内发生的脉冲次数。根据这个原理,可以采用PICl6F87X系列单片机内置定时器模块TMRl计时j同时使用CCP模块的捕捉功能,每间隔n(n=1,4,16)个脉冲捕捉一次并产生中断,记录第1个和第(m-1)*n+1个脉冲到来时的定时器计时tl和tm。 用被捕捉的脉冲次数除以第1次和第(m-1)*n+1次脉冲之间间隔的时间即可得到脉冲频率值。因此,脉冲频率值计算公式为: f=n*(m-1)/(tm-t1)

相关主题
文本预览
相关文档 最新文档