单片机应用软件开发必须掌握
我们假设您指的是在嵌入式单片机环境下的软件开发。由于单片机资源有限内存小、主频低算法选择需要兼顾效率与资源占用。以下分类列出一、必须熟练使用的软件算法基础核心这些是嵌入式开发中几乎每个项目都会用到的必须掌握。循环队列环形缓冲区应用场景串口接收/发送缓冲、任务队列、数据缓冲、buffer。为什么重要单片机中频繁的数据流动避免数据覆盖提高效率。状态机有限状态机FSM应用场景系统工作流程控制、通信协议解析如UART命令解析、用户界面控制。为什么重要使程序结构清晰易于维护和调试避免使用复杂的标志位和条件判断。定时器调度器时间片轮询滴答减法应用场景多任务调度合作式调度、周期性任务如LED闪烁、按键扫描、AD采集。为什么重要单片机通常没有操作系统需要自己实现简单的多任务管理。按键检测算法消抖与状态识别应用场景机械按键检测。为什么重要按键消抖是基础同时要能识别长按、短按、连按等。传感器数据滤波算法应用场景AD采集值滤波、去除噪声。常用算法平均值滤波、中值滤波、中位值滤波、一阶滞后滤波低通滤波、滑动平均滤波、卡尔曼滤波。为什么重要提高数据稳定性避免误触发传感器最多用滑动平均值滤波。CRC校验算法应用场景通信数据校验如Modbus协议、存储数据校验。为什么重要保证数据完整性通信可靠。字符串处理相关算法应用场景解析通信协议ASCII格式、数据转换。常用操作字符串分割、转换为数值atoi, atof等、格式化输出类似sprintf但单片机中常用轻量级实现。二、需要了解的软件算法根据项目需求使用这些算法在特定项目中非常有用了解其原理和实现在需要时能快速应用。排序与查找简单排序冒泡排序、选择排序数据量小的时候。查找顺序查找、二分查找注意数据必须有序、查表法。数据结构链表单向链表用于动态管理数据对象但单片机中慎用动态内存。栈和队列除了循环队列也可能用到栈例如函数调用栈、表达式求值。PID控制算法应用场景电机控制、温度控制等闭环控制。为什么重要工业控制中常用但参数整定需要经验。数据压缩与编码应用场景数据存储或传输时节省空间。常用算法哈夫曼编码压缩、Base64编码用于ASCII传输二进制数据。位操作相关算法应用场景IO控制、数据包封装与解析、位图管理。常用操作位域、位掩码、位翻转等。内存管理应用场景动态内存分配谨慎使用、内存池固定大小内存块管理。为什么重要避免内存碎片提高内存使用效率。校验和与纠错编码除了CRC还有奇偶校验、和校验、汉明码等。三、需要了解的软件设计模式与框架这些不是具体算法但能帮助您更好地组织代码。模块化编程将功能分离为独立的模块降低耦合。回调函数Callback应用场景事件驱动编程例如中断处理中调用用户函数。命令模式应用场景将操作封装为对象便于实现撤销、重做等功能。观察者模式应用场景事件通知例如一个模块状态改变通知多个其他模块。四、给新手的建议从基础开始先熟练掌握状态机、环形缓冲区、定时器调度和基本滤波算法。这些是嵌入式软件的骨架。理解单片机的限制避免使用浮点数运算改用定点数、避免动态内存分配除非有把握、注意中断服务函数要短小。代码优化技巧使用查表法替代复杂计算、用位操作替代乘除法、用状态机替代延时等待。多读优秀代码阅读一些开源项目如FreeRTOS、uC/OS等的源码学习其编程风格和设计思想。实践出真知多做项目在实践中遇到问题并解决才能真正掌握。最后记住在单片机软件开发中可靠性和效率往往比代码的通用性更重要。因此选择算法时要根据具体资源情况和项目需求权衡。算法类别算法名称主要用途详细说明滤波与信号处理均值滤波对连续多次采样的AD值求平均值可以消除随机噪声。例如读取温度传感器时由于电路干扰数据会上下跳动取10次平均后数值更稳定。适合变化缓慢的信号如室温、湿度。中值滤波对一组采样值按大小排序取中间的那个值。能有效去除“毛刺”脉冲干扰比如偶尔一次采到很大或很小的异常值。常用于按键检测、红外接收、防止单个异常数据影响判断。一阶低通滤波类似硬件RC滤波器的软件实现新值 旧值 × (1-α) 采样值 × α。α越小滤波越强。可以平滑连续变化的信号比如锂电池电压、光照强度。计算简单只需乘法和加法适合8位单片机。滑动平均滤波维护一个固定长度的队列每来一个新数据就丢掉最旧的数据然后计算队列平均值。既能平滑波形又能及时响应变化。适合实时显示数据流比如串口助手收到的传感器曲线。数据处理与变换查表法事先把复杂函数如sin、cos、指数的结果计算好存入数组使用时直接读取速度极快。例如步进电机控制中需要正弦波表来产生细分电流查表比实时计算快几十倍。线性插值查表时表内只有离散点比如0°、10°、20°的正弦值如果想得到5°的值就在0°和10°之间按比例估算。用于提高精度而不增加表的大小。典型应用NTC热敏电阻的阻值转温度。定点数运算单片机没有浮点运算单元FPU时用整数模拟小数。例如把1.23表示为123乘以100运算完再除以100。避免慢速的浮点库常用于PID计算、电量百分比显示。字节/位操作CRC、校验和CRC是循环冗余校验用于检测通信数据是否被篡改如串口、CAN、无线模块。校验和简单地把所有字节相加也能发现部分错误。保证数据传输可靠性。控制算法PID控制最经典的闭环控制根据目标值与实际值的偏差自动调整输出比如PWM占空比使实际值稳定在目标值。用于恒温加热、电机转速控制、平衡小车。需要调节Kp、Ki、Kd三个参数。增量式PIDPID的一种变种每次只计算输出需要变化多少增量而不是绝对输出值。可以防止积分饱和也更容易实现手动/自动无扰切换。常用于步进电机位置控制、舵机角度控制。PWM占空比调节通过改变高电平时间比例来模拟电压输出。虽然算法本身简单但调节方式如线性调节、指数调节会影响效果。例如LED调光用指数曲线人眼感觉更平滑散热风扇用线性调节即可。状态机与逻辑有限状态机FSM把程序逻辑分解为若干个“状态”比如按键的等待、确认、长按、释放每个状态下只处理允许的事件。让复杂流程变得清晰、不易出错。广泛应用多按键扫描、MODBUS协议解析、菜单导航。事件驱动调度系统平时进入低功耗休眠只有发生外部中断按键、串口收到数据才唤醒并根据事件类型执行对应的任务。常用于电池供电设备如蓝牙遥控器、无线传感器节点。调度与资源管理时间片轮询在裸机无RTOS系统中用定时器产生固定时间中断轮流执行不同的任务比如每2ms扫描按键每10ms刷新LED每50ms读取传感器。实现多个任务“同时”运行的感觉。任务优先级调度给不同任务分配优先级高优先级的任务可以打断低优先级的任务。例如实时报警信号必须立即处理而串口打印数据可以稍后。可以用在主循环中断的基础上或者简单的RTOS中。环形缓冲区FIFO一个固定大小的数组通过头指针和尾指针循环使用空间。用于缓冲串口接收的数据中断把字节存入缓冲区主循环从缓冲区取出处理两者速度不匹配时不会丢数据。也常用于音频数据流。搜索与排序二分查找在有序数组中快速定位某个值。例如有一个温度-电阻对照表按温度排序要查出某个电阻对应的温度二分查找只需比较log2(N)次比逐个查找快很多。适合查表较大的情况。冒泡/插入排序对少量数据比如几十个按大小排序。例如显示最近5次温度的历史记录、对菜单选项排序、或者对多个报警优先级排序。冒泡简单易写插入排序在数据接近有序时效率更高。数据压缩与编码行程编码RLE把连续重复的数据用“重复次数数据值”表示。例如一张16×16的图标有大量连续相同颜色RLE可以大幅减少存储空间。也用于压缩简单的波形数据或字库。曼彻斯特编码每个比特用跳变表示比如0→1代表数据01→0代表数据1解决了通信线上无时钟时的同步问题并且没有直流分量。常用于RFID、红外遥控、以太网等通信。数学与数值计算开平方/三角函数近似在低端单片机上不用math.h库占ROM大且慢而是用查表、泰勒展开或牛顿迭代快速计算。例如无人机飞控中根据加速度计计算姿态角需要快速sin/cos。牛顿迭代法一种逐步逼近的方法可以用来快速计算除法如果单片机没有硬件除法器或开平方。只需几次乘法就能得到高精度结果。也用于求解非线性方程。通信协议处理协议解析如MODBUS接收一串数据后要判断帧头、地址、功能码、数据、校验。例如MODBUS RTU需要检测3.5字符空闲作为帧结束然后提取数据执行命令。算法包括状态机解析、CRC计算、异常响应。位填充/去填充在CAN总线或USB协议中如果连续出现5个相同电平的位就会自动插入一个相反电平的位防止丢失同步。发送时执行位填充接收时去掉填充位。这是底层通信固件必须实现的功能。低功耗相关唤醒源检测单片机从休眠模式醒来后需要快速判断是哪个中断唤醒的定时器外部按键RTC然后只处理对应任务其他不处理处理完继续休眠。避免无效操作浪费电量。延迟休眠算法刚执行完一个任务比如按键响应时可能很快又有新任务此时不要立即进入休眠而是延迟一小段时间比如100ms再休眠避免频繁进出休眠模式带来的额外功耗。单片机必掌握算法新手详细版算法名称主要用途大白话解释典型应用场景具体例子队列排队办事数据先来的先处理后到的排后面。防止处理不过来时丢失数据。串口助手一次性发来100字节数据单片机1字节1字节接收但你的主程序可能正忙着点灯。队列把收到的数据存起来等主程序有空再慢慢取。环形缓冲区固定大小的循环队伍就像操场跑道数据存满了就从头覆盖旧数据。节省内存不用频繁挪位置。GPS模块每秒发10条数据你只关心最新的一条。用环形缓冲区存新数据自动盖掉最老的永远保留最新10条。状态机记忆当前状态设备现在在做什么决定了它遇到事件后该做什么反应。比如电梯关门状态按“1楼”才响应开门状态按“1楼”可能先关上门。①长按按键按下100ms算“单击”按2秒算“长按”。状态机能区分按下过程中时间长短。②四轴飞行器解锁油门最低方向摇杆右偏→锁定状态变解锁状态。均值滤波多次测量求平均减少随机抖动。读取热敏电阻温度ADC值总跳±2。连续取10次相加再除以10读数就稳了。中值滤波去掉最离谱的那个值比如10个数里最小和最大可能是干扰取中间第5大的值。按键接在ADC口上多按键共用一路ADC按下时ADC本应稳定在200但偶尔有个别值跳到50或500中值滤波直接扔掉这些异常值。一阶低通滤波让变化更平滑新值 旧值×0.9 当前采样×0.1当前采样权重越小越平滑。①电池百分比手机电量不会从50%瞬间变51%而是慢慢变。②电机启动PWM占空比从0慢慢加到目标值避免猛冲。PID控制根据误差自动调整比如设定温度100度当前80度误差20度。PID会让加热功率 P×20 I×累积误差 D×误差变化率精确达到目标。①平衡小车车身倾斜时PID计算电机速度和方向让它直立。②恒温加热台温度接近100度时自动降低功率防止过冲。增量式PID每次只输出“增加/减少多少”适合步进电机或数字电位器这类“给个增量动作一次”的设备。步进电机控制云台本次输出10脉冲下次输出-5脉冲。PID只输出每次的脉冲数变化量而不是绝对位置。查表法提前算好所有可能结果不用现场计算sin、cos等复杂函数直接读数组。①sin值角度0~359度对应1000个sin值查表比计算快几百倍。②NTC温度传感器电阻值-温度对照表存好测出电阻直接查温度。线性插值查表没精确值时用两点连线估算中间值比如表中10℃对应5kΩ20℃对应3kΩ15℃对应? 按比例 (53)/24kΩ。电池电量显示电压3.7V对应100%3.3V对应0%。实际测出3.5V插值得到50%。定点数运算不用浮点数小数也能算小数把1.23乘以100变成整数123来算最后再除以100。没有FPU的单片机也能飞快计算。计算电池剩余容量电流0.123A×时间10.5s 1.2915As。用定点数放大1000倍做乘法不调用慢吞吞的浮点库。CRC校验给数据包加“指纹”发送方按规则算出CRC值附在包尾接收方重新计算对比。不同则说明传输过程出错。①Modbus通信指令最后两个字节是CRC16线受到干扰数据错一位CRC就对不上设备就会丢弃指令。②OTA升级升级包带CRC防止固件烧录错误。异或校验最简单的“奇偶校验”把所有数据按位异或得到一个校验字节。自定义串口协议帧头数据异或值。接收方把数据和异或值重新异或结果为0表示正确。用于对可靠性要求不高的地方如调试输出。时间片轮询把多个任务分时执行10ms到了去扫按键50ms到了去刷新显示100ms到了去读传感器。不用RTOS也能“同时”做多件事。裸机单片机主循环里一个巨大while(1)里面放一堆“if (定时标志) 执行任务”用定时器每1ms置一个标志。LED呼吸灯、按键检测、数码管动态扫描都能共存。事件驱动没事就睡觉有事才干活平时进入低功耗模式中断来了比如按键按下了唤醒CPU处理完继续睡。门磁传感器干电池供电99%时间深度睡眠只有干簧管触发中断才醒来上报“门开了”然后立刻睡。内存拷贝/比较批量复制或比较内存块比如把数组A的10个字节复制到数组B或者比较两个数组内容是否相同。①OLED显示先把显示内容画在缓存区然后一次性memcpy到显存刷新。②协议解析收到数据包后用memcmp比较前几个字节是否为OK\r\n。字符串转数值把文本数字变成真正的数字123这个字符串ASCII码转成整数123。①AT指令发ATCWJAP?返回CWJAP:SSID,信号强度 -45dBm你需要从字符串中提取出-45并转成整数。②GPSGNGGA语句中纬度3158.2104,N转成31.970173度。单片机应用软件开发工程师必掌握算法完整三列表格算法名称主要用途大白话解释典型应用场景具体例子位操作技巧单独控制寄存器或引脚的一个bit0/1不影响其他位。置位REG | (13)清零REG ~(13)翻转REG ^ (13)提取某位(REG3)1。几乎每个驱动都用。状态机记忆当前状态根据状态决定事件如何响应。按键长短按识别、四轴飞行器解锁、菜单导航、通信协议解析。队列FIFO数据先入先出解决收发速度不匹配的问题。串口接收缓存、按键扫描缓冲、日志存储。环形缓冲区固定大小的队列数据写满后自动覆盖最旧的数据。同上但更省内存常用于实时数据流如GPS、传感器。按键消抖去除机械按键按下/弹起时的电平抖动避免一次动作被误判多次。① 延时消抖简单阻塞不推荐产品用② 状态机消抖定时扫描连续3次相同电平确认。数据打包/解包将多个数据int、float等拆成字节流发送接收方再拼回原数据。发送16位整数buf[0]val0xFF; buf[1]val8接收valbuf[0]|(buf[1]8)。超时管理给某个事件设定等待上限超时后放弃等待或报错防止程序卡死。串口接收帧间隔超时判断等待外设就绪循环计数超时I2C/SPI通信超时保护。均值滤波多次采样取平均抑制随机噪声。ADC多次采样平滑温度、湿度传感器读数稳定。滑动平均滤波维护一个固定长度的队列每次采样去掉最老值、加入最新值再求平均。光照强度连续采集电池电压动态显示变化更平滑且响应快。限幅滤波当前采样与上次有效值差值超过阈值则丢弃保留上次值。温度传感器突跳5℃认为是干扰人体红外信号突变滤除。中值滤波取一组采样值中间的那个数消除脉冲噪声异常大或异常小的值。按键ADC读取消除毛刺红外测距传感器抗干扰。一阶低通滤波新值 旧值×权重 当前采样×(1-权重)让信号平滑变化。电池电量百分比缓慢变化电机PWM软启动加速度计数据平滑。PID控制根据设定值与反馈值的偏差自动计算控制量实现无静差稳定控制。直流电机转速闭环平衡小车直立恒温加热台温度控制。增量式PIDPID每次只输出控制量的“变化值”增量适用于步进电机等需要步进驱动的对象。步进电机位置控制数字电源步进调节舵机微调。查表法将可能的结果预先计算好存成数组运行时直接读取避免耗时计算。sin/cos值表CRC校验表温度-电阻对照表。线性插值查表时若没有精确匹配的点用相邻两点直线关系估算中间值。电池电压-电量曲线查表细化NTC热敏电阻阻值转温度。二分查找在有序数组中快速定位目标值的位置时间复杂度O(log₂N)。大型查表优化如NTC分度表快速定位菜单合法值快速匹配。累加和校验将所有数据字节相加取低8位作为校验值检测数据传输或存储是否出错。无线遥控器指令校验自定义串口协议简单传感器通信。CRC校验更强大的数据包“指纹”能检测多比特错误有多种变体CRC-8/16/32。Modbus通信SD卡/Flash存储完整性检查OTA升级包校验。异或校验所有字节按位异或得到一个校验字节计算极快。自定义简易协议调试辅助部分传感器通信如DS18B20。时间片轮询利用定时器中断划分时间片在裸机上实现多任务分时执行不用RTOS。LED闪烁每500ms、按键扫描每20ms、数码管动态扫描每1ms。事件驱动系统平时休眠只有中断/事件发生时才唤醒执行相应代码完成后继续休眠。低功耗门磁传感器按键唤醒系统无线模块接收唤醒。内存拷贝/比较高效批量复制或比较内存块如memcpy、memcmp。显示缓冲区刷新协议数据包解析比较帧头。字符串转数值将ASCII字符串如123.45转换为整数或浮点数。AT指令参数提取GPS NMEA语句解析串口命令行处理。单片机应用软件开发工程师必掌握算法续算法名称主要用途大白话解释典型应用场景具体例子异或加密/解密用一个密钥字节与数据按位异或加密后再异或同一密钥即可还原极轻量。① 无线遥控器指令加密防止简单的重复攻击。② 存储用户密码到EEPROM时做简单混淆。③ 调试信息加密输出防旁人直接看懂。游程编码RLE压缩连续重复的数据把“AAAAA”记录为“5个A”节省存储空间。① OLED全屏显示大量连续相同颜色像素压缩率极高。② 将采集的空闲串口数据全是0x00压缩后存储到Flash。查表法替代分支用一个数组映射代替if-else或switch-case使代码更简洁且执行更快。① 按键值转功能码func map[ key ]代替if(key1) func…。② 错误码转错误字符串索引。③ 单片机解码红外键值转系统动作。快速开方算法在不支持硬件除法/开方的MCU上用牛顿迭代法或查表法快速计算平方根。① 计算两点间距离勾股定理时避免慢速浮点开方。② 均方根电流计算。③ 加速度计矢量幅值计算。移动方差/标准差动态计算一段滑动窗口内数据的波动程度判断信号是否稳定。① ADC采集判断触摸按键是否被按下信号从抖动变平稳。② 判断电机转速是否已稳定转速方差小于阈值。③ 温控系统判断温度是否进入稳态。电量累积库仑积分对电流乘以时间进行积分计算电池消耗/剩余电量比电压法更准确。① 电池供电设备精确电量显示如蓝牙耳机、电子烟。② 太阳能充电统计。③ 电机运行能耗统计。看门狗喂狗算法在规定时间内给硬件看门狗发“喂狗”脉冲否则单片机自动复位。需在任务中合理安排喂狗时机。① 主循环喂狗基本。② 多任务中“分时喂狗”每个任务执行完后累计标记最后统一喂狗防止长耗时任务导致复位。简易时间戳/滴答计时利用系统心跳如1ms中断维护一个全局毫秒计数器用于测量时间间隔、超时、延时。① 非阻塞延时记录当前时间戳循环判断“当前时间-记录时间 等待时长”。② 按键长按计时。③ 通信超时重试。循环冗余校验CRC查表法预先计算好CRC表运行时直接查表提高计算速度减少代码量。① Modbus RTU通信CRC16查表。② 以太网帧校验CRC32。③ 文件系统存储校验。字节对齐/结构体打包控制结构体在内存中的布局避免编译器自动填充字节导致通信协议错位。① 定义通信协议结构体时使用#pragma pack(1)或__attribute__((packed))。② 将传感器数据直接映射到接收缓冲区的指针。简易高低通滤波整数版用整数运算实现一阶滤波避免浮点适合无FPU的MCU。公式y (a * x (256-a) * y_prev) 8。① 电池电量平滑显示。② 加速度计噪声滤除。开关量去抖动输入滤波对数字输入信号如来自比较器的过零检测进行消抖防止电平毛刺导致误触发。① 过零检测信号输入电网噪声大。② 编码器AB相输入滤波。③ 霍尔传感器转速脉冲整形。脉冲计数与频率测量在规定时间内对输入脉冲计数或者测量单个脉冲宽度反算频率。① 霍尔传感器测转速。② 超声波模块测距测量高电平宽度。③ 外部中断配合定时器测量PWM输入信号频率。占空比测量输入捕获同时测量PWM信号的高电平时间和周期时间计算占空比。① 接收遥控接收机的PWM信号RC接收机输出1~2ms脉冲。② 测量舵机控制信号。③ 分析其他设备输出的PWM。滑动窗口协议在可靠通信中同时处理多个未确认的包提高信道利用率。① 蓝牙/无线模块批量数据传输。② 串口实现类似XModem的文件传输。③ 自定义可靠UDP协议。简单内存池管理预先分配一大块静态内存每次从中分配固定大小的块避免碎片且分配快。① 通信协议动态创建帧缓冲区。② 多个传感器数据包轮流存放。③ RTOS的消息队列底层实现。二分法逼近解方程在单调区间内搜索方程的根或传感器反查值比遍历查找快。① 已知NTC电阻反查温度已排序表。② 非线性传感器校正。③ 给定PWM占空比反推预期转速查不到时逼近。伪随机数生成用线性同余法等生成看起来随机的数用于简单随机效果。① 流水灯跑马灯随机颜色。② 随机延时避免多设备同步干扰。③ 简单游戏中的随机数。毫秒级软件定时器基于系统滴答中断实现多个软件定时器单次/周期节省硬件定时器资源。① LED闪烁周期500ms。② 按键长按检测单次1s。③ 传感器定期采集周期100ms。环形缓冲区高级版带“读写位置”和“数据长度”标记支持一读一写或多读多写的环形缓冲区带剩余空间判断。① 串口DMA接收主循环读取。② 音频数据缓冲I2S中断写入解码任务读取。③ 高频率ADC数据缓冲。查表法实现非线性校正传感器输出与被测物理量呈非线性关系用分段查表插值校正。① NTC热敏电阻阻值→温度。② 光电二极管光强→照度。③ 气体传感器浓度曲线校正。软复位判断利用一个备份寄存器或特定RAM区标记复位来源上电复位、看门狗复位、软件复位。① 判断是否为看门狗复位如果是则不再初始化某些外设快速恢复现场。② 软件升级后自动复位并跳到新程序。学习建议针对这批新增算法单片机应用软件开发工程师必掌握算法第三辑算法名称主要用途大白话解释典型应用场景具体例子互补滤波将两种传感器的数据按权重融合取长补短得到更稳定的姿态角。① 四轴飞行器角度计算加速度计低频准但易抖与陀螺仪高频准但会漂移融合。② 平衡小车姿态融合。③ 计步器方向解算。滞后比较器带迟滞的比较避免阈值附近反复跳变当输入超过上限才变高低于下限才变低中间区保持上次状态。① 温度控制器26℃以上开风扇24℃以下关风扇中间保持。② 电池低电压报警3.3V报警3.6V恢复避免在阈值处反复报警。递推式滑动平均每次采样后更新总和 旧总和 - 最老值 新值再除以长度避免每次重新累加。① 实时ADC数据平滑要求响应快。② 动态显示曲线上每一点都快速更新。去极值平均滤波先去掉一组数据中的最大值和最小值再取平均消除脉冲干扰。① 多路温度巡检每个通道采集10次去掉最大最小后平均结果更稳定。② 高精度电子秤的原始数据预处理。指数加权移动平均一阶滤波的变种新估计值 α × 当前采样 (1-α) × 上次估计值α越小越平滑。① 网络延迟动态估算。② 触摸屏坐标平滑。③ 电机电流过流保护前的平滑判断。整数转字符串自定义itoa把整数如-123转换为ASCII字符串如-123用于显示或发送。① 将温度值显示在OLED上。② 把测量数据通过串口以文本形式发送给电脑。③ 在LCD上打印时间数值。字符串转整数简易atoi把ASCII数字串转为整数忽略前导空格处理正负号。① 解析AT指令中返回的整数参数。② 读取串口输入的十进制数字命令如“SET 100”。BCD码与二进制互转在二进制与4位十进制码BCD之间转换常用于时钟芯片和数码管显示。① DS1302时钟芯片读写时间返回BCD码。② 数码管驱动将二进制数值拆成每位数字送显。冒泡排序 / 插入排序对少量数据排序30个代码简单不需要复杂算法。① 对按键扫描的多个AD值排序后取中值中值滤波。② 对几个传感器数值排序找出最大值。③ 菜单中动态调整选项顺序。线性反馈移位寄存器LFSR生成伪随机序列或快速实现CRC、扰码。占用资源极少。① 生成白噪声用于测试。② 产生伪随机LED流水灯图案。③ 简单扩频通信。曼彻斯特编码用每个bit周期内的电平跳变表示0/1上升沿为0下降沿为1消除直流分量自带时钟。① RFID/NFC通信ISO14443。② 以太网10BASE-T。③ 红外遥控某些协议。软件PWM生成使用定时器中断和比较输出在任意IO口上产生可调占空比的方波不受硬件PWM通道限制。① 控制多个LED呼吸灯硬件PWM不够时。② 模拟产生舵机控制信号50Hz占空比5%~10%。③ 简单DA输出PWMRC滤波。脉冲宽度测量输入捕获软件版利用外部中断和定时器测量高电平或低电平的持续时间。① 超声波测距模块发送触发后测量ECHO引脚高电平宽度。② 接收红外遥控脉冲序列。③ 单总线DHT11时序读取。状态机实现命令解析用状态机逐字节解析串口命令识别帧头、帧尾、转义字符等无需缓存整帧。① 处理MODBUS RTU命令地址→功能码→数据→CRC。② 解析AT指令。③ 识别特殊转义字符如0x7D, 0x7E。环形日志缓冲区在内存中循环存储调试日志保留最新N条记录发生故障时可导出分析。① 系统异常时保存最后200条调试信息。② 记录传感器历史数据用于事后分析。③ 存储按键操作轨迹用于用户行为分析。软件看门狗任务监控多个任务各自定时“喂狗”任何一个任务卡死都能导致全局复位。① RTOS中每个任务循环里设置一个标志监控任务检查所有标志。② 裸机主循环中监测关键函数的执行时长。循环冗余校验CRC简单实现不查表用移位和异或逐bit计算CRC代码简单但稍慢适合小数据量。① 验证单字节或短数据包的完整性。② 学习CRC原理用。③ 硬件不支持查表且RAM极小的情况。简单数据压缩差值编码存储相邻采样值的差值如果变化小差值可以用较少字节表示。① 存储长时间的温度记录温度变化缓慢。② 心电图/加速度数据轻度压缩。③ 无线传感器网络节省带宽。双缓冲区Ping-Pong使用两个缓冲区交替接收/处理数据避免读写冲突。① DMA采集ADC时一个缓冲区满了通知主程序处理DMA继续填充另一个缓冲区。② 音频播放双缓冲防卡顿。环形缓冲区实现FIFO带DMA环形缓冲区配合DMA自动接收数据主循环从后面取无锁或原子操作。① 串口空闲中断 DMA接收不定长数据。② 高速SPI从机数据接收。二元一次方程求解克莱姆法则解简单的两个方程两个未知数用于传感器标定或坐标转换。① 触摸屏两点校准计算缩放因子和偏移。② 模拟量输入线性校正y ax b。③ 双轴加速度计倾斜补偿。简易三角函数近似泰勒/查表用多项式逼近sin/cos避免浮点库。① 无FPU的MCU中计算旋转角度如电机矢量控制。② 简易图形旋转。③ 生成正弦波表格。整数开方快速平方根倒数使用移位和牛顿迭代快速计算整数平方根比库函数快得多。① 计算向量长度 sqrt(dx²dy²) 。② 均方根值计算。③ 游戏中的距离判断。滑动窗口最大值/最小值维护一个固定大小的窗口快速获取当前窗口内的最大/最小值。① 实时信号的峰值检测。② 机械振动幅值监控。③ 心率检测中的波峰查找。✅ 常规应用必掌握约15个覆盖80%工作类别算法备注基础数据结构环形缓冲区、队列、状态机几乎所有项目都用IO与按键位操作、按键消抖状态机版每天都要写通信与校验数据打包/解包、超时管理、累加和/CRCUART/I2C/SPI必备滤波与平滑均值滤波、一阶低通滤波、限幅滤波传感器数据处理必备定时与调度滴答计时/非阻塞延时、软件定时器、时间片轮询裸机多任务核心实用技巧查表法线性插值、整数/字符串互转提高效率显示通信常用 按需学习遇到具体项目再学控制类PID、增量PID、互补滤波四轴/平衡车专用存储/压缩游程编码、差值编码、环形日志信号处理滑动平均、移动方差、滞后比较器可靠性看门狗喂狗策略、双缓冲区、软件看门狗任务监控数学运算整数开方、快速三角函数近似仅当无FPU且需要时 给新手的最终建议不要贪多先把“常规应用必掌握”的15个算法亲手写一遍代码在开发板上验证理解透彻。优先实战做一个综合小项目比如智能温控风扇、蓝牙小车、简易手表自然就会用到其中大部分算法。忘记高级算法快速排序、二叉树、红黑树等在工作两三年的单片机开发中几乎用不到不用花时间去学。如果您已经看懂了这些表格并且能说出