news 2026/9/25 6:25:17

51单片机驱动24BYJ48步进电机:ULN2003接线、代码与避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
51单片机驱动24BYJ48步进电机:ULN2003接线、代码与避坑指南

1. 项目缘起与整体设计思路

24BYJ48 这颗减速步进电机,在单片机入门圈子里几乎是“人手一颗”的存在。价格便宜、驱动简单、扭矩够用,拆开来看内部就是一组减速齿轮加一个四相永磁转子。很多人第一次接触步进电机就是拿它配 51 单片机做实验,但真正动手时才发现:接线顺序搞不清、代码里节拍表写错、电机只会抖不会转,这些问题一个接一个。这篇内容就是把我自己踩过的坑和最终跑通的方案完整梳理出来,从硬件接线到代码实现,再到常见故障排查,尽量让第一次上手的人也能一次点亮。

核心思路其实很朴素:51 单片机负责产生时序脉冲,ULN2003 负责把单片机的弱电流信号放大成能驱动电机线圈的强电流信号,24BYJ48 负责把电脉冲转换成角位移。三者串起来,就是一个典型的“控制—驱动—执行”链路。为什么选 ULN2003 而不是自己搭三极管驱动电路?因为 ULN2003 内部集成了 7 路达林顿管,每路都能提供 500mA 左右的灌电流能力,而且自带续流二极管,专门用来吸收电机线圈断电时产生的反向电动势。自己用分立元件搭,不仅占板面积大,续流二极管的方向还容易接反,一旦接反,电机断电瞬间的反向电压很容易把单片机 IO 口打坏。ULN2003 模块通常还自带指示灯,哪一相在工作一眼就能看出来,调试阶段非常省事。

整个方案适合谁参考?如果你手上有 51 单片机最小系统板、一个 24BYJ48 电机、一个 ULN2003 驱动模块,想做一个简单的定位控制、旋转平台或者教学演示,这套方案可以直接抄作业。不需要复杂的库函数,不需要操作系统,纯裸机跑,代码量小,逻辑清晰,特别适合刚学完 GPIO 输出实验、想找个综合案例练手的阶段。

2. 硬件接线与关键参数解析

2.1 24BYJ48 引脚定义与相序确认

24BYJ48 通常引出 5 根线,颜色分别是红、橙、黄、粉、蓝。红色那根是公共端,接电源正极,其余四根对应四个线圈相。这里有一个非常容易搞错的地方:不同批次的电机,线序颜色可能不一样。我手上这颗电机,橙色是 A 相,黄色是 B 相,粉色是 C 相,蓝色是 D 相,但网上有些资料里黄色和粉色是反的。最稳妥的办法是拿万用表测:公共端和任意一相之间的电阻大约在 50 到 70 欧姆左右,四相之间两两测量电阻接近无穷大。确认公共端之后,再根据电机内部结构判断相序。如果手头没有万用表,也可以用一个笨办法:先把红色接正极,然后拿其余四根线依次碰负极,每次碰的时候电机轴会轻微抖动一下,记录下抖动方向,就能推断出相序。

ULN2003 模块的输入端通常标着 IN1 到 IN4,输出端对应 OUT1 到 OUT4。把电机的四根相线分别接到 OUT1 到 OUT4,公共端红线接到模块上的 VCC 正极。模块的 GND 和单片机的 GND 必须共地,这一点新手经常忘,结果就是单片机有输出但电机不动。单片机这边,我选的是 P1.0 到 P1.3 四个 IO 口,分别对应 IN1 到 IN4。为什么用 P1 口?因为 51 单片机的 P1 口是标准双向 IO,内部有上拉电阻,驱动 ULN2003 的输入完全够用,而且 P1 口没有复用功能,不会和其他外设冲突。P0 口需要外接上拉电阻才能输出高电平,P2 和 P3 口有复用功能,虽然也能用,但调试阶段尽量避开,减少变量。

2.2 电源选择与电流估算

