ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于单片机的多功能智能婴儿车:避障、环境监测与蓝牙遥控实现

基于单片机的多功能智能婴儿车:避障、环境监测与蓝牙遥控实现 简介本资源是一套完整的基于单片机的多功能智能婴儿车毕业设计与课程设计实践方案面向电子信息、自动化、嵌入式等专业的本科生及单片机初学者解决智能硬件系统从原理设计、仿真验证到功能实现的全流程学习需求。压缩包共41个文件涵盖Protues仿真工程.pdsprj/.pdsbak、Keil C51源码6个.c、5个.h、.a51/.hex/.uvproj、LCD1602/ADC0832/DHT11/HC-SR04等模块驱动代码、系统流程图8张.bmp、仿真界面图7张.png、原理图.SchDoc与.PDF、器件清单.xlsx及功能说明文档.txt全面支撑软硬协同开发与调试。已有69人学习下载读者可直接复现自动避障、座椅角度调节、温湿度监测、音乐播放、远程状态显示等核心功能掌握单片机外设驱动、多任务逻辑调度、传感器数据融合及ProtuesKeil联合仿真调试等关键技术环节。 带娃的时候你有没有遇到过这种情况婴儿车推到一半手机响了你得一手扶着车把一手回消息眼睛还得盯着前面的台阶夏天太阳晒着你摸一下车里的温度总担心闷着孩子有时候刚把宝宝放进车里一转身接个电话回来就忘了孩子是不是还在车上。这些问题听起来小但每一个都能让带娃的人手忙脚乱。我当初做这个基于单片机的多功能智能婴儿车就是冲这些实际痛点去的。这篇文章会把我从需求拆解、硬件选型、软件实现到联调踩坑的完整过程讲清楚项目的核心是用51单片机作为主控配合超声波避障、温湿度检测、称重防遗忘和蓝牙遥控这几大模块做出一台能自己判断障碍物、能上报环境数据、能用手机远程控制的婴儿车原型。整体方案并不复杂非常适合单片机入门者、嵌入式方向的学生以及正在做毕业设计的人参考。1. 需求拆解一台婴儿车到底需要哪些“智能”1.1 从带娃痛点反推功能清单很多人一听“智能婴儿车”第一反应是堆功能——加屏幕、加语音、加摄像头、加GPS什么都想往上放。但实际做过一轮需求分析你就会发现用户真正需要的功能往往很朴素。带娃的人最关心的就三件事安全、舒适、省心。安全对应的是避障和防遗忘。婴儿车在小区里推前面突然窜出一只猫、一个皮球或者台阶边缘没看清这些情况全靠家长反应不一定来得及。超声波避障可以在接近障碍物时自动减速甚至刹停给家长一个缓冲时间。防遗忘则是通过车内的压力传感器实时检测宝宝是否在车上一旦家长推着空车走远了或者把宝宝单独留在车里系统会发出提醒这个功能对心大的家长来说非常实用。舒适对应的是环境监测。婴儿车内部是个相对封闭的空间夏天暴晒之后车内温度可能比外面高好几度冬天又容易捂得太热。DHT11温湿度传感器把车内的温湿度实时采出来超过阈值就报警家长可以及时调整盖被、遮阳帘或者增减衣物。省心对应的是遥控和状态可视化。蓝牙模块连接手机之后家长可以用APP控制小车前进、后退、转向也能随时查看当前温湿度和载重状态。不需要额外装复杂的屏幕手机上搞定成本低、交互也直观。1.2 为什么用单片机而不是ARM Linux或者现成方案这个项目我一开始也纠结过要不要直接上树莓派或者用OpenMV之类的视觉方案来做后来全否了。原因很简单婴儿车这个场景不是要跑复杂的AI算法而是要稳定、实时、低成本地处理几个传感器信号和控制几个电机。单片机方案最大的优势是可靠性高、外设丰富、功耗低。51内核的单片机虽然算力不强但处理超声波的脉冲计时、DHT11的单总线时序、HX711的称重数据、蓝牙串口收发这些任务绰绰有余。更重要的是它的GPIO、定时器、外部中断、串口这些资源刚好能覆盖所有需求开发资料也极其丰富遇到问题网上一搜就能找到方向特别适合这个项目的定位。ARM Linux方案不是不行而是杀鸡用牛刀。启动时间长达数秒系统复杂度上去之后稳定性反而难保证功耗也高电池续航是问题。再说成本一个能跑Linux的核心板加摄像头加各种外设预算直接翻几倍。单片机方案整机物料成本可以控制在100元上下对于课程设计或者毕业设计来说性价比非常能打。2. 硬件选型十个模块怎么搭配才稳2.1 主控芯片的选择逻辑主控我最终选了STC89C52RC这可能是很多人觉得“老掉牙”的一颗芯片但它在这个项目里其实非常合适。它有8KB Flash、512字节RAM、3个定时器、4个8位IO口、1个全双工串口这些资源在我规划的方案里刚好够用不会因为资源过剩增加成本和功耗。如果你做一些计算量更大的扩展比如加MPU6050做姿态融合、加OLED屏幕做动画菜单那建议直接上STM32F103C8T6价格也就几块钱性能强很多。但这个项目我的核心诉求是稳定和简单51单片机在裸机开发逻辑下反而更好写——寄存器少、中断响应可预期、PWM波形可以通过定时器完全掌控。另外STC89C52RC支持串口下载程序不需要额外的仿真器一根USB转TTL线就能烧录。这对学生党来说太友好了不用花几十上百块买下载器。2.2 传感器与执行器的选型清单整个系统我拆成了几个功能模块每个模块的选型如下表所示模块器件型号功能选型理由主控STC89C52RC核心逻辑处理资源够用、资料多、串口下载避障HC-SR04超声波检测前方障碍物成本低、测距精度够、角度可控近距离检测红外避障传感器补充超声波盲区便宜、响应快、抗环境光能力尚可温湿度DHT11车内温湿度采集单总线协议、功耗低、精度满足需求称重HX711压力传感器监测车内载重状态24位ADC、稳定性好、驱动简单震动检测SW-520D倾斜传感器检测车身倾倒/剧烈颠簸数字量输出、直接接GPIO蓝牙HC-05手机与主控通信串口透传、配对简单、模块成熟电机驱动L298N驱动直流减速电机双路H桥、带使能端支持PWM调速电机4个直流减速电机驱动车轮扭矩足够、带减速箱、好控制显示LCD1602液晶屏本地显示温湿度/状态模块化、接口通用、显示直观电源18650电池×2 LM2596降压模块系统供电电压覆盖3.3V和5V、效率高报警有源蜂鸣器超阈值报警、防遗忘提醒驱动简单、声音足够大这里特别说一下超声波避障和红外避障的分工。HC-SR04超声波的有效测距范围是2cm到400cm精度在毫米级但在近距离小于2cm会失效而且对柔软物体比如衣服、毛毯反射效果差。红外避障传感器正好弥补这两个短板它检测距离通常在2cm到30cm可调对物体材质不敏感。两个传感器配合一个负责“远看”一个负责“近防”互补性很好。2.3 电源分配最容易翻车的一环电源是整个项目中第一个把我坑惨的部分我后面会专门讲。这里先给出我认为最稳妥的配电方案电机和单片机分开供电。单片机、传感器、蓝牙、液晶屏统一用5V供电由一个LM2596降压模块从电池电压降压得到。L298N电机驱动板直接从电池取电驱动电机。L298N板载的5V稳压输出通常不够稳定不要拿来给单片机供电。系统共地。这是很多新手容易忽视的如果不共地单片机和电机驱动之间的控制信号没有统一的参考电位逻辑电平会乱电机根本不受控。两节18650电池串联是7.4V左右刚好在L298N的电机供电范围内LM2596输入范围在4.5V到40V之间也完全覆盖。如果你用的是4节5号电池电压会降到4.8V到6V电机扭力会明显不足慎用。3. 软件实现主循环、定时器与各功能子程序3.1 主程序框架别让一个传感器卡死整台车单片机裸机开发最常见的错误是把所有功能塞进一个while循环里然后某个传感器读数据时用delay硬等导致整个系统卡死。比如DHT11单总线通信每次读取需要几十毫秒如果这个过程中超声波测距的中断来了或者蓝牙串口数据来了就可能被丢掉或相互干扰。我的方案是主循环 状态标志位 定时器节拍的非阻塞架构。volatile uint8_t flag_20ms 0; // 20ms节拍用于扫描按键和蓝牙 volatile uint8_t flag_200ms 0; // 200ms节拍用于超声波测距 volatile uint8_t flag_1s 0; // 1s节拍用于温湿度采集和称重 void Timer0_Init() { TMOD 0x01; // 定时器0模式116位 TH0 0x4C; // 50ms定时初值 TL0 0x00; ET0 1; TR0 1; EA 1; } void Timer0_ISR() interrupt 1 { static uint8_t cnt_20ms 0; static uint8_t cnt_200ms 0; static uint8_t cnt_1s 0; TH0 0x4C; TL0 0x00; cnt_20ms; if (cnt_20ms 1) { flag_20ms 1; cnt_20ms 0; } cnt_200ms; if (cnt_200ms 4) { flag_200ms 1; cnt_200ms 0; } cnt_1s; if (cnt_1s 20) { flag_1s 1; cnt_1s 0; } }主循环只做一件事轮询各个标志位谁置位就处理谁的任务。void main() { System_Init(); while (1) { if (flag_20ms) { flag_20ms 0; Bluetooth_Process(); Key_Scan(); } if (flag_200ms) { flag_200ms 0; Ultrasonic_Trigger(); } if (flag_1s) { flag_1s 0; DHT11_Read(); HX711_Read(); LCD_Update(); } } }这样设计的好处很明显超声波测距的启动和回波读取占用时间极短温湿度读取即使需要几十毫秒也只是在一个1秒的周期内做一次不会阻塞其他任务。蓝牙指令处理是时间敏感度最高的任务放在20ms周期里轮询也不会因为传感器读取而丢数据。3.2 电机PWM调速与避障逻辑电机调速我用的是L298N的使能端PWM方案。L298N的ENA、ENB引脚分别控制左路和右路电机单片机通过定时器1生成PWM波形占空比决定电机转速。void Motor_Init() { TMOD | 0x10; // 定时器1模式1 TH1 0xFF; TL1 0xD2; // 初始占空比约50% ET1 1; TR1 1; } void Set_PWM(uint8_t duty) { // duty范围 0~100 TH1 (65536 - (duty * 100)) / 256; TL1 (65536 - (duty * 100)) % 256; }避障逻辑我写成了状态机而不是简单的“遇到障碍就停”。因为婴儿车在推行过程中如果超声波检测到障碍就直接刹停体验会非常差——地面上一个易拉罐就能让车停下来。所以我的状态机分了三档距离大于60cm正常速度前进PWM占空比60%。距离在25cm到60cm之间减速到30%占空比同时蜂鸣器响一声提醒家长。距离小于25cm电机停转同时启用红外传感器做近距离复核如果红外也触发就完全刹停并报警。这样设计的好处是轻量障碍物不会触发急停家长可以正常推行而遇到真正的危险比如台阶、墙、突然窜出的东西时车能及时停下。这个逻辑在实际测试中反映很好不会被误触烦恼。超声波测距的驱动需要一个10us以上的触发脉冲然后等待Echo引脚返回高电平高电平持续时间和距离成正比。void Ultrasonic_Trigger() { uchar i; uint distance; TRIG 1; for (i 0; i 10; i); // 约10us延时 TRIG 0; while (!ECHO); // 等待高电平 TR0 0; TH0 0; TL0 0; TR0 1; while (ECHO); // 等待高电平结束 TR0 0; distance (TH0 * 256 TL0) * 0.017; // 单位cm // 计算关系时间(us) * 340m/s / 2 距离 }这里有个细节超声波测距里的定时用到了定时器0而系统节拍也用定时器0会冲突。实际项目中我把超声波测距的计时改成了记录系统Tick差值或者用定时器0单独计时并在用完立刻恢复节拍模式。更好的做法是直接用一个外部中断引脚来捕获Echo上升沿和下降沿但51的资源有限我用的是查询法配合关闭和恢复定时器中断的临界区处理。3.3 环境监测与称重防遗忘DHT11的读取是整个软件里时序要求最严格的模块。它的单总线协议要求主机发送起始信号后等待从机响应然后在40位数据中每位数据的高电平时间不同来表示0或1。用51单片机的话必须用微秒级的延时函数而且不能开中断否则时序会被破坏。void DHT11_Read() { uchar buf[5] {0}; uchar i, j; DATA 1; Delay_us(2); DATA 0; Delay_us(20000); // 主机拉低大于18ms DATA 1; Delay_us(30); if (!DATA) { // 从机响应信号 while (!DATA); // 等待高电平 while (DATA); // 等待低电平 for (j 0; j 5; j) { // 读取40位数据 for (i 0; i 8; i) { while (!DATA); Delay_us(40); if (DATA) { buf[j] | (0x80 i); } while (DATA); } } } // buf[0]湿度整数, buf[1]湿度小数, buf[2]温度整数, buf[3]温度小数, buf[4]校验 }读取完成后要校验数据buf[0]buf[1]buf[2]buf[3]等于buf[4]才认为数据有效。我一开始没加校验结果是偶尔会出现一个几百度的离谱温度后来加校验之后就再也没有了。称重模块HX711是四线接口VCC、GND、SCK、DT时钟线由单片机控制。读数据时单片机给SCK至少25个脉冲前24个脉冲把24位AD值移出第25个脉冲控制通道和增益。由于HX711的增益放大倍数默认是128实际测得的AD值范围很大需要标定换算成具体的克数。标定方法很简单先不放东西记录零点AD值然后放一个已知重量比如1kg砝码记录满量程AD值两点确定一条直线之后就能把AD值映射为重量。long HX711_Read() { long value 0; uchar i; SCK 0; while (DT); // 等待数据就绪 for (i 0; i 24; i) { SCK 1; value value 1; if (DT) value | 1; SCK 0; } SCK 1; // 第25个脉冲输入增益128 SCK 0; return value; }防遗忘逻辑是用重量阈值判断的。当重量大于2kg模拟一个婴儿的重量时认为宝宝在车上当之前有重量、突然变成小于0.5kg且触发了蓝牙的“锁车”标志系统就进入防遗忘模式蜂鸣器持续报警同时蓝牙向手机发送警示信息。3.4 蓝牙通信协议与指令解析HC-05蓝牙模块默认是AT模式需要先用串口发AT指令配置为主机或从机模式。这个项目里我把它设置为从机模式手机APP连接后就是透明传输单片机串口收到的数据直接就是手机发来的指令。我自定义了一套简单协议每条指令固定3个字节帧头命令字校验值。指令功能0xAA 0x01 0xAB前进0xAA 0x02 0xA8后退0xAA 0x03 0xA9左转0xAA 0x04 0xAE右转0xAA 0x05 0xAF停止0xAA 0x06 0xAC查询状态校验值用的是命令字取反简单够用。串口接收中断里把帧头0xAA作为状态机的起点连续收到3个字节且校验通过才执行动作避免误码。void UART_ISR() interrupt 4 { uchar ch; if (RI) { RI 0; ch SBUF; switch (recv_state) { case 0: if (ch 0xAA) { recv_state 1; } break; case 1: recv_cmd ch; recv_state 2; break; case 2: if (ch (uchar)(~recv_cmd)) { Cmd_Execute(recv_cmd); } recv_state 0; break; } } }手机端我当时用的是网上找的“蓝牙串口”APP可以通过按键发送十六进制指令也能直接看单片机回传的温湿度和称重文本。如果你要做得更完整可以用Android Studio写一个简单的自定义APP界面放几个按钮和文本框难度不大。对毕设来说串口调试助手作为演示工具也够用。4. 联调阶段踩过的坑从复位死机到传感器漂移4.1 电机一启动单片机就复位这个问题我印象太深了。第一次把整机装起来打开电源开机正常LCD正常显示蓝牙也能连上。但只要一调用电机前进函数单片机立刻复位LCD回到开机画面。有时候更夸张电机转一下整个系统就死机。排查过程花了大半天。先是怀疑程序逻辑单独测电机PWM输出发现不接电机时逻辑正常接了电机就复位。然后怀疑是电流不足电池电压被拉低用万用表一测电机启动瞬间电池电压从7.4V掉到4V以下单片机当然撑不住。问题根源就是一开始说的“共电源”。电机启动电流瞬间能到1A以上而LM2596降压模块虽然能承受输入电压波动但输入电压如果跌到5V以下输出就不稳定了单片机的供电就挂。解决方式和我2.3节说的一样电机直接从电池取电单片机供电串一个二极管再加一个大电容二极管防反接和降压电容储能扛瞬时压降。实测下来电机启动瞬间单片机的5V电压纹波控制在0.3V以内系统再也没复位过。4.2 超声波测距偶尔跳变超声波模块在空旷环境下测得很准但在室内推着走的时候偶尔会跳出一个特别大的值或者特别小的值导致小车莫名其妙刹车。后来我加了两个处理。第一是滤波连续测5次去掉最大值和最小值取剩下3次的平均值。第二是加上一阶低通滤波把每次的新测量值和上一次的有效值做加权filtered_distance (uint16_t)(old_distance * 0.7 new_distance * 0.3);这样处理后就算有个别跳变也不会立刻影响电机状态。而且我在避障逻辑里也加了滞回区间从“正常”切换到“减速”的阈值是60cm但从“减速”恢复“正常”要等距离大于80cm防止小车在临界点反复加减速推起来一顿一顿的。4.3 DHT11温湿度读取失败这个坑最容易排查出来的是现象最难看出的是原因温湿度数据隔几分钟就变成“无效”LCD上显示为0或者显示一个奇怪的负值。排查到最后发现是我在DHT11读取过程中开了中断。DHT11的数据位宽度是微秒级的高电平26-28us代表070us代表1如果读取过程中定时器中断插进来哪怕只耽误几百个纳秒位宽判断就会出错。解决办法是在读取DHT11之前关EA中断总开关读完再打开。DHT11的读取周期是毫秒级几十微秒的关中断时间对系统其他任务没有任何影响。4.4 蓝牙连接正常但指令乱码蓝牙模块第一次上电我按网上教程直接把波特率设为38400串口助手收发也是38400但是手机APP连上之后发指令单片机收到的是乱码。问题出在HC-05默认波特率是9600我AT指令设置38400后虽然模块返回OK但只改了一侧的通信参数单片机串口还是9600。两边波特率不一致收到的肯定是乱码。这个坑典型到我都不知道该怎么吐槽自己。后来统一把所有通信配置都改成96008位数据、无校验、1位停止位整个世界清净了。如果你也遇到乱码第一件事不是查协议而是确认两边的波特率、数据位、停止位、校验位完全一致。5. 成本清单、复现建议与后续扩展5.1 整体物料成本很多读者关心这个项目到底花了多少钱我完整记录了一下物料数量单价合计STC89C52RC最小系统板112元12元L298N电机驱动模块18元8元直流减速电机带轮子48元32元HC-SR04超声波模块13元3元红外避障传感器12元2元DHT11温湿度模块13元3元HX711称重模块压力传感器110元10元HC-05蓝牙模块110元10元LCD1602液晶屏16元6元18650电池座LM2596降压2115元15元蜂鸣器、杜邦线、面包板等杂项-20元20元婴儿车车架二手140元40元总计--约161元如果你手头已经有51单片机开发板和一些常用传感器实际新增成本可能不到80元。这个成本级别在课程设计和毕业设计里都属于非常友好的。5.2 复现时的几个建议面包板只适合初期验证整机装配时务必用杜邦线加焊锡固定或者自己画一块PCB。面包板接触不良导致的故障会让你排查到怀疑人生。传感器全部做3D打印支架或者热熔胶固定不要悬空。超声波模块如果固定不牢测距角度会漂影响避障判断。车架最好是买一辆二手轻便婴儿车来改装不要自己焊车架安全性和时间成本都不划算。低压和电源逻辑一定要按我前面说的分开供这是整机稳定性的命门。程序里每个模块都单独写一个源文件和一个测试函数先逐个验证再整合。我这个项目里先测超声波、再测电机、再测蓝牙每个单独跑通了才合并最后联调只花了一个晚上。5.3 可以继续做的方向如果你做完这个基础版本还觉得不过瘾下面这些方向都是现成的扩展点把主控换成STM32增加MPU6050姿态传感器实现车身倾斜检测和自动刹车逻辑会复杂一些但完全可行。增加GPS或北斗模块实现定位和轨迹记录适合做成“防走失”功能。用ESP8266或ESP32模块替代蓝牙做成WiFi连接手机在任何地方都能查看车内状态相当于把遥控升级成了远程监控。在LCD1602基础上加一块OLED显示屏显示更细腻还可以做简单的菜单系统。把超声波避障升级成两个舵机超声波的扫描方案实现前方120度范围内的障碍检测而不是固定一个方向。我个人在实际操作中的体会是这个项目的价值不在于它多“高科技”而在于它把单片机课程里学的定时器、中断、串口、GPIO、PWM这些知识点全部串了起来并且最后能跑在一辆真实的婴儿车上。做的时候你可能会骂骂咧咧但看到小车能自动避开障碍、手机一按就能转弯的那一刻成就感是真的顶。最后再分享一个小技巧婴儿车在小区里推的时候太阳直射会让超声波模块读数偏大尽量在模块上方加一个遮阳挡片能减少很多环境干扰。这套方案我已经帮好几个学弟复现过照着这个思路做少走弯路。本文还有配套的精品资源点击获取
返回列表