一、基础功能(完成基础功能+10分) 功能1:LED流水灯模式 上电后,LED以默认速度(1Hz)循环右移(此为模式1),共3种模式流水灯 ① 模式1:右移流水灯 ② 模式2:左移流水灯 ③ 模式3:双向闪烁(全亮-全灭交替) 功能2:数码管动态显示 数码管显示倒计时:从30秒开始,每秒减1,减至0时LED提示(0101 0101闪烁) 功能3:定时器中断控制 使用定时器T0控制LED流水速度与数码管更新 使用定时器T1实现倒计时功能(精确到秒) 功能4:按键中断响应 S2和S3配置为外部中断(下降沿触发),分别实现LED流水灯模式切换和倒计时启停
时间: 2025-06-24 22:34:46 浏览: 20
### 实现方案概述
以下是基于定时器中断和按键中断实现LED流水灯模式切换以及数码管倒计时功能的设计思路:
#### 主要功能模块
1. **LED流水灯模式切换**
使用按键中断检测按键输入,通过改变全局变量`LEDMode`来控制LED灯的流动方向或闪烁方式。支持的功能包括右移、左移和双向闪烁。
2. **数码管倒计时**
利用定时器中断实现每秒更新一次倒计时时间,并动态显示在数码管上。可以通过另一个按键启动或暂停倒计时。
3. **定时器中断**
设置定时器工作于模式1(16位定时),并配置其初值以达到精确的1毫秒中断间隔。每次中断累加计数器,当累计到1000次时触发1秒事件。
4. **按键中断**
配置外部中断源(INT0 或 INT1)用于检测按键动作。按键A负责切换LED流水灯模式;按键B负责启停倒计时。
---
### 硬件资源分配
- **P2口**:连接LED灯。
- **P1口**:连接共阳极数码管段选线。
- **P3.7/P3.6**:分别作为按键A/B的输入端口,启用外部中断。
- **定时器0**:用于生成1毫秒周期的中断信号。
---
### 软件设计细节
#### 1. 初始化部分
初始化硬件外设,包括IO口、定时器和外部中断。
```c
#include <reg52.h>
#include <intrins.h>
sbit KEY_A = P3^7; // 按键A (切换LED模式)
sbit KEY_B = P3^6; // 按键B (启停倒计时)
unsigned char LEDMode = 0; // 当前LED模式:0=左移, 1=右移, 2=双向闪
unsigned int Count_ms = 0; // 记录毫秒级计数值
unsigned char Countdown_sec = 10; // 倒计时初始值为10秒
bit IsCountdownRunning = 0; // 是否正在运行倒计时标志
void Timer0_Init() {
TMOD |= 0x01; // 定时器0工作于模式1 (16位)
TH0 = 0xFC; // 设定重载值,得到约1ms中断
TL0 = 0x18;
EA = 1; // 打开总中断
ET0 = 1; // 启动定时器0中断
TR0 = 1; // 启动定时器0
}
void ExtInt_Init() {
EX0 = 1; // 允许外部中断0 (KEY_A)
IT0 = 1; // 边沿触发
EX1 = 1; // 允许外部中断1 (KEY_B)
IT1 = 1; // 边沿触发
}
```
#### 2. 中断服务程序
##### 定时器0中断处理
每当累积满1000毫秒时,执行相应的操作,比如更新倒计时或者驱动LED灯变化。
```c
void Timer0_ISR() interrupt 1 {
static unsigned int ms_count = 0;
TH0 = 0xFC; // 重装载初值
TL0 = 0x18;
ms_count++;
if(ms_count >= 1000) { // 满足1秒钟条件
ms_count = 0;
if(IsCountdownRunning && Countdown_sec > 0){
Countdown_sec--; // 更新倒计时
}
switch(LEDMode){ // 根据当前模式调整LED状态
case 0: P2 = _crol_(P2, 1); break; // 左移
case 1: P2 = _cror_(P2, 1); break; // 右移
case 2: P2 ^= 0xFF; // 双向闪烁
}
}
}
```
##### 外部中断处理
按键A用于切换LED模式,按键B用于启停倒计时。
```c
void External_Int0_ISR() interrupt 0 using 1{
delay_10ms(); // 去抖延时
if(KEY_A == 0){
LEDMode++; // 改变LED模式
if(LEDMode > 2) LEDMode = 0;
}
}
void External_Int1_ISR() interrupt 2 using 1{
delay_10ms();
if(KEY_B == 0){
IsCountdownRunning = !IsCountdownRunning; // 切换倒计时开关
}
}
```
#### 3. 数码管动态显示子函数
利用查表法将十进制数字转换成对应的七段码,并逐位扫描显示。
```c
code unsigned char DigitCode[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99}; // 对应0~4的七段码
void Display_Digit(unsigned char digit_value){
P1 = ~DigitCode[digit_value]; // 输出段码
P0 = 0xEF; // 选择第几位数码管点亮
}
```
---
### 总结说明
以上代码实现了基于定时器中断和按键中断的多功能控制系统,具体包括:
- LED流水灯三种模式(左移、右移、双向闪烁)的切换;
- 数码管倒计时功能及其启停控制;
- 整体逻辑清晰,便于扩展其他功能[^1]。
---
###
阅读全文
相关推荐


