24BYJ48 的额定电压一般是 5V,但实际工作时线圈电流大约在 100mA 到 200mA 之间。四相同时导通的情况在单四拍模式下不会出现,但在双四拍模式下会有两相同时导通,总电流可能达到 300mA 以上。如果直接用 51 单片机最小系统板上的 5V 输出给电机供电,很容易因为电流不足导致电机无力或者单片机复位。我的做法是:单片机用一路 5V 供电,电机驱动模块用另一路 5V 供电,两路电源共地但不共正。如果手头只有一个电源,至少要在电源输出端并联一个 470uF 到 1000uF 的电解电容,用来吸收电机启停时的电流波动。这个电容的作用很关键,我试过不加电容直接供电,电机每走一步单片机就重启一次,加了电容之后立刻稳定。

ULN2003 模块上通常有一个 4 位拨码开关或者跳线帽,用来选择是否给电机供电。有些模块默认是断开的,需要把跳线帽插上才能把 VCC 引到电机公共端。这个细节在模块说明书里往往一笔带过,但实际调试时如果忘了插,电机就是一动不动,查半天代码也找不到问题。

2.3 接线图与实物对照

接线图我习惯用文字表格来整理,比看图更直接:

单片机引脚ULN2003 输入ULN2003 输出24BYJ48 线色
P1.0IN1OUT1橙色
P1.1IN2OUT2黄色
P1.2IN3OUT3粉色
P1.3IN4OUT4蓝色
GNDGND——
5VVCC公共端红色

注意:ULN2003 模块的 VCC 和电机的公共端红线是同一个网络,不要重复供电。如果模块上有独立的电机电源输入端子,优先从那里接 5V。

实物接线时,我建议先用杜邦线连接,不要急着焊板子。因为一旦焊死,发现相序错了再拆很麻烦。杜邦线插好后,先不急着写代码,用手轻轻转动电机轴,感受一下是否有阻力。如果完全没阻力,说明线圈没有通电;如果有轻微阻力但转不动,说明线圈通电了但相序可能不对。这个手感判断法在调试初期非常实用。

3. 步进电机工作原理与驱动方式选择

3.1 四相步进电机的基本节拍

24BYJ48 是四相永磁式步进电机,内部有四个线圈绕组,按圆周排列。给其中一个线圈通电,转子会转到与该线圈对齐的位置;按顺序给四个线圈轮流通电,转子就会一步一步跟着转。这个“一步一步”的步距角,电机本体是 5.625 度,但内部有 1:64 的减速齿轮,所以输出轴的实际步距角是 5.625 除以 64,等于 0.0879 度。也就是说,输出轴转一圈需要 360 除以 0.0879,大约 4096 步。这个数字很关键,后面写定位代码时要用来计算脉冲数。

驱动方式有三种常见模式:单四拍、双四拍、八拍。单四拍是每次只给一相通电,顺序是 A-B-C-D,功耗低但扭矩小,转动时振动比较明显。双四拍是每次给两相通电,顺序是 AB-BC-CD-DA,扭矩比单四拍大,转动更平稳。八拍是单四拍和双四拍交替,顺序是 A-AB-B-BC-C-CD-D-DA,步距角减半,转动最平滑,但同样转速下需要的脉冲频率翻倍。我一般推荐用八拍模式,因为 24BYJ48 本身扭矩就不大,八拍模式能在不增加硬件成本的前提下获得更好的低速平稳性。如果对功耗有严格要求,比如电池供电的场景,可以用单四拍,但要注意电机可能带不动负载。

3.2 为什么选 ULN2003 而不是 L298N

L298N 是另一种常见的电机驱动芯片,能驱动直流电机和步进电机,电流能力比 ULN2003 大得多。但在这个项目里,24BYJ48 的电流需求只有 200mA 左右,ULN2003 完全够用,而且价格更便宜、体积更小、接线更简单。L298N 需要额外的使能引脚和逻辑电源,对于只需要驱动一颗小步进电机的场景来说,属于杀鸡用牛刀。ULN2003 的另一个优势是输入电平兼容性好,51 单片机 P1 口输出的高电平大约 4.5V 左右,ULN2003 的输入阈值是 2.4V,完全能可靠触发。L298N 的逻辑输入虽然也是 5V 兼容,但模块上往往有 5V 稳压器,接线时容易把电源搞混。

