少走弯路,PIC单片机中断总结
51单片机中断知识总结
51单片机中断知识总结如下:一、中断概念中断是一种特殊的事件处理机制,当单片机在执行程序时,如果发生某种突发事件(如外部中断请求、定时器溢出等),需要立即处理,这时单片机就会暂时中断当前的工作,转去处理这个突发事件。
处理完后再回到原来被中断的地方继续执行程序。
这个过程就称为中断。
二、51单片机的中断系统结构51单片机的中断系统由中断允许寄存器IE控制。
IE寄存器可以控制所有中断以及某个中断源的开放和屏蔽。
三、中断标志位中断标志位是用于标识某个事件是否发生的中断信号。
当发生某个事件时,硬件会自动置位相应的中断标志位。
四、中断响应条件中断响应条件包括两个:1)允许中断标志位为1;2)相应中断的优先级最高。
只有当这两个条件都满足时,单片机才会响应中断。
五、中断处理中断处理是对中断源进行有针对性的服务。
用户需要编写相应的中断处理程序,以便在发生中断时执行相应的操作。
六、中断返回中断返回是指返回到主程序断点处,继续执行主程序。
这个过程由硬件自动完成。
七、外部中断外部中断是由外部设备产生的中断请求。
在51单片机中,外部中断可以通过INT0和INT1引脚输入。
外部中断的触发方式可以是下降沿触发或电平触发。
八、定时器中断定时器中断是由定时器溢出产生的中断请求。
当定时器溢出时,硬件会自动置位相应的中断请求标记,并产生中断请求。
九、串口中断串口中断是由串行口接收完一帧数据后产生的中断请求。
当串行口接收完一帧数据后,硬件会自动置位相应的中断请求标记,并产生中断请求。
以上就是关于51单片机中断的知识总结,希望能够帮助到您。
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转换完成中断。
PIC单片机中断程序设计技巧
PIC单片机中断程序设计技巧
所有的中档系列PIC 单片机,PORTB 端口最高的4 个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产
生中断。
这就是通常所说的引脚状态变化中断。
在设计引脚中断程序时,有三个需要特别注意的地方。
一是,在清除P0RTB 中断标志位RBIF 之前,必须安排一条必不可少的,以PORTB 端口数据寄存
器PORTB 为源寄存器的读操作指令。
放置这一指令的目的有时并不只是为了
读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF 标
志位,为下一次中断做好准备。
二是,由于端口PORTB 是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要
的虚假中断。
三是,一般都利用PIC 单片机的引脚功能来检测按键,所以必须处理好按键消抖的问題。
引脚中断程序设计
在主程序里先设置有关的寄存器。
◇设置TRISB 寄存器,使RB7~RB4 相关的引脚处于输入状态;
◇如果需要弱上拉,通过OPTION_REG 的第7 位设置;
◇RBIF=O;
◇RBIE=1;
◇GIF=1。
响应状态变化后的中断服务程序。
◇检查RBIF 是否为l,为l 则是引脚变化引起的中断;
◇调用延时程序,延时20~30 ms,目的是为了按键去抖;。
PIC中档单片机的中断总结
PIC中档单片机的中断总结对于来说,一次中断的过程大致有下列阶段:为了使得解释形象和直观,本文采纳一些诙谐的语句来比方解释:中断哀求---------比方成申请买经济适用房的哀求中断标记-------一份申请书本中断使能xxIE-----本单位领导PEIE-------------户口办公室主任GIE--------------银行的管理信贷的科长中断哀求:房子太少,儿子要结婚了,得买房了,可资源和财力有限,不能卖商品房,只好按特别状况处理,写一份申请书(中断标记位IF 置1);本单位领导xxIE看了之后,假如给你盖了一个戳:(即该中断使能位IE=1),那么恭喜你,这份申请书可以提交到更高一级的部门;假如没盖(xxIE= 0),那么对不起,先放我这里吧,等我们讨论讨论好后再说。
假如你不愉快,要拿回申请书撕掉,呵呵,那么IF=0;你的购房哀求之梦破灭;xxIE领导将按照户口,将这些哀求书给分类,一类是外地迁来的户口,提交给户口办公室PEIE主任审查,PEIE主任假如给你盖了个戳(PEIE= 1),那么,他将会把申请书提交给银行的GIE科长批准,否则就是放在这里再讨论讨论或者你要回归撕毁;一类是本地户口,可挺直提交给银行的GIE科长批准,然后你将申请书带到GIE科长的办公室。
GIE科长盖了章之后(GIE=1),然后,你就可以拿着申请书去找房地产商要房子了(此时PC指针=0004H),由于GIE科长有无数事情要做,所以他每盖了一次戳之后(注重是一次不是一个,由于大概有多个中断同时发生,也就是说有其他地方的人来请GIE盖戳),就在办公室门外挂了个牌子:请勿打搅。
他自己则歇息去了,直到接到RETFIE的电话或者有人打他的手机。
房地产商预备给房子了,不过你最好得先把各项手续给填好,叫5w押第1页共4页。
中断是什么,PLC中断,单片机中断,那中断能干什么?
中断是什么,PLC中断,单片机中断,那中断能干什么?中断的概念:中断是计算机独有的一种工作方式;在主程序执行的过程中,中断主程序的执行;在执行子程序的过程中,中断子程序的执行。
中断程序主要是为某些特定控制功能而设定。
与子程序不同,中断是随机发生且必须立即响应的。
需要执行中断程序必须要有中断源(引发中断的信号)每个中断信号都有一个编号加以识别,也就是我们说的中断事件号在200SMART系列PLC中共有三大类中断事件,分别是:I/O中断:I/O 中断包括上升/下降沿中断、高速计数器中断和脉冲串输出中断。
CPU 可以为输入通道I0.0、I0.1、I0.2 和I0.3(以及带有可选数字量输入信号板的标准 CPU 的输入通道 I7.0 和 I7.1)生成输入上升和/或下降沿中断。
可对这些输入点中的每一个捕捉上升沿和下降沿事件。
这些上升沿/下降沿事件可用于指示在事件发生时必须立即处理的状况。
高速计数器中断可以对下列情况做出响应:当前值达到预设值,与轴旋转方向反向相对应的计数方向发生改变或计数器外部复位。
这些高速计数器事件均可触发实时执行的操作,以响应在可编程逻辑控制器扫描速度下无法控制的高速事件。
脉冲串输出中断在指定的脉冲数完成输出时立即进行响应。
脉冲串输出的典型应用为步进电机控制。
通信中断:CPU 的串行通信端口可通过程序进行控制。
通信端口的这种操作模式称为自由端口模式。
在自由端口模式下,程序定义波特率、每个字符的位数、奇偶校验和协议。
接收和发送中断可简化程序控制的通信时基中断:基于时间的中断包括定时中断和定时器 T32/T96 中断。
可使用定时中断指定循环执行的操作。
循环时间位于 1 ms 到 255 ms 之间,按增量为 1 ms 进行设置。
必须在定时中断 0 的 SMB34 和定时中断 1 的 SMB35 中写入循环时间。
每次定时器到时时,定时中断事件都会将控制权传递给相应的中断程序。
通常,可以使用定时中断来控制模拟量输入的采样或定期执行 PID 回路。
关于PIC单片机的中断现场保护问题
关于PIC单片机的中断现场保护问题在进入中断服务子程序期间,只有返回地址PC 的数值被自动压入堆栈,其他的一些寄存器的内容就得按照程序的需要由我们自己想办法了。
PIC 单片机汇编语言没有象51 系列单片机那样的PUSH POP 指令,所以我们要用一段程序来实现类似的功能。
因为是用一段程序来实现现场的保护,这样就可能影响到W 和STATUS 寄存器,所以我们要在保护现场的时候先把这两个寄存器给保护了。
这些现场保护不是将数据保存在芯片的堆栈中。
而是将其放到RAM 中进行保存。
个人认为将这些数据保存在与体选址无关的RAM 中,也就是说PIC 一般有四个体,无论目前在哪个体里改变其RAM 的数据,都可以映射到其他体中,本人认为这样在程序上比较方便,避免了一些弊端和麻烦。
我也是刚接触PIC,如果有说的不对的地方,还请大家提出,我们共同探讨。
先谢了:)下面引用一段厂家提供的中断现场保护的样例程序:将W,STATUS,和PCLATH 寄存器内的内容保存到临时备分寄存器中(1) MOVWF W_TEMP 复制W 到它的临时寄存器W_TEMP 中(2) SWAPF STATUS,W 将STATUS 中的高低四位交换后放入W(3) CLRF STATUS 不管目前在哪个体,都设置成体0 为当前体(4) MOVWF STATUS_TEMP 保存STATUS 到体0 上的临时寄存器(5) MOVF PCLATH,W 把寄存器PCLATH 中的内容复制到W 中(6) MOVWF PCLATH_TEMP 保存PCLATH 到临时寄存器里(7) CLRF PCLATH 不管当前处在哪页,都把PCLATH 设置成0 ............(中断服务子程序的核心部分)(8) MOVF PCLATH_TEMP,W 经过W 转移。
单片机中断实验总结
单片机中断实验总结单片机中断是单片机系统中一项重要的功能和特性。
通过中断,可以实现对外部事件的实时响应和处理,从而提高系统的实时性和可靠性。
在实验中,我对单片机中断进行了学习和实践,以下是我的实验总结。
在实验中,我首先了解了中断的基本概念和原理。
中断是指在程序执行过程中,由外部事件、硬件设备或软件请求而打断正常执行流程,转去执行与该事件或请求相关的子程序。
中断可以分为外部中断和内部中断。
外部中断是通过硬件引脚与外部设备进行连接并触发的,而内部中断则是由软件内部生成的。
中断的实现需要借助中断控制器,例如常用的单片机8051就内置了中断控制器。
实验中,我使用keil C编译器和STC89C52单片机开发板进行了中断的实现。
编写了一个简单的程序,当外部中断0引脚检测到高电平时,触发外部中断,执行相应的中断服务程序。
在编写程序时,首先定义了中断服务程序的函数原型,然后通过中断向量表将中断服务程序与相应的中断号关联起来。
在主程序中,使用IE寄存器和相应的位操作函数开启了外部中断。
在实验过程中,我遇到了一些问题,并进行了解决。
首先,我发现外部中断引脚的电平触发方式对中断的触发有影响。
通过查阅资料,我了解到外部中断引脚可以选择边沿触发还是电平触发,需要根据实际的需求进行设置。
其次,我发现在中断服务程序中,需要注意中断屏蔽和中断优先级的设置,以免出现中断互相屏蔽的情况。
最后,我发现中断服务程序中的代码需要尽量简洁和高效,以保证中断的响应时间和系统的实时性。
通过实验,我进一步理解了单片机中断的概念和原理,掌握了使用keil C编写中断程序的方法,提高了对单片机系统的认识和理解。
中断在单片机系统中具有重要的作用,可以实现对外部事件的实时响应和处理,从而提高系统的可靠性和实时性。
在今后的学习和实践中,我将进一步深化对中断的理解和应用,并将其应用到更为复杂的系统中。
参考内容:1. 《嵌入式系统原理与开发:使用51单片机和C语言》-程杰2. 《嵌入式系统与单片机原理实验教程》-王刚3. 《单片机原理与应用》-马利民4. STC89C52单片机数据手册5. Keil C51编译器使用手册。
pic单片机中断
PIC18系列的低优先级中断入口地址在0x0018地址,下面的代码是在入口地址处放置一个向量函数,这个向量函数里就是一个内嵌汇编的GOTO指令,GOTO到低优先级的中断服务函数InterruptHandlerLow。
//----------------------------低优先级中断入口-----------------------------------1#pragma code InterruptVectorLow = 0x18 //用#pragma伪指令定义一个名字叫InterruptVectorLow的段,并把这个段放到0x18地址起始的代码空间2void InterruptVectorLow (void) //低优先级中断向量函数3 {4_asm5goto InterruptHandlerLow //内嵌汇编指令6_endasm7 }8#pragma code //这里不是多余的,它是告诉连接器回到默认的代码段,如果不加的话,连接器就会傻傻地把后面的代码紧跟着上面的代码一直放下去。
而LKR文件里定义了向量区最多到0x29地址,所以如果没加此行通常会报错910#pragma interruptlow InterruptHandlerLow //这里使用interruptlow这个关键词来声明InterruptHandlerLow这个函数是低优先级中断服务函数,用了关键词后,这个函数将会由编译器自动产生基本的现场保护,并且这个函数的返回将是使用RETFIE 返回的。
111213void InterruptHandlerLow (void)14 {15/* 低优先级服务函数的代码写在这里*/16 }PIC18系列的高优先级中断入口地址在0x0008地址,下面的代码是在这个入口地址处放置一个向量函数,这个向量函数里就是一个内嵌汇编的GOTO指令,GOTO到高优先级的中断服务函数InterruptHandlerHigh 。
PIC单片机中断系统详细汇总
PIC单片机中断系统详细汇总在PIC单片机中,中断系统的实现主要包括以下几个方面的内容:1.中断向量表:PIC单片机中的中断系统采用了向量表的形式来管理不同类型的中断。
向量表是一个存放中断服务子程序入口地址的表格,当中断发生时,单片机根据中断号在向量表中查找相应的中断服务子程序入口地址,并跳转到该地址处执行相应的操作。
2.中断优先级:PIC单片机中的中断系统支持多级中断优先级。
不同的中断可以设置不同的优先级,当多个中断同时发生时,系统会根据优先级的设置,优先处理优先级较高的中断,从而保证重要的中断不会被忽略。
3.中断源:PIC单片机支持多个中断源,包括外部中断(外部引脚上的信号触发的中断)、定时器中断(由定时器溢出或比较事件触发的中断)和串口中断(由串口接收/发送数据触发的中断)等。
每个中断源都有对应的中断标志位,当中断发生时,对应的中断标志位会被设置,以便主程序判断中断类型并做出相应的处理。
4.中断使能和屏蔽:PIC单片机中的中断系统提供了中断使能和屏蔽的功能。
通过设置相应的中断使能和中断屏蔽寄存器的位,可以控制一些中断源的中断是否启用,以及在一些中断源触发中断后,是否允许继续触发该中断。
5.中断服务子程序:PIC单片机的中断系统需要用户自行编写中断服务子程序来处理中断事件。
中断服务子程序是一个与主程序独立的子程序,它会在中断发生时被自动调用,并执行特定的操作。
在编写中断服务子程序时,需要注意子程序的实时性和占用资源的情况,以确保中断的及时响应和系统的稳定性。
6.中断处理流程:PIC单片机中的中断处理流程可以简单描述为:当中断发生时,系统会根据中断号在中断向量表中查找相应的中断服务子程序入口地址,并跳转到该地址处执行中断服务子程序。
在中断服务子程序中,可以对中断事件进行处理,清除中断标志位,并在需要的情况下触发其他操作,比如发送数据、修改相关寄存器等。
当中断服务子程序执行完毕后,系统会自动返回到主程序的执行流程中,继续执行之前的任务。
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)清除,这样其他中断就暂时不能被响应(此时,如果别的中断发出的中断请求,标志位将一直保留着),直到这个中断程序退出后才会得到响应。
PIC小结
PIC工作小结Led点灯、uart收发摘要本文总结了针对pic学习过程中的遇到的问题以及解决的过程。
检查器件检查power supplypower supply 加电,调节直选用通道的5V处,此处选用slave(任选一个),用万用表检查引脚,看是否显示正确,(将万用表调至合适的档位,红+ 黑- 测量各个引脚,确认显示正确),关闭power supply为什么是5V?通过查看电路图VDD供电引脚,我们得知核心芯片需要3V电压。
再查看power原理图,得知需要用常用的5V电压经过转换得到3V电压。
找板子的5V引脚,注意连线顺序,对照板子上的正方形引脚。
检查PIC板1、查看电路图根据发光二极管的特性知,当引脚RD8、RD9、RD10、RD11处于低电平时,二极管发光,查看pic引脚图,找到RD8、RD9、RD10、RD11,找到为68、69、70、71脚,2、检查是否引脚是否有短路现象用万用表,一个脚接R3、R4、R5、R6(从板子上看到的),一个脚测pic的68、69、70、71脚,看是否导通。
2、准备连接线和power supply 连接,注意红+、黑-,注意连线的正确性,看pcb的j12.编写程序1、设置引脚方向寄存器(从电路图看到是RD8、RD9、RD10、RD11),查看数据手册,找到TRISD:决定端口的方向,0输出,1输入PORTD:当方向为输入时,存放端口的值LATD:数据锁存器ODCD:漏极开路控制寄存器2、设置锁存器#include <p24FJ128GA010.h>int main(void){_TRISD8 = 0; //设置引脚方向:0 输出;1 输入_TRISD9 = 0;_TRISD10 = 0;_TRISD11 = 0;_LATD8 = 0; //设置锁存器的值,低电平(由前面得知)_LATD9 = 0;_LATD10 = 0;_LATD11 = 0;while(1) {}return 0;}3、编译设置好项目的输出路径、当前路径、头文件路径、库文件路径。
PIC学习心得
PIC学习心得本次心得为PIC18F25K22上的代码零、配置CPU 的特殊功能,地址从300000开始,如以下,有晶振选择,复位功能,看门狗配置,调试口rb7-rb6的配置,因为RB6-RB7为串口2的端口,需要对应为位=1才能使得他们可以用于普通io,其实单片机默认也是1.对于已经用于特殊功能的引脚,比如已经配置了引脚为I2C功能,如果要配置为普通IO时,需要将I2C失能掉,SSPXCON1=0X00;这样才能正常使用这2个IO口了如果要使单片机使用内部晶振,就需要将对应的OSCCON位置1IRCF<2:0>:内部RC 振荡器频率选择位(2)IRCF<2:0>=111 = HFINTOSC – (16 MHz)OSTS=0 = 器件依靠内部振荡器(HFINTOSC、MFINTOSC 或LFINTOSC)运行OSCCON2默认使用内部晶振时,频率会随温度漂移,使用波特率的时候要注意了,最好使用外部晶振PWDX默认,使外围功能使能#pragma romdata CONFIG1H=0x300001 //晶振const rom unsigned char config1H = 0x0a; //setting for HS oscillator中档功耗#pragma romdata CONFIG2L=0x300002 //复位const rom unsigned char config2L = 0x00;#pragma romdata CONFIG2H=0x300003const rom unsigned char config2H = 0x1e; //WDT#pragma romdata CONFIG3H=0x300005//配置一些端口的映射const rom unsigned char config3H = 0x00; //禁用复位脚,开始为CPU提供时钟而无需等待#pragma romdata CONFIG4L=0x300006//最高位为1,RB6 和RB7用于普通IO 口const rom unsigned char config4L = 0x80; //RB6 和RB7专用于在线调试#pragma romdata一、中断配置,PIC只有高低2个优先级,对应的函数有2个,函数地址为0X08和0X18中断配置,一下为高低优先级配置RCONbits.IPEN=1;//使能中断优先级,如果IPEN配置为0,没有中断优先级,所有优先级都为高,调到0x08地址的中断INTCONbits.GIE=1;//=允许所有高优先级中断INTCONbits.PEIE=1;//=允许所有低优先级的中断2、中断函数写法高优先级地址为0X08#pragma code InterruptVectorHigh = 0x08void InterruptVectorHigh (void){_asmgoto InterruptHandlerHigh //jump to interrupt routine,goto之后的InterruptHandlerHigh函数名可以自己取名_endasm}// High priority interrupt routine#pragma code#pragma interrupt InterruptHandlerHigh //InterruptHandlerHigh函数名可以自己取名void InterruptHandlerHigh()//中断函数内容低优先级函数地址为0X18#pragma code InterruptVectorLow= 0x18void InterruptVectorLow (void){_asmgoto InterruptHandlerLow //jump to interrupt routine,goto之后的InterruptHandlerHigh函数名可以自己取名_endasm}// High priority interrupt routine#pragma code#pragma interruptlow InterruptHandlerLow //InterruptHandlerHigh函数名可以自己取名void InterruptHandlerLow(void) //中断函数内容3、例如串口中断配置:IPR1bits.RC1IP=0; //设为低优先级,让他跳入低优先级中断函数,为1将跳入高优先级函数PIR1bits.RC1IF=0; //清中断标志PIE1bits.RC1IE=1; //接收中断允许PIE1bits.TX1IE=0; //发送中断禁止4、这样配置完成后,如果串口其他寄存器配置无误,接收到数据后就会跳入低优先级函数InterruptHandlerLow中二、ADC1、ADC采集为了不浪费MCU资源,不用中断函数来采集配置如下,(1)先将要用于ADC采集的IO口配置为输入(2)将对应IO扣配置为ADC输入(3)配置ADCON0-3寄存器TRISA|=0x01;//引脚方向寄存器,1输入,0输出。
关于中断部分的小结1
关于中断部分的小结(1)中断是单片机和其他各种微处理器中必不可少的一部分之一,在此对51单片机中断有用的部分加以小结。
小结(1)主要是对中断部分,对中断编程常用的特殊功能寄存器加以罗列小结,这一部分是中断思想的核心,以后的编程全部围绕这些寄存器进行。
以后对于中断的编程及其寄存器设置可参考这一部分内容。
一、关于51中断:对于51单片机中断子程序的编写我们必须知道大多51单片机芯片有5个中断源,有2个中断优先级,每个中断源的优先级可以编程控制。
5个中断源分别是:外部中断0,由INT0/P3.2输入外部中断1,由INT1/P3.3输入定时器/计数器0,溢出中断请求;定时器/计数器1,溢出中断请求;串行口发送/接收,中断请求;这里给出一个非常经典的中断源图,根据这个图我们就能大概知道中断的具体过程,以及在中断编程中哪些地方需要设置。
很明显的,5个中断源可以分为三类,外部中断,定时器中断和串口中断;并且我们需要对TCON,IE,IP等进行设置。
二、几个重要的特殊功能寄存器:1.中断允许控制寄存器IECPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
EX0(IE.0),外部中断0允许位;ET0(IE.1),定时/计数器T0中断允许位;EX1(IE.2),外部中断1允许位;ET1(IE.3),定时/计数器T1中断允许位;ES(IE.4),串行口中断允许位;EA (IE.7), CPU中断允许(总允许)位。
2.控制寄存器TCONTCON的低4位用于控制外部中断, TCON的高4位用于控制定时/计数器的启动和中断申请。
其格式如下:TF1(TCON.7):T1溢出中断请求标志位。
T1计数溢出时由硬件自动置TF1为1。
CPU响应中断后TF1由硬件自动清0。
T1工作时,CPU可随时查询TF1的状态。
所以,TF1可用作查询测试的标志。
TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
单片机中断实验总结
单片机中断实验总结本次实验是关于单片机中断的,通过对中断的学习和实验,我了解了中断的基本原理和实现方式,进一步认识到中断在程序设计和实现中的重要性。
首先,通过实验我了解到中断是一种异步的事件,可以打断正在执行的程序,并在中断发生时响应处理。
单片机中断是指在硬件或软件条件满足时,单片机主动中断正在执行的程序,跳转到相应的中断服务程序中执行。
中断可以在不影响主程序的同时响应该事件,使程序更加高效、灵活。
其次,在实验过程中我学会了如何在单片机中实现外部中断,包括设置中断触发方式、对中断请求进行检测和响应等。
我了解到单片机中断可以分为外部中断和内部中断,其中外部中断是通过外部中断源(如按键、触摸开关等)触发的,而内部中断则是由单片机内部条件触发的。
外部中断常常用于接收外部设备输入(如计数器、编码器等),并在特定条件下进行中断处理。
最后,在实验中我还学习了如何编写中断服务程序,并利用中断服务程序响应中断并完成相应处理。
中断服务程序需要快速、准确地响应中断事件,才能实现高效的中断处理。
因此在编写中断服务程序时需要注意以下几点:1. 确定中断源:不同的中断源可能需要不同的中断触发方式和响应程序。
因此在编写中断服务程序前需要确定中断源,根据中断源的特点确定相应的中断触发方式、响应程序等。
2. 保存寄存器状态:中断服务程序执行过程中需要使用寄存器等CPU资源,因此在中断服务程序中需要先保存相关寄存器的状态,防止中断服务程序执行过程中出现寄存器误操作等问题。
3. 快速响应和处理:中断服务程序需要快速、准确地响应中断,因此需要使用最小可行代码,避免执行过多的指令或函数调用等操作。
PIC指令系统小结
PIC 单片机指令系统总结PIC 单片机是RISC 型单片机,指令系统比较简单,但是PIC 有一个致命的弱点对于PIC12系列,PIC16系列单片机来说它的程序储存器一般是512个字节一页(有的单片机是2K 一页)如果用汇编语言编程的话,特别要注意翻页的问题,十分麻烦。
用C 语言的话可以避免这个麻烦。
对于PIC18系列来说没有这个问题的。
但是我个人认为对于简单的程序用PIC 汇编语言编程还是比较容易的。
一.PIC 低档机系列指令系统(33条指令)1. 指令:ADDWF f, d操作数: 310≤≤f []1,0∈d操作: ()()→+F W 目标寄存器受影响的状态位: C 、DC 和Z说明: 将W 寄存器的内容与寄存器f 的内容相加。
如果d 为0,结果存入W 寄存器。
如果d 为1,结果存回f 寄存器2. 指令:ANDLW操作数 2550≤≤K操作:W K W →&受影响标志位:Z说明:将W 寄存器中的内容与8位立即数相与。
结果存入W 寄存器3. 指令: ANDWF f, d操作数:310≤≤f []1,0∈d操作: →F W &目标寄存器受影响标志位:Z说明:将W寄存器中的内容与F寄存器中的内容相与,如果d=0则结果存入W寄存器,如果d=1,则结果存入f寄存器.4. 指令: BCF f,b操作数: 310≤≤f 70≤≤b操作: ()b f →0受影响标志位: 无说明: 将f 寄存器中的第b 为清05. 指令: BSF f,b操作数: 310≤≤f 70≤≤b操作: ()b f →1受影响标志位: 无说明: 将f 寄存器中的第b 为置16. 指令: BTFSC f, d操作数: 310≤≤f 70≤≤b操作: 如果()b f =0,跳行受影响标志位: 无说明: 如果f 寄存器中的第b 位为0, 则跳一行执行指令,否则执行下一条指令7. 指令:BTFSS f, d操作数: 310≤≤f 70≤≤b操作: 如果()b f =1,跳行受影响标志位: 无说明: 如果f 寄存器中的第b 位为1, 则跳一行执行指令,否则执行下一条指令8. 指令: CALL K操作数: 20470≤≤K操作: →+1PC 压载 0:7PC K → ()9:105:6PC STATUS → 80PC → 受影响标志位: 无说明: 调用子程序.首先,将返回地址PC+1压载保护.8位直接地址被装入PC 的0:7.PC 的高位9:10,从STATUS 5:6装入,PC<8>被清0.CALL 是一条双周期指令9. 指令: CLRF f操作数: 310≤≤f操作: f h →00 Z →1受影响标志位: Z说明: 将寄存器f 中的内容清0,并且Z 标志位被置110 指令: CLRW操作数: 无操作: W h →00 Z →1受影响标志位: Z说明: 将寄存器W 中的内容清0,并且Z 标志位被置111. 指令: CLRWDT操作数: 无操作: WDT h →00说明: 清看门狗指令12. 指令: COMF f , d操作数: 310≤≤f []1,0∈d操作: →f 目标寄存器受影响标志位: Z说明: 将寄存器f 的内容取反.如果d 为0,结果存入W 寄存器.如果d 为1 结果存入f 寄存器.13. 指令: DECF f, d操作数: 310≤≤f []1,0∈d操作: →−1f 目标寄存器受影响标志位: Z说明: 将寄存器F 中的内容减1 .如果d 为0,结果存入W 寄存器,如果d 为1结果存入f 寄存器.14. 指令: DECFSZ f, d操作数: 310≤≤f []1,0∈d操作: →−1f 目标寄存器,结果为0,则跳行执行指令,结果不为0,则执行下一条指令 受影响标志位: 无说明: 将寄存器F 中的内容减1 .如果d 为0,结果存入W 寄存器,如果d 为1结果存入f 寄存器. 如果结果为0则跳行执行指令,结果不为0,则执行下一条指令15. GOTO K操作数: 20470≤≤K操作: 0:PC K → 9:105:PC STATUS →受影响标志位: 无说明: GOTO 是一条无条件转移指令,类似51的AJMP ;AVR 的RJMP 指令16. INCF f, d操作数: 310≤≤f []1,0∈d操作: →+1f 目标寄存器受影响标志位: Z说明: 将寄存器F 中的内容加1 .如果d 为0,结果存入W 寄存器,如果d 为1结果存入f 寄存器.17. INCFSZ f,d操作数: 310≤≤f []1,0∈d操作: →+1f 目标寄存器,如果结果为0,则跳行受影响标志位: Z说明: 将寄存器F 中的内容加1 .如果d 为0,结果存入W 寄存器,如果d 为1结果存入f 寄存器. 如果结果为0则跳行执行指令,结果不为0,则执行下一条指令18. IOLW K操作数: 2550≤≤K操作: W K W →|受影响标志位: Z说明: 将W 寄存器中的内容与8位立即数相或,结果存入W 寄存器.19. IORWF f, d操作数: 310≤≤f []1,0∈d操作: →F W |目标寄存器受影响标志位: Z说明: 将W 中的内容和F 做或运算,d=0时结果存入W 寄存器,d=1时结果存入F 寄存器20.MOVF f , d操作数: 310≤≤f []1,0∈d操作: →F 目标寄存器受影响标志位: Z说明: 如果d=0,F 中的内容送W 寄存器,d=1,F 中的内容送F 寄存器,但是影响Z 标志位21. MOVLW K操作数: 2550≤≤K操作: W K →受影响标志位: 无说明: 将8位立即数装入W 寄存器22. MOVWF F操作数: 310≤≤f操作: F W →受影响标志位: 无说明: 将W 寄存器中的数据传送到F 寄存器23 NOP说明: 空指令,仅仅消耗一个指令周期24 OPTION操作数: 无操作: →W 选项寄存器受影响标志位: 无说明:将W 中的内容送到选项寄存器OPTION 中.25. RETLW K操作数: 2550≤≤K操作: W K → (POP) PC受影响标志位: 无说明: 将8位立即数从K 中装入W 寄存器.将栈顶地址装入程序计数器.26 .RLF f, d操作数: 310≤≤f []1,0∈d操作: 见下受影响标志位: C说明: 将寄存器f 的内容连同进位一起循环左移一位。
PIC单片机中断程序的设计技巧
PIC单片机中断程序的设计技巧设计PIC单片机中断程序时,需要根据具体的需求和硬件环境进行合理的设计。
下面是一些设计中断程序的技巧:1.确定中断触发源:首先需要确定中断是由什么触发的,例如定时器溢出、外部中断引脚等。
根据不同的触发源,可以选择不同的中断方式,如正边沿触发、负边沿触发等。
2.中断优先级设置:如果系统中存在多个中断源,需要明确中断的优先级。
可以通过优先级控制寄存器来设置不同中断的优先级,确保在同时触发多个中断的情况下,能够正确处理高优先级的中断。
3.中断服务程序的编写:中断服务程序是在中断发生时自动执行的程序,因此需要编写相应的中断服务程序。
中断服务程序的编写需要注意以下几点:-保持中断向量表的正确性:中断向量表保存了中断向量地址,确保中断服务程序被正确调用。
需要在程序中配置中断向量表的地址,并确保中断向量表的内容正确无误。
-快速响应中断并尽快执行中断服务程序:由于中断发生时需要尽快进行响应,所以中断服务程序需要尽可能地简短和高效。
可以通过减少循环次数、使用高效的算法等方式来提高中断服务程序的执行效率。
-使用全局变量:中断服务程序通常会修改全局变量的值,所以需要在设计中考虑全局变量的使用规则,防止数据冲突问题的发生。
可以通过使用互斥机制或者禁止一些中断来解决这个问题。
4.确定中断处理的顺序和时间:如果系统中存在多个中断源,需要明确中断处理的顺序和时间。
不同的中断源可能具有不同的优先级,所以需要在设计中明确不同中断的处理顺序,确保每个中断按照优先级进行处理。
5.合理的中断延迟时间:中断处理需要一定的时间,因此需要根据具体需求和硬件环境来确定合理的中断延迟时间。
如果中断处理时间过长,可能会导致系统响应速度变慢,影响整体性能。
因此需要合理地设置中断延迟时间,确保系统能够及时地响应中断。
6.中断嵌套的处理:在一些情况下,可能会存在中断嵌套的情况,即一些中断服务程序中又发生了另一个中断。
在设计中断程序时,需要考虑到中断嵌套的处理方式,例如设置屏蔽中断或者暂时禁止其他中断的发生,确保中断的处理顺序正确无误。
PIC中档单片机的中断总结
PIC中档单片机的中断总结
PIC中档单片机的中断总结
与51或者其他系列的单片机相比,PIC 单片机的中断机制有其特殊之处,针对我们一些初学者存在的一些问题和疑惑,我在此做一个个人总结,不当的地方,请站友们指正。
先摘引三个对PIC中断理解的回帖,然后我再对中断活动的过程、应该注意的事项、及一个疑惑进行较详细的总结和解释。
---------------
john frank :关于pic中断有些不明白的地方
借用大虾的程序;
;******************** 中断服务代码
btfss INTCON,T0IE ; 判断是否为T0中断
goto other_int
btfss INTCON,T0IF ; it ’s the time of T0 int
goto other_int
bcf INTCON,T0IF ; 是T0中断,清除中断标志
movlw 0x10 ; 微秒的高位字节加上定时时间 256x16分频=4096=0x1000的高位(0x10)
addwf us+1
goto end_int
other_int ; 可添加其他中断服务代码
nop ; other isr code can be added
;**********************************
end_int ; 恢复现场
=================
假如又有新的中断正好在这段程序中间产生
btfss INTCON,T0IF
goto other_int
bcf INTCON,T0IF
程序岂不是要出错跑飞[1] [2] [3] [4] [5]。
关于PIC单片机的中断现场保护问题
关于PIC单片机的中断现场保护问题
在进入中断服务子程序期间,只有返回地址PC的数值被自动压入堆栈,其他的一些寄存器的内容就得按照程序的需要由我们自己想办法了。
PIC 单片机汇编语言没有象51系列单片机那样的PUSH POP指令,所以我们要用一段程序来实现类似的功能。
因为是用一段程序来实现现场的保护,这样就可能影响到W和STATUS 寄存器,所以我们要在保护现场的时候先把这两个寄存器给保护了。
这些现场保护不是将数据保存在芯片的堆栈中。
而是将其放到RAM中进行保存。
个人认为将这些数据保存在与体选址无关的RAM中,也就是说PIC一般有四个体,无论目前在哪个体里改变其RAM的数据,都可以映射到其他体中,本人认为这样在程序上比较方便,避免了一些弊端和麻烦。
我也是刚接触PIC,如果有说的不对的地方,还请大家提出,我们共同探讨。
先谢了:)
下面引用一段厂家提供的中断现场保护的样例程序:将W,STATUS,和PCLATH寄存器内的内容保存到临时备分寄存器中
(1) MOVWF W_TEMP 复制W到它的临时寄存器W_TEMP中
(2) SWAPF STATUS,W 将STATUS中的高低四位交换后放入W
(3) CLRF STATUS 不管目前在哪个体,都设置成体0为当前体。
PIC学习几个小知识点
1、芯片PIC16F877A:今天遇到了一个问题,不知道C语言不支持还是编译器不支持,具体是这样的,我在主函数中申明了一个数组,然后调用一个函数,将这个数组以形参的方式传入那个函数,传的是这个数组的地址,也就是形参是指针,在被调用的函数中,我这样处理这个指针行不行?
void main()
{
unsigned int Year,month_day,Week_Hour,Min_Sec;
RCFGCALbits.RTCPTR = 3;//指针指到年
Year = RTCVAL;//年
month_day = RTCVAL;//月日
Week_Hour = RTCVAL;//周时
*RAM_Addr++ = month_day & 0x00FF;
*RAM_Addr++ = (month_day & 0xFF00) >> 8;
*RAM_Addr++ = Year & 0x00FF;
}
不能省略Year,因为它每次都是自减的!
PIC学习小知识点
1、今天晚上搞了一个晚上,就PIC单片机,按键不知道为什么总是进S3,说明S3一直被按下,查了好半天才发现,S3接在了RB3上,RB3在用来仿真的时候是不能用的,它是一直被拉低的,所以一直S3是按下的!
2011.10.17学习:
在PIC的一些中、低端型号中,往往只有一个中断函数入口,而且没有中断优先级,这对于很多在学校学习89C51核出来的学生,往往给他们带来一定的学习障碍。
SinusoidalBLDC.c: In function '_T1Interrupt':
单片机中断原理
单片机中断原理在单片机系统中,中断是一种重要的处理方式,它可以在CPU执行程序的过程中,暂停当前的程序,转而执行其他的程序或者服务子程序,然后再返回到原来的程序中继续执行。
中断可以分为外部中断和内部中断两种,它们在单片机系统中起着非常重要的作用。
首先,我们来看一下外部中断。
外部中断是由外部设备或者外部信号引起的,比如按键的按下、定时器的溢出等。
当外部中断发生时,CPU会立即停止当前的工作,转而去执行中断服务程序。
中断服务程序的执行完毕后,CPU会回到原来的程序中继续执行。
外部中断的优先级一般是比较高的,因为它们通常代表着一些紧急的事件或者需要立即处理的任务。
其次,我们再来看看内部中断。
内部中断是由CPU内部的一些特定事件引起的,比如指令的执行完毕、定时器的溢出等。
内部中断和外部中断一样,都会暂停当前的程序,转而去执行中断服务程序,然后再返回到原来的程序中继续执行。
内部中断的优先级一般是比较低的,因为它们通常代表着一些常规的事件或者任务。
单片机中断的原理是通过中断向量表来实现的。
中断向量表是一个存储中断服务程序入口地址的表格,当中断发生时,CPU会根据中断号在中断向量表中查找对应的中断服务程序的入口地址,然后跳转到该地址开始执行中断服务程序。
中断向量表的大小和位置是固定的,不同的单片机可能会有不同的中断向量表的大小和位置。
在单片机系统中,中断的使用可以大大提高系统的实时性和响应能力。
比如在一些需要及时处理外部事件的应用中,比如控制系统、通信系统等,中断可以及时响应外部事件,提高系统的实时性。
另外,在一些需要多任务处理的应用中,中断也可以用来实现多任务处理,提高系统的响应能力。
总的来说,单片机中断原理是一种非常重要的处理方式,它可以在CPU执行程序的过程中,及时响应外部事件或者内部事件,提高系统的实时性和响应能力。
通过合理的使用中断,可以使单片机系统更加稳定和高效地运行。
希望本文对大家对单片机中断原理有所了解和帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void interrupt isr (void) { //中断服务函数写在这里 } void init_interrupt() { GIE=0; PEIE=1; IPEN=1; //TMR1IE=1; //TMR1IF=0; //TMR1IP=0;
少走弯路,PIC 单片机中断总结
PIC 单片机有多个中断源,16 系列只有一个中断入口,18 系列有两个中 断入口,不同编译器下书写格式又不大一样。网上资源千篇一律,也不够系 统,只是简单的罗列程序,代码生存的环境不一样也少有说明。在此做个简 单的总结,因为又走了弯路... 1.先说 18 系列(MCC18 编译器下): MPLAB C18 不自动把中断服务程序放在中端向量处。通常将 GOTO 指令 放在中断向量处,从而把控制权转交给相应中断服务程序。 void low_isr(void); void high_isr(void); *****************************低级中断入口及服务子程序 ********************ห้องสมุดไป่ตู้***************/ #pragma code low_vector=0x18//低优先级中断入口,转自 21ic 基础知识 void interrupt_at_low_vector(void) {
_asm GOTO high_isr _endasm } #pragma code #pragma interrupt high_isr void high_isr(void) { //高优先级中断服务函数写在这里 } 2.再说 18 系列(PICC18 编译器下): //void PIC18F_High_isr(void); //void PIC18F_Low_isr(void); *****************************低级中断服务子程序 ************************************/
#pragma interrupt lowlow_priority PIC18F_Low_isr void PIC18F_Low_isr (void) { //低优先级中断服务函数写在这里 } *****************************高级中断服务子程序 ************************************/ #pragma interrupt PIC18F_High_isr void PIC18F_High_isr (void) { //高优先级中断服务函数写在这里 } 3.三说 16 系列(PICC 编译器下)(只有一个中断入口,无所谓高了就):
//TMR1L=61; //T1CON=0xC7;//set up timer0 - 8bit -prescaler //TMR0IE=1; //TMR0IF=0; //TMR0IP=0; //TMR0L=61; //T0CON=0xC7;//set up timer0 - 8bit -prescaler 1:256 GIE=1; }
_asm GOTO low_isr _endasm } #pragma interrupt low_isr #pragma code void low_isr(void) { //低优先级中断服务函数写在这里 } *****************************高级中断入口及服务子程序 ************************************/ #pragma code high_vecotr=0x08//高优先级中断入口 void interrupt_at_high_vector(void) {