外部中断实验

实验指导书:外部中断实验(INT0/INT1功能验证)

一、实验目的

  1. 掌握STC8H8K64U单片机外部中断(INT0和INT1)的工作原理;
  2. 掌握外部中断相关寄存器的配置方法,包括中断允许、中断请求、中断优先级及触发方式设置;
  3. 学会使用中断服务程序处理外部事件;
  4. 掌握利用STC-ISP软件进行程序下载的方法。

二、实验器材

  • 开天斧三开发板(主控芯片:STC8H8K64U,LQFP64封装) 1块
  • USB数据线 1根
  • 计算机 1台
  • STC-ISP下载软件
  • Keil C51集成开发环境

三、实验原理

3.1 中断系统概述

中断是指CPU在正常执行程序的过程中,由于外部或内部事件的发生,使CPU暂停当前程序的执行,转去处理该事件,处理完毕后再返回原程序继续执行的过程。

STC8H8K64U单片机共有44个中断源,其中包括5个外部中断(INT0~INT4)。外部中断是由单片机外部引脚信号变化引起的中断,常用于响应按键、传感器等外部事件。除外部中断2、外部中断3、定时器2、定时器3、定时器4固定是最低优先级中断外,其他的中断都具有4个优先级。

3.2 外部中断引脚

在STC8H8K64U单片机中,外部中断INT0和INT1对应的引脚固定为:

外部中断对应引脚中断向量地址
INT0P3.20x0003
INT1P3.30x0013
说明:STC8H8K64U的所有普通I/O口还支持端口中断功能(可通过寄存器配置实现),但本实验只使用传统的外部中断INT0和INT1。

3.3 中断响应的基本条件

中断响应需要满足以下条件:

  1. 中断源有中断请求;
  2. 该中断源的中断允许控制位为1(使能该中断);
  3. CPU总中断允许控制位EA = 1(开放总中断);
  4. 无同级或更高级中断正在被CPU服务;
  5. 当前指令执行完毕(当前机器周期为指令的最后一个机器周期)。

中断配置的基本流程为:总中断EA打开 → 需要用的外设中断打开 → 如有需要就设置中断优先级 → 编写中断处理函数(相应中断标志位如需清零操作,尽量简短,不要用延时函数)。

3.4 外部中断相关寄存器

3.4.1 中断允许寄存器IE(可位寻址)

D7D6D5D4D3D2D1D0
名称EAET2ESET1EX1ET0EX0
  • EA(IE.7):总中断允许控制位。EA = 1时,CPU开放总中断,各中断源的允许由各自的中断允许位决定;EA = 0时,CPU屏蔽所有中断请求。
  • EX1(IE.2):外部中断INT1允许位。EX1 = 1时允许INT1中断。
  • EX0(IE.0):外部中断INT0允许位。EX0 = 1时允许INT0中断。

3.4.2 定时器/计数器控制寄存器TCON(可位寻址)

D7D6D5D4D3D2D1D0
名称TF1TR1TF0TR0IE1IT1IE0IT0
  • IE1(TCON.3):外部中断INT1请求标志位。检测到INT1引脚上的有效边沿时由硬件置1,CPU响应中断后由硬件自动清零。
  • IT1(TCON.2):外部中断INT1触发方式控制位。IT1 = 1时为下降沿触发,IT1 = 0时为上升沿和下降沿均可触发。
  • IE0(TCON.1):外部中断INT0请求标志位。检测到INT0引脚上的有效边沿时由硬件置1,CPU响应中断后由硬件自动清零。
  • IT0(TCON.0):外部中断INT0触发方式控制位。IT0 = 1时为下降沿触发,IT0 = 0时为上升沿和下降沿均可触发。

3.4.3 中断优先级控制

STC8H8K64U单片机的中断优先级通过中断优先级寄存器(IP、IPH等)设置。外部中断INT0和INT1都具有4个中断优先级,可在多中断场景下设定响应优先级顺序。在本基础实验中,因只使用INT0和INT1两个中断源,可采用默认优先级设置。

3.5 开天斧三开发板电路说明

开天斧三开发板的主控芯片为STC8H8K64U(LQFP64封装)。开发板上已集成:

  • 按键电路:P3.2引脚(INT0)和P3.3引脚(INT1)各连接一个独立按键,按下时为低电平(GND),平时通过上拉电阻保持高电平。
  • LED电路:P2端口连接多个LED指示灯(低电平有效),其中P2.0对应INT0的中断响应指示,P2.1对应INT1的中断响应指示。
