第2章 按键输入与消抖!掌握I/O口输入核心,实现单片机人机交互

前言

上一章我们学会了用C语言控制LED亮灭,实现了单片机的"单向输出"------只能按提前写好的固定逻辑执行,我们没法在运行过程中干预它的行为。但在所有实际的嵌入式产品里,人机交互都是必不可少的核心功能:按一下按键切换模式、长按调节参数,这些都离不开"按键输入"。

本章是嵌入式入门的核心分水岭,也是新手最容易踩坑的章节。我见过太多人学完LED后,在按键这里卡了壳:要么按下去没反应,要么按一次触发好几次,要么写的按键代码卡死了其他功能。而这些问题的根源,都是只抄了例程,没搞懂I/O口输入的底层原理,没理解"按键抖动"的本质。

本章我们依然延续保姆式风格,从最底层的I/O口输入模式讲起,全程深度联动C语言核心知识点,用大白话拆解所有复杂概念,零知识跳步、全细节覆盖。我们会先讲透输入和输出的本质区别,再拆解按键的硬件原理、抖动的来源和危害,然后从最基础的软件消抖,到独立按键的多功能驱动,一步步带着你从原理到实操,彻底掌握按键输入的全流程开发。

学完本章,你将彻底掌握I/O口的双向控制能力,能独立写出稳定、无抖动的工业级按键驱动代码,真正实现单片机和人的双向交互,为后续的传感器读取、综合项目开发打下最坚实的基础。


