精华内容
下载资源
问答
  • C51单片机 一个外部中断(入门单片机)
    千次阅读
    2021-07-25 22:36:57

    代码部分

    void main()
    {	
    /*---------------EA,IT,EX必须写-------------*/
    	EA=1; 	//开启总中断
    	IT1=1;	//中断触发模式
                //=0为低电平触发,=1为下降沿触发
     	EX1=1;  //外部中断允许位
    
        while(1)
    	{
    	    led1=0;		  	 
    	}
    }
    
    
    void int1() interrupt 0
    {	 			
         led=~led1;
    }

    解释:

    1.外部中断(按键中断)最最重要的部分就是EA,IT,EX三条语句,这三条是必不可少的。

    2.EA是中断总开关,类似家里电闸的总闸,总闸下面有外部中断,内部中断,串口中断,AD中断等,相当于家里各个房间的分闸,EA=1就是把总闸开了,EA=0就是把总闸关了。

    3.IT是触发模式,相当于其中一个分闸的闸刀有两种开它的模式,第一种是一直按着这个分闸的按钮,手松开闸门就关了,还有一种是只要按一下闸刀就开了,手松开也没事。因为外部中断源有两个,相当于家里有两个卫生间,都是卫生间功能是一样的,但电源是分开的,开第一个卫生间就写IT0,第二个就写IT1  。IT0=0就是要一直按着开关才能用,也就是“低电平触发”IT0=1就是上面说的第二种方式,手放开也没事,也就是“下降沿触发”,一般单片机按键用第二种方式。

    4.EX是外部中断允许位,也就是你现在已经把总闸打开了,也选好了卫生间,也选好了开电源的方式,现在终于要把这个房间电源打开了。EX1=1就是打开,EX1=0就是关闭。注意,现在只是把这个房间电闸打开了,厕所墙壁上还有个开关,随手开灯随手关灯。这个开关就是你外部配给这个引脚的按键。真正要进中断前面三条语句还是准备工作,按键按下才会进一次中断。

    5.按照顺序下来,上面三条EA,IT,EX已经执行了,然后就是执行循环里的部分,你又不能只去一次厕所,不用每次都重新开一次总电闸。循环里的过程是这样的:当没有操作(指按键按下)的时候,led1一直是灭的,当按下了按键,他就跳转去下面的中断服务函数了,运行其中的语句,比如说让原来不亮的灯亮起来,然后回到刚刚的语句执行下面的,就好比当厕所没人用,灯就不开,有人进去了,开了开关灯亮了,然后用完了出来回到刚开关那里再按一下,把灯关了。

    6.中断函数怎么写呢:中断函数就是刚刚进厕所打开灯后(开关按下后)要做的事,有专门的规范

                                    void int1() interrupt 0
                                    {                 
                                         led=~led1;
                                    }

    就写成void 函数名()interrupt 数字     {    执行的语句         }

    能改的就只有函数名和数字,当然数字也不能乱改

    用到是外部中断0(INT0)数字就写0,对应EA=1,EX0=1,IT0=1.

    用的是外部中断1(INT1)数字就写2,对应EA=1,EX1=1,IT1=1.

    也能在其他地方看到void init0()interrupt 0 using 0 ,发现有个using 0 的,新手不清楚可以不写,不写也不会错。

    更多相关内容
  • 单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来...
  • STM32外部中断程序

    2020-08-11 07:44:44
    STM32外部中断程序,配有原理图,简单易懂。设置NVIC中断分组2:2位抢占优先级,2位响应优先级,根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器。
  • STM8的外部中断程序

    2018-11-09 12:01:08
    STM8的外部中断程序。适合初学STM8的同学。
  • 51单片机外部中断实验程序的设计与分析.pdf
  • STM32F103 ET6 开发板的外部中断测试程序.经测试可以正确运行.
  • 51单片机的5大中断源:串行口中断、定时中断1、外部中断1、定时中断0、外部中断0;下面一起来学习一下
  • 11.外部中断程序.rar

    2019-08-03 18:12:41
    STM32单片机的外部中断程序 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事 件/中断请求的边沿检测器。EXTI的每根输入线都可单独进行配置,以选 择类型(中断或事件)和相应的触发事件(上升沿触发...
  • 外部中断实验程序

    2015-02-09 08:28:34
    外部中断实验程序
  • msp430外部中断程序

    2020-07-25 21:02:20
    本文给大家分享了一个msp430外部中断程序
  • 下面是一个STM32F030 IO口外部中断应用程序,感兴趣的朋友可以看看。
  • 通过外部中断(按键),实现led灯的控制
  • 已知单片机的 P0 口接了一位七段数码管,当无外部中断外部中断 0)时,数码 管按 a~g 段依次点亮,不断循环显示;当有外部中断(按钮被按下,P3.2 有下降沿电 压)时,数码管显示状态改为“8”亮灭闪烁显示,亮灭...
  • 基于STM32的外部中断程序范例DSP外部中断程序
  • 汇编课程设计-外部中断程序 16/32位微机原理
  • 以下两个程序效果相同,一个使用汇编语言,一个使用C语言,从仿真效果看,c语言程序运行比较流畅。含有原理图。
  • 主要介绍了外部中断的使用方法,包括: 1 基本概念 2 GPIO外部中断 3 程序开发
  • STM32的外部中断程序,亲测可用。内有详细注释和说明文档,很好的参考资料。
  • stm32f103基于正点原子待机唤起实验的停机唤起实验。 按键KEY0(PB0)按下,触发中断,进入停机模式;按键KEY1(PB1)按下,触发外部中断,从停机模式唤醒;
  • 由于arduino官方提供的红外遥控...这里使用外部中断加定时器1来实现红外遥控nec协议的解码。 板子:arduino uno 中断引脚:2 定时器:1 实现功能:可以接收nec协议的红外编码,并且可以连续接收(如果遥控器支持的话)
  • stm32外部中断按键消抖(电路与stm32程序),测试通过。按键消抖动,抗干扰5768875687687687678
  • STM8S 外部中断程序

    热门讨论 2011-11-11 08:43:42
    利用STM8S的外部中断控制GPIO输出点亮LED
  • 67外部中断0电平触发单片机C语言源码.zip项目程序C语言源码下载67外部中断0电平触发单片机C语言源码.zip项目程序C语言
  • 51/52单片机外部中断实验程序 伟福试验箱专用
  • STM32外部中断实验

    2018-11-14 10:54:47
    亲测可用,可以用来做STM32的外部中断,有问题可以联系或者在评论区评论
  • STM32F103:外部中断(EXTI)——原理和程序

    千次阅读 多人点赞 2021-11-23 13:50:08
    一、外部中断(EXTI)—简介 EXTI (External interrupt/event controller)——外部中断/事件控制器。 互联型STM32有20个能够产生事件/中断请求的边沿检测器,STM32F103系列有19个能够产生事件/中断请求的边沿检测器。 ...

    本文章技术信息均出自:STM32F103系列超详细参考手册-中文版


    一、外部中断(EXTI)—简介

    EXTI (External interrupt/event controller)——外部中断/事件控制器。
    互联型STM32有20个能够产生事件/中断请求的边沿检测器,STM32F103系列有19个能够产生事件/中断请求的边沿检测器。
    每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。
    每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。

    二、外部中断(EXTI)—框图

    在这里插入图片描述

    三、外部中断(EXTI)—线路映像

    通用I/O端口以下图的方式连接到16个外部中断/事件线上:
    在这里插入图片描述

    外部中断/事件线功能
    EXTI_Line0—EXTI_Line15外部中断线
    EXTI_Line16PVD输出
    EXTI_Line17RTC闹钟事件
    EXTI_Line18USB唤醒事件
    EXTI_Line19以太网唤醒事件(只适用于互联型STM32)

    四、外部中断(EXTI)—寄存器

    从外部中断(EXTI)结构框图可以知道,外部中断功能由六个寄存器配置。

    1. 中断屏蔽寄存器(EXTI_IMR)

    在这里插入图片描述

    2. 事件屏蔽寄存器(EXTI_EMR)

    在这里插入图片描述

    3. 上升沿触发选择寄存器(EXTI_RTSR)

    在这里插入图片描述

    4. 下降沿触发选择寄存器(EXTI_FTSR)

    在这里插入图片描述

    5. 软件中断事件寄存器(EXTI_SWIER)

    在这里插入图片描述

    6. 挂起寄存器(EXTI_PR)

    在这里插入图片描述

    五、外部中断(EXTI)—配置

    1. 外部中断(EXTI)—映射关系

    外部中断线外部中断通道外部中断服务函数
    GPIO_Pin0EXTI0_IRQnEXTI0_IRQHandler
    GPIO_Pin1EXTI1_IRQnEXTI1_IRQHandler
    GPIO_Pin2EXTI2_IRQnEXTI2_IRQHandler
    GPIO_Pin3EXTI3_IRQnEXTI3_IRQHandler
    GPIO_Pin4EXTI4_IRQnEXTI4_IRQHandler
    GPIO_Pin5—GPIO_Pin9EXTI9_5_IRQnEXTI9_5_IRQHandler
    GPIO_Pin10—GPIO_Pin15EXTI15_10_IRQnEXTI15_10_IRQHandler

    2. 外部中断(EXTI)—GPIO引脚配置

    在这里插入图片描述
    由上图可知,外部中断的GPIO引脚可以配置一下三种:

    GPIO_Mode_IN_FLOATING	//浮空输入
    GPIO_Mode_IPU			//上拉输入
    GPIO_Mode_IPD			//下拉输入
    

    3. 外部中断(EXTI)—触发方式

    外部中断(EXTI)有三种触发方式:

    EXTI_Trigger_Rising			//上升沿触发
    EXTI_Trigger_Falling 		//下降沿触发
    EXTI_Trigger_Rising_Falling	//上升沿和下降沿都可以触发
    

    六、外部中断(EXTI)—程序

    外部中断配置程序

    void EXTIX_Init(void)
    {
    	EXTI_InitTypeDef EXTI_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	GPIO_InitTypeDef GPIO_InitStructure;
    //初始化时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTB,PORTC时钟
    	//初始化GPIO端口
    	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_4;	//PA0,PA4
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 	//PA0设置成浮空输入,默认下拉	
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 		//最高输出速率50MHz
    	GPIO_Init(GPIOA, &GPIO_InitStructure);					//初始化GPIOA
    
    	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6|GPIO_Pin_8;	//PB6,PB8
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		  	//设置成上拉输入,默认下拉
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 		//最高输出速率50MHz
    	GPIO_Init(GPIOB, &GPIO_InitStructure);					//初始化GPIOB
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_14;	//PC12,PC14
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 			//设置成下拉输入,默认下拉
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 		//最高输出速率50MHz
    	GPIO_Init(GPIOC, &GPIO_InitStructure);					//初始化GPIOC
    	
    
    /*GPIOA0中断初始化配置*/  
    	EXTI_ClearITPendingBit(EXTI_Line0);                    	//清除线0 IO口中断清除挂起位(清除中断标志位)
      	EXTI_InitStructure.EXTI_Line=EXTI_Line0;	      		//中断线选择
      	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;		//EXTI为中断模式
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;	//上升沿触发
      	EXTI_InitStructure.EXTI_LineCmd = ENABLE;				//使能中断
      	EXTI_Init(&EXTI_InitStructure);	 						//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);	//将GPIOA0挂到中断上
    
    /*GPIOA4中断初始化配置*/  
    	EXTI_ClearITPendingBit(EXTI_Line4);                    		//清除线4 IO口中断清除挂起位(清除中断标志位)
      	EXTI_InitStructure.EXTI_Line=EXTI_Line4;	      			//中断线选择
      	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//EXTI为中断模式
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		//下降沿触发
      	EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//使能中断
      	EXTI_Init(&EXTI_InitStructure);	 							//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);	//将GPIOA4挂到中断上
    		
    /*GPIOB6中断初始化配置*/  
    	EXTI_ClearITPendingBit(EXTI_Line6);                    		//清除线6 IO口中断清除挂起位(清除中断标志位)
      	EXTI_InitStructure.EXTI_Line=EXTI_Line6;	      			//中断线选择
      	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//EXTI为中断模式
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//上升沿和下降沿都可以触发
      	EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//使能中断
      	EXTI_Init(&EXTI_InitStructure);	 							//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);	//将GPIOB6挂到中断上
    
    /*GPIOB8中断初始化配置*/  
    	EXTI_ClearITPendingBit(EXTI_Line8);                    		//清除线8 IO口中断清除挂起位(清除中断标志位)
      	EXTI_InitStructure.EXTI_Line=EXTI_Line8;	      			//中断线选择
      	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//EXTI为中断模式
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		//下降沿触发
      	EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//使能中断
      	EXTI_Init(&EXTI_InitStructure);	 							//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);	//将GPIOB8挂到中断上
    		
    /*GPIOC12中断初始化配置*/  
    	EXTI_ClearITPendingBit(EXTI_Line12);                    	//清除线12 IO口中断清除挂起位(清除中断标志位)
      	EXTI_InitStructure.EXTI_Line=EXTI_Line12;	      			//中断线选择
      	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//EXTI为中断模式
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;		//上升沿触发
      	EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//使能中断
      	EXTI_Init(&EXTI_InitStructure);	 							//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource12);	//将GPIOC12挂到中断上
    
    /*GPIOC14中断初始化配置*/  
    	EXTI_ClearITPendingBit(EXTI_Line14);                    	//清除线14 IO口中断清除挂起位(清除中断标志位)
      	EXTI_InitStructure.EXTI_Line=EXTI_Line14;	      			//中断线选择
      	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//EXTI为中断模式
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//上升沿和下降沿都可以触发
      	EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//使能中断
      	EXTI_Init(&EXTI_InitStructure);	 							//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource14);	//将GPIOC14挂到中断上
    		
    /*NVIC初始化配置*/
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);            	//配置NVIC优先级分组为0
    
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			//使能线0所在的外部中断通道
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//抢占优先级0
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;			//子优先级3
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//使能外部中断通道
      	NVIC_Init(&NVIC_InitStructure);  	  						//初始化外设NVIC寄存器
    		
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;			//使能线4所在的外部中断通道
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//抢占优先级0
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;			//子优先级2
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//使能外部中断通道
      	NVIC_Init(&NVIC_InitStructure);  	  						//初始化外设NVIC寄存器
    		
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;			//使能线9到线5所在的外部中断通道
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//抢占优先级0, 
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//子优先级1
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//使能外部中断通道
      	NVIC_Init(&NVIC_InitStructure); 
     
       	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;		//使能线15到线10所在的外部中断通道
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//抢占优先级0
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			//子优先级0
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//使能外部中断通道
      	NVIC_Init(&NVIC_InitStructure); 
    }
    

    外部中断服务函数

    //外部中断0服务函数 
    void EXTI0_IRQHandler(void)
    {
    	if(EXTI_GetITStatus(EXTI_Line0)!= RESET)//有中断申请
    	{
    		/**
    		其他功能程序
    		**/
    		EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位 
    	}
    }
    
    //外部中断4服务函数 
    void EXTI4_IRQHandler(void)
    {
    	if(EXTI_GetITStatus(EXTI_Line4)!= RESET)//有中断申请
    	{
    		/**
    		其他功能程序
    		**/
    		EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位 
    	}
    }
    
    
    //外部中断9_5服务函数 
    void EXTI9_5_IRQHandler(void)
    {
    	if(EXTI_GetITStatus(EXTI_Line6)!= RESET)//有中断申请
    	{
    		/**
    		其他功能程序
    		**/
    		EXTI_ClearITPendingBit(EXTI_Line6); //清除LINE6上的中断标志位 
    	}
    	
    	if(EXTI_GetITStatus(EXTI_Line8)!= RESET)//有中断申请
    	{
    		/**
    		其他功能程序
    		**/
    		EXTI_ClearITPendingBit(EXTI_Line8); //清除LINE8上的中断标志位 
    	}
    }
    
    
    //外部中断15_10服务函数 
    void EXTI15_10_IRQHandler(void)
    {
    	if(EXTI_GetITStatus(EXTI_Line12)!= RESET)//有中断申请
    	{
    		/**
    		其他功能程序
    		**/
    		EXTI_ClearITPendingBit(EXTI_Line12); //清除LINE12上的中断标志位 
    	}
    	
    	if(EXTI_GetITStatus(EXTI_Line14)!= RESET)//有中断申请
    	{
    		/**
    		其他功能程序
    		**/
    		EXTI_ClearITPendingBit(EXTI_Line14); //清除LINE14上的中断标志位 
    	}
    }
    

    展开全文
  • 闲来无事,今天一遍这个来介绍说明一下外部中断INT0、INT1。其他的小编以后再整理给大家。 先上一个实例: 题目: 实例仿真图: 程序 #include <reg52.h> #include <intrins.h> #define uint ...

    小编在学习51单片机中断的时候常常被外部中断、定时/计数器和串行口弄的稀里糊涂的,本来就是个小小学渣,怎么能经得起折磨!!!
    闲来无事,今天写一遍这个来介绍说明一下外部中断INT0、INT1。其他的小编以后再整理给大家。
    先上一个实例:
    题目:
    实例仿真图:
    图1
    程序

    #include <reg52.h>
    #include <intrins.h>
    #define uint unsigned int
    
    void delay1s(void)   //延时1s
    {
        unsigned char a,b,c;
        for(c=167;c>0;c--)
            for(b=171;b>0;b--)
                for(a=16;a>0;a--);
        _nop_();  
    }
    
    void main(void){
     P0 = 0x01; //设一个初值
     IP = 0x04;  //设置中断优先级,人为的将INT1的优先级设置大于INT0
     IT0 = 1; //TCON,设置中断触发方式为边沿触发方式
     IE = 0x85; //IE,开总中断允许,开INT0,INT1中断允许
     while(1); //死循环,等待中断信号
    }
    
    void int0_p(void) interrupt 0{ //外部中断0中断服务程序,其中 “int0_p(void)”函数名随意
      uint j;
     delay1s();
     for(j=0;j<7;j++){
       P0 = _crol_(P0,1);
      delay1s();
     }
    }
    
    void int1_p(void) interrupt 2{ //外部中断0中断服务程序,其中 “int1_p(void)”函数名随意
      uint i;
     delay1s();
     for(i=0;i<7;i++){
       P0 = _cror_(P0,1);
      delay1s();
     }
    }
    

    实例的结果:
    (1)当仅按下INT0引脚处的按键K1时,LED自上向下依次点亮,即顺流水一次。
    (2)当仅按下INT1引脚处的按键K2时,LED自下向上依次点亮,即逆流水一次。
    (3)当按下K1后,在LED顺流水的过程中按下K2,LED变成逆方向依次点亮,一段时间后又变成顺流水,然后结束。(默认INT0的优先级大于INT1,我们在程序中将INT1的优先级设置大于INT0)

    总结:
    中断初始化过程:
    1、设置IP:完成中断优先级的设置:
    (老师的PPT,借来一用,嘿嘿)图2
    2、设置TCON:设置中断触发方式
    这个TCON可以位操作:例:程序中设置外部中断0为边沿触发,可直接写成IT0=1;
    图3
    3、设置IE:开总中断,开需要的中断
    (IE也可以位操作)
    注意:外部中断的中断标志位是自动清除的
    图4
    4、写中断服务程序的中断号如下:
    图5
    补充:中断标志的撤销说明如下:
    图6

    展开全文
  • stm8 外部中断 源代码

    2020-03-20 22:09:23
    stm8 外部中断 程序源代码 只需要改一下对应的io口数字就可以使用,适合学习如何编写外部中断程序
  • 51单片机:外部中断1程序设计

    千次阅读 2020-07-20 11:13:03
    操作K4按键使LED8(D8)状态取反 #include <reg52.h> typedef unsigned int u16; typedef unsigned char u8; ...//设置外部中断1 void Int1Init() { IT1=1;//设置触发方式 EX1=1;//打开

    在这里插入图片描述
    在这里插入图片描述

    1、操作K4按键使LED8(D8)状态取反

    #include <reg52.h>
    
    typedef unsigned int u16;
    typedef unsigned char u8;
    
    sbit K3=P3^2;  //INT0
    sbit K4=P3^3;  //INT1
    
    sbit led=P2^7;
    
    void delay(u16 i)
    {
     while(i--);
    }
    
    //设置外部中断1
    void Int1Init()
    {
        IT1=1;//设置触发方式
    	EX1=1;//打开INT1的中断允许
    	EA=1; //打开总中断
    }
    
    //中断服务函数
    void Int1()  interrupt 2
    {
        //消除抖动
    	delay(1000);
    	if(K4==0)
    	{
    	  led=~led;
    	}
    }
    
    void main()
    {
        Int1Init(); //设置外部中断
    	  while(1);
    }
    

    2、操作K4按键使LED8(D8)状态取反,同时蜂鸣器响,led点阵闪烁

    #include <reg52.h>
    
    typedef unsigned int u16;
    typedef unsigned char u8;
    
    sbit K3=P3^2;  //INT0
    sbit K4=P3^3;  //INT1
    
    sbit beep=P1^5;
    sbit led=P2^7;
    
    void delay(u16 i)
    {
     while(i--);
    }
    
    void Int1Init()
    {
        IT1=1;//触发方式
    	EX1=1;
    	EA=1; 
    }
    
    
    void Int1()  interrupt 2
    {
    	u16 i;
    	delay(1000);
    	if(K4==0)
    	{
    		P0=0x00;
    		P2=0x00;
    		for(i=100;i<150;i++)
    		{
    			beep=~beep;
    			delay(i);
    		}
    		delay(1000);
    		P0=0xff;
    		P2=0xff;
    		delay(1000);
    	}
    }
    
    void main()
    {
        Int1Init(); 
    	  while(1);
    }
    
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,556
精华内容 63,822
关键字:

外部中断程序怎么写