实验简介

在51单片机系统中,中断是一个非常重要的功能,它允许单片机在执行主程序的同时,能够及时响应外部事件。本实验将使用51单片机的两个外部中断源INT0和INT1,通过按键触发中断,实现不同的LED显示效果。

硬件连接

  • INT0(P3.2):连接按键K3

  • INT1(P3.3):连接按键K4

  • P2口:连接8个LED灯

  • 按键另一端接地,采用上拉电阻设计(通常单片机IO口内部已有上拉)

中断相关寄存器配置

51单片机的中断系统主要通过以下几个寄存器控制:

  1. TCON寄存器:控制中断触发方式

    • IT0(TCON.0):INT0触发方式控制位

    • IT1(TCON.2):INT1触发方式控制位

    • 设置为1时为边沿触发,0为电平触发

  2. IE寄存器:中断使能控制

    • EA(IE.7):总中断开关

    • EX0(IE.0):INT0中断使能

    • EX1(IE.1):INT1中断使能

  3. IP寄存器:中断优先级控制

    • PX0(IP.0):INT0优先级

    • PX1(IP.1):INT1优先级

程序设计思路

  1. 初始化阶段:

    • 配置中断触发方式为边沿触发

    • 使能相应中断

    • 设置中断优先级(本实验设为相同)

    • 初始化LED流水灯效果

  2. 主程序:

    • 实现基本的流水灯效果

    • 通过延时函数控制流水速度

  3. 中断服务程序:

    • 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--);
}

程序解析

  1. 中断初始化

    • 通过IT0和IT1设置为1,配置为下降沿触发

    • 通过EX0和EX1使能两个外部中断

    • EA开启总中断

  2. 主程序

    • 不断循环执行running_light()函数,实现流水灯效果

    • 当有按键按下时,触发中断,执行相应中断服务程序

  3. 中断服务程序

    • INT0中断:通过交替给P2口赋值0x0f和0xf0,实现上下4灯交替闪烁

    • INT1中断:通过交替给P2口赋值0x00和0xff,实现全亮全灭闪烁

    • 两种中断都执行5次后返回主程序

实验现象

  1. 正常情况下,8个LED灯呈现流水灯效果,依次点亮

  2. 按下K3按键并松开后:

    • 流水灯停止

    • 上面4个LED和下面4个LED交替闪烁5次

    • 恢复流水灯效果

  3. 按下K4按键并松开后:

    • 流水灯停止

    • 所有LED一起闪烁5次

    • 恢复流水灯效果

注意事项

  1. 按键消抖:实际应用中应考虑按键抖动问题,可通过硬件消抖或软件延时解决

  2. 中断优先级:本实验两个中断优先级相同,当同时按下时,按硬件查询顺序响应

  3. 中断标志位:51单片机外部中断标志会在进入中断后自动清除

扩展思考

  1. 如何修改程序,使得两个中断有不同的优先级?

    • 通过设置IP寄存器的PX0和PX1位

    • 高优先级中断可以打断低优先级中断

  2. 如何实现按键长按和短按的不同效果?

    • 可以在中断中检测按键持续时间

    • 结合定时器实现精确计时

  3. 如何增加更多的中断源?

    • 51单片机只有2个外部中断,但可以通过其他方法扩展

    • 例如使用定时器中断或端口变化中断(某些增强型51)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