51单片机-进一步理解中断函数

发布者:RainbowJoy最新更新时间:2021-10-19 来源: eefocus关键字:51单片机  中断函数  外部中断 手机看文章 扫描二维码
随时随地手机看文章

1.另一个外部中断

前面两讲都是围绕外部中断0(P3.2的功能)来讲解,这里我们也还有一个外部中断1(P3.3的功能)。P3.3要想实现上一讲的功能只需杜邦线接下面的IO端口即可

6.10.png

代码就是把“EX0”改为“EX1”,“IT0”改为“IT1”。

interrupt后面的0要改为2,函数名我们改为“EXTI1_IRQHandler()”


#include  

#include //详见第六章第8讲

 

void main()

{  

    IT1 = 1;   //下降沿触发模式

    EX1 = 1;

    EA  = 1;

   

    LED_Init();//初始化LED硬件模块 

    while(1);

}

  

void EXTI1_IRQHandler() interrupt 2

{

    LED2=!LED2; 

}


再次提醒,杜邦线的一头接的是P3.3。

至于interrupt后面的数字为什么要为2,大家先熟悉这张图了解一下先

6.11.png

更多中断知识的概念参考《手把手教你学51单片机》文档6.5节。


2.按键触发中断

我们每次要把P3.2和P3.3外部拉低或释放,都需要拔插杜邦线,这样太麻烦,我们可以用按键来取代这些拔插动作,按键按下不放就相当于一直拉低,跟杜邦线一直插着GND一个效果,松开按键就跟杜邦线没插GND一样。


可是P3.2和P3.3没有直接相连的按键,不过没关系,我们把杜邦线这样接,让P3.3和P2.3一起相连,K4的按键动作可以使P2.3和P3.3同步电平

6.12.png

我们要用到按键,所以别忘了初始化按键模块。

#include  

#include //详见第六章第8讲

 

void main()

{  

    IT1 = 1;   //下降沿触发模式

    EX1 = 1;

    EA  = 1;

   

    LED_Init();//初始化LED硬件模块 

    KEY_Init();//初始化按键功能模块

    while(1);

}

  

void EXTI1_IRQHandler() interrupt 2

{

    LED2=!LED2; 

}


3.去抖动


按键似乎没能很灵敏的按一下松手LED2就跳变一次亮或灭的效果,那是因为我们没有延时消抖,一个按键动作就存在好几个下降沿了,导致中断函数被执行了几遍。


在中断函数中加延时就可以消除这种失灵现象了,不过在以后编程里不能在中断函数里使用延时,这样会使程序的执行效率大打折扣,我们本次只是作为测试代码才在中断函数里用延时。


#include  

#include //详见第六章第8讲

 

void main()

{  

    IT1 = 1;   //下降沿触发模式

    EX1 = 1;

    EA  = 1;

   

    LED_Init();//初始化LED硬件模块 

    KEY_Init();//初始化按键功能模块

    while(1);

}

  

//请把P3.3和P2.3用杜邦线连接起来

void EXTI1_IRQHandler() interrupt 2

{

    delay_ms(50);//去抖动

    if(INT1==0)  //P3.3是否还处于低电平的稳定接触状态,INT1已在“#include ”中定义好了

    {

        LED2=!LED2; 

    } 

}


这样就可以达到按下松手一次,LED2的状态只能取反一次的灵敏效果。如果我们一直按着不放,LED2也只是跳变一次而已,有点像不支持连按功能,这是因为“IT1=1;”的原因。


要是改为“IT1=0;”,这样K4按键就有种支持连按的感觉从而LED2就会不停闪烁了。按键按下一直不放就会不停地进入中断函数。


#include  

#include //详见第六章第8讲

 

void main()

{  

    IT1 = 0;   //低电平状态下触发

    EX1 = 1;

    EA  = 1;

   

    LED_Init();//初始化LED硬件模块 

    KEY_Init();//初始化按键功能模块

    while(1);

}

  

//请把P3.3和P2.3用杜邦线连接起来

void EXTI1_IRQHandler() interrupt 2

{

    delay_ms(50);//去抖动

    if(INT1==0)  //P3.3是否还处于低电平的稳定接触状态

    {

        LED2=!LED2; 

    } 

}