注意:开天斧三开发板上机械按键按下时有抖动现象,但STC8H8K64U的外部中断响应速度较快,一次按键可能会触发多次中断,导致LED状态不确定地多次翻转,这是正常现象。如需消除抖动,可在中断服务程序中采用软件延时消抖或状态机判断方法。

四、实验内容

实验任务一:外部中断INT0功能验证

按下P3.2(INT0)按键,使P2.0连接的LED灯状态翻转(亮灭交替)。

实验任务二:外部中断INT1功能验证

按下P3.3(INT1)按键,使P2.1连接的LED灯状态翻转(亮灭交替)。

实验任务三:外部中断INT0和INT1综合验证

同时启用INT0和INT1两个外部中断,分别控制两个不同的LED灯,验证两个中断源可以独立工作、互不干扰。

五、实验步骤

5.1 硬件连接

  1. 取出开天斧三开发板,检查板载按键和LED是否完好。
  2. 使用USB数据线将开发板与计算机连接。
  3. 本实验直接使用开发板上的板载按键和LED,无需额外接线。
    • INT0按键连接P3.2,按下为低电平
    • INT1按键连接P3.3,按下为低电平
    • P2.0 LED指示灯,低电平点亮
    • P2.1 LED指示灯,低电平点亮

5.2 软件编程

  1. 打开Keil C51集成开发环境,新建工程,选择芯片型号为STC8H8K64U。
  2. 新建C源文件,添加头文件#include <STC8H.H>
  3. 编写主函数,完成以下初始化设置:
    • 设置P2口和P3口为准双向口模式(P2M1 = 0x00; P2M0 = 0x00; P3M1 = 0x00; P3M0 = 0x00);
    • 设置外部中断INT0的触发方式(下降沿触发:IT0 = 1);
    • 设置外部中断INT1的触发方式(下降沿触发:IT1 = 1);
    • 使能外部中断INT0和INT1(EX0 = 1, EX1 = 1);
    • 开放总中断(EA = 1);
    • 主循环保持空循环或执行其他任务。
  4. 编写中断服务程序:
    • INT0中断服务程序(interrupt 0):翻转P2.0(P20 = ~P20);
    • INT1中断服务程序(interrupt 2):翻转P2.1(P21 = ~P21)。
  5. 编译程序,生成HEX文件。

5.3 程序下载

  1. 打开STC-ISP下载软件;
  2. 在软件中选择正确的单片机型号:STC8H8K64U;
  3. 设置IRC频率为24MHz(用户可自行修改频率);
  4. 打开编译生成的HEX文件;
  5. 点击“下载/编程”按钮;
  6. 按开发板上的复位键或重新上电,等待下载完成。

5.4 观察实验现象

  1. 任务一(INT0):按下P3.2(INT0)按键,观察P2.0 LED灯的状态变化。每按一次按键,LED灯亮灭状态翻转一次。由于是机械按键无消抖处理,可能出现一次按键多次翻转的现象。
  2. 任务二(INT1):按下P3.3(INT1)按键,观察P2.1 LED灯的状态变化。每按一次按键,LED灯亮灭状态翻转一次。
  3. 任务三(综合):分别按下两个按键,验证各自控制对应LED翻转,互不影响;同时或快速交替按下两个按键,验证两个中断源能够正确响应各自的中断请求。
  4. 观察完毕后,记录实验现象。

六、参考程序

6.1 包含文件及寄存器定义说明

程序头部需包含#include <STC8H.H>头文件,该头文件可通过STC-ISP软件自动生成,包含了STC8H8K64U单片机所有特殊功能寄存器的地址定义。在使用前,应确认STC-ISP软件的“头文件”设置中选择的型号与目标芯片一致。

6.2 I/O口模式设置说明

STC8H8K64U的I/O口(除P3.0和P3.1外)上电后默认是高阻输入状态,因此使用前必须先设置I/O的模式。本实验中P2口连接LED,P3口连接按键,均设置为准双向口模式。

6.3 外部中断初始化程序

#include <STC8H.H>

