历史上的今天
返回首页

历史上的今天

今天是:2024年10月25日(星期五)

正在发生

2021年10月25日 | 单片机的外部中断(二)

2021-10-25 来源:eefocus

前言:单片机的中断系统(一)


80C51单片机提供两个外部中断口:  INT0(P3.2)和INT1(P3.3)引脚输入。这两个引脚是功能复用引脚,既可以作为普通V0口,也可作为外部中断输入引脚。下面以部中断0来讲述。80C51单片机在每个机器周期的S5P2期间扫描外部中断输入引脚的电平状态。当外部中断设置为下降沿触发时,若处理器在连续两个机器周期扫描到INT0引脚的电平先后为高电平和低电平时,就会设置中断标志位IE0为1,表示外部有中断申请,该中断申请信号会一直保持,直到该中断被响应,该标志由内部硬件自动清除。当外部中断设置为电平触发方式时,在外部中断引脚INTo变为低电平时,IE0变为1,并一直保持为1,直到引脚INTo的输入变为高电平时,IE0位才清0。因此,选择低电平触发方式时,对INT0的电平持续时间有严格要求,必须保持INTo引脚为低电平,直到中断被响应才 能变高,而且在中断返回前必须变成高电平,以撤销中断请求。若低电平时问太短,则可能导致中断不会被响应;若太长,在中断子程序执行完后仍为低电平,则IE0会一直保持为1,这时会导致一次中断请求,得到多次响应。 ——————http://www.51dzw.com/embed/embed_110007.html


外部中断0实验 


按键作为外部中断的产生源,按下按键,led状态反转。

图一:单片机引脚图

图二:独立按键接线图

图三:LED引脚图


程序:


#include

 

sbit key3=P3^2;//外部中断0的引脚接口

sbit led=P2^0;

 

void delay(int dat)

{

while(dat--);

}

 

void Int0Init()

{

IT0=1;//下降沿触发

//IE0=0;请求标志位,无触发,或响应中断后,硬件自动置0

EX0=1;//外部中断0允许标志

EA=1;//打开总终端

}

 

void main(void)

{

Int0Init();

while(1);//如果不写while(1),单片机在主程序中会不断循环执行,导致不断初始化

}

 

void LedRever() interrupt 0 //0是外部中断的中断号

{

delay(1000);

if(key3==0)

{

led=~led;

}

}

 

 比较有意思的是,中断函数中增加了消抖部分。


如果不加消抖,可能想程序可能想多次执行这个中断。如果消抖在外面,可能已经进入中断了,还没进行消抖。


 


外部中断1实验:


接线引脚图如图一、二、三。


普中教程代码:


/**************************************************************************************

*               外部中断1实验   *

实现现象:下载程序后按下K4按键可以对D1小灯状态取反。

注意事项:无。   

***************************************************************************************/

 

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

 

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

typedef unsigned char u8;

 

sbit k4=P3^3;  //定义按键K4

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

 

/*******************************************************************************

* 函 数 名         : delay

* 函数功能    : 延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(u16 i)

{

while(i--);

}

 

/*******************************************************************************

* 函 数 名         : Int1Init()

* 函数功能    : 设置外部中断1

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void Int1Init()

{

//设置INT1

IT1=1;//跳变沿出发方式(下降沿)

EX1=1;//打开INT1的中断允许。

EA=1;//打开总中断

}

 

/*******************************************************************************

* 函 数 名       : main

* 函数功能 : 主函数

* 输    入       : 无

* 输    出    : 无

*******************************************************************************/

void main()

{

Int1Init();  // 设置外部中断1

while(1);

}

 

/*******************************************************************************

* 函 数 名         : Int1() interrupt 2

* 函数功能    : 外部中断0的中断函数

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

 

void Int1() interrupt 2 //外部中断1的中断函数

{

delay(1000); //延时消抖

if(k4==0)

{

led=~led;

}

}

推荐阅读

史海拾趣

American Electric公司的发展小趣事

随着全球化进程的加速,American Electric公司开始实施国际化战略。公司积极拓展海外市场,与多个国家的电力企业建立合作关系,共同开展电力项目。同时,公司还在海外设立了多个分支机构,以便更好地服务当地客户。这些举措不仅提高了公司的国际影响力,还为公司的长期发展奠定了坚实的基础。

AirBorn公司的发展小趣事

随着电子行业的竞争日益激烈,AirBorn面临着来自同行的压力和挑战。为了保持领先地位,AirBorn加强了与客户的沟通与合作,深入了解市场需求和变化趋势。同时,公司还加大了对新技术和新材料的研发投入,不断推出具有创新性和竞争力的新产品。这些举措使得AirBorn在激烈的市场竞争中保持了稳健的发展态势。

GCi Technologies公司的发展小趣事
定时器设置错误或IC内部定时器故障可能导致充电时间不准确。
台湾岱恩(DAIN)公司的发展小趣事
可能是由于外部电阻设置不当或IC内部故障导致。
Advanced Monolythic Ceramics公司的发展小趣事
对电池进行定期维护和充电,以延长电池使用寿命。
Electronicon Kondensatoren GmbH公司的发展小趣事

ELECTRONICON Kondensatoren GmbH,其前身为RFT Kondensatorenwerk Gera,于20世纪30年代末与德国图林根东部的Gera的电容器制造商建立了紧密的合作。自此,ELECTRONICON开始崭露头角,专注于电容器技术的研发与生产。公司始终将产品的质量和可靠性作为核心理念,为未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

protel 2004安装与教程

这个我还没下,不过应该不错的,要的话去下下看,是个BT种子…

查看全部问答>

如何做图像识别啊

本帖最后由 paulhyde 于 2014-9-15 09:11 编辑 各个大哥大姐如何做图像识别啊,比如在一个物体上写个A如何把它识别出来,有什么好方案没,,不甚感激!  …

查看全部问答>

电子工程师创新设计必备宝典系列之FPGA开发全攻略免费下载

;P ;P !从本网站挪过来的资料! 为了响应小杰关于FPGA入门资料编写号召,特此发此贴,提供下载。 书还没看,感觉还不错,要求FPGA有点入门的。 关于学习FPGA,首先是自己有开发板,然后,就是自己给自己立一个项目练习。这样自己会编写代码。 ...…

查看全部问答>

人工智能发展的太慢了,很是纠结。

照这样下去,和人无差别的机器人女友诞生那天,哥都得60来岁甚至更老了。郁闷啊。…

查看全部问答>

ce6 eboot中内存读写测试!

在eboot中也不能使用物理地址直接访问内存。而使用的是虚拟地址。 我的6410版,RAM从128M升级到256M之后,系统一直没有搞定,在eboot中测试内存发现, 我映射了一段并不存在的内存到0x96000000,在eboot中写了一个循环读写,如下: for (i = 0; ...…

查看全部问答>

注册表项[HKEY_LOCAL_MACHINE\SOFTWARE\Apps]下有许多子项,如何将它们一一读出?

在WinCE上, 注册表项 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Apps]下有许多子项, 如何将它们一一读出?…

查看全部问答>

LCD 驱动程序上有一个DUMMY (RGB_DUMMY) 的东西,它起什么作用呀?

LCD 驱动程序上有一个DUMMY (RGB_DUMMY) 的东西,它起什么作用呀? 三星6410(或BSP上)有这个东西吗? 如何设置它?…

查看全部问答>

MTK6225 手机开发板(含源代码)

MTK6225 手机开发板(含源代码) 有诚意者请联系 Qq:296662705 硬件特性: 1、 CPU:mtk6225 2、 TFLASH 卡接口 3、 176X220 2.6寸TFT LCD,最高支持320*240*16的TFT LCD 4、 4线触摸屏接口 5、 双声道音频输出 6、 一个Camera 130万像素 ...…

查看全部问答>

高手们看看这是怎么回事??

我在用USBASP下程序的时候出现了这样的情况,各位大哥看看是怎么回事? …

查看全部问答>