用51单片机打造一个“时间旅行者”,按下按键,LED灯随时间倒流,你敢尝试吗?

用51单片机(STC89C52RC)的定时器和IO口,编写程序实现以下功能:

        按下按键时,LED灯开始倒流,从最后一个LED灯逐个熄灭,直到第一个LED灯熄灭为止;
同时,时钟也开始倒流,秒钟逐秒减少,分钟和小时也相应减少,直到时间回到00:00:00;
再次按下按键时,时间和LED灯恢复到当前的状态,继续向前流动。

程序设计要求:

        使用定时器中断实现时钟功能,定时器中断频率为1Hz;
        使用外部中断实现按键检测功能;
        使用IO口控制LED灯的亮灭,通过控制IO口输出不同的电平来控制LED灯的亮灭;
        按下按键时,LED灯开始倒流,从最后一个LED灯逐个熄灭,直到第一个LED灯熄灭为止;
        同时,时钟也开始倒流,秒钟逐秒减少,分钟和小时也相应减少,直到时间回到00:00:00;
        再次按下按键时,时间和LED灯恢复到当前的状态,继续向前流动。

程序设计思路:

        配置定时器T0为工作模式1,使用定时器中断实现1Hz的计时功能;
        配置外部中断INT0,使用外部中断中断服务程序实现按键检测功能;
        初始化LED灯显示模式为流水灯模式,LED灯从左往右依次亮起,再从右往左依次熄灭,循环进行;
        在定时器中断中更新时钟显示,每隔1秒更新一次,时间格式为hh:mm:ss;
        在外部中断中断服务程序中,切换LED灯显示模式为倒流模式,LED灯从最后一个逐个熄灭,同时时钟也倒流,秒钟逐秒减少,分钟和小时也相应减少,直到时间回到00:00:00;
        再次按下按键时,恢复原来的LED流水灯模式,并继续显示当前的时间。

程序代码示例:

以下是一个生动有趣的示例代码,实现了按键控制LED流水灯模式和定时器时钟功能。具体的硬件连接和编程细节需要根据实际情况进行调整。

#include <reg52.h>

sbit LED = P1^0;  // LED灯的控制引脚
sbit KEY = P3^2;  // 按键的检测引脚

unsigned char time_hh = 0;  // 时钟的小时部分
unsigned char time_mm = 0;  // 时钟的分钟部分
unsigned char time_ss = 0;  // 时钟的秒钟部分

void delay(unsigned int count) {
    unsigned int i, j;
    for (i = 0; i < count; i++) {
        for (j = 0; j < 120; j++) {
            // 空循环延时,根据实际情况进行调整
        }
    }
}

void init_timer() {
    TMOD |= 0x01;  // 设置定时器T0为工作模式1
    TH0 = 0xFC;  // 定时器初值,根据实际情况进行调整
    TL0 = 0x66;  // 定时器初值,根据实际情况进行调整
    ET0 = 1;  // 打开定时器T0中断
    EA = 1;  // 打开总中断
    TR0 = 1;  // 启动定时器T0
}

void init_external_interrupt() {
    IT0 = 1;  // 设置外部中断INT0为下降沿触发
    EX0 = 1;  // 打开外部中断INT0
    EA = 1;  // 打开总中断
}

void update_clock() {
    time_ss--;  // 时间倒流,秒钟部分减少

    if (time_ss < 0) {
        time_ss = 59;
        time_mm--;  // 时间倒流,分钟部分减少

        if (time_mm < 0) {
            time_mm = 59;
            time_hh--;  // 时间倒流,小时部分减少

            if (time_hh < 0) {
                time_hh = 0;  // 时间回到00:00:00
                time_mm = 0;
                time_ss = 0;
            }
        }
    }
}

void interrupt_timer() interrupt 1 {
    TH0 = 0xFC;  // 定时器初值,根据实际情况进行调整
    TL0 = 0x66;  // 定时器初值,根据实际情况进行调整

    update_clock();
}

void interrupt_external() interrupt 0 {
    delay(10);  // 消除按键抖动,根据实际情况进行调整

    if (KEY == 0) {
        // 倒流模式,LED灯从最后一个逐个熄灭,同时时钟倒流
        while (KEY == 0) {
            // 控制IO口输出不同的电平来控制LED灯的亮灭
            LED = 0;  // 熄灭LED灯

            delay(100);  // 控制倒流速度,根据实际情况进行调整

            update_clock();  // 更新时钟显示
        }

        // 再次按下按键后,恢复原来的LED流水灯模式,并继续显示当前的时间
        LED = 1;  // 点亮LED灯
    }
}

void main() {
    init_timer();
    init_external_interrupt();

    while (1) {
        // 主循环中可以添加其他需要实现的功能
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LYPHARD MELODY。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值