尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于51单片机的噪声监测系统设计:ADC0832与1602显示实战

基于51单片机的噪声监测系统设计:ADC0832与1602显示实战 简介本资源是一套面向高校电子类专业本科生的毕业设计级单片机项目聚焦环境噪声实时监测与阈值报警功能实现适用于课程设计、毕设开发及嵌入式入门实践。资源包共64个文件涵盖Keil C51源程序工程含.c/.h/.a51等、Proteus 8.10仿真工程含.pdsprj/.pdsbak、完整论文材料doc/docx格式、配套技术手册ADC0832、LCD1602、按键等器件资料以及安装教程、视频操作指南mp4、答辩技巧文档等压缩包大小为29.84MB。已有185人学习下载内容组织模块清晰——从硬件选型、信号采集与AD转换、LCD动态显示、双LED状态指示、蜂鸣器声光报警到三按键人机交互均提供可运行代码与仿真验证附带详细使用说明PDF与常见问题解答显著降低调试门槛助力快速掌握单片机系统开发全流程。 做这块板子之前我其实已经在帮同学调了好几套51课程设计了说实话看到“基于单片机的噪声监测系统”这个标题的时候第一反应是这又是一个“看着简单细节折磨人”的活儿。等真正把原理图、程序、仿真整个串起来跑通才发现这套系统特别适合拿来练手因为它把嵌入式系统里最常用的几样东西全占了模拟信号采集、串行ADC时序、1602显示、按键输入、报警输出。一套玩下来对单片机项目的整体认知基本就齐了。这篇文章就按我实际调板子的顺序来写先讲整体怎么设计、为什么这么选型再逐个拆硬件电路然后上代码最后说仿真和实测中的坑。无论你是要做课程设计还是想自己做一个小型环境噪声监测工具这套“51ADC08321602”的组合都值得参考。1. 系统整体设计与选型思路1.1 项目到底要实现什么功能先把这个系统的完整信号链路理清楚。声音信号被拾音器件采集后先经过前级放大电路把微弱的毫伏级信号放大到ADC能采样的范围。然后ADC0832把模拟电压转换成8位数字量单片机读取转换结果经过滤波和运算得到当前环境噪声对应的分贝值显示在LCD1602上。同时系统里存了一个阈值一旦测得的噪声分贝值超过阈值红色LED和蜂鸣器就会触发报警绿色LED作为运行指示灯常亮或闪烁。三个按键用来切换工作模式、修改阈值。拆开来看这个系统其实就是一个典型的“传感器输入-数据处理-人机交互-报警输出”闭环几乎覆盖了单片机应用的基础框架。它的核心难点不在任何一个单独模块而在于把这些模块组合起来时时序、引脚分配、前后级匹配这些细节是否处理得到位。1.2 为什么选51单片机而不是ARM或者Arduino我知道很多人一上来就疑惑都什么年代了还用51其实这个项目用51反而是最合适的。第一51单片机资料极多无论是数据手册、例程还是别人的开源工程网上到处都能找到遇到问题很容易搜到解决方案。第二它的外设接口直接、逻辑简单GPIO操作直观非常适合用来理解底层时序而不是把时序都交给库函数去掩盖。第三课程设计、电子竞赛、毕业设计这些场景里51依然是很多学校默认的教学平台别人接你的板子也方便。更关键的一点是这个项目的性能瓶颈根本不在CPU上。ADC0832是8位ADC采样率也不是很高1602显示更新也不需要多快51的频率完全够用。选51不会拖后腿反而让整个电路和程序都更容易被读懂。1.3 为什么ADC选AD0832而不是ADC0809ADC0809在课程设计里也很多见8路模拟输入、并行输出看起来比0832“高级”。但它的缺点太明显了并行8位数据口要占掉P0口全部引脚再加上控制线整个单片机的IO口几乎都耗光了。而ADC0832是串行接口只需要CS、CLK、DI、DO四根线哪怕是只用三根线也能把数据读出来。对于自带1602显示、按键、蜂鸣器的系统来说IO口是特别珍贵的资源剩下引脚越多后面布线越轻松。另外ADC0832虽然是8位分辨率但在这个场景下完全够用。参考电压接5V那么一个LSB对应的电压大约是5V / 256 ≈ 19.5mV也就是说模拟电压变化超过19.5mV显示值就会变一格。对于噪声监测来说这个精度足够让你看到明显的噪声等级变化又不至于因为微小波动导致数字乱跳。如果你要做高精度的声压计那当然得换更高位数的ADC但那就是另一个项目了。1.4 显示、报警、输入器件怎么搭配LCD1602是字符型液晶里最普及的型号16列2行一行显示当前分贝值一行显示阈值刚好够用。虽然OLED、TFT现在也不贵但1602在户外阳光下的可读性、调试的直观性都很好而且四线或八线接线方式都非常成熟。两个LED我用了一个绿色一个红色绿色作为“系统正常运行”的指示红色作为“噪声超限”的报警指示。蜂鸣器我选了有源蜂鸣器因为它内部自带振荡电路只要给他通上合适的电压和电流就会响不需要单片机输出PWM去驱动省去了很多麻烦。三个按键呢一个是模式切换键用来在“正常监测模式”和“阈值设置模式”之间切换另外两个是用来加减阈值数值的。整个系统的IO口分配我当时是这么安排的P0口接1602的数据口P2.0-P2.2接1602的RS、RW、E控制线P1.0-P1.3接ADC0832P1.4、P1.5接LEDP1.6、P1.7接蜂鸣器控制脚和模式按键P3.2、P3.3接加减按键。这样分配的好处是各模块之间互不干扰编程的时候也容易记。2. 硬件电路核心细节解析2.1 前级信号调理电路怎么把声音变成ADC能采的电压这是整个硬件里最容易翻车的地方。驻极体麦克风输出的信号非常微弱大概只有几毫伏到几十毫伏如果直接送进ADC0832你会发现采到的数字几乎是0无论你怎么喊都没反应。所以必须加一级放大。我当时用的电路是驻极体麦克风加一级LM358同相放大。麦克风需要先通过一个10kΩ电阻接到VCC提供偏置电流同时输出端通过一个0.1uF的耦合电容连接到运放的同相输入端。这个耦合电容的作用是把麦克风输出的直流偏置隔掉只让交流声音信号通过。然后在运放的反相输入端和输出端之间接一个100kΩ反馈电阻反相输入端对地接一个10kΩ电阻这样放大倍数就是1 100kΩ / 10kΩ 11倍这只是一个基础放大倍数。如果实测发现声音信号太小可以再串联一级相同结构的放大或者把反馈电阻换成200kΩ放大倍数提到21倍。但要特别注意单电源供电下运放输出不能到负电压所以麦克风信号放大后会有一个直流偏置这个偏置也得控制在ADC的输入范围0~5V以内。我的做法是在放大电路输出端再串一个电阻分压网络确保信号中心点电压在2.5V左右这样声音波动的正负半周都能落在0~5V区间内。2.2 ADC0832的接线和工作时序到底是怎么回事ADC0832是8位逐次逼近型ADC带两个输入通道CH0和CH1可以配置成单端输入或者差分输入。我们这个项目只需要一路信号所以把CH0接放大电路的输出CH1悬空或者接地都行。引脚接线是这样的ADC0832引脚51单片机引脚说明CSP1.0片选使能低电平有效CLKP1.1串行时钟输入DIP1.2数据输入用来配置通道DOP1.3数据输出读取转换结果VCC5V参考电压和供电GNDGND接地CH0前级输出模拟信号输入通道这块芯片的时序是典型的SPI-like串行协议。主机先把CS拉低然后通过CLK和DI往芯片里发送三个配置位。第一位是起始位必须为1第二位决定是单端输入还是差分输入我们选单端输入所以写1第三位决定使用CH0还是CH1选CH0就写0。送完这三个配置位之后芯片开始在后续时钟的下降沿依次输出转换结果先是8位高有效位接着是8位反码。有个细节特别容易踩坑每次CLK信号的产生都需要一定的延时如果CLK切换太快芯片跟不上读出来的数据就不稳定。我当时用的是大概几个微秒的软件延时实际测试下来很稳。如果你用的是12MHz晶振一个NOP指令大约1us插入几个NOP就够了。等读完16位数据后再拉高CS结束一次转换。2.3 1602液晶接线中老被忽略的对比度引脚1602大家都会接RS、RW、E、D0-D7VSS接地VDD接5V但V0这脚很多人忘了接。V0是液晶对比度调节脚如果不接东西或者直接接地液晶屏幕可能显示成一片黑块或者干脆白屏。正确做法是V0脚通过一个10kΩ电位器接到GND调节电位器让屏幕显示清晰。实测下来一般调到中间偏下一点的位置显示效果最好。我在这个项目里用的是8位并口模式因为P0口刚好空出来。如果你后面还想加其他传感器IO口不够了也可以改成4位模式只接D4-D7但初始化时要先发一次0x30切换到8位模式再切到4位模式。这个“先8后4”的初始化顺序是1602的老规矩很多新手不知道容易卡在初始化环节。2.4 报警电路和按键电路的设计细节LED不要直接接在单片机引脚上。51单片机引脚高电平驱动能力很弱大概只有几百微安直接驱动LED亮度不够甚至可能拉低引脚电平导致逻辑错乱。我习惯用“低电平点亮”的接法LED一端接VCC另一端经过一个330Ω限流电阻接单片机引脚引脚输出低电平时LED亮。这样利用的是单片机的灌电流能力比拉电流靠谱得多。蜂鸣器也一样不能直接接引脚。我用了一个NPN三极管S8050作为开关管单片机引脚通过1kΩ电阻连接到三极管基极发射极接地集电极接蜂鸣器负极蜂鸣器正极接VCC。当单片机引脚输出高电平时三极管导通蜂鸣器得电发声。注意有源蜂鸣器有正负极接反了不会响。按键电路我采用的是最简单的外部上拉式接法。每个按键一端接单片机引脚另一端接地。单片机引脚内部拉一个高电平按下按键变成低电平。要注意的是按键按下和松开的瞬间会产生机械抖动如果不处理一次按下可能被识别成多次。我用了20ms软件延时消抖效果很好。3. 软件设计从状态机到关键代码3.1 主程序结构用状态机来组织整个软件如果全写在一个主循环里逻辑会乱成一锅粥。我用了一个简单的状态机把系统分成两个状态正常监测状态和阈值设置状态。在正常监测状态下系统反复执行采集ADC → 滤波 → 计算分贝 → 更新1602显示 → 判断是否超限 → 控制报警输出。在阈值设置状态下系统只处理按键输入和阈值加减操作同时屏幕上显示当前的阈值设定值方便用户看到自己调到了多少。为什么不用中断来做按键扫描因为这个系统对实时性要求不高ADC读取本身也是软件时序控制的如果用中断反而容易和主循环的时序产生冲突。轮询的方式在这里简单可靠完全够用。3.2 ADC0832读取函数代码实例读取ADC0832的驱动代码是这套系统的核心之一。我贴一下我调通的版本为了方便阅读我加了一些延时函数。#include reg51.h sbit CS P1^0; sbit CLK P1^1; sbit DI P1^2; sbit DO P1^3; void delay_us(unsigned int t) { while(t--); } // channel: 0 CH0, 1 CH1 unsigned char read_adc0832(unsigned char channel) { unsigned char i, dat 0, dat1 0; CS 1; CLK 0; DI 0; CS 0; // 发送起始位 DI 1; CLK 1; delay_us(2); CLK 0; // 发送通道选择位 if(channel 1) DI 1; else DI 0; CLK 1; delay_us(2); CLK 0; // 发送单端/差分选择位单端模式选1 DI 1; CLK 1; delay_us(2); CLK 0; // 读取8位转换结果高位在前 for(i 0; i 8; i) { dat dat 1; CLK 1; delay_us(2); CLK 0; if(DO) dat | 0x01; } // 读取8位反码用于校验 for(i 0; i 8; i) { dat1 dat1 1; CLK 1; delay_us(2); CLK 0; if(DO) dat1 | 0x80; } CS 1; // 正码与反码校验匹配则返回转换值 if(dat (dat1 ^ 0xFF)) return dat; else return 0xFF; }这段代码里要注意的是延时函数的频率和CLK频率的关系。CLK频率太高芯片跟不上返回0xFFCLK频率太低虽然稳定但浪费CPU时间。我实测delay_us(2)延时大约2usCLK周期约4us大约250kHz的时钟频率AD0832完全能正常工作。如果你发现读数不稳定可以先把延时加大到5us再试。3.3 分贝换算到底应该怎么算ADC读取到的是0到255的整数对应0到5V电压。我们要把这个值换算成分贝。这个换算在理论上是非线性的声压级和电压之间是对数关系dB 20 * log10(V / Vref)其中Vref是参考电压。但在51这种8位单片机上做浮点对数运算不管是计算时间还是代码体积都不太划算。所以我在这个课程设计里采用了一种更实用的做法线性映射。先把ADC值整体映射到一个预设的噪声范围比如30dB到100dB这个范围覆盖了正常环境到比较嘈杂的工况。映射公式就是D (adc_val / 255.0) * (100 - 30) 30写成C语言就是unsigned int calc_db(unsigned char adc_val) { // 假设ADC输入0对应30dB255对应100dB unsigned long tmp; tmp (unsigned long)adc_val * (100 - 30) / 255; return (unsigned int)(tmp 30); }这里我把计算顺序调整了一下先乘70再除255。为什么要先乘后除因为如果先除再乘浮点运算在51上特别耗时而且会有舍入误差。先乘后除在不溢出的前提下全用整数运算快得多。adc_val最大值255乘以70之后是17850unsigned long完全放得下。当然这种线性映射不严谨因为真正的分贝和电压是对数关系。但在课程设计这个场景里我用的是简化模型思路是传感器输出的电压本身就经过前级放大电路做了一定的对数压缩所以ADC值与分贝值的近似线性关系在有限范围内是可用的。如果真要做高精度标定就得拿声压计做校准曲线那工作量就另说了。为了减少ADC读数的随机波动我还加了一个简单的滑动平均滤波。取最近5次采样值求平均这样即使环境噪声有轻微波动显示数字也不会抖得太厉害。滑动平均的数组我用一个环形队列来管理代码大概长这样unsigned char filter(unsigned char new_val) { static unsigned char buf[5] {0,0,0,0,0}; static unsigned char index 0; unsigned int sum 0; unsigned char i; buf[index] new_val; if(index 5) index 0; for(i 0; i 5; i) sum buf[i]; return (unsigned char)(sum / 5); }3.4 LCD1602显示驱动中文显示逻辑1602的驱动说白了就是往里面的数据寄存器和指令寄存器写数据。初始化代码网上很多但我还是要强调一下初始化的顺序。上电之后1602需要一段时间内部自检所以要先延时15ms以上然后发0x30延时5ms再发0x30延时100us第三次发0x30然后才发0x38设置8位模式、2行显示、5x8点阵。这个时序不能省省了就会出现显示乱码。我的显示格式是这样的第一行显示当前噪声值例如Sound: 75dB第二行显示阈值例如Limit: 70dB在阈值设置模式下第一行正常显示噪声第二行显示SET:70dB并且让数值部分稍微闪烁提示用户正在修改阈值。闪烁的实现其实很简单就是每次更新时先在该位置写空格延时再写数字反复刷新。写字符串的时候我封装了一个函数可以直接指定显示位置void lcd_show_string(unsigned char row, unsigned char col, unsigned char *str) { unsigned char addr; if(row 0) addr 0x80 col; else addr 0xC0 col; lcd_write_cmd(addr); while(*str) { lcd_write_data(*str); } }1602的数据口我接在P0口。注意P0口内部没有上拉电阻如果外接设备对电平要求严格最好在P0到VCC之间接一排10kΩ上拉排阻。我实测过不接上拉也能亮但显示效果容易发暗或者闪烁接了上拉之后稳定很多。3.5 按键处理怎么避免一次按下触发多次动作按键扫描逻辑不复杂但处理不好很影响体验。我的做法是在每个主循环里检测三个按键的电平状态如果检测到低电平先延时20ms再检测一次如果还是低电平说明确实按下了这时候再执行对应的操作。处理完按键之后要等待按键释放也就是检测到高电平才返回防止按住按键时反复触发同一个操作。三个按键的功能分配如下KEY1模式切换在正常模式和阈值设置模式之间切换。进入设置模式时蜂鸣器短响一声作为提示。KEY2加在设置模式下阈值加1dB。长按可以连续加但要在释放后再加或者采取“按一次加5、长按连续加”的策略。KEY3减在设置模式下阈值减1dB。阈值不能无限加减我限制在30到100dB之间低于30按30算高于100按100算。这个范围跟我们前面线性映射的范围保持一致避免阈值超出实际测量范围造成逻辑混乱。3.6 报警控制逻辑怎么做才不会乱响报警控制用了一小段策略当代分贝值大于阈值加1dB时判定为超限红色LED亮起蜂鸣器以连续短鸣的方式报警。当代分贝值小于阈值减2dB时才解除报警。这里我故意引入了一个滞回区间。为什么要这样因为环境噪声在阈值附近波动时如果超过1dB就报警、低过1dB就停止那蜂鸣器会像抽风一样频繁响停非常烦人。加一个1dB的滞回区间后报警行为就稳定多了。这是做上下限判断时的通用技巧不只是在这个项目里适用。绿色LED运行指示我用了一个比较简单的方案正常模式下绿灯常亮进入阈值设置模式后绿灯以1Hz频率闪烁提示系统不在自动监测状态。闪烁功能用计数器实现在主循环里累计循环次数每跑到一定次数翻转一次电平。4. Proteus仿真搭建与调试实录4.1 仿真环境里的元件选型和电路搭建我用的是Proteus 8 Professional版本。仿真元件清单如下AT89C51单片机本体晶振接12MHz两个30pF负载电容LM358运放用于放大前置模拟信号ADC0832模数转换芯片LM016LProteus里的1602液晶模型LED-GREEN、LED-RED两个指示灯BUZZER有源蜂鸣器注意Proteus里有个SOUNDER元件那个是无源蜂鸣器不要选错BUTTON三个按键电阻、电容若干模拟噪声信号源的问题比较关键。Proteus里当然没有真实的驻极体麦克风我在仿真里用了两种替代方案。第一种是用一个正弦信号发生器设置频率1kHz、幅值0.1V再通过一个电容和一个直流偏置网络接到ADC输入端模拟一个变化的声音信号。第二种更简单直接用一个滑动变阻器ADJUST分压手动调节输入电压看ADC读数和显示值是否跟手。第二种方式更适合调试显示和报警逻辑因为你可以精确控制输入电压知道它对应什么结果。我当时仿真时用了一个信号发生器加偏置的电路。正弦波输出经过0.1uF电容耦合到一个分压器分压器上端接5V、下端接地中间节点电压在2.5V附近这样振荡信号叠加在2.5V直流偏置上能够保证电压范围在0到5V之间不会出现负压。然后把这个节点接到ADC0832的CH0引脚。4.2 仿真运行的核心观察点仿真跑起来之后我主要观察四个点。第一1602能不能正常显示。如果显示黑块先调电位器V0如果还是黑块检查初始化时序是不是太快把延时加大。第二ADC0832的读数是否随着输入电压变化。在Proteus里最好给ADC0832加一个虚拟示波器看看CLK和DO线有没有正常的脉冲波形。第三阈值设置功能是否生效。把输入电压调到让分贝值超过阈值红色LED和蜂鸣器能不能及时响应。第四按键是否稳定。在仿真里按键没有物理抖动但程序里保留消抖逻辑也没问题因为从仿真移植到实物的时候用得上。4.3 仿真和实物的几个重要差异仿真跑通了不代表实物就能随便复制有几个差异我深有体会。第一个是运放供电问题。仿真里LM358可以直接接正负12V双电源但实物里我只有5V单电源所以必须改成单电源供电输出会带直流偏置需要做隔直和偏置处理。第二个是蜂鸣器驱动。仿真里BUZZER模型可以直接接引脚但实物里必须加三极管驱动否则驱动电流不够。第三个是按键抖动。仿真里没有抖动实物里的机械抖动必须靠软件消抖。如果你们学校只要求做仿真那仿真调通基本就完事了。但如果你要焊实物板子我建议仿真阶段就把这些问题考虑进去直接按照实物能用的电路来搭仿真可能前期麻烦一点后期省心很多。5. 常见问题与排查技巧实录5.1 问题速查表做这套系统时遇到的问题五花八门我把典型问题整理成了一张表方便你按图索骥。问题现象可能原因排查方法1602显示一片黑块V0对比度没调好或初始化时序不对接10k电位器调V0电压检查初始化延时1602显示乱码数据口接线错误或者电平不稳检查P0口是否接上拉电阻逐一核对RS/RW/E接线ADC读数为0通道选择字写错或CS时序不对用示波器看CLK、DO波形检查配置位顺序ADC读数为255输入电压高于参考电压或校验码不对用电压表测CH0输入电压检查代码里校验逻辑读数来回跳输入信号不稳定或缺少滤波加滑动平均滤波检查前级电路是否自激蜂鸣器不响三极管接反或驱动引脚不对检查三极管级性短接三极管ce测试蜂鸣器好坏按键一次触发多次消抖时间不够或缺少释放检测加大延时到20ms加按键释放等待循环阈值调不了按键模式逻辑有bug确认是否进入设置模式检查模式标志位切换条件5.2 我卡得最久的一个问题这项目里我卡得最久的问题说出来你可能不信竟然是1602的显示更新太频繁导致屏幕闪得厉害。一开始我在主循环里每次循环都调用lcd_show_string刷新整行内容结果数据显示正常了但屏幕一直在闪。后来我改成了“数值变化才刷新”的策略只在ADC换算出来的分贝值发生变化时才去更新显示区域没变化就一直保留原来内容。这个问题在仿真里不太明显但在实物上非常影响观感。如果你也遇到屏幕闪的情况优先检查是不是刷新频率太高。还有一个细节我一开始把ADC0832的正码和反码校验判断写反了写完代码怎么调试都返回0xFF。后来我用调试软件单步走仔细观察dat和dat1的值才发现反码读取的时候位移方向写错了。正码是高位在前反码读取的时候就该相反用尾部插入的方式。改成正确的位移方向后校验马上通过了。遇到这种串行协议的问题最快的排查方式就是加串口打印或者仿真里加虚拟示波器把每个位抓出来看。5.3 从仿真移植到实物的注意事项实物移植的时候有几个和仿真环境完全不一样的地方要注意。晶振电容不能少。12MHz晶振配两个30pF电容到地否则单片机可能起振失败整个系统没有任何反应。复位电路也要接好我是用的典型10uF电容加10kΩ电阻复位电路。P0口上拉排阻必须加。如果用的是P0口接1602数据口这种方式不上拉的话数据显示不稳定。我当时用的是10kΩ排阻实测效果比不加上拉时清晰很多。电源滤波绝对不能省。VCC和GND之间并一个100uF电解电容和一个0.1uF瓷片电容一个滤低频纹波一个滤高频噪声。不接这两个电容ADC读数的跳动会明显增大。有源蜂鸣器的驱动电路要注意千万别把蜂鸣器直接跨接在引脚和地之间。我用S8050三极管驱动基极串1kΩ电阻实测压降和音量都很合适。如果你觉得声音太大吵人可以在蜂鸣器两端并联一个几欧姆到几十欧姆的电阻来分流降音量但一般不用这么操作。6. 实测效果与几点总结整个系统调通之后我在室内和走廊分别做了几次手动测试。把阈值设定在70dB正常聊天环境下显示值大概在55到65dB之间跳动红色LED和蜂鸣器不动作。拍手或者敲桌子时显示值会瞬时冲到85dB以上红色LED立刻亮起蜂鸣器跟着响反应速度大约在几十毫秒级别肉眼看起来是实时的。用信号发生器怼模拟输入的时候分贝值和输入电压的对应关系也跟我预估的线性映射基本一致。这套系统我现在回头看觉得它最难得的地方不是某个模块本身有多难而是它把“采集端”和“执行端”完整串起来。调通它的过程里你会真正理解什么叫时序匹配、什么叫前级阻抗匹配、什么叫软件滤波、什么叫状态机。这些经验放到STM32、放到其他嵌入式平台上一样通用。如果你后续想在这个基础上继续扩展可以考虑几个方向换成一个高位数的ADC比如ADS1115来做更精确的采集加一个DS1302时钟模块实现分时段记录噪声数据或者再接一个蓝牙模块把噪声数据传到手机上显示。但无论怎么扩展底层的信号链思路是不变的。我个人还是建议先把这套51版本的固件和电路吃透再去追那些新平台新器件这样基础最扎实。最后分享一个小技巧调试这种多模块系统时不要指望直接一把就全通。我的习惯是先把1602点亮并显示一行固定字符再单独调试ADC0832读数等这两个都确认没问题了才把它们整合到一起然后依次调按键、调报警。每加一个模块就验证一个模块出了问题能立刻定位到是哪一部分省下来的时间足够你再制作一块新板子。本文还有配套的精品资源点击获取
返回列表