还有一个细节:ULN2003 是灌电流驱动,也就是说输出端拉低时导通。这意味着电机的公共端要接正极,四相线接输出端。如果接反了,电机不会转,但也不会烧,只是没反应。这个特性在调试时反而安全,接错了不会立刻损坏器件。

3.3 脉冲频率与转速的关系

步进电机的转速由脉冲频率决定。输出轴转速等于脉冲频率乘以步距角,再除以 360。以八拍模式为例,步距角是 0.0879 度,如果每秒发 1000 个脉冲,转速就是 1000 乘以 0.0879 除以 360,大约 0.244 转每秒,也就是每分钟 14.6 转。这个速度对于 24BYJ48 来说已经比较快了,再快可能会失步。失步的意思是电机收到脉冲但转子跟不上,表现为电机发出嗡嗡声但不转,或者转得比预期慢。24BYJ48 的推荐启动频率在 500Hz 到 1000Hz 之间,超过这个范围需要加加减速算法,否则直接启动很容易堵转。

我在实际测试中总结了一个经验值:八拍模式下,脉冲间隔在 1ms 到 2ms 之间比较稳妥,对应频率 500Hz 到 1000Hz。如果负载很轻,可以尝试 500us 间隔,但要注意观察电机是否失步。失步的典型现象是电机声音变大、转动不连续、用手轻触输出轴能感觉到明显的顿挫。

4. 完整代码实现与逐行解析

4.1 节拍表定义与 IO 口初始化

代码的核心是一张节拍表。八拍模式的节拍表有 8 个元素,每个元素对应四个 IO 口的输出状态。我用一个 unsigned char 数组来存,低四位分别对应 P1.0 到 P1.3。比如 0x01 表示 P1.0 为高,其余为低;0x03 表示 P1.0 和 P1.1 同时为高。完整的节拍表如下:

unsigned char code step_table[8] = { 0x01, // A 0x03, // AB 0x02, // B 0x06, // BC 0x04, // C 0x0C, // CD 0x08, // D 0x09 // DA };

这里用code关键字把数组存到程序存储器里,节省 RAM 空间。51 单片机的 RAM 很小,标准 8051 只有 128 字节,虽然这个数组只有 8 字节,但养成好习惯没坏处。IO 口初始化很简单,把 P1.0 到 P1.3 设为输出模式。51 单片机的 IO 口默认就是准双向口,不需要像 STM32 那样配置寄存器,直接写 0 或 1 就行。但为了代码可读性,我还是加了一句P1 = 0x00;先把所有 IO 拉低,确保电机初始状态是断电的。

4.2 延时函数与脉冲生成

延时函数用最简单的软件循环实现。51 单片机的机器周期和晶振频率有关,我用的晶振是 11.0592MHz,一个机器周期大约 1.085us。下面这个延时函数,传入参数是毫秒数:

void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 114; j++); }

这个 114 是我实测出来的经验值,不同编译器优化等级下可能会有偏差。更严谨的做法是用定时器做精确延时,但对于步进电机驱动来说,毫秒级的误差完全可以接受,因为电机本身对脉冲间隔的容忍度比较高。如果你需要更精确的控制,可以把延时函数换成定时器中断,但代码复杂度会上升不少。

脉冲生成的主循环逻辑是:遍历节拍表,依次把每个节拍值写到 P1 口,然后延时。正转就是从索引 0 到 7,反转就是从 7 到 0。这里有一个细节:每次写 P1 口之前,最好先把低四位清零,再写入新的节拍值。因为 P1 口的高四位可能被其他代码用到,直接赋值会覆盖高四位。我的做法是P1 = (P1 & 0xF0) | step_table[i];,这样只影响低四位。

4.3 完整代码与注释

