精华内容
下载资源
问答
  • 外部中断0 外部0中断触发:(P3.2口触发;P3.2触发;P3.2触发) 若IT0=0,则为低电平触发 若IT0=1,则为下降沿触发 外部中断0初始化: 初始化方法一: void Init_INT0() { IT0=1;//设置外部中断0;下降沿触发 EX0=...

    中断

    在这里插入图片描述

    TMOD:定时器/计数器工作方式寄存器

    TCON:定时器/计数器控制寄存器

    在这里插入图片描述

    IE:中断允许控制寄存器

    在这里插入图片描述

    IP:中断优先级控制寄存器

    外部中断0

    外部0中断触发:(P3.2口触发;P3.2触发;P3.2触发

    若IT0=0,则为低电平触发

    若IT0=1,则为下降沿触发

    外部中断0初始化:

    初始化方法一:

    void Init_INT0()
    {
     IT0=1;//设置外部中断0;下降沿触发 
     EX0=1;//开启外部中断0; 
     EA=1;//开启中断总开关 
     } 
    
    
    初始

    化方法二:

    void Init_INT0()
    { 
     TCON=TCON|0x01;//0000 0001->0x01相当IT0=1;设置下降沿触发中断
     IE=0x81;//1000 0001->0X81;
         //第一个1是EA=1;即中断总开关
         //第二个1是EX0=1;即中断分支开关
    }
    
    
    外部0

    中断子函数:

    void RSI_INT0() interrupt 0
    {
     P0=~P0;//当触发中P0口的LED取反 
    }

    主函数:

    void main()
    {
     P0=0xff;//灯全熄灭
     Init_INT0();//初始化外部中断0
     while(1);
    }
    
    
     

    外部中断1:

    外部1中断触发:(P3.3口触发;P3.3触发;P3.3触发

    若IT1=0,则为低电平触发

    若IT1=1,则为下降沿触发

    外部中断1初始化:

    方法一:

    void Init_INT1()
    {
     IT1=1;//设置外部中断1;下降沿触发 
     EX1=1;//开启外部中断1; 
     EA=1;//开启中断总开关 
     } 
    
    
     

    方法二:

    void Init_INT1()
    { 
    // IT1=1;//设置下降沿触发
    // EX1=1;//外部中断1的分支开关
    // EA=1;//中断总开关
      
      TCON=TCON|0x04;//0000 0100->0x04相当IT1=1;设置下降沿触发
      IE=0x84;//IE=1000 0100->0x84
         //第一个1相当EA=1;第二个1相当EX1=1
    }
    
    
     
    
    外部1

    中断子函数:

    void ISR_Int1() interrupt 2
    {
      P0=~P0;//取反 
    }

    主函数:(P3.3给了下降沿,软件触发)

    void main()
    {
     P0=0xff;//熄灭所有的灯
     Init_INT1();//外部中断1初始化
     while(1){
      Int1=1;
      Int1=0;//P3.3由1->0;下降沿触发
     }
    }

    该主函数可进行Dobug,查看函数的走向。

    例题:(中断嵌套)

    利用外部中断0,进行3次流水灯;

    利用外部中断1,进行3次闪耀;

    且外部中断1的优先级高于外部中断1。

    不进行中断时LED灯处于熄灭状态。

    #include <reg51.h>
    
     
    
    //延时程序
    
    void delay()
    
    {
    
           int i,j;
    
           for(i=0;i<10;i++)
    
            for(j=0;j<3000;j++);    
    
    }
    
    //外部中断0和1初始化
    
    void Init_INT01()
    
    {      
    
           TCON=TCON|0x05;//0000
    0101->0x01相当IT0=1,IT1=1;设置下降沿触发中断
    
           IE=0x85;//1000 0101->0X85;
    
                                       //第一个1是EA=1;即中断总开关
    
                                       //第二个1是EX1=1;即中断1分支开关
    
                   //第二个1是EX0=1;即中断0分支开关
    
           IP=IP|0x04;//设置外部中断1优先级高于外部中断0
    
    }
    
     
    
    //LED右移程序
    
    void lelf(unsigned int n)
    
    {
    
           unsigned int i,j;
    
           for(i=0;i<n;i++)
    
           {
    
                  for(j=0;j<8;j++)
    
                  {
    
                         P0=~(0x80>>j);
    
                         delay();
    
                  }
    
           }
    
           P0=0xff;
    
    }
    
     
    
    //闪耀程序
    
    void flash(unsigned int n)
    
    {
    
           unsigned int i;
    
           for(i=0;i<n;i++)
    
           {
    
                  P0=~P0;
    
                  delay();
    
           }
    
    }
    
    void main()
    
    {
    
           Init_INT01();
    
           while(1);
    
    }
    
    //外部中断0子程序
    
    void out_INT0() interrupt 0
    
    {
    
           lelf(3);
    
           
    
    }
    
    //外部中断1子程序
    
    void out_INT1() interrupt 2
    
    {
    
           flash(4);
    
    }

    定时器0中断:

    中断触发:

    定时/计数时间到触发中断

    定时/计数原理:

    脉冲下降沿,定时器/计数的值加 1

    初始化程序:
    //定时器/计数器0初始化

    void tminer0_Init()
    {
     TMOD&=0XFC;//选择定时模式C/T=0;计数模式C/T=1;
     TMOD|=0x01;//选择定时器0;工作模式1,16位定时/计数
     TH0=0xFF;  //装初值
     TL0=0xFE;  //定时1us
     ET0=1;     //定时器0开关
     EA=1;      //中断总开关
     TR0=1;     //启动定时器0
    }

    中断子程序:

    //定时器中断0子程序
    void time0() interrupt 1
    {
     TH0=0xFF;//重新装初值
     TL0=0xFE;//定时1us
     P0=~P0;
    }

    主程序:

    void main()
    {
     tminer0_Init();
     while(1);
    }
     

    定时器1中断:

    #include
    <reg51.h>
    //定时器/计数器1初始化
    
    void
    tminer1_Init()
    
    {
    
           TMOD&=0XCF;//选择定时模式C/T=0;计数模式C/T=1;
    
           TMOD|=0x10;//选择定时器1;工作模式1,16位定时/计数
    
           TH1=0xFF;//装初值
    
           TL1=0xFE;//定时1us
    
           ET1=1;//定时器1开关
    
           EA=1;//中断总开关
    
           TR1=1;//启动定时器1
    
    }
    
    void
    main()
    
    {
    
           tminer1_Init();
    
           while(1);
    
    }
    
    //定时器中断1子程序
    
    void
    time0() interrupt 3
    
    {
    
           TH1=0xFF;//重新装初值
    
           TL1=0xFE;//定时1us
    
           P0=~P0;
    
    }
    展开全文
  • 8051外部中断0解析

    千次阅读 2019-07-23 10:23:44
    我们令IT0 = 1, 即选择了"边沿触发", 所以每当独立按键按下时, 中断处理函数EX_INT0()就会执行. 当进入中断处理函数执行时, 若P32引脚的电平为低电平, 则说明K3按键已按下; 若P32引脚的电平为高电平, 说明K3按键已...

    程序实现功能:

    在实验板上左下方有一个黑色的独立按键(K3), 当我们按下它时, D1(LED灯)的状态就会取反.

    思路分析:

    我们令IT0 = 1, 即选择了"边沿触发", 所以每当独立按键按下时, 中断处理函数EX_INT0()就会执行. 

    当进入中断处理函数执行时, 若P32引脚的电平为低电平, 则说明K3按键已按下; 若P32引脚的电平为高电平, 说明K3按键已抬起.

    "低电平触发"和"边沿触发"的区别:

    ①"低电平触发"是指在电平处于低电平态的时间内触发.

    ②"边沿触发"是指在电平由高 -> 低或由低 -> 高的一瞬间触发.

    独立按键电路原理图:

     

    抖动的处理:

    为什么我们要在中断处理函数开始执行时先加入1ms延时模块, 是因为按键在按下或抬起时电平不是一下子稳定到低或高状态的, 而是在经历一小段时间的电平抖动后才到达稳定态: 为了对P32引脚电平判断的准确性, 先加入1ms的延时模块, 当电平稳定之后 再行判断.

     

    程序源代码:

    #include <STC89C5xRC.H>
    
    void delay()//获得1ms延时
    {
    	TH0 = 0xFC;
    	TL0 = 0x18;//65536 - 1000 = 64536 = FC18H
    	TR0 = 1;//开启定时器0
    	while(TF0 == 0);//等待定时器0计数溢出
    	TF0 = 0;
    	TR0 = 0;//暂停定时器0
    }
    
    void EX_INT0() interrupt 0//外部中断0处理函数
    {
    	delay();//1ms延时消抖
    	if(P32 == 0)
    	{
    		P20 = ~ P20;//D1电平翻转
    	}
    }
    
    int main()
    {
    	TMOD = 0x01;//设置定时器0的工作模式
    	TR0 = 0;
    	TF0 = 0;
    	P20 = 0;//开发板上D1亮
    
    	EA = 1;//中断总开关打开
    	EX0 = 1;//外部中断0开关打开
    	IT0 = 1;//边沿触发
    	//IT0 = 0 -> 低电平触发中断,  IT0 = 1 -> 边沿触发中断
    	while(1)
    	{
    		;
    	}
    	return 0;
    }

     

    展开全文
  • 外部中断0——51程序

    万次阅读 2016-09-12 23:16:22
    51单片机中一共有5个中断方式: ①外部中断0 ②定时器中断0外部中断1 ④定时器中断1 ⑤串口中断 ...void int0_init() //外部中断0初始化函数 { EA = 1; //打开总中断 IT0 = 1; /*设置中断触发方式:

    51单片机中一共有5个中断方式:

    ①外部中断0

    ②定时器中断0

    ③外部中断1

    ④定时器中断1

    ⑤串口中断

    5个中断优先级从  高  到  低


    
    void int0_init()                    //外部中断0初始化函数
    {
    	EA = 1;     //打开总中断
    	IT0 = 1;    /*设置中断触发方式:
                                        ITx = 0;  //  低电平触发
                                        ITx = 1;  // 下降沿触发
                        */
    	EX0 = 1;    //打开外部中断
    }
    
    void int0_isr(void) interrupt 0    //外部中断0服务函数
    {
    	EX0 = 0;           //打开外部中断
    	delay_ms(10);
    	if(0 == key1)
    	{
    		while(!key1);
    		delay_ms(10);
    
                                //中间做你想做的事
            }
    	EX0 = 1;           //关闭外部中断
    }



    展开全文
  • stm32hal库之外部中断巨坑,如果使用按键外部中断会导致频繁触发中断,从而不能退出中断,导致卡死 void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) { /* EXTI line interrupt detected */ if(__HAL_GPIO_EXTI_...

    stm32hal库之外部中断巨坑,如果使用按键外部中断会导致频繁触发中断,从而不能退出中断,导致卡死

    void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    {
      /* EXTI line interrupt detected */
      if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
      {
       __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
        HAL_GPIO_EXTI_Callback(GPIO_Pin);
    	
      }
    }
    

    把上面的改为

    void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    {
      /* EXTI line interrupt detected */
      if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
      {
       // __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
        HAL_GPIO_EXTI_Callback(GPIO_Pin);
    		__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
      }
    }
    

    原因是在回调函数没有执行完毕就去执行清除外部中断标志位对的话,如果按键还在按下,有可能导致不停触发中断,也就是不断嵌套中断,导致不能退出,卡死在中断里面,因为按键触发外部中断起码有几百ms,这期间大家想想可以触发多少次中断了

    展开全文
  • STM32 FreeRTOS 外部中断服务函数注意事项 移植正点原子的FreeRTOS操作系统到我们自己的工程,发现的一个注意事项; 看下面代码,带FreeRTOS的外部中断服务函数,实现按键消抖,不能用delay_ms()或者和vTaskDelay...
  • 51单片机外部中断0实例详解

    千次阅读 2020-02-14 11:47:49
    今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法。 1 51单片机的中断源 51单片机共有5个中断源,分别为: 外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断都对应一个中断向量,...
  • 效果:让数码管连续循环显示0~9,当有外部中断产生时,显示暂停5~7秒 这里外部中断0属于高优先级,定时器中断1是外设中断系统,属于低优先级。在这里,外部中断的优先级必须比定时器中断的优先级高,不然在定时时...
  • 外部中断

    千次阅读 2020-03-01 17:28:35
    外部中断0(INT0):P3.2口的附加功能 外部中断1(INT1):P3.3口的附加功能 当引脚上出现有效的中断信号时,就有中断标志置1,向CPU申请中断。 二.外部中断相关寄存器 1.中断允许寄存器(IE) EA:CPU开启中断...
  • 说在前面:记得前几天写了一个用按键来控制灯的函数,但是无论怎样都无法实现函数的重复使用,一开始以为是没有设置好循环,但是,因为没有实现外部中断才做不了循环操作2.外部中断1.作为STM32而言,每一个IO口都...
  • 外部中断0和1外部中断原理编程原理(外部中断0)代码实现 外部中断原理 外部中断0:(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置...
  • 一、配置外部中断 1.配置引脚: 1.选择外部中断 2.选择触发条件 3.选择上下拉 2.使能中断 1勾选中断,使能中断 3.生成代码中,在main.c中添加中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t ...
  • Cortex-M0系列 ~ 外部中断

    千次阅读 2018-08-16 16:31:52
    STM32的每个I/O都可以作为外部中断的中断输入口,每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。这里使用的外部中断来检测按键,下面是相关配置代码~ void EXTIX_Init() { GPIO_InitTypeDef GPIO...
  • STM32 关于外部中断线、中断源和中断服务函数的问题 中断线问题: 上图可以看出,PA0、PB0...PG0共用的EXTI0中断线,PA1、PB1...PG1共用的EXTI1中断线,也就是 编程里面的(如下图库文件),对应16个中断线,...
  • Arduino 定时器中断 外部中断

    万次阅读 2019-04-09 17:29:31
    但如果此时发生了某一件事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务),待CPU将事件B处理完毕后,再回到原来被中断的地方继续执行程序(中断返回),这一过程成...
  • 代码: ULONG vector; KIRQL irql;...功能:将外部中断IRQ10与中断函数OnInterrupt挂钩,中断10触发时进入OnInterrupt函数进行端口的处理操作。 问题:IoConnectInterrupt函数执行不成功,返回错误。
  • 外部中断EXTI

    千次阅读 2016-09-12 16:50:15
    前置技能: 按键输入-GPIO输入一,STM32中断介绍相比简单的51单片机,STM32的每个IO口都可以作为外部中断输入STM32中断控制器支持19个外部中断/事件请求: 线0-15:外部IO口输入中断 线16:连接到PVD输出 线17:连接到...
  • 外部中断 STM32F4的每个IO都可以作为外部中断的中断输入口,这点也是STM32F4的强大之处。STM32F407的中断控制器支持22个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F...
  • DSP28335外部中断配置过程

    千次阅读 2019-04-15 21:59:24
    28335外部中断基本特点 7个可屏蔽中断源和1个不可屏蔽外部中断源 ...**外部中断外设和其他外设不一样,在中断函数中只用清除PIE中断即可不用清除外设中断**。 外部中断配置过程 其实28335的外部中断配...
  • STM89C52外部中断0实验

    2018-05-03 20:01:55
    外部中断0低电平触发实验代码:#include &lt;reg52.h&gt;#define uint unsigned int#define uchar unsigned charsbit ... //外部中断信号产生脚/*====================================函数 : delay(uint...
  • 单片机中断是指CPU在正常执行程序的过程中,由于计算机内部或外部发生了另一...今天要做的一个实验叫做外部中断,按下按键,停止主程序中的内容,立即转去执行中断服务函数。 我们主要看到原理图与代码,了解中断是什...
  • 实验目的:用独立按键作为外部中断的触发信号,当按键按下发送来信号的时候,再执行中断函数(在函数内定义LED灯的亮灭) 如上图所示51单片机总共有5个中断源,本博文先展示第一种 INT0 中断 先看电路图 按键 P3^...
  • 学单片机的,相信对中断的概念都已经了如指掌了,中断具体是什么我在这里也就不再详细说明,不懂的上网找找也一大堆。那么在介绍实验之前我先跟大家简单讲讲STM32当中的NVIC(嵌套向量中断控制器) NVIC NVIC(嵌套...
  • 代码如下: void TimeConf(void) { TMOD=0x01;//打开定时器模式并选择方式2 TL0=TH0=0x00;...void intConf(void)//中断初始化 { EA=1; EX0=1; ET0=1; } void inte() interrupt 0 { GPIO_LED=
  • 1 #include <reg52.h> 2 #include <stdio.h> 3 sbit LED = P2^0; 4 //初始化函数 5 void init(){ ... 6 //打开外部中断1的分开关 ... 8 //打开外部中断总开关 ...10 //外部中断1的标志...
  • 利用外部中断0实现数码管按键加减

    千次阅读 2021-03-24 09:25:01
    利用外部中断0实现数码管按键加减 实现的结果: # 源程序: /*程序功能:在单片机的INT0,INT1引脚分别接两个按钮,通过按扭向单片机申请中断 中断一次实现变量加1或减1,并将结果显示在数码管*/ #include <reg51.h...
  • 8051外部中断1解析

    千次阅读 2019-07-23 10:41:21
    程序实现的功能: 在实验板上左下方有一...(外部中断1和外部中断0在处理上类似, 红色的部分为不同之处) 中断处理程序标号: 外部中断0 -----------> 0 定时器0中断 -----------> 1 外部中断1 -----------&...
  • 设计单片机的Proteus仿真电路,实现如下功能:控制P0口数码管循环显示0-9; 按下上面开关,控制P2口数码管依次显示0-9;按下下面开关,控制P1口数码管依次显示0-9。
  • 重要声明: 以下代码有粘贴 截取他人劳动成果的成分 如有...它能使CPU在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行CPU原来的工作。引起中断的原因或者说发出中断请求的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,436
精华内容 38,574
关键字:

外部中断0的中断函数