关键字:51单片机  中断函数  外部中断 引用地址:51单片机-进一步理解中断函数

上一篇:51单片机-中断函数
下一篇:51单片机-中断的实验现象

推荐阅读最新更新时间:2024-11-16 21:54

51单片机内部EEPROM的应用
STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。 ISP:In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。比如我们通过电脑给STC单片机下载程序,或给AT89S51单片机下载程序,这就是利用了ISP技术。 IAP:In Application Programable 是指在应用编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候可以
[单片机]
S3C内部中断外部中断
1.中断分两大类:内部中断和外部中断。 2.外部中断。24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体参考datesheet数据手册。 寄存器:EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23的触发方式。 EINTFLT0-EINTFLT3:控制滤波时钟和滤波宽度。 EINTPEND:这个是中断挂起寄存器,清除时要写1,后面还有几个是写1清除。当一个外部中断(EINT4-EINT23)发生后,那么相应的位会被置1。为什么没有EINT0-EINT3,呵呵,看
[单片机]
基于51单片机的LED旋转显示器制作
由于刚学51单片机,加上制作电路板软件也是从零开始,的确花了我不少的时间和精力。不过也就是在这艰难的独立制作中,真正学到了不少实在的东西。原理就不多说了。 下面分享一下我的制作过程。这里有关于本制作的更详细的图片展示: 首先是制作效果图: 电路图: 电路采用的是无限供电模块给单片机供电的。采用无限供电。无摩擦,震动小。LED与单片机引脚之间的连接采用的是细小的漆包线。省去了限流电阻。省去复位电路制作起来更简单方便。 准备主要材料:因很多人不知材料哪里买,先将地址链接在材料名称,点击就进去了 1.51单片机1片 2.单片机插槽和万能电路板(洞洞板) 3.贴片LED0603(颜色自定,如果焊接技术不够
[单片机]
基于<font color='red'>51单片机</font>的LED旋转显示器制作
51单片机入门 - SPI总线
UART、 I2C 和 SPI 是单片机系统中最常用的三种通信协议。 1、初步介绍 SPI 是一种高速的、全双工、同步通信总线,标准的 SPI 也仅仅使用 4 个引脚,常用于单片机和 EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。 SPI 通信原理比 I2C要简单,它主要是主从方式通信,这种模式通常只有一个主机和一个或者多个从机,标准的 SPI 是 4 根线,分别是 SSEL( 片选,也写作 SCS)、 SCLK( 时钟,也写作 SCK)、 MOSI( 主机输出从机输入Master Output/Slave Input) 和 MISO( 主机输入从机输出 Master Input/Slave O
[单片机]
51单片机学习笔记之中断
(一)寄存器 要想学习中断那么首先就要了解寄存器,在这里我们学习一下什么是寄存器,寄存器怎么用。 1.什么是寄存器 寄存器是特殊的RAM,特殊功能寄存器是控制单片机硬件的开关(例如IE)或者是指示单片机状态的信号(例如PSW),通过特殊寄存器你就可以方便的控制整个MCU,并且知道当前的MCU的工作状态。 2.寄存器怎么用 AT89S51单片机中的特殊功能寄存器(SFR)的单元地址映射在片内RAM区的80H~FFH区域中,它共有26个,离散地分布在该区域中。用到哪个寄存器就相应配置哪个寄存器即可。寄存器太多就不一一写出来了,用到再去找就好。 (二)中断 单片机的中断是由单片机片内的中断系统来实现的。当中断请求源(简称中断
[单片机]
<font color='red'>51单片机</font>学习笔记之<font color='red'>中断</font>
6位数字显示频率计数器电路及51单片机源程序
1.频率计算器功能 利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。 2.电路原理图 3.程序设计内容 (1).定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数
[单片机]
6位数字显示频率计数器电路及<font color='red'>51单片机</font>源程序
51单片机C语言调用汇编子程序的简便方法
1、在汇编文件中,程序前边加上如下三句话就可以: PUBLIC _delay, _binrlc ;定义公用子程序名,这里定义了两个子程序(有下划线) LUOYUAN SEGMENT CODE ;程序段命名,LUOYUAN,叫啥名都可以 RSEG LUOYUAN 下边放子程序(程序名要下划线,其它标号不要下划线) ;汇编语言文件 PUBLIC _delay, _binrlc;定义子程序名 LUOYUAN SEGMENT CODE ;命名LUOYUAN的程序段 RSEG LUOYUAN _delay: MOV P1,#55H MOV R2,#30H DJNZ R2,$ RET
[单片机]
基于51单片机设计的用电故障控制系统
1 引言   对于电网短路和线路故障检测保护已有不少研究。市面上的电器短路、过载、超压的保护器功能单一。容易损坏,没用提示功能,不够人性化。但随人们生活水平的不断提高。用电设备也不断增加,产生了肓目用电现象。这给人们造成极大的安全隐患。其中危害性最大的用电故障有三种:输入电压过高、室内线路严重过载、用电器短路。本文设计的单片机AT89C5l用电故障控制系统的目的就是为了防止这三种故障带来的危害。   2 硬件的组成   单片机用电故障控制系统的硬件分别是:由降压变压器、2个相瓦串联的感应线圈、升压变JK器、电磁开关、5V稳压电源、超压过流信号获取比较电路、可编程接门扩展芯片8255、HD44780字符液晶显示模块、ISD26
[单片机]
基于<font color='red'>51单片机</font>设计的用电故障控制系统

推荐帖子

【基于ESP32-S2-Kaluga-1的物联网室内环境监测仪】开发环境体验-Arduino
乐鑫官网提供了对arduino的支持 https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html 步骤是: 下载支持包:https://github.com/espressif/arduino-esp32.git 安装到路径:/hardware/espressif/esp32 然后使用git命令执行:gitsubmoduleupdate--in
dql2016 DigiKey得捷技术专区
MSP430F149小系统开发板实现USART数据接收中断
//******************************************************************************//MSP-FET430P140Demo-USART0,Ultra-LowPwrUART2400EchoISR,32kHzACLK////Description:Echoareceivedcharacter,RXISRused.IntheMainloopUART0//ismad
fish001 微控制器 MCU
STM32使用DMA时当前的内存地址应该怎么获得?(已解决)
SxM0AR是设置的内存地址,如果DMA使用循环读取内存地址应该是在SxM0AR到SxM0AR+数组长度之间变化我读取了SxM0AR,这个地址是固定的,在程序运行时不会动态变化那么如果想知道当前DMA正在向哪个内存地址写入数据应该如何获取这个地址?STM32使用DMA时当前的内存地址应该怎么获得?(已解决)NDTR
littleshrimp stm32/stm8
高速放大器设计三大常见问题,德州仪器帮您攻克!
在使用高速放大器进行设计时,一定要熟悉其通用的规格并了解其特定概念。在本文中,高速放大器是指增益带宽积(GBW)大于或等于50MHz的运算放大器(opamps)。(这些概念也适用于低速器件。)以下设计师在使用高速放大器时遇到的一些常见问题。问:为什么某些高速运算放大器具有最小增益规格?答:失补偿的运算放大器具有闭环最小增益稳定规格,但与单位增益稳定的同类产品相比,在相同电流消耗下,其可提供更大的GBW​​和更低的噪声。失补偿仅表示Aol(开环增益)
alan000345 模拟与混合信号
我的F28035是怎么回事?
编译器:CCSV5目标IC:F28035现象:正在debug的,把文件修改一下又重新装入时,出现了无法装入的现象,后又重新启动电脑,再次DEBUG,还是如此,后来无意中看了下面的红字,真想~~呜呜!0x3f7ff6处没写什么啊,CMD文件中不用这部分的。 我的F28035是怎么回事?看到了,要用这个的,我在程序中没有用FLASHA,也没对它擦除,是不是这个原因?是不是也把BEGIN的位置也改一下呢? 原来,为了避开经常使用的FLASH
dontium 微控制器 MCU
正从51向msp430过渡,请各位给点意见或指导
正从51向msp430过渡,请各位给点意见或指导,请大家积极分享心得,谢谢正从51向msp430过渡,请各位给点意见或指导买块开发板学习,不要舍不得花钱~~要说开发板,launchpad才4.3美刀,很便宜。然后把外设都使用一遍就基本会了,有51基础,430很容易上手留意EEWorld的相关团购,呵呵……
iceiceice1 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved