02讲 | 51单片机按键外部中断实现LED灯的亮灭

本文介绍了51单片机如何利用外部中断INT0和INT1控制LED灯的亮灭,详细讲解了按键中断控制原理、消除抖动的方法,并提供了具体的代码实现,包括软件消抖的10ms延时函数应用。

前言

专栏内容持续补充更新,目前正在进行优惠活动!

目录

一、按键中断控制原理

二、外部中断实现 LED 灯亮灭功能代码

三、按键控制LED亮灭工程代码


一、按键中断控制原理

外部中断 INT0 和外部中断 INT1 触发有两种方式,上升沿或下降沿均可触发方式和仅下降沿触发方式。

二、消除抖动

矩阵键盘通常使用机械触点式按键开关,其主要功能式把机械上的通断转换为电气上的逻辑关系。

机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定的时间触点机械抖动,然后其触点才稳定下来。

其抖动过程如下图所示,抖动时间的长短与开关的机械特性有关,一般为 5-10ms。在触点抖动期间检测按键的通与断,可能导致判断出错,即按键一次按下或释放错误的被认为是多次操作,这种情况是不允许出现的。

为了克服按键触点机械抖动所致的检测误判,必须采取消抖措施。按键较少时,可采用硬件消抖,按键较多时,我们一般采用软件消抖,软件消抖的时候直接用延时函数判断,延时时间一般采用 10ms


二、外部中断实现 LED 灯亮灭功能代码

#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit led=P2^0;
sbit k4=P3^3;//外部中断1
void delay(u16 i)
{
	while(i--);
}
void zhongduan()
{
	EA=1;//总中断打开
	EX1=1;//外部中断1打开
	IT1=1;//外部中断1选择低电平触发
}
void main()
{
	zhongduan();//调用中断函数
	while(1);
}
void zhong() interrupt 2//外部中断服务函数
{
	delay(1000);//消除按键抖动
	if(k4==0)
	{	
		led=~led;//led默认高电平,这里实现状态的反转
	}
}

三、按键控制LED亮灭工程代码

#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit led=P2^0;
sbit ke=P3^1;

void delay(u16 i)
{
	while(i--);
}

void anjian()
{
	if(ke==0)//判断按键是否被按下
	{
		delay(1000);//消抖
		if(ke==0)//消抖之后再次判断是否被按下 ?
		led=~led;//点亮led灯,led灯默认高电'平
		while(!ke);//判断是否断开
	} 
}

void main()
{
	while(1)
	{
		anjian();
	}
}
### 实现51单片机外部中断控制LED 以下是基于51单片机外部中断功能实现LED的一个典型示例代码。此代码利用了两个外部中断源(INT0 和 INT1),并通过配置相应的寄存器来完成对LED状态的切换。 #### 配置说明 为了使能外部中断并响应按键输入,需设置以下几个关键参数: - **EA位**:全局中断允许开关。 - **EX0/EX1位**:分别用于开启或关闭外部中断0和外部中断1。 - **IT0/IT1位**:决定外部中断触发方式(电平触发或边沿触发)。在此处采用下降沿触发模式[^2]。 #### 示例代码 ```c #include <reg52.h> sbit LED = P1^0; // 定义P1.0作为LED输出端口 void ExternalInterrupt_Init() { EA = 1; // 开启总中断 EX0 = 1; // 启用外部中断0 (P3.2/INT0) IT0 = 1; // 设置为下降沿触发 } // 外部中断0服务程序 void Ext_Int0_ISR(void) interrupt 0 { LED = ~LED; // 切换LED的状态(点或者熄) } void main() { LED = 1; // 初始化LED处于熄状态 ExternalInterrupt_Init(); // 调用初始化函数 while(1); // 主循环保持运行 } ``` 上述代码展示了如何通过外部中断0(连接到P3.2引脚)来改变LED的状态。当检测到一次有效的下降沿信号时,`Ext_Int0_ISR()` 中断处理函数会被调用,在其中执行LED状态翻转操作[^1]。 如果还需要增加另一个按键去控制其他设备或是第二个LED,则可以按照相似的方式设定外部中断1,并编写对应的ISR(interrupt service routine)[^2]。 #### 注意事项 - 硬件电路设计上要确保按钮的一侧接地而另一侧接到相应中断管脚(P3.2 或者 P3.3),同时考虑加入上拉电阻以稳定逻辑电平。 - 如果实际应用中有多个外设需要管理,可能要考虑优先级分配以及潜在的中断嵌套情况。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个写代码的修车工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值