/* 外部中断初始化函数 */
void ExtInt_Init(void)
{
    // 设置P2口和P3口为准双向口模式
    P2M1 = 0x00;  P2M0 = 0x00;
    P3M1 = 0x00;  P3M0 = 0x00;

    // 设置外部中断INT0和INT1为下降沿触发
    IT0 = 1;       // INT0下降沿触发
    IT1 = 1;       // INT1下降沿触发

    // 使能外部中断INT0和INT1
    EX0 = 1;       // 使能INT0
    EX1 = 1;       // 使能INT1

    // 开放总中断
    EA = 1;
}

6.4 中断服务程序

/* INT0中断服务程序(中断向量号0)
   功能:翻转P2.0(LED)状态,指示INT0中断响应 */
void INT0_ISR(void) interrupt 0
{
    P20 = ~P20;    // 翻转P2.0,LED状态改变
}

/* INT1中断服务程序(中断向量号2)
   功能:翻转P2.1(LED)状态,指示INT1中断响应 */
void INT1_ISR(void) interrupt 2
{
    P21 = ~P21;    // 翻转P2.1,LED状态改变
}

中断服务程序注意事项:

  • 中断函数通过interrupt n关键字声明,其中n为中断向量号;
  • 中断服务程序应尽量简短,不要在中断中执行长时间延时或复杂运算;
  • 本程序不需要手动清除中断标志位,因为CPU响应中断时硬件会自动清除IE0和IE1标志;
  • 如果使用了外部中断INT2~INT4,则需要在中断服务程序中通过软件清除相应的中断标志位。

6.5 主程序

void main(void)
{
    ExtInt_Init();    // 调用外部中断初始化函数

    while(1)
    {
        // 主循环空转,等待中断
        // 也可在此执行其他任务,如显示刷新等
    }
}

七、实验现象及记录

操作内容预期现象实际现象原因分析
按下P3.2(INT0)按键P2.0 LED状态翻转INT0下降沿触发中断
按下P3.3(INT1)按键P2.1 LED状态翻转INT1下降沿触发中断
连续快速按下INT0按键P2.0 LED状态多次翻转,可能出现一次按键多次翻转现象机械按键抖动导致多次触发
同时按下两个按键两个LED各自独立翻转中断优先级仲裁后依次响应
说明:由于开天斧三开发板上使用的是机械按键,按下时存在机械抖动。虽然每次按键按下时只产生一次低电平跳变,但抖动产生的多次跳变可能导致中断被多次触发,因此按一次按键可能观察到LED多次翻转,这是正常现象。在实际应用中可加入软件延时消抖(但不建议在中断服务程序中添加延时),或利用定时器实现状态机消抖。

八、思考题

  1. 如果将外部中断的触发方式由下降沿触发改为上升沿和下降沿均触发(IT0 = 0, IT1 = 0),实验现象会有什么变化?请修改程序并验证。
  2. 如何区分中断是由上升沿触发还是下降沿触发?如果需要在上升沿和下降沿均触发时区分触发边沿,可以如何实现?(提示:可在中断服务程序中读取引脚电平进行判断)
  3. 如果同时按下P3.2和P3.3两个按键,哪个中断会先被响应?为什么?(提示:查阅中断优先级和中断查询次序相关内容)
  4. 按键去抖动有哪些常用方法?请查阅资料并尝试编写一个带有按键消抖功能的外部中断程序。
  5. 如果要在中断服务程序中点亮LED持续1秒钟后再熄灭,应该如何实现?这样设计中断服务程序是否合理?为什么?

九、实验总结

通过本次实验,学生应掌握以下知识点:

  1. 外部中断的基本原理:了解外部中断INT0和INT1对应的引脚(P3.2和P3.3)、中断向量地址及其在中断系统中的作用。
  2. 中断寄存器的配置方法:熟悉TCON(IT0、IT1、IE0、IE1)、IE(EA、EX0、EX1)等寄存器的功能与配置方法。
  3. 中断服务程序的编写规范:掌握interrupt n关键字的用法,了解中断服务程序应尽量简短、避免延时的编程原则。
  4. 中断配置基本流程:总中断EA打开 → 外设中断打开 → 设置优先级(可选) → 编写中断处理函数。
  5. 工程实践能力:通过利用开天斧三开发板进行实际编程调试,培养嵌入式系统的软硬件联调能力。
  6. 机械按键抖动问题:认识按键抖动对中断响应的影响,为后续学习软件/硬件消抖技术打下基础。

本站所有文章、数据、图片来源于网络,仅供学习使用,如有侵权,联系删除!