#include <reg52.h> unsigned char code step_table[8] = { 0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09 }; void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 114; j++); } void motor_step(unsigned char direction, unsigned int steps) { unsigned int i; static unsigned char index = 0; for (i = 0; i < steps; i++) { if (direction == 1) { index++; if (index >= 8) index = 0; } else { if (index == 0) index = 7; else index--; } P1 = (P1 & 0xF0) | step_table[index]; delay_ms(2); } P1 = P1 & 0xF0; // 停止时断电,防止电机发热 } void main() { P1 = 0x00; while (1) { motor_step(1, 4096); // 正转一圈 delay_ms(500); motor_step(0, 4096); // 反转一圈 delay_ms(500); } }

这段代码里,motor_step函数的steps参数是脉冲数,4096 个脉冲对应输出轴转一圈。为什么是 4096?前面算过,八拍模式下步距角是 0.0879 度,360 除以 0.0879 等于 4096。如果你用的是单四拍或双四拍,步距角翻倍,转一圈需要的脉冲数就是 2048。这个数字一定要根据实际驱动模式来调整,否则定位会差一倍。

static unsigned char index这个变量很关键。它记录了当前节拍在表中的位置,每次调用motor_step时从上次的位置继续,而不是从头开始。如果每次调用都从 0 开始,电机每次都会先回到初始位置再转,表现就是抖动一下再走,非常不流畅。用 static 修饰后,index 在函数调用之间保持,电机就能连续转动。

注意:P1 = P1 & 0xF0;这一句在停止时把低四位清零,让电机线圈断电。如果不加这一句,电机停止后仍然有一相或两相通电,线圈会持续发热,长时间运行可能烧毁电机。这个细节在很多教程里被忽略,但实际使用中非常重要。

5. 常见问题排查与避坑指南

5.1 电机不转的几种可能

电机完全不转,先查电源。用万用表量 ULN2003 模块的 VCC 和 GND 之间是否有 5V。如果没有,检查模块上的电源跳线是否插好。如果有 5V 但电机还是不转,用万用表量电机公共端和任意一相之间的电阻,正常应该在 50 到 70 欧姆之间。如果电阻无穷大,说明电机内部断线;如果电阻为零,说明线圈短路。这两种情况都说明电机坏了,换一颗就行。

电源正常、电机正常,那问题大概率在代码或接线上。先确认单片机的 P1.0 到 P1.3 是否真的在输出高低电平变化。最简单的办法是在 P1.0 上接一个 LED 加限流电阻,看 LED 是否闪烁。如果 LED 不闪,说明代码没跑起来,检查晶振是否起振、复位电路是否正常。如果 LED 闪但电机不转,检查 ULN2003 的输入输出对应关系,IN1 对应 OUT1,不要接错。我遇到过有人把 IN1 接到 OUT2,结果节拍顺序全乱,电机只会原地抖动。

还有一种情况是电机抖动但不连续转。这通常是脉冲频率太快导致失步。把delay_ms(2)改成delay_ms(5)试试,如果电机开始正常转动,说明之前频率太高了。24BYJ48 在八拍模式下,2ms 间隔对应 500Hz,已经接近它的启动频率上限,带负载时容易失步。降到 5ms 间隔,对应 200Hz,扭矩会明显改善。

5.2 电机发热严重怎么办

电机发热通常是因为停止后线圈仍然通电。前面代码里加了P1 = P1 & 0xF0;就是解决这个问题的。如果你用的是其他教程的代码,检查一下停止时是否把所有 IO 都拉低了。另外,如果电机长时间连续运行,即使有断电逻辑,线圈也会因为频繁通断而产生一定热量,这是正常的。但如果烫手,说明电流过大,检查电源电压是否超过 5V,或者 ULN2003 模块是否损坏导致输出不受控。

还有一个容易被忽略的点:24BYJ48 的公共端红线必须接正极,如果误接到 GND,电机不会转,但 ULN2003 的输出端会直接对地短路,模块会迅速发热甚至烧毁。接线时一定要反复确认红线的位置。

5.3 常见问题速查表

