C51/C52单片机的中断(EXTI)介绍及实现(二)

最新更新时间:2022-04-20来源: eefocus关键字:C51  C52  单片机  中断  EXTI 手机看文章 扫描二维码
随时随地手机看文章

一、什么是中断


重复说明,CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。


简单来说就是:打断当前正在做的事,去执行另外的事,执行完后再回来接着做前面被打断的事,如图所示:

程序中的表现方式:

引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统。


二、51单片机的中断系统结构


89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套。

INT0、INT1分别为外部中断0和外部中断1,分别接P32和P33


TO、T1分别是定时器中断0和定时器中断1


RXTX为串口中断,分别接P32和P33。它们的优先级从上至下INT0优先级最高,串口中断优先级最低


比如INT0:TCON寄存器是配置IT0的,设置高低电平有效;IE寄存器控制外部中断和总中断;IP设定优先级


三、寄存器介绍


1、IE寄存器:中断允许控制


CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的

EX0(IE.0),外部中断0允许位;

ET0(IE.1),定时/计数器T0中断允许位;

EX1(IE.2),外部中断1允许位;

ET1(IE.3),定时/计数器T1中断允许位;

ES(IE.4),串行口中断允许位;

EA (IE.7), CPU中断允许(总允许)位


2、TCON寄存器:中断请求标志


IT0(TCON.0),外部中断0触发方式控制位。

        当IT0=0时,为电平触发方式(即高低电平)。


        当IT0=1时,为边沿触发方式(下降沿有效)。


IE0(TCON.1),外部中断0中断请求标志位。

IT1(TCON.2),外部中断1触发方式控制位。

IE1(TCON.3),外部中断1中断请求标志位。

TF0(TCON.5),定时/计数器T0溢出中断请求标志位。

TF1(TCON.7),定时/计数器T1溢出中断请求标志位。      

3、优先级的问题


同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:

优先级三条原则:


CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。

正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。

正在进行的低优先级中断服务,能被高优先级中断请求所中断。

为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。


四、中断源

五、中断响应条件及实现步骤


中断响应条件


 中断源有中断请求;

 此中断源的中断允许位为1;

 CPU开中断(即EA=1)。

以上三条同时满足时,CPU才有可能响应中断


步骤:


主程序中需要有以下代码:


EA=1;//打开总中断开关

EX0=1;//开外部中断0

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

中断服务函数:


void   int0   ()  interrupt   0    using  1

{

       do anything that you want

}

程序-如下:


#include "reg52.h"              //此文件中定义了单片机的一些特殊功能寄存器

 

typedef unsigned int u16;      //对数据类型进行声明定义

typedef unsigned char u8;

 

 

sbit k3=P3^2;  //定义按键K3

sbit led=P2^0;       //定义P20口是led

 

void delay(u16 i)

{

       while(i--);     

}

 

void Int0Init()

{

       //设置INT0

       IT0=1;//跳变沿出发方式(下降沿)  按键按下为0,由1跳变为0就是下降沿

       EX0=1;//打开INT0的中断允许。      

       EA=1;//打开总中断     

}

 

void main()

{     

       Int0Init();  //  设置外部中断0

       while(1);        

}

 

void Int0()      interrupt 0            //外部中断0的中断函数

{

       delay(1000);   //延时消抖

       if(k3==0)

       {

              led=~led;

       }

}

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

版权声明:本文为CSDN博主「nandycooh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_42108484/article/details/88147564


关键字:C51  C52  单片机  中断  EXTI 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic564504.html

上一篇:51单片机的静态和动态数码管的显示
下一篇:51单片机定时器的方式0使用注意

推荐阅读

