以下是基于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。

代码下载:

下载代码

相关资源:

单片机定时器实现4个LED轮流亮灭 (1秒间隔)

原文地址: https://www.cveoy.top/t/topic/kwm5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录