现象可能原因排查方法解决方法
电机完全不转电源未接通量 VCC-GND 电压检查跳线帽、电源线
电机抖动不转相序错误对照节拍表检查接线调整 IN1-IN4 顺序
电机抖动不转脉冲频率过高增大延时把 delay_ms(2) 改为 5
电机只往一个方向转方向变量未生效检查 direction 参数确认正反转逻辑
电机发热严重停止未断电检查停止时 IO 状态加 P1 &= 0xF0
单片机频繁复位电源电流不足量电源电压波动加 470uF 电容或独立供电
电机转速慢节拍模式选错确认单四拍/八拍改用八拍模式
定位不准脉冲数计算错误核对步距角八拍用 4096,单四拍用 2048

5.4 独家避坑经验

第一个坑:杜邦线接触不良。这个问题看起来很低级,但实际调试中非常常见。杜邦线插久了会松动,尤其是电机电流较大的时候,接触电阻会导致电压下降,电机表现时好时坏。我的做法是用热熔胶把杜邦线接头固定一下,或者直接焊在洞洞板上。如果发现电机偶尔转偶尔不转,先摇晃一下杜邦线,看现象是否变化。

第二个坑:ULN2003 模块上的指示灯。有些模块的指示灯是接在输入端的,有些是接在输出端的。接在输入端的指示灯只能说明单片机有信号输出,不能说明电机线圈有电流。接在输出端的指示灯才能真实反映电机相线的工作状态。调试时如果指示灯亮但电机不转,先确认指示灯接的是哪一端。

第三个坑:晶振频率。51 单片机的延时函数和晶振频率强相关。如果你用的是 12MHz 晶振,同样的延时循环,实际延时会比 11.0592MHz 短大约 8%。这个差异在低速时看不出来,但高速时可能导致失步。换晶振后记得重新调整延时参数。

第四个坑:电机轴上的负载。24BYJ48 的扭矩很小,输出轴直接用手都能捏住。如果负载稍大,比如带一个轮子或者一个小转盘,电机可能带不动。这时候要么换扭矩更大的电机,要么加减速机构。我试过用它直接驱动一个 3D 打印的小风车,空载能转,加上风叶就失步了。后来换了一颗 42 步进电机才解决。

6. 功能扩展与进阶玩法

6.1 用定时器中断替代软件延时

软件延时的缺点是占用 CPU,主循环里什么都干不了。如果想让单片机在驱动电机的同时还能响应按键或者刷新数码管,就得用定时器中断来产生脉冲。思路是:定时器每 1ms 中断一次,在中断服务函数里更新节拍表索引并输出到 P1 口。主循环就空出来处理其他任务。定时器的初值计算方法是:65536 减去(定时时间除以机器周期)。以 11.0592MHz 晶振、1ms 定时为例,机器周期是 1.085us,1ms 除以 1.085us 约等于 921,初值就是 65536 减 921 等于 64615,即 0xFC67。把 TH0 和 TL0 分别赋值为 0xFC 和 0x67,开定时器中断,就能得到 1ms 的精确中断。

用定时器中断后,电机的转速控制就变成了修改定时器初值。初值越小,中断越频繁,转速越快。但要注意,中断频率不能超过电机的启动频率,否则一样会失步。我一般把最低中断间隔设在 1ms,对应 1000Hz,再快就要加加减速了。

6.2 加减速算法让启停更平滑

直接以高速启动步进电机,很容易失步。加减速的思路是:启动时脉冲间隔从大到小逐渐减小,停止时从小到大逐渐增大。最简单的实现方式是线性加减速,每走一步把延时值减 1,直到达到目标速度。停止时反过来。这个算法不需要复杂的数学,用一个变量记录当前延时值,在循环里递增或递减就行。我试过用这个方法驱动 24BYJ48,启动频率从 200Hz 逐渐升到 800Hz,电机转动非常平滑,完全没有失步。

6.3 结合按键实现正反转和调速

在主循环里加两个按键,一个控制正反转,一个控制速度档位。按键消抖用软件延时 10ms 再读一次。速度档位可以用一个数组存不同的延时值,按一下切换一档。这个功能做出来之后,整个项目就从“能转”升级到了“能用”。我把它装在一个小云台上,用按键控制摄像头左右旋转,效果还不错。24BYJ48 的保持扭矩虽然不大,但驱动一个小型摄像头模组绰绰有余。

