在CT107D单片机综合训练平台上实现外部中断控制LED闪烁

引言

在单片机开发中,外部中断是一个非常重要的功能,它可以让单片机在检测到外部信号变化时立即做出响应。本文将详细介绍如何在CT107D单片机综合训练平台上使用外部中断来控制LED灯的闪烁。我们将使用两种不同的方式来实现这一功能:一种是在中断服务函数中直接进行延时,另一种是在中断服务函数中设置标志变量,在主循环中进行延时。

硬件连接

首先,我们需要将J5处的跳帽接到2~3引脚,这样S5按键将连接到P32/INT0,S4按键将连接到P33/INT1。这样,当按下S5按键时,P32引脚将产生一个下降沿信号,触发外部中断0。

代码实现

1. 直接在中断服务函数中延时

在这种方式中,我们将在中断服务函数中直接进行延时操作。以下是完整的代码实现:

#include <REGX52.H>

sbit L1 = P0^1; // 定义L1指示灯

sbit L8 = P0^7; // 定义L8指示灯

void SeletcHC573()

{

P2 = (P2 & 0x1f) | 0x80; // 选择HC573锁存器

}

void Delay(unsigned int t)

{

while(t--); // 简单的延时函数

}

void working()

{

SeletcHC573();

L1 = 0; // 点亮L1

Delay(60000); // 延时

L1 = 1; // 熄灭L1

Delay(60000); // 延时

}

void Init_INT0()

{

IT0 = 1; // 设置INT0为下降沿触发

EX0 = 1; // 使能外部中断0

EA = 1; // 使能总中断

}

void ServiceINT0() interrupt 0

{

L8 = 0; // 点亮L8

Delay(60000); // 延时

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

L8 = 1; // 熄灭L8

}

void main()

{

Init_INT0(); // 初始化外部中断0

while(1)

{

working(); // 主循环中不断调用working函数

}

}

2. 在中断服务函数中设置标志变量,在主循环中延时

在这种方式中,我们将在中断服务函数中设置一个标志变量,然后在主循环中根据这个标志变量来控制L8的亮灭。以下是完整的代码实现:

#include <REGX52.H>

sbit L1 = P0^1; // 定义L1指示灯

sbit L8 = P0^7; // 定义L8指示灯

void SeletcHC573()

{

P2 = (P2 & 0x1f) | 0x80; // 选择HC573锁存器

}

void Delay(unsigned int t)

{

while(t--); // 简单的延时函数

}

void working()

{

SeletcHC573();

L1 = 0; // 点亮L1

Delay(60000); // 延时

L1 = 1; // 熄灭L1

Delay(60000); // 延时

}

void Init_INT0()

{

IT0 = 1; // 设置INT0为下降沿触发

EX0 = 1; // 使能外部中断0

EA = 1; // 使能总中断

}

unsigned char stat_int = 0; // 定义中断标志变量

void ServiceINT0() interrupt 0

{

stat_int = 1; // 设置中断标志变量

}

void LEDINT()

{

if(stat_int == 1)

{

L8 = 0; // 点亮L8

Delay(60000); // 延时

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

L8 = 1; // 熄灭L8

}

stat_int = 0; // 清除中断标志变量

}

void main()

{

Init_INT0(); // 初始化外部中断0

while(1)

{

working(); // 主循环中不断调用working函数

LEDINT(); // 检查中断标志变量并控制L8

}

}

代码解析

1. 直接在中断服务函数中延时

  • SeletcHC573():选择HC573锁存器,确保P0口的输出能够控制LED。

  • Delay():一个简单的延时函数,通过循环递减来实现延时。

  • working():控制L1指示灯不断闪烁。

  • Init_INT0():初始化外部中断0,设置为下降沿触发,并使能中断。

  • ServiceINT0():中断服务函数,当按下S5按键时,进入该函数,点亮L8并进行延时后熄灭。

2. 在中断服务函数中设置标志变量,在主循环中延时

  • stat_int:定义一个全局变量作为中断标志。

  • ServiceINT0() :中断服务函数,当按下S5按键时,设置stat_int为1。

  • LEDINT() :在主循环中检查stat_int,如果为1,则点亮L8并进行延时后熄灭,最后清除stat_int

总结

本文详细介绍了如何在CT107D单片机综合训练平台上使用外部中断来控制LED灯的闪烁。我们通过两种不同的方式实现了这一功能:一种是在中断服务函数中直接进行延时,另一种是在中断服务函数中设置标志变量,在主循环中进行延时。这两种方式各有优缺点,第一种方式简单直接,但可能会影响主循环的执行;第二种方式更加灵活,能够更好地处理复杂的任务。

相关推荐
开-悟12 分钟前
嵌入式编程-使用AI查找BUG的启发
c语言·人工智能·嵌入式硬件·bug
Natsume17105 小时前
嵌入式开发:GPIO、UART、SPI、I2C 驱动开发详解与实战案例
c语言·驱动开发·stm32·嵌入式硬件·mcu·架构·github
shaun20016 小时前
华为c编程规范
c语言
MeshddY6 小时前
(超详细)数据库项目初体验:使用C语言连接数据库完成短地址服务(本地运行版)
c语言·数据库·单片机
森焱森6 小时前
无人机三轴稳定化控制(1)____飞机的稳定控制逻辑
c语言·单片机·算法·无人机
凌肖战7 小时前
力扣网C语言编程题:快慢指针来解决 “寻找重复数”
c语言·算法·leetcode
猫猫的小茶馆10 小时前
【STM32】预分频因子(Prescaler)和重装载值(Reload Value)
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
JeffersonZU10 小时前
Linux/Unix文件IO(文件描述符、原子操作、文件数据结构、open、read、write、fcntl、dup)
linux·c语言·unix·gnu
智者知已应修善业14 小时前
【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
森焱森1 天前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机