有的单片机中断优先级有外部中断,为什么还要专门弄什么键中断,专门的键中断有什么好处?

& & & &外部中断在单片机中占有很重要的作用。而且外部中断的优先级默认是最高的。平台单片机一般有两个外部中断---INT0、INT1。中断的使用方法和前面讨论的定时器的方法相似,不一样的是触发的条件不同,定时器中断是计数器从0XFFFF增加0x0000时 TF置1,外部中断触发条件是INT管脚电平变化。有电平下跳沿和低电平触发两种配置方式。
& & & & 当中断时间发生时, MCU便会转向定时器的中断向量地址,再由中断向量地址再转向相应的中断处理函数,中断处理函数是程序是程序员编写的。
& & &如果您要做一个外部中断试验,需要的电路非常简单。因为今天我的计算机上没有安装protel。所以我没随手画一个简单的示意图。
& & & & 当按键弹起时INT0管脚是高电压,按下时INT0管脚是低电压。当键盘按下的瞬间INT0就会出现一个下跳沿。我们以这个为前提设计一个试验电路。
& & & 根据这个试验我们编写一个试验代码,就是当键盘按下的瞬间,LED 闪烁一次。
sibt LED = P1^1;
void &exint0_init( &)
& & & IT0 =1; & //下降沿产生中断
EX0 =1; & //使能外部中断
EA &=1; & //使能全局中断
&void &exint0( & ) interrupt 0
& & LED =~LED;&
&void &main( )
& & &exint0_init( &);
& & &以上代码只是演示一下中断的使用方法,但是在实际应用中可能会有问题,因为键盘电路需要去抖。所不要这样使用。
& & & 外部中断另外有一个主要的作用是,可以将MCU从&STOP&状态唤醒。这个功能非常重要。假如您给冰箱的控制系统做一个前面板。当冰箱的工作状态设置完成后。可以让面板的MCU进入stop模式。这样可以降低冰箱功耗,另外可以延长电路寿命。当有键盘按下时,通过外部中断唤醒这个电路系统。
& & &下一节我们看看怎样通过外部中断测量一个方波的频率。
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号单片机外部中断详解及程序
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
单片机外部中断详解及程序
单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。
实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。电路结构和接线不变,仅把程序改为下面的形式。
#include &iom16.h&
unsigned int t=500; //定义一个全局变量t,并设定初始值为500次
//===========延时子函数,在8MHz晶振时约1ms=============
void delay_ms(unsigned int k)
unsigned int i,j;
for(i=0;i&k;i++)
for(j=0;j&1140;j++)
//============主函数==================================
void main( void )
DDRB = 0xFF; //设置端口B为输出方向
PORTB = 0xFF; //设置端口B的输出为全高电平
DDRD = 0x00; //设置端口D为输入方向
PORTD = 0xFF; //设定端口D为内部上拉方式,无信号输入时处于高电平状态
MCUCR = 0x0A; //设定INT0、INT1为下降沿触发
GICR = 0xC0; //使能INT0、INT1中断
SREG = 0x80; //使能总中断
PORTB = 0x55; //让接在端口B上的LED显示
delay_ms(t); //延时t个ms
PORTB = 0xAA; //让接在端口B上的LED显示
delay_ms(t); //延时t个ms
//============中断函数(外部0)==========================
#pragma vector = INT0_vect
__interrupt void INT0_Server(void)
t = 100; //设定t的值为100次
//============中断函数(外部1)==========================
#pragma vector = INT1_vect
__interrupt void INT1_Server(void)
t = 500; //设定t的值为500次
把上述程序进行编译并下载到单片机中,可以看到结果与第二个示例中的完全一致。下面就来分析一下键盘中断的程序原理。
在分析程序之前,先来了解一下什么叫&外部中断&。前面已讲述过,在没有打扰的情况下,单片机的程序在封闭状态下自主运行,但如果在某一时刻需要响应一个外部事件(比如有按键被按下),这时就需要用外部中断。具体来讲,外部中断就是在单片机的一个引脚上,由于外部因素导致了一个电平的变化(比如由高变低),而通过捕获到这个变化,单片机内部自主执行的程序就被暂时打断,转而去执行相应的中断处理程序,执行完后又回到原来中断的地方继续执行原程序。这个引脚上的电平变化,就申请了一个外部中断事件,而这个能申请外部中断的引脚就是外部中断的触发引脚。在上面的例子中,可以看到两个按键S1、S2被接到了ATMega16的PD3和PD2引脚,而这两个引脚正是该单片机的两个外部中断(INT1和INT0)的触发引脚(第二功能)。当按键没有按下时,这两个引脚都为高电平(执行过PORTD=0xFF),当按键被按下时,引脚电平跳变为低电平,这时若单片机设置成允许中断申请,就会触发外部中断事件,从而转去执行中断服务程序。明白了这个过程之后,接下来就可以分析程序了。
程序执行后,主程序就一直在不停的运行while(1)内的这个死循环,让LED以t=500ms的初始值来交替闪烁,直到有外部中断来打断它。假设某一时刻按键S2被按下,这时由于引脚PD2上的电平突然被拉低,申请了一个外部中断0(INT0),这时的程序就转去执行外部中断0的中断服务程序(即__interrupt void INT0_Server(void)函数)。这时全局变量t的值被该函数重新赋值为100(即延时为100ms),完成后又回到主函数中的while(1)内去继续执行,因此LED闪烁的速度就变快了。
观察程序可看出,如果没有中断去调用中断服务子程序,在主程序中是没有语句去调动它的。也就是说如果没有外部中断,中断服务子程序(即__interrupt void INT0_Server(void)函数)是永远不会被执行的。这也说明,中断服务子程序是一类特殊的子程序,它不能被主程序调用,只能被中断申请调用。因此,中断服务子程序有它固定的格式和写法。在不同的编译系统中的写法不完全一样,下面给出IAR下的中断服务子程序的格式。
#pragma vector = INT0_vect
__interrupt void INT0_Server(void)
中断服务程序代码
以上是固定格式,除斜体部分外,其余部分不可更改。斜体部分中的INT0_vect表示中断的向量号,不同的中断名称不一样(原型在头文件iom16.h中)。斜体部分中的INT0_Server是中断函数的名称,是由开发者自己定义的。虽然可以自定义,但名称还是要取得&见名知义&,这样一看就知道是什么中断服务了。
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reserved单片机外中断消抖的问题 我的方法为什么不行?-土地公问答
单片机外中断消抖的问题 我的方法为什么不行?
单片机外中断消抖的问题 我的方法为什么不行?
程序如下:
我的想法是在进入外中断的时候把这个中断关了, 然后返回主程序的时候再开开 ,但是这样不行啊?为什么啊 ?如果用
if(KEY==0)
{delay_ms(10);if(KYE==0)
}的方法 那不就和扫描按键的方式差不多了吗?如果中断也需要在主程序中不...程序:我想进入外断候断关 返主程序候再 行啊啊 用if(KEY==0){delay_ms(10);if(KYE==0)} 扫描按键式差断需要主程序断检测 麻烦啊软件消抖难道种#include &reg52.h&#include &absacc.h&#include &k_dis.h&unsigned char i=0;void int_0(void) interrupt 2{EX1=0;if(i&100){i++;}else{i=0;}}void main(void){
i=0;EX1=1; IT1=1; EA=1; while(1) {EX1=1;dis_num(i);}}展开
建议用外部断检测按键外部断用检测要求响应速度高(微秒级)外设按键作间都于40毫秒测试虽做发板按键做断验证否用产品尽量要做按键消抖要用延10ms再检测办延10ms实浪费控制器资源要知道间微控制器说非宝贵做按键检测建议设置10ms定器断作钟节拍并断设置标志程序主循环检测钟节拍标志检测标志清除标志并扫描按键记录前按键状态并检测结做比较并记录相同数连续三检测同按键按则确认按键按既消抖保证按键准确较少占用微控制器间资源稍微增加点程序空间单片机做机界面系统应该合算面两问题参考http://zhidao.baidu.com/question/?&oldq=1http://zhidao.baidu.com/question/?&oldq=1追问您好你说得在中断中设置标志的方法,我稍稍有点思路!但是我也不理解我设想的那种方法啊 我不用延时 但是在刚进入外部中断的时候 外部中断就已经被关了啊为什么还会有按键抖动计数增加呢既然关了外部中断 ,那么抖动的时候外部中断没有被触发啊 为什么还会有这样的是发生呢追答你可以测试一下按键动作的情况,抖动主要发生在按键按下的瞬间和抬起的瞬间,时间一般都小于1ms,你的中断服务程序时间很短,只有几个微秒,退出中断前还要再使能中断,消除不了1ms左右的抖动,更消除不了按键抬起时的抖动。单片机系统一定要对每个外设都有时间的概念,外设时间跨度从微秒级到秒级,哪种时间跨度的外设处理的频率是什么样的要先算好,才能使程序稳定可靠。追问谢谢您的回答使我明白了很多还有一件事想问问前辈,就是我做了个简单的万年历秒的增加我是用定时器做的延时,都说定时器做延时准确啊虽然我是在定时器里面设置了标志然后在主函数中判断是否到1秒到了定义秒的变量就加1,但是实际的程序出来之后比正常的秒要慢很多呢,我把标志的判断 减少之后也不能和正常的秒数相吻合,时间长了 就能看出来和正常时间的差别了!还有星期在单片机做的万年历中是怎么计算的啊追答单片机做万年历要扩展万年历芯片,用定时器的累计误差太大。我上面给你的链接的第一个就是做万年历的。常用的万年历芯片有TI的DS1302、NXP的PCF8563等,你可以找找看看。这些万年历芯片设置好当前值以后,星期、闰年都能自己算出来,只要按照芯片的要求从芯片内部的存储器中读取数据就可以了,如果显示到秒,最好100ms更新一次显示,一面感觉出秒与秒之间的时间差。更多追问追问:您好你说得在中断中设置标志的方法,我稍稍有点思路!但是我也不理解我设想的那种方法啊 我不用延时 但是在刚进入外部中断的时候 外部中断就已经被关了啊为什么还会有按键抖动计数增加呢既然关了外部中断 ,那么抖动的时候外部中断没有被触发啊 为什么还会有这样的是发生呢追答:你可以测试一下按键动作的情况,抖动主要发生在按键按下的瞬间和抬起的瞬间,时间一般都小于1ms,你的中断服务程序时间很短,只有几个微秒,退出中断前还要再使能中断,消除不了1ms左右的抖动,更消除不了按键抬起时的抖动。单片机系统一定要对每个外设都有时间的概念,外设时间跨度从微秒级到秒级,哪种时间跨度的外设处理的频率是什么样的要先算好,才能使程序稳定可靠。追问:谢谢您的回答使我明白了很多还有一件事想问问前辈,就是我做了个简单的万年历秒的增加我是用定时器做的延时,都说定时器做延时准确啊虽然我是在定时器里面设置了标志然后在主函数中判断是否到1秒到了定义秒的变量就加1,但是实际的程序出来之后比正常的秒要慢很多呢,我把标志的判断 减少之后也不能和正常的秒数相吻合,时间长了 就能看出来和正常时间的差别了!还有星期在单片机做的万年历中是怎么计算的啊追答:单片机做万年历要扩展万年历芯片,用定时器的累计误差太大。我上面给你的链接的第一个就是做万年历的。常用的万年历芯片有TI的DS1302、NXP的PCF8563等,你可以找找看看。这些万年历芯片设置好当前值以后,星期、闰年都能自己算出来,只要按照芯片的要求从芯片内部的存储器中读取数据就可以了,如果显示到秒,最好100ms更新一次显示,一面感觉出秒与秒之间的时间差。
其它类似问题
其它人正在问的问题单片机中,比如51单片机有五个中断源,两个外部中断源,两个定时器中断源,一个串口中断。它们都在什么情_百度知道
单片机中,比如51单片机有五个中断源,两个外部中断源,两个定时器中断源,一个串口中断。它们都在什么情
片机中。它们都在什么情况下使用,两个定时器中断源,一个串口中断,两个外部中断源,比如51单片机有五个中断源
我有更好的答案
25S进中断判断一下按键是不是被按下了,就永远不会漏掉,一旦满足条件,进入中断程序,就是每隔一段时间进一次中断。也可用来检测按键。一个人按键假如最快的速度是0,会造成单片机资源的浪费。一般用来检测按键或者一些外部的电平信号定时器中断是计时进入中断。如果你一直放在主循环里执行按键检测程序.5秒一次,你每隔0外部中断可以设置为低电平触发和下降沿触发,也就是阻塞程序
采纳率:30%
使用中断方式只要设置完成以后,只要有按键按下就会自动跳转到中断函数。循环扫描的方式是一直扫描一个或多个引脚,一种是循环扫描的方法一种就是中断的方法,相对来说定时比较精确),比如做时钟系统计秒的时候使用。两个定时器的中断优先级不一样、定时器中断用于单片机定时进入中断函数处理函数内部代码(用定时器定时。所以一般都使用中断方式,定时器0中断可以在定时器1执行中断函数的时候进入定时器0中断,而反之则不行3、外部中断最简单的用法就是用来判断按键,看是否有按键按下,这种方法比较浪费单片机的资源,我们做按键实验的时候可以用两种方式(这里只只举例一个按键的情况下),是最常用的功能之一1、串口中断用于串口通信的时候,比如多级通信或转成485信号与电脑通信2
为您推荐:
其他类似问题
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
C51单片机实例教程-第13课,用外中断方式读按键,控制灯的亮灭
下载积分:30
内容提示:C51单片机实例教程-第13课,用外中断方式读按键,控制灯的亮灭
文档格式:PDF|
浏览次数:543|
上传日期: 18:33:27|
文档星级:
全文阅读已结束,如果下载本文需要使用
 30 积分
下载此文档
该用户还上传了这些文档
C51单片机实例教程-第13课,用外中断方式读按键,控制灯
关注微信公众号}

我要回帖

更多关于 单片机串口中断 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信