精华内容
下载资源
问答
  • 51单片机——外部中断

    千次阅读 2021-04-16 12:35:06
    一、外部中断 1.1 中断 关于中断的概念在上一篇博客中已经提到了。(传送门:51单片机入门教程(5)——定时器中断) 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并...

    一、外部中断

    1.1 中断

    关于中断的概念在上一篇博客中已经提到了。(传送门:51单片机入门教程(5)——定时器中断)

    中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

    51单片机的中断源优先级与向量号如下表:

    中断源                   优先级    中断向量号
    INT0 – 外部中断0          最高      0
    T0 – 定时器/计数器0中断    第2       1
    INT1 – 外部中断1          第3       2
    T1 – 定时器/计数器1中断    第4       3
    串口中断                  第5       4
    T2 – 定时器/计数器2中断    最低      5

    1.2 外部中断

    除了定时器中断外,51单片机还有两个外部中断源——外部中断0、外部中断1。分别由单片机的12号引脚(INT0/P3.2)、13号(INT1/P3.3)引脚的低电平/负跳变触发。

    和定时器中断一样,要使用这两个外部中断,首先要进行初始化操作,即写入相关的寄存器。初始化外部中断需要写入下面两个寄存器。

    1、IE – 中断允许控制寄存器
    2、TCON – 控制寄存器

    以初始化0号外部中断为例,说明寄存器的设置方法。

    IE 中断允许控制寄存器
    序号    D7    D6    D5    D4    D3     D2       D1       D0
    符号    EA    –    ET2    ES    ET1    EX1    ET0    EX0
    说明:
    EA    全局中断允许位,当此位是1时中断可用。(重要)
    ET2  定时器/计数器2中断允许位
    ES   串口中断允许位
    ET1 定时器/计数器1中断允许位
    EX1 外部中断1允许位
    ET0 定时器/计数器0中断允许位
    EX0 外部中断0允许位 (重要)
    和定时器中断类似,使用外部中断需要开启全局中断允许位EA,以及开启外部中断0允许位EX0

    EA = 1;       //开启总中断
    EX0 = 1;     //开启外部中断0

    TCON 控制寄存器
    序号    D7      D6      D5      D4      D3     D2     D1    D0
    符号    TF1    TR1    TF0    TR0    IE1    IT1    IE0    IT0
    说明:
    TF1 定时器1溢出标志位
    TR1 定时器1运行控制位
    TF0 定时器0溢出标志位
    TR0 定时器0运行控制位
    IE1 外部中断1请求标志   IE1=1则外部中断1在向CPU请求中断,当CPU响应中断时硬件清0。一般不用手动设置。
    IT1 外部中断1触发方式选择位 该位为0时INT1引脚上的低电平信号可触发外部中断1。该位为1时INT1引脚上的负跳变信号可触发外部中断1。
    IE0 外部中断0请求标志 IE0=1则外部中断0在向CPU请求中断,当CPU响应中断时硬件清0。一般不用手动设置。
    IT0 外部中断0触发方式选择位 该位为0时INT0引脚上的低电平信号可触发外部中断1。该位为1时INT1引脚上的负跳变信号可触发外部中断1。(重要)

    IE1和IE0为状态位,即表示CPU对当前的中断执行状态,一般无需手动设置。需要设置的寄存器位是IT0,以选择低电平信号触发还是负跳变信号触发。

    低电平信号 :即该引脚电平信号为0时有效。
    负跳变信号 :意思是电平从高跳至低时有效,即1→0的信号,而一直维持低电平则不会触发中断。

    IT0 = 1;     //设置外部中断0触发方式 

    由以上内容可知,如果要使用外部中断0,并设置为负跳变信号触发,程序写法如下:

    void initEx0()
    {
      //中断允许寄存器IE
      EA = 1;     //开启总中断
      EX0 = 1;    //开启0号外部中断
    
      //控制寄存器TCON
      IT0 = 1;   // 设置外部中断触发方式.  // 0-低电平触发  // 1-负跳变触发
    }
    

    假如要实现以下功能:

    按键与INT0引脚相连,按下按键触发外部中断。
    每触发一次外部中断,计数加一,并将次数显示在一位数码管上。

    搭建仿真电路如下:

    在这里插入图片描述

    代码如下:

    # include <reg52.h>
    # define uchar unsigned char
    # define uint unsigned int
    
    //共阳数码管编码表
    uchar code table[] =
        {0xc0,0xf9,0xa4,0xb0,
        0x99,0x92,0x82,0xf8,
        0x80,0x90,0x88,0x83,
        0xc6,0xa1,0x86,0x8e};
    
    //初始化0号外部中断
    void initEx0();
    
    //计数变量
    uint count = 0;
    
    void main()
    {
      initEx0();
      while(1){
        P2 = table[count];   //在数码管上显示中断次数
      }
    }
    
    void initEx0()
    {
      EA  = 1;	 //开启总中断
      EX0 = 1;	 //开启0号外部中断
      IT0 = 1;	 //设置外部中断触发方式 //0 - 低电平触发 //1 - 负跳变触发
    }
    
    void ex0_intr() interrupt 0 
    { 
      //每进入一次中断,则次数加一
      count = count + 1;
      if(count == 10)
        count = 0;
    }
    

    二、中断优先级

    51单片机的中断系统有6个中断源,可实现二级中断嵌套 。
    再次放出这张表

    中断源                   优先级    中断向量号
    INT0 – 外部中断0          最高      0
    T0 – 定时器/计数器0中断    第2       1
    INT1 – 外部中断1          第3       2
    T1 – 定时器/计数器1中断    第4       3
    串口中断                  第5       4
    T2 – 定时器/计数器2中断    最低      5

    假设外部中断0、1同时向CPU申请中断,由上表可知,优先执行0号外部中断的服务程序。
    修改仿真电路如下(按键同时连接INT0与INT1)。按键按下,则CPU同时收到两个中断请求:

    在这里插入图片描述
    修改程序功能如下:

    在0号外部中断服务程序中数码管显示0
    在1号外部中断服务程序中数码管显示1

    代码如下

    # include <reg52.h>
    # define uchar unsigned char
    # define uint unsigned int
    
    //共阳数码管编码表
    uchar code table[] =
    {0xc0,0xf9,0xa4,0xb0,
    0x99,0x92,0x82,0xf8,
    0x80,0x90,0x88,0x83,
    0xc6,0xa1,0x86,0x8e};
    
    //初始化0、1号外部中断
    void init();
    
    void main()
    {
      init();
      while(1);  //等待中断发生
    }
    
    void init() 
    {
      EA = 1;	 //开启总中断
      EX0 = 1;	 //开启0号外部中断
      IT0 = 1;	 //设置外部中断0触发方式 
      EX1 = 1;   //开启1号外部中断
      IT1 = 1;   //设置外部中断1触发方式 
    }
    
    void ex0_intr() interrupt 0 
    { 
      P2 = table[0];  //显示0
    }
    
    void ex1_intr() interrupt 2 
    { 
      P2 = table[1];  //显示1
    }
    


    编译程序,并下载进仿真.按下按键即可看到数码管显示1,说明当两个外部中断同时向CPU请求中断时,CPU优先处理中断优先级高的那个,即0号外部中断。

    在这里插入图片描述

    ————————————————
     

    展开全文
  • 51单片机 外部中断

    千次阅读 2021-04-09 21:13:42
    为了降低CPU的占有率,同时实现单片机对复杂情景的处理,引入了中断。 CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,为该外设服务(或者处理紧急事件),...

    一、中断的概念:

    为了降低CPU的占有率,同时实现单片机对复杂情景的处理,引入了中断。

    CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,为该外设服务(或者处理紧急事件),处理完毕后回到原断点继续执行原程序。该过程叫做中断。

    二、什么是中断源

    引起中断的原因和发出中断请求的来源
    中断源可以是外设,紧急事件,定时器或者人为设置用于单步断点调试程序。

    1.中断系统要解决的问题:

    1.CPU在执行程序中,如何检测到随机发生的中断请求
    2.是否允许中断
    3.如何正确的进入中断
    4.怎么排列优先级
    5.中断完成后,怎么返回原断点处

    2. 51单片机的中断源:

    中断源名称引脚入口地址
    INT0外部中断0P3.20003h
    INT1外部中断1P3.30013h
    T00号定时器中断P3.4000bh
    T11号定时器中断P3.5001bh
    TI/RI串行口中断P3.1 TXD0023h

    基础型51单片机有5个中断源,增强型52系列增加了一个定时计数器2,共有6个中断源。

    在这里插入图片描述
    根据上图可知51单片机中断部分流程:
    1.检测对应中断源标志位
    2.检测对应中断开关是否打开
    3.检测总中断是否打开
    4.查询是否有优先级更高或同优先级中断正在执行
    5.有更高优先级或同级,等待执行完毕进行中断,无高优先级和同级,直接进行中断

    中断控制相关寄存器

    中断控制寄存器 IE—中断的允许和接收

    EAET2ESET1EX1ET0EX0
    中断控制位T2串行口T1INT1T0INT0

    中断控制主要由两方面:
    A: 是否允许中断
    B: 中断的优先级设置

    三、如何使用外部中断:

    1.开启总中断: EA
    2.开启外部中断: EX0/1
    3.设置中断触发方式: IT0/1(低电平或高电平触发)
    4.编写中断服务程序:
    void 函数名 (void) interrupt m using n

    {

    }

    m范围为0~4,分别代表5个中断源,外部中断INT0就是0,T0就是1,INT1就是2,T1就是3,串行中断就是4

    n的范围为0~3,分别表示4组工作寄存器,不写就用0. 不写也可以

    #include "reg52.h"
    #include <intrins.h>
    
    sbit LED = P1^0;
    
    void Delay500ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	_nop_();
    	_nop_();
    	i = 22;
    	j = 3;
    	k = 227;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    
    void init()
    {
    	EA = 1;			// 开启总中断
    	EX0 = 1;		// 开启外部中断
    	IT0 = 1;		// 低电平触发
    }  
    
    void main()
    {
    	init();
    
    	while(1){
    
    		}
    
    }
    
    
    void INTERR(void) interrupt 0      // 外部中断服务函数
    {
    	 	LED = 0;
    		Delay500ms();
    		LED = 1;
    		Delay500ms();
    }			
    
    展开全文
  • 51单片机外部中断0实例详解

    千次阅读 2020-02-14 11:47:49
    今天就以51单片机外部中断0为例,来简单讲解一下单片机中断的用法。 1 51单片机的中断源 51单片机共有5个中断源,分别为: 外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断都对应一个中断向量,...

    今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法。

    1 51单片机的中断源

    51单片机共有5个中断源,分别为:

    外部中断0

    定时器0中断

    外部中断1

    定时器1中断

    串口中断

    每一个中断都对应一个中断向量,中断向量表如下所示:

    51单片机外部中断0实例详解

    2 什么是中断事件

    当中断发生时单片机将正在执行的程序暂时放下而去处理中断事件,当中断事件处理完毕后再接着去处理之前的事情,这样可以大大降低单片机的资源,提高执行效率。举个例子说明一下什么是中断:

    我很喜欢打CS,每天晚上我都会抽时间打CS,但同时厨房里正在烧水,为了不使水烧干,我每隔5分钟就去厨房看一下水有没开,但这就错过了游戏老被别人爆头干掉,我很苦恼,怎么办。于是我在网上买了一个水烧开就会叫的水壶,这样我就不用每隔5分钟去厨房了从而可以专心的打游戏,只有听到水壶吱吱叫的时候,我去把水倒出来就可以了。

    在这个例子里,打游戏就是主任务,水烧开就是中断,吱吱叫就是中断向量,听到吱吱响我就明白水烧开了,这时我要把打游戏这个主任务暂时放下,转而去处理水烧开了这个中断事件,水倒完后我就又回到了游戏这个主任务中。这样是不是提高了打游戏的效率呢?

    3 中断的硬件实现

    51单片机的外部中断0引脚接一只按键,该按键通过上拉电阻接到电源,即没有按键发生时单片机检测到的是高电平,当按键按下时单片机检测到的是低电平。单片机的P0.0引脚以灌电流的方式接了一只LED,当按键按下时LED灯点亮,没按键时LED灯熄灭。

    51单片机外部中断0实例详解

    4 中断的软件实现

    单片机中断函数的写法比较固定,51单片机中断函数的写法如下:

    void Initd() interrupt 0

    其中:

    void:为中断函数的返回类型,中断函数多为空类型;

    Initd():是中断函数的名称,这个函数名符合C语言函数命名规范就可以,随便起;

    interrupt:为51单片机中断的关键字,必须这么写(51单片机必须这么写);

    0:为中断向量,该值详看第一个表格,如果是外部中断1就写2,如果是定时器1中断就写3;

    中断函数不用在主函数中调用,只要中断事件发生,单片机自己主动会调到中断函数中。

    该例子的函数如下所示:

    51单片机外部中断0实例详解

    5仿真实现

    当按键发生时,LED灯点亮,如下图所示。注意对比两种图中按键的状态。

    51单片机外部中断0实例详解

    展开全文
  • 51单片机具有5个中断源,其中有两个外部中断INT0、INT1。 1、外部中断0:INT0,其对应的引脚为P3^2。 #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; sbit k3=P3^2; //定义按键...

    51单片机具有5个中断源,其中有两个外部中断INT0、INT1。

    1、外部中断0:INT0,其对应的引脚为P3^2。

    #include "reg52.h"			
    
    typedef unsigned int u16;	  
    typedef unsigned char u8;
    
    sbit k3=P3^2;  //定义按键K3,外部中断0触发I/O口
    sbit led=P2^0;	 //定义P20口是led
    
    /*******************************************************************************
    * 函 数 名        : delay
    * 函数功能        : 延时函数,i=1时,大约延时10us
    *******************************************************************************/
    void delay(u16 i)
    {
    	while(i--);	
    }
    
    /*******************************************************************************
    * 函 数 名        : Int0Init()
    * 函数功能        : 设置外部中断0
    *******************************************************************************/
    void Int0Init()
    {
    	//设置INT0
    	IT0=1; //跳变沿出发方式(下降沿). PS:INT0=0,即为低电平触发
    	EX0=1; //打开INT0的中断允许。	
    	EA=1; //打开总中断	
    }
    
    /*******************************************************************************
    * 函 数 名        : main
    * 函数功能        : 主函数
    *******************************************************************************/
    void main()
    {	
    	Int0Init();  //	设置外部中断0
    	while(1);		
    }
    
    /*******************************************************************************
    * 函 数 名        : Int0()	interrupt 0
    * 函数功能        : 外部中断0的中断函数
    *******************************************************************************/
    
    void Int0()	interrupt 0		//外部中断0的中断函数
    {
    	delay(1000);	 //延时消抖
    	if(k3==0)
    	{
    		led=~led;
    	}
    }
    

     

    2、外部中断1:INT1,其对应的引脚为P3^3。

    #include "reg52.h"			
    
    typedef unsigned int u16;	  
    typedef unsigned char u8;
    
    sbit k4=P3^3;  //定义按键K4,外部中断1的触发I/O口
    sbit led=P2^0;	 //定义P20口是led
    
    /*******************************************************************************
    * 函 数 名        : delay
    * 函数功能        : 延时函数,i=1时,大约延时10us
    *******************************************************************************/
    void delay(u16 i)
    {
    	while(i--);	
    }
    
    /*******************************************************************************
    * 函 数 名        : Int1Init()
    * 函数功能        : 设置外部中断1
    *******************************************************************************/
    void Int1Init()
    {
    	//设置INT1
    	IT1=1; //跳变沿出发方式(下降沿). PS:INT1=0,即为低电平触发
    	EX1=1; //打开INT1的中断允许。	
    	EA=1; //打开总中断	
    }
    
    /*******************************************************************************
    * 函 数 名        : main
    * 函数功能        : 主函数
    *******************************************************************************/
    void main()
    {	
    	Int1Init();  //	设置外部中断0
    	while(1);		
    }
    
    /*******************************************************************************
    * 函 数 名        : Int1()	interrupt 2
    * 函数功能        : 外部中断1的中断函数
    *******************************************************************************/
    
    void Int1()	interrupt 2		//外部中断1的中断函数
    {
    	delay(1000);	 //延时消抖
    	if(k4==0)
    	{
    		led=~led;
    	}
    }
    

     

    展开全文
  • 而很多现实场景需要有多个外部中断同时进行,这时候单片机自带的外部中断端口可能就不够用了,那么,怎么解决这个问题呢,本文将会用最典型的51单片机为例,介绍两种较简单的拓展外部中断的方法。
  • AT89C51单片机外部中断

    千次阅读 2020-11-27 22:12:30
    C51单片机外部中断调用P3_2 ,P3_3口。 中断方式有两种,分别为电平方式和脉冲方式。 中断请求有0和1。中断总允许为EA=1, IE0:外部中断请求0标志位; IT0:外部中断0触发方式设置位,IT0=1下降沿触发,IT0=0低电平...
  • 51单片机外部中断点亮LED灯

    千次阅读 多人点赞 2020-08-02 15:44:14
    外部中断软件设计原理 中断发生的三个条件 ①中断源有中断请求; ②此中断源的中断允许位为 1; ③CPU 开中断(即 EA=1)。 比如我们配置外部中断 0,对应的配置程序如下: EA=1;//打开总中断开关 EX0=1;//开外部...
  • 51单片机入门教程(6)——外部中断

    万次阅读 多人点赞 2018-12-03 18:19:02
    51单片机入门教程(6)——外部中断
  • C51单片机 外部中断

    2020-06-15 10:48:56
    51单片机中断系统 一、中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来...
  • C51单片机外部中断的触发方式

    千次阅读 2020-06-23 15:30:25
    ○ CPU采样外部中断引脚电平 ○ 低电平,则硬件置1(IE=1) ○ 高电平,则硬件清0(IE=0) ○ 外部中断引脚的低电平要一直保持,直到CPU响应外部中断 ○ CPU响应中断后,会硬件将IE清0(IE=0),但是不会取消掉...
  • 单片机外部中断使用例程,电平出发类型,C语言例程
  • 要学习51单片机中断的朋友,拥有这一篇博文就够了,深入浅出,里面包含了寄存器,外部中断、定时器中断、中断嵌套等的讲解,还有代码实战。快一万字,写得不容易,还请大家点赞支持一下,后续持续更新(一)寄存器1....
  • 51单片机外部中断INT0实例(汇编程序)

    万次阅读 多人点赞 2018-08-04 12:07:38
    用汇编语言实现:按一次K1外部中断INT0响应一次,LED显示值加1(十进制), ;前提是共阴数码LED第一位,需要设定,由P0口控制。 ORG 0000H LJMP START ORG 0003H LJMP INTT0 ORG 0600H START: SETB EA ...
  • 本文主要讲了51单片机的几个中断源,希望对你的学习有所帮助。
  • 一、外部中断介绍 在前面文章中,我们对中断的概念进行了介绍。STC89C516单片机内部有6个中断源,它们分别为: INT0—外部中断0,由P32端口线引入,低电平或下降沿触发中断。 INT1—外部中断1,由P33端口线引入...
  • 51单片机有5个中断源分别是:  1、INT0——外部中断0,由P3.2端口引入,低电平或下降沿引起。默认优先级最高  2、INT1——外部中断1,由P3.3端口引入,低电平或下降沿引起。默认优先级第二  3、T0——定时器/...
  • 51单片机(V51)学习——外部中断和定时器中断简单使用一、外部中断(下降沿开启和低电平开启)(1)外部中断概念:(2)下降沿演示:(3)低电平中断二、定时器中断(1)概念:(2)简单使用 一、外部中断(下降沿...
  • 51单片机外部中断应用实例(电平触发、边沿触发)

    万次阅读 多人点赞 2019-05-15 15:10:32
    硬件:STC89C52RC 开发工具:Keil uVision4 前言:8051是一款很经典的、历史悠久的单片机,作为一款入门级的单片机8051受到很多初学者的欢迎。...外部中断单片机提供的系统紧急事件的输入控制。事件触发的方式...
  • 写了一个 51单片机外部中断程序

    千次阅读 2016-07-11 18:12:15
    /*以下是能在keilC 中变异的源码,直接粘贴过去就行,外部中断0(INT0)和外部中断1都有(INT1)*/ /*程序很简单,但是对新手来说还是很实用的*/ /****************************************************************...
  • 代码部分 void main() { /*---------------EA,IT,EX必须写-------------*/ EA=1; //开启总中断 IT1=1; //中断触发模式 //=0为低电平触发,=1为下降沿触发 ... //外部中断允许位 ...1.外部中断
  • (一)中断 (二)定时器,计数器中断 TL0低八位先进行存储,达到0XF,向上进一,直到...(2)控制寄存器TCON:(低四位控制外部中断,高四位控制计数器启动和中断申请) (3)定时器的四种工作方式: ...
  • 基于51单片机外部中断(嵌套) 选用芯片AT89S52 /*********************************************************** 此中断函数功能为:默认上排LED流水灯闪烁,外部中断IT0(点亮下 排全部LED灯)为低级中断,外部...
  • 51单片机的外部中断1引脚接开关K1,外部中断引脚0接开关K0,P1.0~P1.7分别接八个发光二极管,开机后只有一个发光二极管从左到右每隔0.5秒循环移动点亮。 当K1电平产生电平跳变时,二极管的循环移动发光被停止,...
  • 以下是假期对51单片机课程内容做的一些小结 中断的基本概念 中断: CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,转而为该外设服务(或者是处理紧急事件)...
  • stm32以及51单片机外部中断详解 问题:什么叫中断? 回答:中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续...
  • GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。 C/T :定时/计数模式选择位。C/T =0为定时模式;C...
  • MCS-51单片机有多个中断源,以8051为例,有5个中断源,两个外中断、两个定时中断和一个串行中断,这一节我们讨论外中断软件编程。  外中断是由外部原因引起的中断,有两个中断源。即外中断0(INT0)和外中断1(INT...
  • 中断时为了使单片机具有对外部或者内部随机发生的事件处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或者内部事件的能力。 其实用生活中的例子,就是周六日,你的妈妈出门上班了,你们打开电脑玩起...
  • 刚开始学51的同学,这是一份好礼,里面详细讲了51各个模块的细节,串口通信,定时中断等,绝对是一份好资料

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,177
精华内容 1,670
关键字:

51单片机外部中断引脚