51单片机外部中断实验:INT0与INT1实现按键控制LED效果
本实验基于51单片机的外部中断功能,通过INT0和INT1接口连接按键触发中断。实验配置了边沿触发方式的中断寄存器,分别实现LED流水灯、上下交替闪烁和全灯闪烁三种显示效果。主程序维持流水灯效果,当K3按键触发INT0中断时执行上下4灯交替闪烁,K4按键触发INT1中断时执行全灯闪烁,各执行5次后恢复主程序。实验展现了51单片机中断系统的实时响应能力,需要注意按键消抖和中断优先级问题,可通过修改I
实验简介
在51单片机系统中,中断是一个非常重要的功能,它允许单片机在执行主程序的同时,能够及时响应外部事件。本实验将使用51单片机的两个外部中断源INT0和INT1,通过按键触发中断,实现不同的LED显示效果。
硬件连接
-
INT0(P3.2):连接按键K3
-
INT1(P3.3):连接按键K4
-
P2口:连接8个LED灯
-
按键另一端接地,采用上拉电阻设计(通常单片机IO口内部已有上拉)
中断相关寄存器配置
51单片机的中断系统主要通过以下几个寄存器控制:
-
TCON寄存器:控制中断触发方式
-
IT0(TCON.0):INT0触发方式控制位
-
IT1(TCON.2):INT1触发方式控制位
-
设置为1时为边沿触发,0为电平触发
-
-
IE寄存器:中断使能控制
-
EA(IE.7):总中断开关
-
EX0(IE.0):INT0中断使能
-
EX1(IE.1):INT1中断使能
-
-
IP寄存器:中断优先级控制
-
PX0(IP.0):INT0优先级
-
PX1(IP.1):INT1优先级
-
程序设计思路
-
初始化阶段:
-
配置中断触发方式为边沿触发
-
使能相应中断
-
设置中断优先级(本实验设为相同)
-
初始化LED流水灯效果
-
-
主程序:
-
实现基本的流水灯效果
-
通过延时函数控制流水速度
-
-
中断服务程序:
-
INT0中断:实现上下4灯交替闪烁
-
INT1中断:实现全部LED闪烁
-
完整代码实现
c
复制
下载
#include <reg51.h>
#include <intrins.h>
#define LED P2
void delay(unsigned int t); // 延时函数声明
// 流水灯模式
void running_light() {
unsigned char i;
LED = 0xfe; // 初始值11111110
for(i=0; i<8; i++) {
delay(30000);
LED = _crol_(LED, 1); // 循环左移
}
}
// INT0中断服务函数 - 上下交替闪烁
void int0_isr() interrupt 0 {
unsigned char i;
for(i=0; i<5; i++) {
LED = 0x0f; // 上4亮,下4灭
delay(20000);
LED = 0xf0; // 上4灭,下4亮
delay(20000);
}
LED = 0xff; // 全灭
}
// INT1中断服务函数 - 全闪烁
void int1_isr() interrupt 2 {
unsigned char i;
for(i=0; i<5; i++) {
LED = 0x00; // 全亮
delay(20000);
LED = 0xff; // 全灭
delay(20000);
}
}
void main() {
// 中断初始化
IT0 = 1; // INT0边沿触发
IT1 = 1; // INT1边沿触发
EX0 = 1; // 使能INT0
EX1 = 1; // 使能INT1
EA = 1; // 开总中断
// 设置中断优先级相同(默认就是相同)
PX0 = 0;
PX1 = 0;
while(1) {
running_light(); // 主循环执行流水灯
}
}
// 简单延时函数
void delay(unsigned int t) {
while(t--);
}
程序解析
-
中断初始化:
-
通过IT0和IT1设置为1,配置为下降沿触发
-
通过EX0和EX1使能两个外部中断
-
EA开启总中断
-
-
主程序:
-
不断循环执行running_light()函数,实现流水灯效果
-
当有按键按下时,触发中断,执行相应中断服务程序
-
-
中断服务程序:
-
INT0中断:通过交替给P2口赋值0x0f和0xf0,实现上下4灯交替闪烁
-
INT1中断:通过交替给P2口赋值0x00和0xff,实现全亮全灭闪烁
-
两种中断都执行5次后返回主程序
-
实验现象
-
正常情况下,8个LED灯呈现流水灯效果,依次点亮
-
按下K3按键并松开后:
-
流水灯停止
-
上面4个LED和下面4个LED交替闪烁5次
-
恢复流水灯效果
-
-
按下K4按键并松开后:
-
流水灯停止
-
所有LED一起闪烁5次
-
恢复流水灯效果
-
注意事项
-
按键消抖:实际应用中应考虑按键抖动问题,可通过硬件消抖或软件延时解决
-
中断优先级:本实验两个中断优先级相同,当同时按下时,按硬件查询顺序响应
-
中断标志位:51单片机外部中断标志会在进入中断后自动清除
扩展思考
-
如何修改程序,使得两个中断有不同的优先级?
-
通过设置IP寄存器的PX0和PX1位
-
高优先级中断可以打断低优先级中断
-
-
如何实现按键长按和短按的不同效果?
-
可以在中断中检测按键持续时间
-
结合定时器实现精确计时
-
-
如何增加更多的中断源?
-
51单片机只有2个外部中断,但可以通过其他方法扩展
-
例如使用定时器中断或端口变化中断(某些增强型51)
-
更多推荐



所有评论(0)