简介:面向电子信息、自动化等专业学生及51单片机课程设计、毕业设计学习者,这份文档围绕基于STC89C51/52单片机的坐姿矫正系统展开,重点解决学习坐姿过近、环境光线不足和久坐不休息等提醒问题。内容涵盖自动与手动两种模式,利用光敏电阻配合模数转换采集环境亮度,结合人体感应判断是否有人,并通过测距模块在距离过近时驱动蜂鸣器报警;人离开后台灯延时关闭,同时可用按键设定工作时长,到时提醒休息,LCD1602负责时间与状态显示。压缩包仅含1个doc文件,约295KB,适合作为毕业设计说明书、系统方案参考和答辩准备材料,已有792人学习。读者可从中获取总体方案、硬件模块选型、电路设计及功能测试思路,便于快速梳理51单片机综合项目的设计脉络。
1. 需求先立住:为什么坐姿矫正要用51单片机做
坐姿矫正听起来像个要上摄像头加视觉识别的项目,很多同学第一反应就是给方案堆算力。实际做下来,基于51单片机的坐姿矫正系统设计核心只有三件事:人离桌面的距离、环境的光线亮度、连续用眼的时长。这三个量都不需要浮点运算,也不需要图像帧缓存,一颗 STC89C52 就足够转得动。这套方案面向的是要做单片机课程设计或毕业设计的读者,硬件成本控制在几十元,焊接和调试都能在宿舍桌面上完成,功能上却把测距、光强采集、倒计时提醒、声光报警四条链路都跑通了,正好覆盖答辩时老师最想看的完整闭环。这里还有个反直觉的取舍:姿态感知没有走穿戴式陀螺仪路线,走的是超声波测距,原因后面细讲。
2. 总体方案论证:主控、显示、传感三条选型线的取舍
方案论证这一章在论文里最容易被写成凑字数的流水账,但答辩老师恰恰爱在这里追问。我的建议是每条选型线都给出两个以上的备选,把「为什么不选」讲得比「为什么选」更清楚。这套系统的信号链其实很简单:光敏电阻把照度转成电压,ADC0832 把电压转成 8 位数字量,单片机拿这个数字量和阈值比;超声波模块把人与桌面的距离转成回波时间,单片机换算成厘米再和阈值比;按键负责设定用眼时长,LCD1602 负责把光强、距离、剩余时间显示出来,蜂鸣器负责越限报警。三条输入、两条输出、一颗主控,整体的复杂度就压在这里,多一个模块都是负担。
2.1 主控选型:STC89C52 与 AVR、STM32 的边界在哪
主控这条线上我一般会给三个备选做对比,把差异落到具体参数上,而不是停在「资料多、上手快」这种空话。
| 维度 | STC89C52 | AVR 系列 | STM32F103RBT6 |
|---|---|---|---|
| 位宽与主频 | 8 位,12MHz 晶振 | 8/16 位,精简指令 | 32 位,72MHz |
| 下载方式 | 串口直接烧写 | ISP 下载 | 需要仿真器与配套环境 |
| 本设计所需 IO | 约 20 个,够用 | 够用 | 富余很多 |
| 开发门槛 | 寄存器少,例程直观 | 寄存器配置偏复杂 | 库函数体系需要先学一轮 |
| 成本 | 低 | 中 | 高 |
STC89C52 内部有 8K 程序存储器、256 字节 RAM、32 个 IO、三个 16 位定时器和两个串口,支持在线可编程,掉电保护、空闲与节电模式也都具备。对一个只需要采样两路传感器、驱动一块字符屏、跑一个秒级倒计时的系统来说,这些资源刚刚好,多出来的算力一点用不上。AVR 的指令效率确实更高,但寄存器配置和熔丝位对初次做完整系统的人来说是额外的认知负担,出了问题排查成本高。STM32 的问题不在性能,在于「杀鸡用牛刀」——为了点一块 LCD1602 去配时钟树、配 GPIO 复用、配库函数,前期学习曲线陡,而本设计没有任何一项功能需要它。所以主控定在 STC89C52,逻辑是资源匹配而不是图便宜。
2.2 显示选型:数码管、点阵屏、LCD1602 的三方权衡
显示这块有三条路。数码管占用 IO 少、强光下可读性好,但它只能显示数字和少量字母,本设计要同时显示「光照:XXX」「距离:XX CM」「剩余:XX 分」这类带单位的混合信息,数码管就不够用了,而且动态扫描要占用定时器和中断,软件复杂度反而上去。点阵屏能显示汉字和图形,可一旦要显示较多内容就得选大尺寸点阵,价格和功耗同步上涨,对电池供电或低功耗场景不友好。
LCD1602 是可读性和成本之间最舒服的那个点。它用 5×7 点阵拼字符,两行各 16 个字符位,控制器内部固化了 192 个字符字形,写字符只需要送 ASCII 码,不用自己建字模。接口上是 RS、RW、E 三根控制线加 8 位数据口,一次占 11 个 IO,本设计 IO 富余,并口比串口更省事,时序也好抓。它的工作电流小、寿命长,字符清晰度对桌面距离的阅读完全够。
提示:如果 IO 特别紧张,可以只接 4 位数据口做两次传输,代价是驱动函数要改写成半字节模式,调试时容易在高低位顺序上翻车,建议先把并口跑通再考虑优化。
2.3 系统框图与两种工作模式的职责划分
硬件框图用文字描述清楚就够了:以 STC89C52 为中心,左侧挂三个输入——光敏电阻经分压后进 ADC0832 的模拟通道,ADC0832 的 CS、CLK、DI、DO 四根线接到单片机的一组 IO 上;超声波模块的 Trig 和 Echo 分别接两个 IO;独立按键接一个 IO 做模式切换、两个 IO 做时间加减。右侧挂两个输出——LCD1602 占一组 8 位口加三根控制线,蜂鸣器经三极管驱动接一个 IO。电源部分共地共 5V,晶振和复位电路按最小系统接。
系统设自动和手动两种模式,这个划分要在论文里写明白,否则答辩时容易被问「模式切换后状态怎么保持」。自动模式下,系统持续采样光强和距离,光强低于阈值就提示光线不足,距离小于设定值就提示坐姿过近,累计用眼时间到点就提示休息,全过程不需要人干预。手动模式则把报警阈值和时间设定交给按键,用户自己调距离门限和倒计时长度,适合不同身高的使用者。两种模式共用同一套采样和显示代码,区别只在阈值来源是常量表还是按键变量。
3. 硬件设计:从最小系统到四个功能模块的电路落地
硬件这一章不要写成元器件清单,要写清楚每个模块「为什么这样接」。我见过太多设计,原理图上元件都在,但一问到上拉电阻为什么是 10K、晶振负载电容为什么取 22pF 就答不上来,这种细节恰恰是区分「焊过板子」和「抄过图」的地方。
3.1 最小系统:电源、晶振与复位三件事
最小系统就三块:供电、晶振、复位。供电用 5V 稳压输出,关键是纹波要小,单片机在高频开关时对电源噪声很敏感,去耦电容要贴近芯片的 VCC 和 GND 引脚放,走线尽量短,别在板子上绕一大圈。晶振取 12MHz,配两只 22pF 瓷片电容到地,这个组合能让机器周期正好是 1 微秒,后面算定时器初值和超声波距离换算都基于这个前提,换成 11.0592MHz 的话串口波特率更准,但定时器初值全部要重算,论文里的数据也得跟着改。
复位电路用 10μF 电解电容配 10K 电阻构成上电复位,按键并联在电容两端做手动复位。这里有个容易被忽略的点:电容正极接 VCC、负极接 RST,这样上电瞬间 RST 保持高电平足够长的时间,芯片才能可靠复位;接反了会出现「上电偶尔不启动、按一下复位才好」的玄学现象。
3.2 光线监测通道:光敏电阻与 ADC0832 的接口设计
光强采集走的是分压加模数转换的路子。光敏电阻和一只固定电阻串联接在 5V 与地之间,中点接 ADC0832 的模拟输入,光照越强光敏电阻阻值越小,中点电压随之变化,单片机读到的数字量就跟着变。固定电阻的取值决定了灵敏度曲线,一般取和光敏电阻在目标照度下阻值接近的规格,这样在常用区间内电压变化最陡,分辨率利用得最充分。
ADC0832 是 8 位逐次逼近型转换器,转换时间约 32 微秒,双通道差分输入可以做数据校验,串行接口只占四根线。它的 DI 和 DO 在时序上不同时工作,而 51 的准双向口本身支持分时复用,所以实际接线时这两根可以并到同一个 IO 上,省一根线。基准电压直接取 VCC,5V 除以 256,每个最低有效位对应约 19.5 毫伏,这个换算关系要写进论文,答辩问「你的光强精度是多少」时可以直接答。
读取一次转换结果的代码如下,注意 CS 的拉低拉高必须包住整段时序,时钟空闲态保持低电平:
#include <reg52.h> #include <intrins.h> sbit ADC_CS = P3^5; sbit ADC_CLK = P3^6; sbit ADC_DI = P3^7; sbit ADC_DO = P3^7; /* DI/DO 复用同一根 IO,靠时序分时切换方向 */ /* ch: 0 或 1,选择单端输入通道;返回 0~255 的转换结果 */ unsigned char adc0832_read(unsigned char ch) { unsigned char i, dat = 0; ADC_CS = 0; /* 片选有效,一次转换开始 */ ADC_CLK = 0; ADC_DI = 1; _nop_(); ADC_CLK = 1; _nop_(); ADC_CLK = 0; /* 起始位 */ ADC_DI = 1; _nop_(); ADC_CLK = 1; _nop_(); ADC_CLK = 0; /* SGL=1 单端模式 */ ADC_DI = ch & 0x01; _nop_(); ADC_CLK = 1; _nop_(); ADC_CLK = 0; /* 通道选择 */ ADC_DI = 1; /* 释放数据线,交给 DO 输出 */ for (i = 0; i < 8; i++) { /* 高位在前,逐位读 8 位数据 */ ADC_CLK = 1; dat <<= 1; if (ADC_DO) dat |= 0x01; ADC_CLK = 0; } ADC_CS = 1; /* 结束本次转换 */ return dat; }这段函数每调用一次就完成一轮完整时序,三个_nop_()是为了保证在 12MHz 下时钟高低电平的持续时间满足芯片要求,去掉之后在快速循环里读数会飘。实际使用时不要拿单次结果直接判断,采 8 次去掉最高最低再取平均,能明显压住抖动。
3.3 超声波测距电路与距离阈值的标定
超声波模块的测距范围标称 3 厘米到 90 厘米,近距离误差小,远距离误差能到 1 到 2 厘米。对坐姿检测来说这个精度完全够用,因为真正有意义的判据是「胸口离桌沿是不是小于某个门限」,门限本身就有几厘米的容错空间,不需要毫米级。
工作时序是:Trig 引脚给一个大于 10 微秒的高电平脉冲,模块内部发出 8 个 40kHz 方波,然后等待回波,Echo 引脚输出一段高电平,高电平的持续时间就是声波往返的时间。声速按 340 米每秒算,往返除以 2,1 微秒对应 0.017 厘米。用定时器 1 在 12T 模式下计数,计数频率正好 1MHz,读出的计数值直接就是微秒数,省掉换算。
提示:Echo 引脚的高电平最长可能接近 25 毫秒(对应 4 米量程),用软件循环计数容易在等待中卡死整个程序,务必加超时退出,这是新手最常见的翻车点。
3.4 蜂鸣器驱动电路:无源蜂鸣器与三极管开关
本设计用的是无源压电蜂鸣器,不是有源的那种。有源蜂鸣器通电就响,音调固定;无源的需要外部给方波,改变方波频率就能改变音调,这样同一颗蜂鸣器可以做出「距离过近」的急促高频和「时间到了」的舒缓低频,靠声音区分报警类型,用户体验上是个加分项。
单片机 IO 的灌电流和拉电流都不足以直接驱动蜂鸣器,必须加一级三极管放大。用 PNP 三极管接成共射开关,基极串一只 1K 到 2K 的限流电阻,发射极接 5V,集电极接蜂鸣器再接地。这样单片机输出低电平时三极管导通,蜂鸣器得电;输出高电平时截止,蜂鸣器停止。基极电阻不能省,也不能取太小,否则单片机引脚在开关瞬间的电流冲击会拉低电源,出现「蜂鸣器一响、屏幕就花」的连锁反应。对感性负载还要注意反向电动势,压电蜂鸣器本身容性偏多,问题不大,但走线要短、地和单片机共地要实。
4. 软件设计:从初始化到三个功能闭环的代码结构
软件这块最忌讳写成一锅粥。这套系统的程序量不大,但模块边界必须清楚,否则改一个阈值要翻三个文件,答辩演示时一紧张就找不着位置。语言用 C51,比汇编可读性好太多,浮点运算也能直接写表达式,代价是代码体积略大,8K 的 Flash 完全装得下。
4.1 主程序框架与模块划分
整个程序分成五个模块:初始化、传感器采样、判断与报警、显示刷新、按键处理。主循环是一个不带操作系统的超级循环,靠定时器中断提供时基,主循环只负责「读值、比较、显示、响铃」这四件事,任何一处都不能出现长延时,否则按键会失灵、显示会闪。
初始化要按依赖顺序来:先配 IO 口方向,再初始化 LCD1602(送功能设置、显示开关、清屏、 entry mode 四条指令,每条之间留足执行时间),再配定时器 0 做 50 毫秒中断,最后把报警标志和计时变量清零。这个顺序不能乱,LCD 初始化里本身要用到延时,如果定时器先开了,初始化过程中的延时会被中断打断,屏幕可能出现半屏乱码。
void main(void) { sys_init(); /* IO、LCD1602、定时器依次初始化 */ lcd_show_string(0, 0, "Posture System "); while (1) { light_val = adc_filter(0); /* 8 次采样取平均,压抖动 */ dist_cm = sonic_get_cm(); /* 带超时保护的测距 */ key_scan(); /* 非阻塞按键扫描 */ judge_and_alarm(light_val, dist_cm); lcd_refresh(light_val, dist_cm, left_sec); } }主循环里四个函数的调用顺序有讲究:先采样后判断,判断完再刷新显示,这样屏幕上看到的值和触发报警的值是同一轮的,不会出现「显示 45 厘米却在报警」的矛盾现象。adc_filter内部做 8 次采样、冒泡排序、去掉最大最小、剩下 6 个求平均,返回一个字节,整个过程在毫秒级完成,不影响主循环节奏。
4.2 光线检测与 AD 采样程序
光强判断的逻辑比想象中要多一层。读数本身是 0 到 255 的原始值,但真正要判断的是「当前照度够不够看书」。原始值和照度之间是非线性的,光敏电阻的阻值随照度按幂律变化,直接拿原始值当阈值也能用,只是阈值定标要靠实测。我一般的做法是:拿照度计或者手机的光感应用做参照,在 50、100、200、300 勒克斯几个点上分别记录 ADC 读数,画一条粗略曲线,然后在「阅读下限」对应的读数上加 10% 的余量作为报警阈值,避免临界状态下来回跳。
判断时还要加滞回,否则光线在阈值附近轻微波动就会导致蜂鸣器滴滴答答响个不停。做法是设两个门限:低于下限触发报警,高于上限才解除,中间留 5 到 8 个刻度的死区。这个技巧在任何阈值判断里都通用,答辩时主动讲出来,比只报一个数字显得懂工程。
#define LIGHT_LOW 60 /* 低于此值判为光线不足,触发报警 */ #define LIGHT_HIGH 70 /* 高于此值才解除报警,形成 10 个刻度的滞回 */ void judge_light(unsigned char val) { static bit light_alarm = 0; if (val < LIGHT_LOW) light_alarm = 1; else if (val > LIGHT_HIGH) light_alarm = 0; if (light_alarm) buzzer_beep(2); /* 两声短提示,与距离报警区分 */ }4.3 45 分钟定时模块与秒级倒计时
定时模块是整个系统里最容易出精度问题的地方,也是答辩必问。本设计用定时器 0 工作在模式 1(16 位不自动重装),12MHz 下机器周期 1 微秒,要产生 50 毫秒中断,初值就是 65536 减去 50000,等于 15536,换算成十六进制是 0x3CB0。中断服务程序里必须手动重装初值,这一点和模式 2 的自动重装不同,忘了重装的话第二次中断周期会变成 65 毫秒多,计时越走越慢,跑一小时能差出好几分钟。
#define T0_RELOAD 0x3CB0 /* 12MHz 下 50ms 定时初值 */ unsigned int tick_cnt = 0; unsigned int left_sec = 45 * 60; /* 默认 45 分钟,按键可调 */ bit time_up = 0; void timer0_isr(void) interrupt 1 { TH0 = T0_RELOAD >> 8; /* 模式 1 必须手动重装 */ TL0 = T0_RELOAD & 0xFF; if (++tick_cnt >= 20) { /* 20 个 50ms 累加成一秒 */ tick_cnt = 0; if (left_sec > 0) { left_sec--; if (left_sec == 0) time_up = 1; /* 到点置标志,主循环处理 */ } } }中断里只做计数和置标志,绝不调用显示函数、绝不响蜂鸣器。中断服务程序越短越好,凡是耗时的动作全部甩给主循环。这条规矩在 51 上尤其重要,因为中断里一旦执行了毫秒级的 LCD 写操作,主循环的按键扫描就会被拖慢,出现「按了没反应、连按才生效」的手感问题。
4.4 LCD1602 显示驱动与字符接口
LCD1602 的驱动拆成三层:最底层写一个字节,中间层写命令和写数据,最上层封装成「在第几行第几列显示一个字符串」。分层之后,上层业务代码完全不用关心时序,改显示内容只动上层。
sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2; #define LCD_DATA P0 /* is_data = 1 写显示数据,= 0 写指令 */ void lcd_write_byte(unsigned char dat, bit is_data) { LCD_RS = is_data; LCD_RW = 0; LCD_DATA = dat; LCD_EN = 1; _nop_(); _nop_(); /* 使能脉宽需大于 450ns,两个空操作足够 */ LCD_EN = 0; delay_ms(2); /* 字符模式指令执行约 40us,留足余量更稳 */ } void lcd_show_string(unsigned char row, unsigned char col, char *s) { unsigned char addr = (row == 0) ? 0x80 : 0xC0; /* 两行起始地址不同 */ lcd_write_byte(addr + col, 0); while (*s) lcd_write_byte(*s++, 1); }这里用固定延时代替读忙标志,是权衡后的选择。读忙标志需要把数据口切为输入、读 D7 位、再切回输出,代码更长,而且 51 的准双向口在读之前要先写 1,操作不当会把数据口拉成中间电平导致花屏。固定延时 2 毫秒虽然牺牲一点刷新速度,但稳,对一秒刷新几次的界面毫无影响。行地址那条 0x80 与 0xC0 的差别要记牢,写反了字符会显示在奇怪的位置,这个坑几乎人人都踩过。
5. 避坑与排查:五个把系统卡在调试台上的高频故障
硬件焊完、程序烧进去,第一次上电大概率是不工作的。这一章列的五条,是我带过的这类课题里出现频率最高的,按「现象—原因—解决」写,照着顺序查能省掉大半天。
5.1 背光亮着但一个字符都没有
现象很典型:通电后屏幕是一片均匀的蓝色或绿色,背光正常,就是没有字符,调对比度电位器只看到整屏变深变浅。原因通常有两个,一是初始化指令没送进去,二是对比度电压不合适。先查第一点:LCD1602 上电后内部复位需要时间,如果程序一上电立刻送指令,芯片还没准备好,指令会被丢掉。解决办法是在sys_init开头加 50 毫秒以上的上电延时,再送初始化序列。再查第二点:第 3 脚 VEE 是对比度调节端,直接接地会得到最高对比度但常常整屏全黑,串一只 10K 电位器到地,调到字符清晰、背景略微可见的位置才是对的。还有一种情况是 RW 脚悬空被拉高,芯片一直处于读状态,写指令全部无效,把 RW 明确接低或接单片机控制就能解决。
5.2 AD 读数在 0 和 255 之间乱跳
现象是串口打印出来的光强值要么一直是 0,要么一直 255,偶尔正常几下。原因多半出在时序上:ADC0832 的 CS 必须在整段时序期间保持低电平,中途被拉高的话芯片复位,读回来的是移位寄存器里的残值。另一个常见原因是 DI 和 DO 复用同一根线时,单片机在读数据阶段没有先把这根线写 1 释放掉,导致前一位的输出被自己拉死。解决方法是严格按「拉低 CS、发三位配置、释放数据线、读八位、拉高 CS」的顺序写,中间不要插入任何其他函数调用。如果读数仍然抖,检查基准电压是不是直接取自 VCC 而 VCC 本身带纹波,可以在模拟输入端并一只 0.1μF 电容到地做简单滤波,同时在软件上做 8 次平均。
5.3 超声波第一次读数是 0,之后偶尔卡住不动
这种现象几乎百分百是超时保护没做。超声波模块在有效量程外或者前方是吸音材质时不会返回回波,while(!ECHO);这种写法会让程序死等在那里,表现出来就是屏幕定格、按键失灵。必须给两个等待循环都加计数上限,超过就返回一个约定的无效值(比如 0xFFFF),主循环拿到无效值时跳过判断、显示「--」。还有一点容易被忽略:两次测距之间要留至少 60 毫秒的间隔,模块内部的余振没有衰减完就发下一次触发,回波会串扰,读数会莫名其妙偏小。在主循环里加一个基于时基的调用间隔,比在测距函数里加死延时更合理。
5.4 蜂鸣器一响,屏幕就花或者程序跑飞
现象是报警瞬间 LCD 出现乱码,严重时单片机直接复位。根因是电流冲击:蜂鸣器启动瞬间的浪涌电流把 5V 电源拉低,单片机电压跌破复位门限。查三个地方,一是三极管基极电阻是不是太小甚至被短接,二是蜂鸣器回路有没有和单片机共用一段细长的地线走线,三是电源的输出能力够不够。解决上,基极电阻取 1K 到 2K,蜂鸣器两端反并一只二极管吸收反向尖峰,电源入口加 100μF 电解配 0.1μF 瓷片做高低频去耦,蜂鸣器的地单独走一根线回到电源地,不要在图中间随便搭。
5.5 倒计时越走越慢,一小时差好几分钟
这条前面提过,但值得单独拎出来说,因为它是「程序能跑但结果不对」的典型。定时器 0 用模式 1 时不具备自动重装能力,中断函数里漏了重装初值,或者重装时高低字节写反(把>>8写成了&0xFF),周期就完全错了。还有一种情况是中断函数里塞了太多活,比如顺手在中断里刷了一次 LCD 或者调了一次延时,导致中断响应被推迟,累计误差越来越大。验证方法很简单:让系统跑满 45 分钟,用手机秒表对一下,误差在 2 秒以内算合格,超过就回头查重装和中断负载。想更保险的话,可以保留一个独立的秒表变量,和显示变量分开维护,互相校验。
6. 验收与答辩:用一张测试表把方案讲圆
答辩现场最尴尬的不是被问住,而是老师问「你这系统测过吗」,你只能说「测过,能响」。把验收做成一张可复现的测试表,把每条判据写死在纸面上,这一页纸比十页原理图都管用。
6.1 验收测试项与判定标准
| 测试项 | 操作方法 | 判定标准 |
|---|---|---|
| 光线报警 | 用可调光源从 300 勒克斯降到 50 勒克斯 | 低于阈值后 2 秒内蜂鸣器响,显示值同步刷新 |
| 光线解除 | 从 50 勒克斯回升到 100 勒克斯 | 报警解除,且不在阈值附近反复触发 |
| 距离报警 | 用挡板从 40 厘米缓慢移到 15 厘米 | 小于门限时报警,误差不超过 2 厘米 |
| 定时精度 | 设定 45 分钟,跑满全程 | 与秒表对比误差不超过 2 秒 |
| 模式切换 | 自动、手动来回切三次 | 阈值生效、显示不乱、无死机 |
| 连续运行 | 通电连续工作 2 小时 | 无复位、无花屏、报警功能正常 |
表格填完之后,把每项的实测数据写成一行记录,连同测试日期一起放进附录。这份记录的价值在于,老师一眼就能看出你是按工程流程验收的,而不是焊完通电就交差。
6.2 答辩时三个必被追问的问题
第一个问题通常是「为什么不用 32 位单片机」。答案不要贬低高性能平台,就说资源匹配:本设计需要约 20 个 IO、两路数字量输入、一块字符屏,8 位机的定时器和串口完全够用,换成 32 位反而要多花时间配时钟树和库函数,而项目周期只有几周,把时间用在传感器标定上收益更高。
第二个问题是「超声波误差怎么保证」。回答要点有两个,近距离误差小、远距离误差 1 到 2 厘米,而本设计的判据门限本身有 3 厘米以上的容错,所以精度足够;同时软件上做了多次采样超时保护和间隔控制,排除了串扰导致的异常值。
第三个问题往往问「光线阈值怎么定的」。这时候要把定标过程讲出来:用参照设备在几个照度点上记录读数,取阅读下限对应值加余量,再设滞回死区。讲完这一句,老师基本不会再追。
我从带第一个这类课题开始就养成了一个习惯:所有验收数据必须在写论文之前测完,测完拍照存档,写报告时直接往表格里填,绝不先写「系统运行稳定」再去补数据。这个顺序颠倒一次,返工的代价就是重测一遍全流程。希望帮到你。
本文还有配套的精品资源,点击获取