简介:基于单片机的汽车疲劳驾驶报警系统毕业设计论文,面向电子信息、嵌入式方向的本专科生及毕业设计选题者,用于参考完整论文结构、系统方案与关键技术实现。资源为2021-2022年收藏专题资料,压缩包内共1个doc文档,大小206KB,便于直接查看和编辑。论文以人体血液流量变化为检测基础,借助红外发光二极管与红外三极管采集脉搏信号,经信号处理电路转换后交由单片机分析,当心率偏离正常值20%以上时驱动报警电路,实现疲劳预警;内容覆盖系统总体设计、检测原理、硬件电路、软件调试及可靠性等完整章节。文档结构清晰,包含中英文摘要、目录、前言、设计方案与总结等模块,适合用于撰写开题报告、搭建系统框架或补充单片机应用案例,已有150人学习浏览,具有一定的参考价值。
1. 为什么疲劳报警系统非要和脉搏过不去
做过车载电子的人都知道,疲劳驾驶检测最难的从来不是报警电路,而是如何在发动机振动、路面颠簸和强光干扰下拿到一个稳定的人体生理信号。这篇论文选了红外脉搏检测方案,思路其实非常朴素:血液随心脏搏动在血管里流动时,耳垂和指尖这类组织薄弱部位的半透明度会周期性变化,红外光穿透过去,接收端就能得到与心跳同步的微弱电信号。把信号放大、整形、算周期,单片机能算出心率;心率偏离正常值超过百分之二十,就触发声光报警。
选这个方案的现实理由也站得住:相比基于摄像头的人眼状态检测,红外脉搏检测不需要复杂图像算法,一颗运行在 12MHz 的 AT89C2051 就能跑完全部逻辑;相比脑电图这类医学级方案,它成本低、体积小、可以做成蓝牙耳机形态贴在耳朵上。当然,它的局限同样清楚——驾驶员必须持续佩戴检测装置,传感器贴合度直接影响信号质量,这一点在实车验证时会比实验室麻烦得多。本文要展开的就是这条信号链路上每一个值得较真的环节,从光电传感器选型、LM324 四级运放处理到中断法测周期的边界条件,最后给出调试时的波形判读经验。
2. 检测原理与整体方案选型:为什么是红外光而非其他生理信号
这章先解决一个根本问题:疲劳状态为什么可以用心率来表达,以及红外光检测脉搏这种方法在工程上的合理性边界在哪。
2.1 脉搏信号作为疲劳指标的医学与工程依据
疲劳驾驶的本质是驾驶员中枢神经系统兴奋度下降,伴随心率变异性改变。论文里采用的判据是“心率偏离正常值 20% 以上”,这是一个相对保守但工程上极易实现的阈值策略。正常人静息心率大致在 60~100 次/分钟,按 20% 偏差计算,低于 48 次或高于 120 次就触发报警。这个范围兼顾了大多数驾驶员的生理差异,避免因个体差异导致频繁误报。
从传感器角度讲,光电容积脉搏波(PPG,即利用光强变化检测血液容积变化的无创方法)是当前性价比最高的心率获取手段。它的物理基础是朗伯-比尔定律——光在生物组织中的吸收量随血液容积变化而改变。心脏收缩时动脉血容量增加,组织吸光增强,透射或反射光减弱;心脏舒张时反之。这个信号幅度虽小,却有明确的周期性,配合模拟滤波电路完全可以提取出来。
2.2 系统总体架构与信号流拆解
整个系统是典型的“传感器+模拟前端+数字核心”架构。红外发光二极管 D1 发射特定波长的红外光,穿过耳垂或指尖后被红外三极管 Q1 接收并转换为电流信号。该信号幅度通常在毫伏级,且叠加了大量噪声,必须依次经过低通滤波、放大、比较整形、微分、单稳态脉冲发生这五个模拟处理步骤,最后变成单片机可直接识别的标准电平脉冲。
信号链路顺序如下:
红外发射(D1) → 组织透射/反射 → 红外接收(Q1) → RC低通 → IC1a放大(约200倍) → IC1b比较器整形 → C5/R10微分 → IC1c单稳态 → P3.3中断输入 → 心率计算 → 液晶显示 + 蜂鸣器报警这条链路里最关键的设计决策有两个:一是采用红外光而不是可见光,因为红外光对外界环境光的抗干扰能力更强,且皮肤对红外光的反射特性比较稳定;二是采用 9V 供电经 LM324 缓冲得到 4.5V 作为运放电源,使得电池电压跌落至 6V 时模拟电路仍能维持正常工作。这使得整套系统对车载电源波动不那么敏感,在实车环境里更可靠。
2.3 与面部识别、方向盘转角检测方案的横向对比
有些方案通过摄像头检测驾驶员眨眼频率、视线方向或瞳孔直径来判断疲劳,这在算法层面需要跑图像识别,对主控的算力和内存有要求,AT89C2051 这类 15 个 I/O 口、128 字节 RAM 的小芯片根本跑不动。还有些方案检测车辆的行驶轨迹偏移、方向盘转角变化率,但这更多是判断“驾驶行为是否异常”,容易把正常变道、弯道行驶误判为疲劳,且反映的是驾驶结果而非驾驶员的生理状态。
论文选择 PPG 测心率的价值在于信息维度最接近疲劳本质——自主神经系统的变化会直接影响心率特征。代价是需要驾驶员佩戴传感器,这是体验层面的妥协。对于论文和课程设计场景,这个取舍完全合理,因为你要论证的核心是“如何测量并判断疲劳”,而不是“如何无感地测量疲劳”。
3. 硬件设计与电路参数:把毫伏级脉搏信号从噪声里捞出来
硬件部分是这套系统的技术重心,也是最值得花时间复现和修改的部分。本章按信号流顺序,从传感器、模拟信号链到单片机最小系统,逐级给出参数计算依据和选型理由。
3.1 红外传感器对(D1/Q1)的选型与安装形态
红外发射管 D1 和接收三极管 Q1 构成检测探头。工程上要关注三个参数:发射管的峰值波长、接收管的峰值响应波长、两者封装后的机械结构。
- 发射管峰值波长选择 940nm 左右,这是红外光电晶体管响应最灵敏的波段,且不易被可见光干扰;
- 接收管选用与发射管波长匹配的红外三极管,暗电流要小,否则环境光稍强就会饱和;
- 机械结构上,论文将 D1 和 Q1 做成类似蓝牙耳机的形态,夹在耳垂两侧。这里要注意发射管和接收管必须保证光路对准,且与被测组织紧贴,任何松动都会导致信号幅度剧烈波动。
我的经验是,如果手头没有现成的耳夹式血氧探头,可以用一个黑色泡沫夹子改造,在两侧分别挖孔嵌入 D1 和 Q1,周围用热熔胶固定和遮光。遮光这一步不能省,否则室外强光直接照射接收管,信号会被完全淹没。
3.2 前置模拟信号链:LM324 四运放的每一级都在干什么
LM324 是四路运算放大器,封装里含四个独立运放,分别标记为 IC1A、IC1B、IC1C、IC1D。整个信号链的处理流程如下:
- IC1A:构成有源低通滤波器,截止频率约 10Hz,增益约 200 倍。为什么截止频率选 10Hz?因为人的脉搏频率范围大致在 0.78Hz(对应 47 次/分钟)到 3.33Hz(对应 200 次/分钟),10Hz 截止频率足够保留有效信号,同时把高频干扰和部分工频噪声滤除。增益 200 倍的作用是把毫伏级信号拉高到伏特级,便于后续比较器判断阈值。
- IC1B:构成电压比较器,将放大后的正弦波整形为方波。R8 调整比较器的阈值电压,也就是设置正弦波幅度在哪个电平处跳变。
- C5 与 R10:构成微分电路,把方波变换成正负尖脉冲。
- IC1C:构成单稳态多谐振荡器,收到尖脉冲触发后输出固定宽度的高电平脉冲,宽度由 R11 与 C6 决定,论文中约为 20ms。
我一般会在这级电路后面加一级简单的电压跟随器,用来隔离输出阻抗,避免后级数字电路的负载变化反向影响单稳态电路的工作状态,你能观察到更稳定的脉冲波形。
3.3 心率采集电路的逐级参数表
下面这张表汇总了信号链上各级核心元件的功能及取值依据,方便你在 Proteus 里仿真或洞洞板焊接时对照检查。
| 级联位置 | 核心元件 | 典型取值 | 作用与选型依据 |
|---|---|---|---|
| 传感器发射 | D1 | 940nm 红外 LED | 穿透耳垂/指尖组织,波长与接收管匹配 |
| 传感器接收 | Q1 | NPN 红外三极管 | 光信号转电流,暗电流越小抗环境光越强 |
| 一阶低通 | R2/C1 | 56kΩ / 47nF | 滤除高频干扰,截止频率约 60Hz |
| 有源低通+放大 | IC1A、R4/C4 | 5kΩ / 3.3μF 附近 | 截止频率约 10Hz,增益约 200 倍 |
| 比较整形 | IC1B、R8 | 56kΩ 可调 | 调整阈值电压,正弦波变方波 |
| 微分电路 | C5/R10 | 1nF / 100kΩ | 方波边缘变尖脉冲,触发单稳态 |
| 单稳态定时 | IC1C、R11/C6 | 220kΩ / 47nF | 输出 20ms 标准脉冲,匹配脉搏信号 |
| 注入单片机 | R12 | 51kΩ | 限流保护,脉冲送入 P3.3 |
3.4 AT89C2051 最小系统:晶振、复位与电源设计要点
AT89C2051 是 20 引脚封装的 8051 内核单片机,15 个可编程 I/O 口、128 字节 RAM、6 个中断源,内置模拟比较器,工作电压范围 2.7V 至 6V,支持 0Hz 至 24MHz 静态工作频率。项目里使用 12MHz 晶振,目的是让定时器计时分辨率足够高,用于周期测量时精度能到微秒级。
晶振电路采用典型的两电容三点式接法,C11、C12 取 22pF。瓷片电容容值不必非常精确,但必须靠近晶振引脚焊接,否则容易导致起振不稳定或频率偏差。复位电路采用经典的电容电阻串联结构,电容 C 取 10uF、电阻 R 取 10kΩ,RC 时间常数为 100ms 左右,确保 RST 引脚高电平持续时间远大于两个机器周期。上电瞬间电容充电形成高电平复位,正常工作时电容隔直,RST 拉低。
值得注意的一个细节是电源方案。心率计整机工作电流约 100mA,其中模拟部分的运放、红外发射管占了大头。系统使用 9V 电池供电,经过 IC1D 缓冲分压得到 4.5V 模拟电源。这个做法相比直接用三端稳压器更有讲究——4.5V 电源即便在电池跌落到 6V 时也能维持运放正常工作,等于把模拟电路的电源适应范围放宽了 3V,同时省掉一个稳压芯片,属于成本和可靠性的平衡。
3.5 报警与显示输出电路的工作逻辑
报警输出采用普通蜂鸣器,由单片机 I/O 口驱动。为了确保驱动电流足够,一般通过一个 NPN 三极管放大电流。显示部分使用 SMC1602A 液晶模块,数据线 DB0~DB7 直接接到单片机 P1 口,RS、RW、E 控制线分别由 P3.0、P3.1、P3.5 控制。液晶显示当前心率值和报警状态,方便驾驶员随时观察。日常使用时,D3 红色发光二极管随脉搏同步闪烁,能让用户直观地确认传感器是否贴合到位。如果 D3 不闪或闪烁不规律,说明探头佩戴有问题或者信号链有故障,这是整套系统最简单也最实用的自检手段。
4. 软件设计与中断测周期:从脉冲间隔到心率数值的计算逻辑
硬件把脉搏变成了整齐的脉冲,单片机接下来要做的事只有一件:数脉冲、算间隔、判阈值。这章把主程序框架、定时器配置、中断处理这三块作为主线,给出可直接参考的代码结构和参数推导过程。
4.1 主程序的整体工作流程
主程序初始化完成两件事:配置定时器工作模式和开启外部中断。随后进入循环,不断把最新计算出的心率值送去液晶显示,同时监测心率异常标志位,一旦发现超出阈值就驱动蜂鸣器报警。主循环本身不参与计数,只负责显示和报警状态更新,这种分工能最大限度减少计时误差。
// 主程序框架(简化版) void main(void) { TMOD = 0x01; // 定时器0工作在方式1,16位定时器 ET0 = 1; // 使能定时器0中断 EX0 = 1; // 使能外部中断0,接P3.2 IT0 = 1; // 外部中断0负跳变触发 EA = 1; // 开启总中断 TH0 = 0x00; TL0 = 0x00; while(1) { if (heart_rate_valid) { lcd_display(heart_rate); } if (heart_rate > HIGH_LIMIT || heart_rate < LOW_LIMIT) { buzzer_on(); } else { buzzer_off(); } } }几个关键参数:
TMOD = 0x01:定时器 0 工作在 16 位定时器模式,最大计时长度 65535 个机器周期;- 12MHz 晶振下机器周期为 1μs,16 位定时器最长可计时 65535μs;
IT0 = 1设置外部中断 0 为负跳变触发,恰好对应硬件输出的下降沿;- 心率阈值用宏定义预设为 HIGH_LIMIT 和 LOW_LIMIT,对应正常值上下浮动 20%。
4.2 定时器方式 1 与脉搏周期的权衡
计时分辨率直接影响心率计算精度。假定实测脉搏周期为 T 微秒,心率值为 60000000/T(次/分钟)。
以 70 次/分钟为例,周期约 857142μs。这个数值远超 16 位定时器的最大量程 65535μs。直接一次计时无法覆盖完整周期,工程上的标准做法是允许定时器溢出并记录溢出次数:
// 定时器0溢出中断,记录溢出次数 void timer0_isr(void) interrupt 1 { overflow_count++; TH0 = 0x00; TL0 = 0x00; // 重新从0开始累加 }- 每次溢出代表 65536μs,将 overflow_count 乘以 65536 再与当前定时器值相加,就得到完整的周期时长;
- 以正常心率下限 40 次/分钟计算,周期为 1500000μs,需要约 23 次溢出,用一个 8 位无符号字符即可容纳;
- 如果心率过低导致周期过长,溢出次数超过 255 次,说明传感器脱落或信号丢失,程序里应做超时判断并停止计算,而不是继续累加。
采用中断方式测周期的好处是全程不占用 CPU 轮询,主循环可以处理显示,保证显示刷新的同时计时不中断。这个方法在 51 单片机课程设计中非常常见,我这里补充说明一下溢出计数的边界条件,实际调试时很有用。
4.3 外部中断里的周期计算与抖动消除
外部中断服务程序的核心任务是从相邻两个下降沿的间隔中推出心率。这里最大的坑是信号抖动——硬件整形后的脉冲在边缘处可能出现毛刺,导致中断被重复触发,测出来的周期会被压缩,心率值虚高。解决思路有两种:硬件上加 RC 滤波,软件上在中断里判断时间间隔。
// 外部中断0服务程序:计算脉搏周期 void ext0_isr(void) interrupt 0 { unsigned long current_capture; unsigned int delta; // 关闭计时 TR0 = 0; current_capture = (unsigned long)overflow_count * 65536UL + TH0 * 256UL + TL0; delta = (unsigned int)(current_capture - last_capture); // 软件滤波:剔除异常短间隔(小于400ms视为抖动,对应心率>150bpm) if (delta > 400000UL) { // 周期合法,换算为心率 heart_rate = 60000000UL / delta; heart_rate_valid = 1; last_capture = current_capture; } else { // 疑似抖动,丢弃本次计数,不更新心率 heart_rate_valid = 0; } // 重新开启计时 overflow_count = 0; TH0 = 0; TL0 = 0; TR0 = 1; }这段代码里有几个细节值得推敲:
60000000UL / delta的单位是次/分钟,不是次/秒。如果周期为 60000000μs(即 60 秒),心率为 1,实际不会出现;正常心率 60 对应周期 1000000μs;- 设置 400ms 的下限过滤条件是常用做法——正常心率上限按 150bpm 计算,周期最低约 400ms。低于这个值说明信号链有抖动或多个脉冲粘连;
- 每次中断末尾清零溢出计数和定时器,要避免在定时器运行期间清零导致计时基准错乱。这里的处理是中断一开始就关闭定时器,清零后再打开,确保下一次测量的起点是干净的。
4.4 异常判定阈值与报警逻辑的低误报设计
心率正常值判定采用论文中的“正常值上下浮动 20%”规则。假设在心率为 75 次/分钟时,高阈值为 90,低阈值为 60。这里的关键是“正常值”从哪来,两个设计方向可以参考:
- 开机后取前 30 秒心率的平均值作为个人基准。这个方案能自适应不同驾驶员,但需要保证开机时驾驶员处于清醒静坐状态;
- 直接使用固定标准值 60~100 次/分钟,上下浮动 20% 后实际报警阈值为 48~120。
报警逻辑还需要防重复打扰。驾驶员长时间疲劳时心率会持续偏低,若蜂鸣器一直响会干扰驾驶。合理做法是加入延时判定:连续 10 秒检测到心率越界才触发报警,报警持续 3 秒后暂停 10 秒再检查。这样既保证报警有效,又不至于因为传感器瞬时误差频繁误报。我在自己的设计里会在 EEPROM 里存一个报警状态位,避免复位后立即再次报警。
5. 调试技巧与验证方法:用示波器逐级看信号,用阈值避开误报
整机能否跑通,取决于你是否能把模拟前端每一级的输出波形都看出门道来。这一章从调试工具到信号判读,再给出一个抗干扰的阈值策略改进思路,也是做实车验证前最值得做的事。
5.1 用示波器逐级定位信号链的问题
数字万用表只能告诉你“有没有电”,示波器才能告诉你“信号对不对”。有条件的建议使用至少双通道数字示波器,量程调到 1V/div,时间轴 500ms/div,把探头依次接在四个关键测试点上。
| 测试点 | 预期波形 | 常见异常 | 排查方向 |
|---|---|---|---|
| Q1 集电极 | 几十毫伏的脉动信号 | 无波形或波形平坦 | 检查 D1 是否发光、光路是否对准、Q1 是否损坏 |
| IC1A 输出 | 约 1~2V 的正弦波 | 波形过小或削顶 | 检查反馈电阻 R4 是否接触不良、增益是否正确 |
| IC1B 输出 | 5V 方波 | 方波占空比不稳定 | 调整 R8 阈值电位器,避开正弦波幅度波动中心 |
| IC1C 输出 | 20ms 高电平脉冲 | 脉冲宽度异常或抖动 | 检查 R11/C6 取值、供电电压是否稳定 |
如果前面都正常但单片机收不到脉冲,重点检查 R12 到 P3.3 之间的连线以及 P3.3 口是否被配置成输出模式——这种低级错误在课程设计里踩的人不少。
5.2 软件滤波阈值如何配合硬件参数调整
前面中断程序里 400ms 的软件下限不能一概而论。如果你的硬件单稳态脉宽不是 20ms 而是 50ms,或者比较器阈值调得过于敏感导致脉冲粘连,400ms 这个值需要相应放宽。一个实用的调整办法是:让被测者静坐,观察示波器上连续十个脉冲的周期最小值,把它乘以 0.8 作为软件滤波下限。
论文中设定单稳态脉宽 20ms 的依据是:确保脉冲宽度远小于最短脉搏周期(大约 300ms),这样后续计数时不会因为脉冲过宽导致相邻脉冲合并。这个 20ms 取值在多数场景下是合理的,它与 400ms 软件下限共同构成了一个双保险机制。实际用下来这组参数配比较好,但也不是绝对标准——将 R11 换到 470kΩ、C6 保持 47nF,脉宽能延长到大约 40ms,需要同步把软件滤波下限调高,这一点在使用原版电路时不需要改,但如果你为了抗干扰调整了 R11,就要记得改动判断逻辑。
5.3 心率数值的简便验证方法
整机调试完成后,用手捏住指夹式传感器,同时用另一只手摸自己的桡动脉手动数脉搏 15 秒,乘以 4 得到实测心率,与液晶屏显示值对比,误差在 ±2 次/分钟内说明系统正常。误差偏大时先看波形是否稳定,再看阈值是否设置不当,不要急着改代码里的除法常数。
最后给一个提升实车可靠性的低成本改进方案:在单片机的 P3.7 引脚外接一个开关,切换“正常值自动学习模式”和“固定阈值模式”。前者适合长时间连续驾驶,通过滑动平均不断更新个人心率基准;后者适合短途代步,直接使用标准健康范围。这个功能只需要改动十几行 C 代码,却能让论文里的固定阈值报警机制在实践中具备更强的适应性,也是一个在答辩时能讲出深度的优化点。
本文还有配套的精品资源,点击获取