使用【c语言】写【led流水灯外部中断延时函数,实现越闪越慢】的代码并注释可在keil5运行
时间: 2024-09-29 11:05:03 浏览: 55
在C语言中,我们可以利用定时器和外部中断来实现LED流水灯越闪越慢的效果。假设我们使用8051系列单片机,并且已经配置好了定时器T1和外部中断INT0。这里是一个简单的示例,我们将使用Keil5开发环境编写代码:
```c
#include <reg52.h> // 包含8051寄存器定义
// 定义延时函数,这里采用定时器T1的方式,时间间隔可通过改变OCR1A值调整
void delay(unsigned int time_ms) {
unsigned int i;
TMOD = 0x01; // 设置TMOD为模式1,即16位定时器模式
TH1 = time_ms / 256; // OCR1A高8位存储毫秒数除以256的结果
TL1 = time_ms % 256; // OCR1A低8位存储余数
EA = 1; // 开启总中断
ET1 = 1; // 开启T1外部中断
TR1 = 1; // 启动定时器T1
for(i = 0; i < (64 * time_ms);) { // 循环计数,模拟延时
while((TF1 == 0) && (!IF)); // 等待定时器溢出标志TF1和中断标志IF同时变为1
TF1 = 0; // 清零TF1
++i; // 增加计数
}
}
// 外部中断服务程序
void interrupt ISR() __attribute__((interrupt("external"))) {
if(IF) { // 检查是否有中断发生
P1 ^= 0x0F; // LED流水灯操作,这里P1.0-P1.7代表LED,异或操作实现灯的切换
IF = 0; // 清除中断标志
}
}
int main(void) {
P1 = 0xFF; // 初始化所有LED关闭
delay(1000); // 初始闪烁速度较快,设置延时1s
while(1) {
delay(2000); // 越闪越慢,每次延时增加一倍
}
return 0;
}
```
阅读全文