基于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
相关产品推荐
相关产品推荐

