You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于mbed.h的嵌入式系统:实现60秒内按键计数定时器

基于mbed.h实现60秒内按键计数功能

原代码存在的核心问题

  • 误用DigitalOut处理按键输入:user_led被定义为输出引脚,完全无法检测按键状态,应替换为DigitalIn
  • 错误使用计时API:mbed中没有clock类的标准用法,代码里clock t = new clock();属于语法和API误用,应使用mbed自带的Timer类实现计时
  • 逻辑偏离需求:代码通过LED状态累加计数器,既没有检测按键输入,也未实现60秒计时停止的逻辑,Ticker的使用和需求无关

修正后的实现代码

#include "mbed.h"

// 定义按键引脚(根据实际硬件引脚修改)
DigitalIn user_button(PA_0, PullUp); // 配置上拉输入,按键按下时引脚为低电平
Timer countdown_timer;
int press_counter = 0;
bool counting_active = false;

int main() {
    // 启动60秒倒计时
    countdown_timer.start();
    counting_active = true;

    while (true) {
        if (counting_active) {
            // 按键检测+消抖处理:检测到低电平后延时10ms确认,避免误触发
            if (!user_button) {
                wait_us(10000); // 10ms消抖
                if (!user_button) {
                    press_counter++;
                    // 等待按键释放,防止单次按下重复计数
                    while (!user_button);
                }
            }

            // 检查是否到达60秒计时终点
            if (countdown_timer.elapsed_time() >= 60s) {
                counting_active = false;
                countdown_timer.stop();
                printf("60秒计时结束,按键总次数:%d\n", press_counter);
                
                // 可选:取消注释以下代码,实现循环计数
                // press_counter = 0;
                // countdown_timer.reset();
                // countdown_timer.start();
                // counting_active = true;
            }
        }

        // 小延时降低CPU占用率
        wait_us(1000);
    }
}

代码关键说明

  • 按键处理:用DigitalIn配置上拉输入适配常见按键电路,加入消抖逻辑避免硬件干扰导致的误计数,同时等待按键释放确保单次按下仅计数一次
  • 计时控制:使用mbed原生Timer类实现精准计时,通过elapsed_time()获取已流逝时间,到达60秒后停止计数并输出结果
  • 状态管理:用counting_active变量控制计数逻辑的启停,避免计时结束后继续检测按键

内容的提问来源于stack exchange,提问作者serhat kaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:35:05