C语言程序代码定时器中断控制流水灯
时间: 2025-05-22 15:32:58 浏览: 10
### C语言实现定时器中断控制流水灯的程序代码
以下是使用C语言在51单片机上通过定时器中断实现流水灯效果的一个完整示例:
```c
#include <reg51.h>
// 定义端口
sbit LED_P1_0 = P1^0;
sbit LED_P1_1 = P1^1;
sbit LED_P1_2 = P1^2;
sbit LED_P1_3 = P1^3;
sbit LED_P1_4 = P1^4;
sbit LED_P1_5 = P1^5;
sbit LED_P1_6 = P1^6;
sbit LED_P1_7 = P1^7;
unsigned char count = 0; // 计数变量
unsigned char mode = 0; // 当前模式标志
void Timer0_Init(void) {
TMOD |= 0x01; // 设置T0为模式1(16位)
TH0 = (65536 - 50000) / 256; // 设定初值,约20ms中断一次
TL0 = (65536 - 50000) % 256;
EA = 1; // 开启总中断
ET0 = 1; // 开启T0中断
}
void Forward_Mode(void) {
switch (mode) {
case 0: LED_P1_0 = 1; break;
case 1: LED_P1_1 = 1; break;
case 2: LED_P1_2 = 1; break;
case 3: LED_P1_3 = 1; break;
case 4: LED_P1_4 = 1; break;
case 5: LED_P1_5 = 1; break;
case 6: LED_P1_6 = 1; break;
case 7: LED_P1_7 = 1; break;
}
for (int i = 0; i < 8; i++) {
if (i != mode) P1 &= ~(1 << i);
}
}
void Backward_Mode(void) {
switch (mode) {
case 0: LED_P1_7 = 1; break;
case 1: LED_P1_6 = 1; break;
case 2: LED_P1_5 = 1; break;
case 3: LED_P1_4 = 1; break;
case 4: LED_P1_3 = 1; break;
case 5: LED_P1_2 = 1; break;
case 6: LED_P1_1 = 1; break;
case 7: LED_P1_0 = 1; break;
}
for (int i = 0; i < 8; i++) {
if (i != (7 - mode)) P1 &= ~(1 << i);
}
}
void Timer0_ISR(void) interrupt 1 {
TH0 = (65536 - 50000) / 256; // 重载初值
TL0 = (65536 - 50000) % 256;
count++;
if (count >= 50) { // 每隔1秒切换状态
count = 0;
mode = (mode + 1) % 8; // 切换模式
}
}
void main(void) {
P1 = 0x00; // 初始化P1端口全灭
Timer0_Init(); // 初始化定时器
while (1) {
Forward_Mode(); // 调用向前模式
Delay_ms(200); // 延时200ms
}
}
```
#### 程序说明
- **定时器初始化**:`Timer0_Init()` 函数配置定时器0为模式1,并设定初值以达到大约20ms的中断周期[^1]。
- **中断服务程序**:每当定时器溢出触发中断时,重新装载定时器初值并增加计数值 `count`。当累计时间到达指定阈值时,切换流水灯的状态或模式[^2]。
- **流水灯模式**:提供了两种基本模式——向前流动 (`Forward_Mode`) 和向后流动 (`Backward_Mode`)。可以根据需求扩展更多复杂模式。
---
###
阅读全文
相关推荐



















