在单片机中断程序,怎么用外部中断INTO和INT1给单片机定…

51单片机笔记(2)
51单片机共有两个外部中断,单片机的中段系统如下
其中外部中断分别是INT0与INT1,关联IO口为P3.2
使用这两个中断的步骤如下
1.&&&&&&&配置中断类型 IT-X
为1代表对应IO口下降沿中断为0代表对应IO口低电平中断
注意低电平中断进入之后如果IO口不取消低电平,单片机会不停地进中断
2.打开对应的中断开关 EX-X,为1打开中断为0关闭中断
3.打开总中断开关EA,为1打开
4.设定中断优先级(也可以不设定,按照系统默认优先级处理)
5.软件中编写中断处理函数
&#include &exti.h&
static void Exti0Init(u8 mode)//P3.2Ò
if(mode)mode = 1;
EA = 1; //
EX0 = 1;//
IT0 = //1:
static void Exti1Init(u8 mode)//P3.3Ò
if(mode)mode = 1;
EA = 1; //
EX1 = 1;//
void ExtiInit(u8 ch,u8 mode)
switch(ch)
Exti0Init(mode);
Exti1Init(mode);
void Exti0Handle(void) interrupt 0
//doso&span style=&color:&&mething here&/span&
void Exti1Handle(void) interrupt 2
{&pre name=&code& class=&cpp&&
//doso&span style=&color:&&mething here&/span&
示例代码如下
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:43542次
积分:1015
积分:1015
排名:千里之外
原创:60篇
评论:16条单片机外部中断详解及程序
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
单片机外部中断详解及程序
单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。
实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。电路结构和接线不变,仅把程序改为下面的形式。
#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 @
单片机教程网
, All Rights Reserved热门关键词:
热门关键词:
热门关键词:
热门关键词:
热门关键词:
热门关键词:
热门关键词:
热门关键词:
单片机外部中断使用
12:04:52 点击: 次&
全新升级 火热来袭,欢迎各同学咨询????????
-------------------------#include //---------------------------------------------------//重定义I/0引脚名称sbit LED0=P1^0;sbit LED1=P1^1;//---------------------------------------------------//固定函数声明void int_0(); //外部中断0void int_1(); //外部中断1//---------------------------------------------------void main(){EA=1; // CPU所有中断开(IE最高位MSB)EX0=1; // INT0中断开IT0=0; // INT0低电平触发(为1则为下降沿触发)EX1=1; // INT1中断开IT1=0; // INT1低电平触发(为1则为下降沿触发)while(1){{;}}//-------------------------------------------------------------------void initial(){EA=1; // CPU所有中断开(IE最高位MSB)EX0=1; // INT0中断开IT0=0; // INT0低电平触发(为1则为下降沿触发)EX1=1; // INT1中断开IT1=0; // INT1低电平触发(为1则为下降沿触发)}//-------------------------------------------------------------------//INT0中断 由P3.2引脚产生void int_0() interrupt 0 using 0{Led1=1; //关闭D1LED0=0; //点亮D0}//-------------------------------------------------------------------//INT1中断 由P3.3引脚产生void int_1() interrupt 2 using 1{LED0=1; //关闭D0LED1=0; //点亮D1}  这样,通过程序和实践,我们就可以很轻易学会了外部中断的使用方法。&&&&
找课114全国免费课程咨询热线,为您推荐口碑最好的中小学课外辅导、少儿英语、成人英语、出国留学机构(其他课程咨询恕不接待)
北京 400-001-&上海 400-001-&广州 400-001- 深圳 400-001-&天津 400-001-&杭州 400-001- 南京 400-001-&苏州 400-001-&济南 400-001- 青岛 400-001-&武汉 400-001-&重庆 400-001-
成都 400-001-&西安 400-001-&宁波 400-001-大连 400-001-
温馨提示:拨打招生免费咨询电话方法,先拨通400-001-9911,再根据语音提示按分机号,等待接通,欢迎您的来电。(电话接听时间段:周一至周日上午9:00―晚上20:00)
??????????
????????????????????
??????????
??????????
音频公开课
8748
3312
4167
3013
3504
3526
5124
3375
13937
3914
6024
5593
5376
11128
9619
9472
8588
15701
13533
13471
三百六十行,欢迎各培训机构加盟君,已阅读到文档的结尾了呢~~
51单片机每个外部中断和定时器中断 应用模版中断,模板,使用,应用模版,中断使用,51单片机,单片机,外部中断,定时器中断,定时器
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
51单片机每个外部中断和定时器中断 应用模版
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
MCS-51单片机中断系统及外部中断/INT0实验
下载积分:30
内容提示:MCS-51单片机中断系统及外部中断/INT0实验
文档格式:DOCX|
浏览次数:83|
上传日期: 22:39:55|
文档星级:
该用户还上传了这些文档
MCS-51单片机中断系统及外部中断/INT0实验
官方公共微信

我要回帖

更多关于 单片机中断程序 的文章

 

随机推荐