MSP432笔记——按键中断
GPIO按键外部中断所用板卡 MSP432P401R LaunchPad按键电路图按键连接GPIO P1.1 P1.4按键按下时,对应IO变化为低电平,按键必须使用上拉电阻程序编写使用库函数 driverLibmain中需要的步骤{设置IO输入/输出方向,带上拉电阻的输入模式清除中断标识位,在配置时就需要清除标志位设置中断触发边沿,上升沿/下降沿使能GPIO中断使能总中断(3个中断函数)}main源码int main(void){ /* Stop Watchdog */ MAP_WDT_A_holdTimer(); //GPIO Interrupt test GPIO_setAsInputPinWithPullUpResis
发表于 2022-08-10
MSP432笔记——按键<font color='red'>中断</font>
MSP432笔记——TIM定时器中断
使用driverlib库函数以TA3为例前期配置时钟源信号源电压等级flash //Flash FlashCtl_setWaitState(FLASH_BANK0,1); FlashCtl_setWaitState(FLASH_BANK1,1); //PCM state PCM_setPowerState(PCM_AM_LDO_VCORE1); //CS configure CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);配置定时器 Config参数配置结构体 config开始定时器 start使能定时器中断 (清空标志位、打开定时器的中断) Timer_A_UpMod
发表于 2022-08-10
基于MSP432的中断练习
/*MSP432:基于寄存器编程:利用P1.1和P1.4引脚外部中断,实现对LED灯亮灭的控制。P1.1和P1.4引脚连接S1和S2按键,该按键按下将触发引脚中断,P2.1和P2.2引脚分别连接连个LED灯,当按键P1.1被按下后,P2.1引脚LED灯的亮灭状态将会发生翻转,当按键P1.4按下后,P2.2引脚的电平将发生翻转。*///中断服务程序extern void PORT1_IRQHandler(void){ if(P1IFG & BIT1) { P2OUT ^= BIT1; P1IFG &= ~BIT1; } if(P1IFG & BIT4) { P2OUT ^= BIT2; P1IFG &
发表于 2022-08-10
基于MSP432的<font color='red'>中断</font>练习
新唐N76E003+GPRS 单片机复位故障排除手记
应用场景GPRS模块采用AIR202/AIR208,电源方案是JW5033;单片机采用新唐N76E003,双串口,18K flash,电源与GPRS的DCDC 即JW5033共用一个5V输入电源。问题描述GPRS联网时或联网成功后收发数据的数据,新唐单片机复位重启。故障排除1、单片机电源前增加电容初步怀疑是供电不足,使用示波器观察后排除此原因,如果真的是供电不足,GPRS模块也应该会同时重启,实际上单片机模块重启时GPRS模块一直正常工作。2、设置单片机P2.0引脚为输入模式而非复位模式将P2.0引脚由复位引脚更改为输入引脚后,故障排除。我的理解是更改为输入引脚后,射频干扰不足以引起单片机复位了,深层次的原因不详。
发表于 2022-08-10
新唐N76E003+GPRS <font color='red'>单片机</font>复位故障排除手记
关于51单片机的地址空间溢出以及解决方法的个人看法(proteus无法仿真)
在51单片机程序编写中,当变量过多而且数据类型过大的话,容易在编译的时候出现以下的问题,具体表现为: *** ERROR L107: ADDRESS SPACE OVERFLOWSPACE: DATA SEGMENT: _DATA_GROUP_LENGTH: 0019HProgram Size: data=130.0 xdata=7 code=3267Target not created.这样子也就是所谓的编译失败,不能生成HEX文件,更加无法烧写到程序中去,那么如何解决这个问题呢,我在网上找到了解法,网上的具体步骤如下:1.先点击这个图标2.在其中的memory model 将small改成compact选项,那么即可编译通过。3
发表于 2022-08-10
关于51<font color='red'>单片机</font>的地址空间溢出以及解决方法的个人看法(proteus无法仿真)
51单片机脉冲信号的计数和LCD显示
设计目标和思路在个人剂量仪开发的过程中,从探头输出的核脉冲信号经过后期放大,成形,滤波以及甄别之后,成为一系列脉冲信号输出,这种脉冲信号由于衰变的随机性,并不是固定频率的脉冲信号。我们本次设计就是针对这种脉冲进形脉冲信号的计数以及在LCD1602显示屏上面的显示。这是C语言的代码部分#include"reg51.h" #include <stdio.h>#include <math.h>#include <string.h>#include <intrins.h>#define uint8_t unsigned char //0-255#define uint16
发表于 2022-08-10
51<font color='red'>单片机</font>脉冲信号的计数和LCD显示

推荐帖子

C51编程规范
你看看有用不?免费C51编程规范
80后 单片机
AD中差分布线连不到焊盘上是怎么回事?
定义了差分对以后,采用DifferentialPairRouting开始布线,可是一边的两个焊盘走线总是连不上另外一边的两个焊盘 <imgname="aimg_3rmoc"title="Altium9中正确的差分对走线方法"style="cursor:pointer;-ms-word-wrap:break-word;"alt=""src="http://wiki.altium
scyshuier PCB设计
【通知】电源课程更新
鉴于大家对电源课程只有一次考试机会,不能多次l练习进而强化记忆的意见,现决定更改考试练习的方式,可进行多次考试从而强化记忆。 由于课程与考试为捆绑发布,更新考试必须更新课程,特将在9月27日中午12:00进行课程更新。更新后课程学习记录将清空,请要参加活动网友提前截图,或等到课程更新后,取得更好的成绩再截图。 给大家带来的不便我们感到非常抱歉,请谅解!【通知】电源课程更新
EEWORLD社区 模拟与混合信号
synopsys vcs 安装
求问redhat6.8环境下如何安装synopsysvcs!?synopsysvcs安装
xianw Altera SoC
声卡虚拟示波器
声卡虚拟示波器声卡虚拟示波器
tsunami 模拟电子
菜鸟求解
菜鸟求解。。。请问如何把atmega328pb-au刷成arduino使用? 菜鸟求解
wz_fly 单片机
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved