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

最新更新时间:1970-01-01来源: 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单片机  中断函数  外部中断 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic545569.html

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

推荐阅读

51单片机 定时器0中断实现1秒LED流水灯
使用定时器0中断实现LED1秒的流水灯#include <reg52.h>typedef unsigned int u16;typedef unsigned char u8;u8 code LED[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};u16 time,i; void timer0init(){ TMOD=0x01; ET0=1; EA=1; TR0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256;} void main(){ timer0init(); while(1);} void tim
发表于 2022-01-12
51单片机 外部中断0控制LED亮灭
使用51单片机外部中断0控制LED亮灭#include <reg52.h.>typedef unsigned char u8;typedef unsigned int u16; sbit key1=P3^2;sbit LED=P2^0; void delay(u16 i){ while(i--);} void int0init(){ IT0=1; EA=1; EX0=1;} void main(){ int0init(); { while(1) { } }} void ini0() interrupt 0{ if(key1==0) { delay(1000
发表于 2022-01-12
51单片机 8X8点阵屏循环左移
使用定时器0中断控制8x8点阵屏循环左移#include <reg51.h.>#include <intrins.h>typedef unsigned char u8;typedef unsigned int u16; sbit SRCLK=P3^6;sbit RCLK=P3^5;sbit SER=P3^4; u16 i,k;u16 time;  u8 code ledduan[][8]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24},             &
发表于 2022-01-12
51单片机项目设计:基于超声波的车库停车系统、车位检测
一、设计要求:毕业设计原题:本设计主要用于室内停车场中,利用51单片机或者嵌入式系统,结合超声波传感器,检测车位是否有车辆停入,并将车位占用情况,以LED模块形式进行实时显示,还可以将剩余车位数显示出来。利用超声波传感器,检测车位占用情况,并计算该区域剩余车位。我们假设一个区域内有4个车位,用超声波检测,发现占用车位相应位置的数码灯点亮,同时显示: 剩余“2”个车位。每个车位上,相距一定距离,安装一个超声波传感器,可以防止误判。剩余车位也就是在LED的旁边,辅助给出这个区域剩余的车位数,而不是整个停车场中总的剩余车位数。led是显示模块这个系统做的是停车场面对面各2个车位每个车位上安装一个传感器超声波测距模块必须要
发表于 2022-01-12
<font color='red'>51单片机</font>项目设计:基于超声波的车库停车系统、车位检测
51单片机项目设计:定时宠物喂食系统
链接:https://pan.baidu.com/s/1CKrXkIHite1LWaWM26gjeQ提取码:abcd取走点赞哦~题目要求:一、拟解决的主要问题1、仔细分析题目要求,理解投食器工作原理,明确工作任务和设计要求,确定整体设计方案,选定单片机以及相关传感器等元器件,实现投食器设定时间,按设定时间发出响声,吸引宠物过来并自动投放食物等功能;2、通过Proteus软件进行设计与仿真,给出系统硬件设计框图、元件选择及各部分电路原理图;3、软件程序流程并编写程序;4、软硬件联合调试;5、完成实物焊接,调试实物,二、设计方案基于单片机的自动投食器设计,通过模块化的设计,利用STC89C52单片机连接控制各模块,逐个完成其基本功能需求
发表于 2022-01-12
<font color='red'>51单片机</font>项目设计:定时宠物喂食系统
51单片机教程:按键输入、矩阵按键(按键巧用)proteus仿真+keil
proteus仿真,绘制电路功能:利用一个按键对一个发光二极管进行控制。这个可以说是最简单的按键输入实验了!由于是51单片机,内部有上拉电阻,我们就不要浪费材料在按键上接上拉了三、打开keil,编写如下代码#include <reg51.h>sbit key=P1^0;  //定义key为P1.0sbit led=P2^0; //定义LED为P2.0void delay10(void) //延时10ms{ int n=1000; while(n--);}void main(void){ while(1) { if(key==0)   //读P1.0引脚,如果引脚为低电平,则进入if { delay10
发表于 2022-01-12
<font color='red'>51单片机</font>教程:按键输入、矩阵按键(按键巧用)proteus仿真+keil

推荐帖子

关于二极管钳位电路的疑问?新手提问,见笑乐!
二极管的导通电压在0.7V所致,二极管正向导通之后阳极和阴极之间的电压稳定在0.7V(硅管),以上面那个二极管为例:高于VCC0.7V的电压造成上面二极管导通,水平线被钳制在Vcc~+0.7V,高于5.7V不一样也是导通吗?假设水平线是10V电压那还能钳制成5.7V吗?为什么???? 关于二极管钳位电路的疑问?新手提问,见笑乐!
刘W杰 模拟电子
一周好资源:buck电路
用PT4107制作BUCK电路的LED驱动电路 Buck型DCDC开关电源的研究与设计 开关电源设计-Buck调节器 Buck变换器原理 Buck型DC 峰值电流控制的Buck BUCK变换器稳压电源的设计方案 BUCK降压型开关稳压电源设计 基于Saber的Buck电路仿真与分析 技术分享:Buck变换器的电感计算 一种新型的软开关BUCK 同步BUCK中的开关损耗计算 SPWM控制技术在双BUCK逆变器中的应用 双Buck电路逆变器的建模与优化设计方案 双Buck
okhxyyo 电源技术
【TI荐课】#直播回放 : TI mmWave 毫米波雷达在汽车车内的应用#
//training.eeworld.com.cn/TI/show/course/5657【TI荐课】#直播回放:TImmWave毫米波雷达在汽车车内的应用#
SensorYoung TI技术论坛
WINCE5.0中实现Mass Storage的功能
本人是想将从USB的同步功能改变,作为一个U盘来识别。所以添加组建Massstorage,重新编译后 将USB插到电脑上,一开始是识别发现新硬件,然后等一下就提示硬件安装过程出现问题,无法正常运行。 请问做过的朋友和知道的朋友,帮帮忙!感激不尽!WINCE5.0中实现MassStorage的功能
88855t WindowsCE
华为资料分享
时常看看,挺有帮助。 华为资料分享
suhaihui 综合技术交流
开关电源的最佳布置流程是什么?
设计电路都会有工程师自己的设计流程,而有些电路的设计流程会要求的稍微严格一些,大家平时在设计开关电路的流程一般是什么样的? 这里贴出设计开关电路的几个重要步骤,大家可以根据自己平时的设计来进行排序,并给出这么设计的原因: a)放置变压器或电感; b)布置功率开关管电流环路; c)布置输出整流器电流环路; d)把控制电路与交流功率电路连接; e)布置输入环路和输入滤波器; f)布置输出负载环路和输出滤波器; 回答最有说服力的前三位,楼主自掏腰包奖励芯
wangerxian 电源技术
小广播
何立民专栏 单片机及嵌入式宝典

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

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