单片机定时器实现4个LED轮流亮灭 (1秒间隔)
以下是基于C语言的单片机代码实现,用于实现4个LED轮流亮灭,每个LED点亮时间为1秒:
#include <reg52.h> // 引入51单片机头文件
#define LED P1 // 定义LED的输出端口
void main()
{
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 定时器初值,计算公式为65536-1s/12.5us,即0xFFFF-0x4C00+1=0xFC00
TL0 = 0x00;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
while (1) {} // 保持程序运行
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
static unsigned char cnt = 0; // 定义计数器并初始化为0
cnt++; // 计数器加1
switch (cnt) // 根据计数器值选择LED点亮
{
case 1:
LED = 0x01; // 第1个LED点亮
break;
case 2:
LED = 0x02; // 第2个LED点亮
break;
case 3:
LED = 0x04; // 第3个LED点亮
break;
case 4:
LED = 0x08; // 第4个LED点亮
break;
default:
cnt = 0; // 计数器清零
break;
}
TH0 = 0xFC; // 重新设置定时器初值
TL0 = 0x00;
}
该代码实现了定时器0中断服务函数timer0,每次中断时计数器cnt加1,根据cnt的值选择点亮相应的LED,并在最后将计数器清零。在main函数中,设置定时器0为模式1,并启动定时器0中断和总中断,保持程序运行。定时器初值为65536-1s/12.5us,即0xFFFF-0x4C00+1=0xFC00,每次中断后重新设置定时器初值,实现LED轮流亮灭,每个LED点亮时间为1秒。注意,以上代码仅适用于12MHz的晶振,若使用其他频率的晶振需要重新计算定时器初值。
代码说明:
- 定时器配置:
TMOD = 0x01;设置定时器0为模式1,即16位定时器,计数器从0xFFFF开始计数,计数到0x0000时产生中断。TH0 = 0xFC; TL0 = 0x00;设置定时器初值为0xFC00,对应1秒的延时。ET0 = 1;开启定时器0中断。EA = 1;开启总中断。TR0 = 1;启动定时器0。
- 中断服务函数:
timer0()函数为定时器0中断服务函数,每次中断时执行。cnt计数器用于记录中断次数,并根据其值选择点亮哪个LED。switch语句根据cnt的值选择点亮相应的LED。TH0 = 0xFC; TL0 = 0x00;每次中断后重新设置定时器初值,确保下次中断也是1秒后发生。
- 主函数:
main()函数中设置定时器配置并启动定时器,然后进入死循环,保持程序运行。
注意:
- 以上代码仅适用于12MHz的晶振,若使用其他频率的晶振需要重新计算定时器初值。
- 代码中使用的LED端口号可以根据实际情况修改。
- 代码中使用的计数器范围可以根据需要调整,例如,如果要实现2秒的延时,可以将计数器范围设置为0~7。
代码下载:
相关资源:
原文地址: https://www.cveoy.top/t/topic/kwm5 著作权归作者所有。请勿转载和采集!