目录

  • 一、本章学习目标
  • 二、核心知识点拆解
    • [2.1 I/O口输入模式的底层原理:单片机如何"读取"外界信号](#2.1 I/O口输入模式的底层原理:单片机如何“读取”外界信号)
    • [2.2 按键的硬件工作原理:按下与弹起的电平变化逻辑](#2.2 按键的硬件工作原理:按下与弹起的电平变化逻辑)
    • [2.3 按键抖动的本质:新手90%问题的根源](#2.3 按键抖动的本质:新手90%问题的根源)
    • [2.4 按键消抖方案:硬件消抖与软件消抖全解析](#2.4 按键消抖方案:硬件消抖与软件消抖全解析)
    • [2.5 独立按键的驱动逻辑:C语言位读取与状态判断](#2.5 独立按键的驱动逻辑:C语言位读取与状态判断)
  • 三、Keil5+STC-ISP保姆式全流程实操
    • [3.1 工程创建与基础环境配置](#3.1 工程创建与基础环境配置)
    • [3.2 纯寄存器实现:基础按键控制LED亮灭](#3.2 纯寄存器实现:基础按键控制LED亮灭)
    • [3.3 工业级规范代码:带消抖的按键翻转LED](#3.3 工业级规范代码:带消抖的按键翻转LED)
    • [3.4 拓展实操:两个按键分别控制LED亮灭](#3.4 拓展实操:两个按键分别控制LED亮灭)
  • 四、保姆式排错指南
  • 五、我的入门踩坑记录
  • 六、课后小练习(带完整可运行标准答案)
  • 七、核心知识点速记
  • 八、本章小结与下一章预告

一、本章学习目标

  1. 彻底理解I/O口输入模式的底层工作原理,能清晰区分输入与输出的核心区别
  2. 深度掌握按键抖动的本质来源与危害,熟练掌握软件消抖的实现方法
  3. 熟练运用C语言位读取操作实现按键状态检测,能独立完成独立按键的驱动开发
  4. 能独立写出稳定、无抖动、不连发现象的按键驱动代码,实现按键对LED的灵活控制
  5. 能独立排查按键开发中的常见问题,包括无响应、误触发、程序卡死等,建立完整的排错逻辑
  6. 掌握工业级嵌入式C语言的模块化编程规范,能把按键驱动封装成独立函数

二、核心知识点拆解

2.1 I/O口输入模式的底层原理:单片机如何"读取"外界信号

为什么要学:上一章我们学了输出,这一章学输入,搞懂输入原理才能懂"单片机怎么知道按键有没有被按下"。

上一章的I/O口输出,是单片机通过引脚对外输出高/低电平,控制LED亮灭,就像你手动拨动开关控制灯;而本章的I/O口输入,是单片机通过引脚"读取"外界的电平信号,判断按键有没有被按下,就像你看着门铃按钮,判断有没有人按它。

专业术语解释:I/O口的输入模式,就是把引脚配置为"读取模式",此时引脚不再对外输出电平,而是变成一个"电平检测器",CPU通过读取对应寄存器的数值,就能知道这个引脚上当前是高电平还是低电平。

STC89C52RC I/O口的核心特性 :P1、P2、P3口内部都自带了上拉电阻,默认就是准双向口模式,既可以做输出,也可以直接做输入,不需要额外配置寄存器;而P0口内部没有上拉电阻,做输入的时候必须外接上拉电阻,否则无法正确读取电平状态。

通俗比喻理解上拉电阻:上拉电阻就像一根弹簧,平时把引脚(一个小球)拉到5楼(高电平),只有外界给它一个力(按键按下),才能把它拉到1楼(低电平)。它的作用是在没有外界信号时,把引脚电平稳定在高电平,避免悬空出现的电平乱跳。

C语言知识点深度联动(核心读取逻辑)

上一章我们知道,每一组I/O口都对应一个8位寄存器,输出时我们写寄存器控制电平;输入时我们只需要读寄存器,就能知道引脚的电平状态。

读取某一个引脚电平的C语言规范写法是:

c 复制代码
// 读取P1_0引脚的电平状态,结果非0代表高电平,0代表低电平
(P1 & (1 << 0)) != 0

原理拆解

  1. 1 << 0:得到二进制0b00000001,只有要读取的第0位是1;
  2. P1 & (1 << 0):按位与操作,只有P1寄存器的第0位是1时,结果才是非0,否则是0;
  3. 通过判断结果是否为0,就能知道引脚当前是高电平还是低电平。

一句话总结:I/O口输入就是读取引脚电平,P1/P2/P3口自带内部上拉电阻可直接输入,通过C语言位读取操作就能判断按键状态。

2.2 按键的硬件工作原理:按下与弹起的电平变化逻辑

为什么要学:搞懂按键硬件原理,才能知道"按下按键"这个动作,是怎么变成单片机能识别的电平信号的。

我们日常用的轻触按键,本质上是一个机械开关:内部有两个金属触点,平时断开,按下时接触导通,松开时在弹簧作用下重新断开。

51单片机开发中,最常用、最稳定的接法是上拉输入接法,也是所有开发板默认的接法:

  1. 单片机I/O引脚通过内部上拉电阻连接到5V电源,未按下时 ,引脚被稳定在高电平
  2. 按键一端接I/O引脚,另一端直接接电源地(GND,0V);
  3. 按键按下时 :触点导通,I/O引脚直接和GND连通,电平被拉到低电平
  4. 按键弹起时 :触点断开,引脚重新被上拉电阻拉回高电平

核心判断逻辑(新手必须刻在脑子里)

  • 按键未按下:引脚为高电平,读取到的数值为1;
  • 按键按下:引脚为低电平,读取到的数值为0。

C语言知识点联动:我们可以通过if-else分支语句,根据读取到的电平判断按键状态,执行对应操作:

c 复制代码
// 如果P1_0引脚为低电平,说明按键按下
if( (P1 & (1 << 0)) == 0 )
{
    // 按键按下,点亮LED
    P1 = P1 & ~(1 << 1);
}
else
{
    // 按键松开,熄灭LED
    P1 = P1 | (1 << 1);
}

一句话总结:常用按键接法是上拉输入,未按下高电平、按下低电平,通过C语言if-else判断电平就能实现按键控制。

2.3 按键抖动的本质:新手90%问题的根源

为什么要学:这是新手最容易踩的坑,搞懂抖动才能写出稳定的按键代码。

很多新手按照上面的逻辑写了代码,会发现一个致命问题:明明只按了一次按键,结果单片机却触发了好几次,比如按一次LED亮了又灭。这就是按键抖动导致的。

专业术语解释:按键抖动是指轻触按键在按下和弹起的瞬间,内部金属触点会因为机械弹性,发生多次连续的接触和断开,导致引脚电平出现多次快速的高低跳变,而不是理想中的一次平稳切换。

通俗比喻理解:你把篮球从高处扔到地上,它不会直接落在地上不动,而是会弹起来好几次才会静止。按键的金属触点也是一样,按下时会因为弹性反弹好几次,才会稳定接触;弹起时也会断开又接触好几次,才会稳定断开。这个弹跳过程就是按键抖动。

抖动的关键参数

按键抖动的持续时间非常短,一般在5ms~20ms之间。这个时间对于人来说完全感知不到,但对于单片机来说,它每秒能执行上千万条指令,这10ms足够它读取几十次引脚状态,把每一次抖动都当成一次按键按下,最终出现"按一次触发好几次"的误触发。

抖动的核心危害

  1. 按键误触发:按一次识别成多次;
  2. 状态识别错误:长按短按混乱;
  3. 程序逻辑混乱:频繁误触发导致主程序状态错乱。

一句话总结:按键抖动是机械触点的弹性弹跳导致的,持续5~20ms,是按键误触发的核心根源,必须通过消抖处理过滤。

2.4 按键消抖方案:硬件消抖与软件消抖全解析

为什么要学:消抖是写出稳定按键代码的核心前提,软件消抖是嵌入式开发最常用的方案。

按键消抖就是通过硬件或软件的方法,过滤掉抖动期间的电平跳变,只保留稳定的电平状态,让单片机只识别一次有效的按键动作。

2.4.1 硬件消抖

硬件消抖是通过在电路上增加电阻和电容(RC滤波),利用电容的充放电特性过滤快速跳变。

  • 优点:消抖完全由硬件完成,不占用CPU资源;
  • 缺点:每个按键都需要额外元件,增加成本和电路复杂度,不适合多按键场景。
  • 适用场景:只有1~2个按键的极简产品。
2.4.2 软件消抖(新手必学,嵌入式开发最常用)

软件消抖是通过C语言代码,避开按键抖动的时间段,只在电平稳定后才读取状态,不需要额外硬件,是性价比最高的方案。

软件消抖的核心逻辑(新手必懂)

我们知道抖动持续不超过20ms,所以可以这样做:

  1. 第一次检测:当单片机第一次检测到引脚电平变化(比如从高变低),说明按键可能被按下,但不立刻认为是有效按下;
  2. 延时避抖:执行一个10ms~20ms的延时,避开抖动时间段,等电平稳定;
  3. 再次确认:延时结束后,再次读取引脚电平,如果还是低电平,说明按键确实被按下,不是抖动,此时才执行对应操作;
  4. 等待松开:最后加一个while循环,等待按键松开,避免长按的时候主循环反复执行操作,导致连发现象。

通俗比喻理解:你在门口等敲门,第一次听到敲门声不立刻开门,等20秒,要是20秒后还有敲门声,才确认是真的有人,再去开门。软件消抖的延时就是这个"等20秒"的动作。

C语言最简软件消抖代码实现

c 复制代码
// 检测按键是否有效按下
if( (P1 & (1 << 0)) == 0 )
{
    Delay_ms(20); // 延时20ms,避开抖动
    if( (P1 & (1 << 0)) == 0 ) // 再次确认
    {
        // 这里写按键按下的有效操作,比如翻转LED
        LED = !LED;
        // 等待按键松开,避免连发现象
        while( (P1 & (1 << 0)) == 0 );
    }
}

一句话总结:软件消抖是最常用的方案,核心逻辑是"第一次检测→延时避抖→再次确认→等待松开",能彻底解决误触发问题。

2.5 独立按键的驱动逻辑:C语言位读取与状态判断

为什么要学:独立按键是最基础的按键形式,掌握它的驱动逻辑是所有按键开发的起点。

独立按键就是每个按键单独占用一个I/O引脚,电路独立,适合1~8个按键的场景。我们把它的驱动逻辑分为两个层级,从基础到进阶:

层级1:基础电平跟随模式

最简单的逻辑:按键按下时执行操作,松开时停止操作,比如按下点亮LED,松开熄灭LED,核心是实时跟随按键电平。

  • 适用场景:电机启停、蜂鸣器控制、灯光点动控制等。
层级2:按键触发翻转模式

工业开发中最常用的模式:按一次按键,翻转一次LED状态(亮→灭,灭→亮),只在按下瞬间触发一次,松开不触发,长按也不连发,这就需要用到上面讲的软件消抖和等待松开。

  • 适用场景:功能开关、模式切换、菜单选择等绝大多数人机交互场景。

C语言知识点联动:独立按键驱动会深度用到位操作、if-else分支、while循环、函数封装、宏定义等知识点,完美把C语言语法和硬件控制结合在一起。

一句话总结:独立按键驱动分为电平跟随和触发翻转两种模式,触发翻转模式最常用,必须配合软件消抖和等待松开使用。


三、Keil5+STC-ISP保姆式全流程实操

3.1 工程创建与基础环境配置

工程创建步骤和上一章完全一致,这里简化说明,重点讲代码部分:

  1. 创建纯英文工程文件夹D:\51_Project\03_Key_Input
  2. 新建Keil工程,选择Atmel→AT89C52,必须添加STARTUP.A51启动文件
  3. 创建main.c源文件并添加到工程;
  4. 点击魔法棒图标,在Output选项卡勾选「Create HEX File」;
  5. 把Encoding设置为UTF-8,避免中文乱码。

3.2 纯寄存器实现:基础按键控制LED亮灭

我们先写纯寄存器实现的代码,彻底巩固输入的底层逻辑,功能:按键按下点亮LED,松开熄灭LED,每一行带逐行注释。

c 复制代码
// 51单片机入门:独立按键控制LED纯寄存器实现版
// 核心逻辑:通过C语言指针操作寄存器,实现I/O口电平读取

// 1. 通过C语言指针,定义P1口寄存器
#define P1 (*(unsigned char *)0x90)

// 2. 按键引脚:P1_0,LED引脚:P1_1
#define KEY_PIN 0
#define LED_PIN 1

// 3. 毫秒级延时函数
void Delay_ms(unsigned int n)
{
    unsigned int i, j;
    for(i = 0; i < n; i++)
        for(j = 0; j < 110; j++);
}

// 4. 主函数
void main(void)
{
    // 初始化:LED默认熄灭
    P1 = P1 | (1 << LED_PIN);
    
    while(1)
    {
        // 检测按键是否按下(低电平)
        if( (P1 & (1 << KEY_PIN)) == 0 )
        {
            // 按键按下:点亮LED
            P1 = P1 & ~(1 << LED_PIN);
        }
        else
        {
            // 按键松开:熄灭LED
            P1 = P1 | (1 << LED_PIN);
        }
    }
}

敲黑板:这个代码没有加消抖,实际测试时会出现误触发,我们在下一个版本里加上消抖。

3.3 工业级规范代码:带消抖的按键翻转LED

接下来用reg52.h简化写法,加上完整的软件消抖和等待松开,功能:按一次按键,翻转一次LED状态,按一次只触发一次,无连发现象。

c 复制代码
// 51单片机入门:工业级带消抖的按键翻转LED
#include <reg52.h>

// 位定义:按键和LED引脚
sbit KEY = P1^0;
sbit LED = P1^1;

// 毫秒级延时函数
void Delay_ms(unsigned int n)
{
    unsigned int i, j;
    for(i = 0; i < n; i++)
        for(j = 0; j < 110; j++);
}

// 主函数
void main(void)
{
    LED = 1; // LED默认熄灭
    while(1)
    {
        // 第一步:第一次检测按键按下
        if(KEY == 0)
        {
            // 第二步:延时20ms,避开抖动
            Delay_ms(20);
            // 第三步:再次确认按键还是按下状态
            if(KEY == 0)
            {
                // 按键有效按下:翻转LED状态
                LED = !LED;
                // 第四步:等待按键松开,避免连发现象
                while(KEY == 0);
            }
        }
    }
}

代码核心讲解

  1. sbit KEY = P1^0;是Keil扩展的位定义关键字,底层逻辑和我们用指针定义寄存器完全一致,简化了单引脚的操作;
  2. LED = !LED;是位翻转的最简写法,0变1,1变0,对应LED灭变亮、亮变灭;
  3. while(KEY == 0);是等待按键松开的死循环,只有按键松开后,程序才会继续往下执行,避免长按连发现象。

3.4 拓展实操:两个按键分别控制LED亮灭

接下来做个拓展:两个按键分别控制LED的亮和灭,K1按下点亮LED,K2按下熄灭LED,巩固独立按键的驱动逻辑。

c 复制代码
// 拓展实操:两个按键分别控制LED亮灭
#include <reg52.h>

sbit KEY1 = P1^0; // K1:点亮LED
sbit KEY2 = P1^1; // K2:熄灭LED
sbit LED  = P1^2; // LED连接P1_2

void Delay_ms(unsigned int n)
{
    unsigned int i, j;
    for(i = 0; i < n; i++)
        for(j = 0; j < 110; j++);
}

// 按键消抖检测函数:模块化封装,返回1表示有效按下
bit Key_Scan(sbit key_pin)
{
    if(key_pin == 0)
    {
        Delay_ms(20);
        if(key_pin == 0)
        {
            while(key_pin == 0); // 等待松开
            return 1;
        }
    }
    return 0;
}

void main(void)
{
    LED = 1;
    while(1)
    {
        // K1按下:点亮LED
        if(Key_Scan(KEY1) == 1)
        {
            LED = 0;
        }
        // K2按下:熄灭LED
        if(Key_Scan(KEY2) == 1)
        {
            LED = 1;
        }
    }
}

拓展引导:试试把K2的功能改成"翻转LED状态",或者增加K3实现LED闪烁模式切换,动手修改代码观察效果!


四、保姆式排错指南(新手100%踩坑全覆盖)

异常现象/报错信息 核心根因 一步到位的解决方法
按键按下完全没反应,LED无变化 1. 按键引脚定义错误;2. 按键电路接法错误;3. P0口做输入未外接上拉电阻;4. 按键扫描代码未在主循环中调用 1. 确认开发板按键实际连接的引脚;2. 确认按键一端接IO口,一端接GND;3. P0口做输入必须外接10K上拉电阻;4. 确保按键扫描代码在while(1)主循环中
按一次按键,触发好几次功能 1. 没有加软件消抖;2. 没有等待按键松开;3. 消抖时间太短 1. 按键检测后必须加20ms延时消抖;2. 单次触发功能必须加while循环等待松开;3. 把消抖时间调整为20~30ms
按下按键后,其他功能全部卡死 用了死循环等待按键松开,阻塞了主程序 后续我们会学定时器实现非阻塞消抖,入门阶段先接受这个小问题,重点掌握消抖逻辑
按键偶尔出现误触发,没按也会触发 1. I/O引脚悬空,没有上拉电阻;2. 电源干扰;3. 按键扫描频率过高 1. 确保输入引脚有上拉电阻;2. 给开发板电源加100uF滤波电容;3. 主循环中加少量延时,降低扫描频率
编译报错:undefined identifier 'P1^0' 1. sbit定义写在了函数里面;2. 用了错误的位操作语法 1. sbit位定义必须写在main函数外面,全局定义;2. 正确写法是先sbit KEY = P1^0; 再用if(KEY == 0)

五、我的入门踩坑记录

踩坑记录1:没加消抖,按一次触发十几次

- 坑的现象 :我最开始写按键控制LED翻转的代码,没有加消抖,直接检测到低电平就翻转,结果按一次LED亮灭好几次,有时候按一次直接跳回原来的状态,完全没法用。

- 背后的原理 :按键按下的瞬间有10ms左右的抖动,主循环在抖动期间执行了十几次检测,每次都翻转一次LED状态,导致误触发。

- 解决方案:我在第一次检测到按键按下后,加了20ms延时,再次确认按键状态,同时加了while循环等待松开,修改后按一次只触发一次,完全没有误触发了。

踩坑记录2:用死循环等待松开,导致其他功能卡死

- 坑的现象 :我写了一个按键控制流水灯模式切换的代码,加了while循环等待松开,结果按下按键不松开的时候,流水灯直接停了,其他所有功能都卡死了。

- 背后的原理 :while循环等待松开的时候,CPU一直在循环检测引脚,不会执行主循环里的其他代码,导致程序被阻塞。

- 解决方案:后续我学了定时器,用定时器实现了非阻塞消抖,不用死循环等待,按下按键不松开的时候,流水灯依然正常运行。

踩坑记录3:P0口做按键输入没加外部上拉电阻,电平乱跳

- 坑的现象 :我把按键接在了P0口,没按按键的时候,单片机也会频繁误触发,用万用表测引脚电平,发现一直在高低之间乱跳。

- 背后的原理 :P0口内部没有上拉电阻,做输入的时候如果不外接上拉电阻,引脚就处于悬空状态,电平会受外界干扰乱跳。

- 解决方案:我给P0口的每个按键引脚都外接了一个10K上拉电阻到5V,重新上电后,引脚电平稳定在高电平,再也没有误触发了。


六、课后小练习(带完整可运行标准答案)

6.1 基础巩固练习(4道)

练习1:实现按键按下LED点亮,松开熄灭,带完整软件消抖

需求说明 :按键连接P1_0,LED连接P1_1,按下点亮,松开熄灭,带消抖,无抖动误触发。
拓展思考:如果要让按键按下时LED闪烁,松开时熄灭,怎么修改代码?

练习2:实现按键短按翻转LED状态

需求说明 :按键连接P1_0,LED连接P1_1,按一次翻转一次亮灭状态,带消抖,按一次只触发一次。
拓展思考:如果要实现两个按键分别控制两个LED的翻转,怎么修改代码?

练习3:实现两个按键,K1点亮LED,K2熄灭LED

需求说明 :K1连接P1_0,K2连接P1_1,LED连接P1_2,K1按下点亮,K2按下熄灭,两个按键都带消抖。
拓展思考:如果要增加K3实现LED闪烁模式,怎么修改代码?

练习4:实现按键控制LED的三种模式切换

需求说明:一个按键连接P1_0,LED连接P1_1,按一次切换到常亮,按两次切换到闪烁,按三次切换到常灭,循环往复。

6.2 进阶实战练习(2道)

练习1:实现非阻塞式按键消抖(不用死循环等待)

需求说明:用标志位的方式实现非阻塞消抖,按下按键翻转LED状态,同时不阻塞主程序中LED的闪烁功能。

练习2:实现按键短按和长按识别

需求说明:一个按键连接P1_0,短按(小于500ms)翻转LED状态,长按(大于500ms)让LED快速闪烁,松开后停止。


七、核心知识点速记

  1. I/O口输入模式是读取引脚电平状态,P1/P2/P3口自带内部上拉电阻可直接输入,P0口做输入必须外接上拉电阻。
  2. 常用按键接法是上拉输入:未按下高电平、按下低电平,通过C语言位读取操作判断状态。
  3. 按键抖动是机械触点的弹性弹跳导致的,持续5~20ms,是按键误触发的核心根源。
  4. 软件消抖是最常用的方案,核心逻辑是"第一次检测→延时20ms避抖→再次确认→等待松开"。
  5. 工业级位读取规范:(寄存器 & (1 << 位号)) == 0,用于判断对应引脚是否为低电平。
  6. 单次触发的按键功能,必须添加while循环等待按键松开,避免长按连发现象。
  7. 独立按键驱动分为电平跟随和触发翻转两种模式,触发翻转模式最常用。
  8. 按键驱动必须模块化封装成独立函数,符合工业级开发规范,提高代码可读性。
  9. 遇到按键问题优先排查:引脚定义、消抖逻辑、等待松开、上拉电阻。
  10. 入门阶段用延时消抖即可,后续学习定时器后可实现非阻塞消抖,解决程序阻塞问题。

八、本章小结与下一章预告

本章我们从I/O口输入模式的底层原理出发,彻底搞懂了单片机读取外界电平信号的核心逻辑,拆解了按键的硬件工作原理和抖动的本质,掌握了软件消抖的实现方案,从最基础的电平跟随,到工业级的触发翻转,一步步完成了独立按键的全流程开发,同时深度联动了C语言的位操作、分支循环、函数封装等核心知识点,真正实现了单片机和人的双向交互。

按键输入是所有嵌入式产品人机交互的基础,本章学到的电平读取、消抖逻辑、模块化编程,不仅适用于51单片机,更是所有嵌入式MCU开发的通用核心能力。

在本章的学习中,我们用到了延时函数来实现消抖,但基础的延时函数会占用CPU资源,阻塞主程序的运行,同时无法实现精准的定时控制。在下一章中,我们会学习51单片机的核心片内外设------定时器/计数器,搞懂定时器的底层工作原理,用C语言实现精准的定时功能,用定时器替代延时函数,实现真正的非阻塞式程序设计,同时为后续的中断、串口通信等高级功能打下最核心的基础。我们下一章,不见不散!

相关推荐
要努力点1 小时前
26考研——计算机考研复试——0854(2)
java·c语言·考研·算法·复试
hoiii1871 小时前
PID控制四轴飞行器系统设计(单片机主控)
单片机·嵌入式硬件
恶魔泡泡糖1 小时前
stm32核心板子使用验证与串口下载
stm32·单片机·嵌入式硬件
wsoz2 小时前
串口仿真协议(RFCOMM)
单片机·嵌入式·蓝牙协议栈·rfcomm
星轨初途2 小时前
【C/C++底层修炼】拆解动态内存管理:四大动态内存函数、六大错误与柔性数组
c语言·开发语言·c++·经验分享·笔记·柔性数组
会编程的小孩2 小时前
指针应用 单片机
单片机·嵌入式硬件
HalvmånEver2 小时前
Linux:基于 UDP Socket 的实战项目 --简单双向通信程序
linux·单片机·udp
2301_789015622 小时前
封装哈希表实现unordered_set/undered_map
c语言·数据结构·c++·算法·哈希算法
沈阳信息学奥赛培训10 小时前
#undef 指令 (C/C++)
c语言·开发语言·c++