6.4 用串口发送指令控制电机

51 单片机的串口通讯通常用定时器 1 来产生波特率。以 11.0592MHz 晶振、9600 波特率为例,定时器 1 工作在模式 2,TH1 和 TL1 都赋值为 0xFD。串口中断里接收指令,比如收到字符 'F' 就正转,收到 'R' 就反转,收到数字就设置速度。这样就能用电脑或者手机通过串口助手远程控制电机。这个扩展把项目从单机控制变成了联机控制,适合做物联网或者远程监控的入门实验。

7. 个人实操体会与建议

这颗 24BYJ48 我前后用了大概十几颗,从最开始连接线都搞不明白,到后来能稳定驱动云台和旋转平台,中间踩的坑基本都在这篇内容里了。最大的体会是:步进电机的调试,硬件占七成,软件占三成。接线对了、电源稳了,代码只要节拍表没错,基本都能转。反过来,如果硬件有问题,代码写得再漂亮也没用。所以新手遇到电机不转,先别急着改代码,拿万用表把电源和线圈量一遍,往往能省下大量时间。

另一个建议是:不要一上来就追求高速。24BYJ48 的定位是低速小扭矩场景,强行提速只会失步。我见过有人为了让它转快一点,把延时降到 100us,结果电机嗡嗡响就是不转,还以为电机坏了。其实把延时调回 2ms,立刻恢复正常。步进电机的转速和扭矩是一对矛盾,想要高速就得牺牲扭矩,想要扭矩就得接受低速。这个取舍在做方案设计时就要想清楚。

最后分享一个判断电机是否失步的小技巧:在电机输出轴上贴一小片反光纸,用手机慢动作录像拍一段,回放时看反光纸的转动是否均匀。如果忽快忽慢或者有停顿,说明失步了。这个方法比用耳朵听声音准确得多,而且不需要额外仪器。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 6:24:57

Win10修改文件默认打开方式全指南:右键、设置、注册表一次说清

不知道你有没有过这种瞬间&#xff1a;双击一个 PDF&#xff0c;结果它跑浏览器里打开了&#xff1b;双击图片&#xff0c;弹出来的是一个从没用过的修图工具&#xff1b;甚至双击 .txt&#xff0c;蹦出来的不是记事本而是某个来路不明的编辑器。我第一次遇到的时候也愣了半天&…

作者头像 李华
网站建设 2026/9/25 6:24:43

截图固定到屏幕怎么实现?贴图工具原理与Snipaste实操指南

1. 截图固定这件事&#xff0c;比你想的更有讲究很多人第一次听到“把截图固定在电脑页面上”这个需求&#xff0c;脑子里冒出来的第一反应是——截图不就是截完保存成图片文件吗&#xff1f;还能固定在页面上&#xff1f;这听起来像是个小众需求&#xff0c;但只要你真正用过一…

作者头像 李华
网站建设 2026/9/25 6:24:36

Windows桌面图标点击失效的底层原理与根治方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/25 6:24:05

CTF夺旗赛入门指南:从Web渗透到逆向分析的完整学习路径

1. CTF到底是个什么竞赛先说一句可能会得罪人的话&#xff1a;很多刚接触网络安全的人&#xff0c;是被"黑客""攻防""破解"这些词吸引进来的&#xff0c;但真正入行以后你会发现&#xff0c;CTF才是离"白帽思维"最近的训练场。CTF&…

作者头像 李华
网站建设 2026/9/25 6:21:49

华为轮值董事长制度深度解析:从孟晚舟交接看企业治理逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/25 6:19:38

低代码平台+生物识别:构建统一身份验证体系的实战指南

前阵子帮一家制造企业做内部系统改造&#xff0c;人事部提了个特别现实的抱怨&#xff1a;考勤机还在用刷卡加指纹&#xff0c;冬天员工手干&#xff0c;指纹经常打不上&#xff0c;生产线门口天天排长队。IT部那边也在头疼&#xff0c;核心业务系统的密码永远有人写在便签纸上…

作者头像 李华