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-11 10:31

如何在Linux下进行stc51单片机的开发
第一次接触 单片机 ,自然选择了简单的51单片机。然而我的操作系统是 Linux 。在 Windows 下上手51似乎很容易。但是 Linux 上搭建 51 开发环境不是很顺。 那么谈谈 Linux 我如何搭建 STC89C52RC 的开发环境吧。 (一) 选择自己喜好的 代码编辑器 即可。vim , emacs , gedit 等都可以。 (二) 安装编译器。一般选择 sdcc 。一般可从发行版的包管理器中直接安装。 如Arch中:   $ sudo pacman -S sdcc 如果不行,需要自行下载编译。 简单介绍使用sdcc: 假如当前目录有一个写好的源文件 main.c 。 使用如下简单方式即可编译。 $ s
[单片机]
51单片机时钟精度误差的解决
前几天用STC89C52单片机制作了一个电子时钟,经过一段时间的实验,发现时间精度存在误差,一分钟慢4秒左右。 这可了不得,十分钟就要慢40秒,一天下来不得慢半96分钟!!! 这个单片机晶振频率为11.0592mhz,和大部分时钟的晶振频率相同,应该没有问题。 后天考虑到源代码: 在定时器中断函数里: void t0(void) interrupt 1 using 0 { tcount++; if(tcount==4000) {tcount=0; second++; if(second==60) {second=0; minute++; if(minut
[单片机]
基于51单片机的多机并行通信系统应用
在一些复杂的系统中,系统与分系统、分系统与设备等之间存在数据的传递问题,往往采用通信的方式来解决。由于分系统、没备等通信波特率的不同,特别是一些特殊波特率设备的存在,使得系统中设备间的相互通信不易实现。例如,在一个系统中,上位机接收某一设备的数据,如图1所示,设备l和设备2采用的是172.8 kbps的波特率,而上位机用VB编程,其通信波特率为115.2 kbps、128 kbps或256 kbps,等,这样设备之间就不能相互通信,给设计带来困难。为了解决上述问题,采用双单片机电路,设计了波特率变换器,将接收波特率为172.8 kbps的数据,转换成波特率为115.2 kbps的输出,从而使不同波特率设备之间的通信成为可能。
[单片机]
基于<font color='red'>51单片机</font>的多机并行通信系统应用
基于AT89C51单片机的ADC0808程序
AT89C51单片机介绍 AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。 由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 AT89C51管脚说明 ATMEL公司的AT89C51是一种高效微控制器。采用40引脚双列直插封装形式。AT89C51单片机是高
[单片机]
基于AT89C<font color='red'>51单片机</font>的ADC0808程序
51单片机P3口介绍
P3.0 P3.7为P3口的8位双向口线,第一功能为基本输入/输出;各脚第二功能见下表: P3口内部结构及其功能描述 如图是P2口内部1位的电路结构。 当P3端口使用第一功能(通用I/O口)输出数据时, 第二输出功能 信号应保持高电平,使与非门开锁,此时端口数据锁存器的输出端Q可以控制P3.x引脚上的输出电平; 当P3端口使用第二输出功能时,P3端口对应位的数据锁存器应置1,使与非门开锁,此时 第二输出功能 输出的信号可控制P3.x引脚上的输出电平; 当P3端口作为输入端口时,无论输入的是第一功能还是第二功能的信号,相应位的输出锁存器和 第二输出功能 信号都应保持为1,使下拉驱动器截止;
[单片机]
基于AT89C51单片机直流电机PWM调速程序分享
这是一款AT89C51单片机直流电机PWM调速程序,程序可以直接用于AT89C52、AT89S51、AT89S51,STC89C51、STC89C52单片机中,单片机晶振采用11.0592M,直流电机由L298集成电路控制,产生的PWM的频率约为91Hz。L298各引脚已在程序中标明,原理图大家可以自己画一下,这里就不具给出。下面是源程序。 #include[reg52.h》//注意请把‘ [ ’换成 “《”,下同。否则编译时会出错。 #include [intrins.h》// #define uchar unsigned char #define uint unsigned int sbit en1=P2^
[单片机]
基于AT89C<font color='red'>51单片机</font>直流电机PWM调速程序分享
STM32-一文读懂EXTI外部中断/事件系统
STM32的外部中断/事件系统简介 注意这里的外部中断指的是EXTI,是芯片的外部中断,主要是由芯片外部事件触发的中断,不是内核的外部中断!在《STM32-异常与中断》中提到的外部中断均是相对于内核而言的,比如串口中断、定时器中断等等都是(内核的)外部中断。 大部分的STM32外部中断/事件控制器由19个产生事件/中断请求的边沿检测器组成,支持 19 个外部中断/事件请求,这19 个外部分别中断为: (互联型 )产品有20个) 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。 线 17:连接到 RTC 闹钟事件。 线 18:连接到 USB 唤醒事件。 每个中断设有状态位,每个中断/事件都有独
[单片机]
STM32-一文读懂<font color='red'>EXTI</font><font color='red'>外部中断</font>/事件系统
STM32如何确定执行哪个中断函数
如下面所示: NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //NRF24L01 中断响应 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级为1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_Init(&NVIC_InitStructure); 则对应的中断函数就是 STM3210x_
[单片机]

推荐帖子

如何为便携式系统选择电容和电感元件(下)
设计人员在考虑无源器件时,他们想到的是电感电容的生产容限,一般为±20%或±10%。这在理论上是对的,但在实际应用中却不然。本文介绍电容电感易受影响的一些参数以及系统设计人员必须了解的知识,并讨论如何为最小但最高效的便携式电源系统解决方案选择外部元件。选择电感为便携式电源应用选择电感,需要考虑的最重要的三点是:尺寸大小、尺寸大小,第三还是尺寸大小。移动电话的电路板面积十分紧俏珍贵,随着MP3播放器、电视和视频等各种功能被增加到电话中时,尤其如此。功能增加也将增加电池的电流消耗量。因
咖啡不加糖 分立器件
刚学单片机开发,请给个绿色破解版的开发工具吧,谢谢
刚学单片机开发,请给个绿色破解版的开发工具吧,谢谢wensoft80@sina.com刚学单片机开发,请给个绿色破解版的开发工具吧,谢谢一般只要在国内服务器上下到的KEIL里面都带完全版的注册码多找找看里面的文件KEIL,eclipse单片机开发?51,avr,pic?好多的,不知你学那种?y原来这么多。。。只要用好破解补丁就可以了,这种资源太不稀缺了
yhy_042 嵌入式系统
TMS320F28335通用输入/输出口GPIO相关寄存器介绍
1、GPxMUX寄存器(功能选择寄存器)每个I/O口都有一个功能选择寄存器,功能选择寄存器主要用于选择I/O工作在特殊功能还是通用数组I/O模式。在复位时,所有GPIO配置成通用数字模式。1)如果GPxMUX.bit=0,配置成通用数字I/O功能;2)如果GPxMUX.bit=1,配置成特殊外设功能口(如SCI、CAN);I/O的输入功能和外设的输入通道总是被使能的,输出通道是通用数组I/O和特殊外设复用的。如果引脚配置成通用数组I/O功能,相应的外设功能将被禁
fish001 DSP 与 ARM 处理器
谁有tornado2.2 for mips ?
小弟刚刚学习vxworks,要作MIPS的BSP开发,请问谁有tornado2.2formips呀?谁有tornado2.2formips?我能够用forarm的版本,修改下交叉编译器来作开发MIPS的BSP用吗?如果能够,我怎么作呀?兄弟,真的不可以的啊。编译器的指令不同啊。同意楼上的!楼主你为啥一定要用mips呢?现在市面上arm的开发板很多啊我手头有一块板子呀。呵呵!不行,我也就死心了。有TornadoforMIPS,不过要自己慢慢找,我也要to
zwjiang 嵌入式系统
新建的DSP工程总会碰到一个警告
使用的是28335的板子,新建工程添加头文件和源文件后不编写任何程序都会出现一个纯文本查看复制代码Linkingwarning#10247-D:creatingoutputsectionramfuncswithoutaSECTIONSspecification这个警告会有什么影响吗,怎么去除呢新建的DSP工程总会碰到一个警告头文件和源文件都是从controlsuite中导入的C:\ti\controlSUITE\device_support\
fraisty DSP 与 ARM 处理器
【2024 DigiKey 创意大赛】AI全功能环境监测站
一、作品简介1.1作品功能介绍本次创意大赛中,我设计并实现了一个AI全能环境监测站。该设备通过集成多款高精度气体传感器,能够全面监测环境中的多种气体成分,如温湿度、空气质量、二氧化碳和各类有害气体等。所有环境数据不仅可以实时显示在MatrixRGB点阵屏上,还能够通过AdafruitIO云平台上传,实现多设备多应用间的环境监测数据共享。用户可以通过网页端查看不同环境指标的实时数据及其变化趋势,获取清晰的历史数据图表和变化曲线。为了增强用户体验,该系统还加入了智
MioChan DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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