-
2020-03-05 21:11:06
实验11:外部中断0
这里要知道51单片机只有P3.2和P3.3引脚的低电平或下降沿信号中断。
注意51单片机一共支持5个中断源,其中2个外部中断源,3个内部中断源
(1)外部中断0,由INT0(P3.2引脚)输入。
(2)外部中断1,由INT1(P3.3引脚)输入。
(3)定时/计数器0溢出中断(T0)请求。
(4)定时/计数器0溢出中断(T1)请求。
(5)串行口发送/接收中断请求。1、设置中断触发方式,即IT0=1或0,IT1=1或0
当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。2、开对应的外部中断,即EX0=1或EX1=1;
外部中断0允许位或外部中断1允许位。3、开总中断,即EA=1;
4、等待外部设备产生中断请求,即通过P3.2,P.3.3口连接外部设备产生中断
5、中断响应,执行中断服务函数
/************************************************************************************** * 外部中断0实验 * 实现现象:下载程序后按下K3按键可以对D1小灯状态取反。 注意事项:无。 ***************************************************************************************/ #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit k3=P3^2; //定义按键K3 sbit led=P2^0; //定义P20口是led /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us *******************************************************************************/ void delay(u16 i) { while(i--); } /******************************************************************************* * 函 数 名 : Int1Init() * 函数功能 : 设置外部中断1 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Int0Init() { //设置INT0 IT0=1;//跳变沿出发方式(下降沿),当0时,为电平触发方式。 EX0=1;//打开INT0的中断允许。 确认是中断0而非中断1. EA=1;//打开总中断“开关” } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { Int0Init(); // 设置外部中断0 while(1); } /******************************************************************************* * 函 数 名 : duan0() * 函数功能 : 外部中断0的中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void duan0() interrupt 0 //外部中断0的中断函数 { delay(1000); //延时消抖 if(k3==0) { led=~led; } }
更多相关内容 -
STM32GPIO外部中断总结
2020-07-15 00:32:35STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处。 -
STM32CUBE配置GPIO中断,以及中断回调函数编写
2020-04-05 23:56:46STM32CUBE配置GPIO中断,以及中断回调函数编写 . -
子函数同时被中断函数和主函数
2020-08-03 14:20:45本文介绍了单片机中常见的中断函数调用子函数和主函数调用子函数的情况,如果同时调用会出现的问题一节解决方法。 -
为何HAL库的工程“进入不了”外部中断?
2021-01-06 12:15:18今天遇到一个惨痛的教训。 用CubeMX生成按键的外部中断工程,Nucleo的板子上PA5连接LED,PC13连接按键,并且外接上拉电阻。如图 于是在CubeMX配置PA5引脚和PC13引脚,一个作为推挽...那么中断函数在哪里呢?打开工 -
合泰单片机HT66FU50外部中断函数
2016-11-06 09:55:24合泰单片机HT66FU50 模块化编程 -
51单片机之——外部中断0(INT0)
2016-08-27 18:09:32在上面可以看到配置外部中断0相关的寄存器时,我们先打开EX0=1,允许外部中断产生,再EA = 1,打开总中断,这样就配置好了能产生外部中断0的先决条件,通过IT0 来配置中断的触发方式。在中断服务函数中,函数名“INT...寄存器是干什么的?怎么配置它?配置完寄存器后,有什么作用呢?
寄存器是中央处理器内的组成部分。它是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。寄存器可以用来暂存指令、暂存数据、暂存地址。换而言之,我们配置寄存器,便是给寄存器中赋予一定的值,而这些值又要与我们的目的想对应,这样它便会有相应的作用。
例如,芯片的资料规定,当给芯片的 A 寄存器赋“0x11”时,它会出现 B 现象;赋“0x77”时,它会出现 C 现象。那么当我们目的是完成 B 现象时,我们就只需要配置 A 寄存器为“0x11”即可。
虽说看起来很简单,并且去完成目的时的流程并非这么容易。但是,实实在在而言,这些就是控制寄存器的根本!
这里以外部中断0(INT0)为例,使得外部中断0每发生一次,最后一位数码管的数值加1。
前一篇博文已经提到,要实现外部中断0,就必须要配置好两个寄存器IP、IE。而对于中断优先级寄存器IP,当我们使用默认优先级时(上篇博文的优先级表格所述),就不必要去配置IP。
接下来附上IE寄存器的每一位的作用:
首先,中断允许位寄存器 IE 是可位寻址的,意思是说,我们可以单独的对D0~D7每一位进行操作,而不需要对 IE 整个赋值(为什么可以这样,因为keil的头文件“reg52.h”已经对 IE 的地址进行了定义)。
在这里说明一点,对于51单片机的 I/O 口而言,上电时,默认输出为高电平。对于其寄存器而言,上电是,默认为0。可见,当要完成外部中断0的配置时,我们只需要配置中的EX0、EA,当然还有外部中断0的触发方式(产生方式),这里就要看到中断及控制寄存器TCON,其成员及意义如下:
可见外部中断0和外部中断1的设置方式雷同,跟据上表所述,我们通过设置IT0来设置外部中断0的触发方式(分别为:低电平触发、下降沿触发),其中 IE 位由硬件自身控制,不需要软件操作。实例的核心代码如下:
/*数码管配置完成*/ void main() { IT0 = 1; //设置为下降沿触发 EX0 = 1; //外部中断0中断允许位 EA = 1; while(1); //等待外部中断0发生 { display(); } } void INT0() interrupt 0 //中断服务函数的书写格式 { if( IE == 1) //产生了外部中断,IE 自动置为1 { dspbuf[0]++; } }
在上面可以看到配置外部中断0相关的寄存器时,我们先打开EX0=1,允许外部中断产生,再EA = 1,打开总中断,这样就配置好了能产生外部中断0的先决条件,通过IT0 来配置中断的触发方式。在中断服务函数中,函数名“INT0”可自由编写,并且中单服务函数不需要声明,后面所加的“interrupt X”X为该中断对应的C语言序号。
值得注意的是,对于51单片机而言,上电之后,所有寄存器的值默认为“0”,所有 I/O 口的值默认为“1”。
通过外部中断的理解,很方便的能引出下一节的定时器/计数器中断。未完待续……
-
中断(外部中断0、外部中断1、定时器中断0、定时器中断1)
2020-07-17 08:36:37外部中断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; }
-
51单片机外部中断0实例详解
2021-05-22 03:49:54今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法。151单片机的中断源51单片机共有5个中断源,分别为:外部中断0定时器0中断外部中断1定时器1中断串口中断每一个中断都对应一个中断向量,中断向...今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法。
1 51单片机的中断源
51单片机共有5个中断源,分别为:外部中断0
定时器0中断
外部中断1
定时器1中断
串口中断
每一个中断都对应一个中断向量,中断向量表如下所示:
2 什么是中断事件
当中断发生时单片机将正在执行的程序暂时放下而去处理中断事件,当中断事件处理完毕后再接着去处理之前的事情,这样可以大大降低单片机的资源,提高执行效率。举个例子说明一下什么是中断:
我很喜欢打CS,每天晚上我都会抽时间打CS,但同时厨房里正在烧水,为了不使水烧干,我每隔5分钟就去厨房看一下水有没开,但这就错过了游戏老被别人爆头干掉,我很苦恼,怎么办。于是我在网上买了一个水烧开就会叫的水壶,这样我就不用每隔5分钟去厨房了从而可以专心的打游戏,只有听到水壶吱吱叫的时候,我去把水倒出来就可以了。
在这个例子里,打游戏就是主任务,水烧开就是中断,吱吱叫就是中断向量,听到吱吱响我就明白水烧开了,这时我要把打游戏这个主任务暂时放下,转而去处理水烧开了这个中断事件,水倒完后我就又回到了游戏这个主任务中。这样是不是提高了打游戏的效率呢?
3 中断的硬件实现
51单片机的外部中断0引脚接一只按键,该按键通过上拉电阻接到电源,即没有按键发生时单片机检测到的是高电平,当按键按下时单片机检测到的是低电平。单片机的P0.0引脚以灌电流的方式接了一只LED,当按键按下时LED灯点亮,没按键时LED灯熄灭。
4 中断的软件实现
单片机中断函数的写法比较固定,51单片机中断函数的写法如下:
void Initd() interrupt 0
其中:void:为中断函数的返回类型,中断函数多为空类型;
Initd():是中断函数的名称,这个函数名符合C语言函数命名规范就可以,随便起;
interrupt:为51单片机中断的关键字,必须这么写(51单片机必须这么写);
0:为中断向量,该值详看第一个表格,如果是外部中断1就写2,如果是定时器1中断就写3;
中断函数不用在主函数中调用,只要中断事件发生,单片机自己主动会调到中断函数中。
该例子的函数如下所示:
5仿真实现
当按键发生时,LED灯点亮,如下图所示。注意对比两种图中按键的状态。
-
STM8L051 外部中断 库函数例程 IAR
2017-09-07 10:37:33STM8L051 外部中断 库函数例程 IAR 需要者可自行下载,下载完成后可在资源下方进行评论,方便后来者参考下载 -
STM32 关于外部中断线、中断源和中断服务函数的问题
2018-08-27 17:17:10STM32 关于外部中断线、中断源和中断服务函数的问题 中断线问题: 上图可以看出,PA0、PB0...PG0共用的EXTI0中断线,PA1、PB1...PG1共用的EXTI1中断线,也就是 编程里面的(如下图库文件),对应16个中断线,... -
STM32 FreeRTOS 外部中断服务函数注意事项
2018-09-13 14:26:05STM32 FreeRTOS 外部中断服务函数注意事项 移植正点原子的FreeRTOS操作系统到我们自己的工程,发现的一个注意事项; 看下面代码,带FreeRTOS的外部中断服务函数,实现按键消抖,不能用delay_ms()或者和vTaskDelay... -
STC89C52单片机外部中断0实验
2021-05-19 17:30:46原标题:STC89C52单片机外部中断0实验/////////////////////////////////////////////////////////////////////////实现功能: 设置,然后通过点亮与P1口第一个引脚相连的D1来显示系统进入了外部中断0实验板型号:BS... -
C51教程 第四个51程序:中断控制--外部中断0
2020-02-18 20:31:52单片机中断是指CPU在正常执行程序的过程中,由于计算机内部或外部发生了另一...今天要做的一个实验叫做外部中断,按下按键,停止主程序中的内容,立即转去执行中断服务函数。 我们主要看到原理图与代码,了解中断是什... -
51单片机学习——8.1外部中断0和1
2021-02-13 08:49:54外部中断0和1外部中断原理编程原理(外部中断0)代码实现 外部中断原理 外部中断0:(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置... -
STM32 外部中断详解(原理+配置代码)
2021-05-23 08:50:49本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断1 前言打算写一下中断,又忍不住想说一下中断的概念,去书上翻一翻,或者自己在搜索引擎上搜一下,都可以找到一大堆,... -
外部中断与内部中断原理与使用
2021-07-26 09:36:51外部中断源2个 1.INT0 — 由P3.2端口控制引入,低水平或者下降沿引起。(下降沿就是给5V后给0V形成下降电压) 2.INT1 —由P3.3端口控制引入,低水平或者下降沿引起。 (这两个中断源标志与中断方式由特殊功能寄存器... -
STM8S103K3T6外部中断源程序_电机测速
2018-12-03 17:43:07主函数调用其他函数利用外部中断 tim4定时1s,测电机的转速, 通过在线仿真观察外部中断情况 有外部中断需要的,测电机的都可以下载参考参考 -
STM32外部中断
2021-05-22 21:58:11外部中断概述 外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续... -
浅谈外部中断中的相关函数设置
2018-04-16 23:38:37说在前面:记得前几天写了一个用按键来控制灯的函数,但是无论怎样都无法实现函数的重复使用,一开始以为是没有设置好循环,但是,因为没有实现外部中断才做不了循环操作2.外部中断1.作为STM32而言,每一个IO口都... -
进一步理解中断函数
2021-05-18 17:10:051.另一个外部中断前面两讲都是围绕外部中断0(P3.2的功能)来讲解,这里我们也还有一个外部中断1(P3.3的功能)。P3.3要想实现上一讲的功能只需杜邦线接下面的IO端口即可代码就是把“EX0”改为“EX1”,“IT0”改为“IT1... -
ESP32外部中断
2021-11-21 17:43:22文章目录前言一、外部中断概念二、配置外部中断1.编写中断服务函数2.配置中断总结 前言 提示:以下是本篇文章正文内容 一、外部中断概念 外部中断是单片机实时地处理外部事件的一种内部机制 当外部事件发生后,... -
8051外部中断0解析
2019-07-23 10:23:44我们令IT0 = 1, 即选择了"边沿触发", 所以每当独立按键按下时, 中断处理函数EX_INT0()就会执行. 当进入中断处理函数执行时, 若P32引脚的电平为低电平, 则说明K3按键已按下; 若P32引脚的电平为高电平, 说明K3按键已... -
13 . 外部中断实验
2021-05-13 10:50:46外部中断实验 介绍了STM32F10x 的中断,就来学习下外部中断。要实现的功能与按键实验一样,即通过按键控制LED,只不过这里采用外部中断方式进行控制。 1. 外部中断介绍 EXTI 简介 STM32F10x 外部中断/事件控制器... -
8051外部中断1解析
2019-07-23 10:41:21程序实现的功能: 在实验板上左下方有一...(外部中断1和外部中断0在处理上类似, 红色的部分为不同之处) 中断处理程序标号: 外部中断0 -----------> 0 定时器0中断 -----------> 1 外部中断1 -----------&... -
STM32CubeMX实战教程(三)——外部中断(中断及HAL_Delay函数避坑)
2020-02-20 19:57:01学单片机的,相信对中断的概念都已经了如指掌了,中断具体是什么我在这里也就不再详细说明,不懂的上网找找也一大堆。那么在介绍实验之前我先跟大家简单讲讲STM32当中的NVIC(嵌套向量中断控制器) NVIC NVIC(嵌套... -
STM32F103:外部中断(EXTI)——原理和程序
2021-11-23 13:50:08一、外部中断(EXTI)—简介 EXTI (External interrupt/event controller)——外部中断/事件控制器。 互联型STM32有20个能够产生事件/中断请求的边沿检测器,STM32F103系列有19个能够产生事件/中断请求的边沿检测器。 ... -
51单片机——外部中断
2021-04-16 12:35:06一、外部中断 1.1 中断 关于中断的概念在上一篇博客中已经提到了。(传送门:51单片机入门教程(5)——定时器中断) 中断是指计算机运行过程中,出现...INT0 – 外部中断0 最高 0 T0 – 定时器/计数器0中断 第2 ... -
实验5 外部中断实验.zip
2020-03-18 09:31:04STM32F10X系列单片机,外部中断实验 实现功能:按键触发,产生下降沿进入中断,执行中断服务函数