ARTICLE DETAIL

资讯详情

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

80C51智能小车设计:超声波避障、红外寻迹与PWM调速

80C51智能小车设计:超声波避障、红外寻迹与PWM调速 简介基于 C51 单片机的电动智能小车毕业设计文档面向电子信息、自动化等专业学生及相关单片机开发者可作为课程设计、毕业设计或课外实践的直接参考资料。资源以 80C51 单片机为控制核心围绕自动避障、自动寻迹、寻光、快慢速行驶与自动停车等功能系统讲解直流电机 PWM 调速、超声波传感器与光电检测器应用、新型显示芯片驱动以及时钟复位、前向/后向通道等硬件电路设计方法。文档覆盖方案设计与论证、硬件设计、软件主程序及子程序设计、测试数据与结果分析还融入软件抗干扰和看门狗技术并附有程序清单与硬件原理图。压缩包为 1 个 doc 文档大小 5.42MB结构完整、层次清晰已有 448 人学习浏览适合需要快速理解系统框架、复现电路与代码并在此基础上进行功能扩展的读者。1. 80C51智能电动小车的设计目标与系统构成一辆玩具电动车底盘改造的智能小车能完成的事情比多数课设要求的更多超声波传感器探测正前方障碍红外光电对管识别地面黑线与光线方向光电码盘测速测距数码管实时显示时间、里程和速度PWM脉宽调速控制快慢行驶和定位停车。这个毕业设计的核心难点不是让车跑起来而是把8位单片机有限的I/O资源、中断系统和外部检测电路做成一个合理分配的整体——80C51只有128字节片内RAM、2个16位定时器和4个并行口所有功能都必须在这套资源里装下。这套设计适合正在做课设或毕设、手里有一套散件却不知道从哪里开始搭电路和写程序的人也适合想把传感器选型和调速链路一次理清的人。2. 传感器检测通道超声波避障、红外寻迹与光电码盘测速的实现2.1 障碍物检测40kHz超声波收发链路超声波测距的基本关系是距离声速乘往返时间再除以2工程实现的关键在接收信号的放大和判决。T/R-40-12是常见的收发分体式超声波传感器中心频率40kHz发送器由80C51输出的40kHz方波驱动接收器把回波转换成毫伏级电压信号先经LM318做两级放大再送到带锁相环的音频解码芯片LM567。输入信号大于25mV时LM567输出端从高电平跳变为低电平这个电平变化直接作为80C51的查询输入。// 40kHz超声波发送脉冲生成定时器0方式28位自动重装 void ultrasonic_send(void) { unsigned char i; TH0 0xF4; // 12MHz晶振下定时12us约41.7kHz TL0 0xF4; TF0 0; TR0 1; // 启动定时器方式2自动重装 P1_0 0; for (i 0; i 16; i) // 16次翻转输出8个完整方波 { while (!TF0); // 等待定时器溢出 TF0 0; P1_0 ~P1_0; // 翻转输出形成半周期 } TR0 0; // 停止定时器 }初值0xF4对应256减12在12MHz晶振、12分频模式下机器周期为1us每12us翻转一次引脚输出方波频率约为41.7kHz。这个频率相对40kHz有约4%的偏差在T/R-40-12的带宽范围内可以正常起振和接收。如果想要更接近40kHz可以改用11.0592MHz晶振并重新计算初值或者把定时长度调整为13us输出约38.5kHz。完整发送一次需要16乘12us约192us这个阻塞时间对周期几十毫秒的避障检测来说可以接受。提示设计文档里写中心频率为40Hz属于笔误压电晶片的实际中心频率是40kHz驱动脉冲序列必须按40kHz生成否则灵敏度会大幅下降。超声波的接收侧没有软件代码主要靠硬件判决。LM567是锁相环音频解码器它的中心频率由外接电阻电容决定调试时要把中心频率调到和发射频率一致。接收信号经LM318两级放大后送入LM567信号幅度大于25mV时输出低电平。用示波器看LM567第8脚在障碍物接近时能看到电平被拉低拉低的持续时间对应超声波往返时间。这个时间信号如果送给定时器1做输入捕获可以算出精确距离如果只是做避障判断直接查询电平跳变就够用。2.2 寻迹检测反射式红外光电传感器的地面线识别寻迹检测采用反射接收原理。红外发光二极管持续发射红外光红外光敏三极管接收地面反射回来的光线。白纸表面反射率高接收管导通输出高电平黑色线条吸收红外光接收管截止输出低电平。这一高一低直接反映小车是否压到黑线。原始信号直接接单片机也能工作但地面反光不均匀、环境光干扰叠加会产生毛刺所以传感器输出到80C51之间串了LM393电压比较器和74LS14施密特触发器两级处理比较器提供明确阈值施密特触发器提供回差保证电平切换干净。// 寻迹信号读取P3.4接收左传感器P3.5接收右传感器 unsigned char track_read(void) { unsigned char status 0; if (!P3_4) status | 0x01; // 左侧压黑线输出低电平 if (!P3_5) status | 0x02; // 右侧压黑线输出低电平 switch (status) { case 0x00: return 0; // 两侧都未压线直行 case 0x01: return 1; // 左侧压线向右修正 case 0x02: return 2; // 右侧压线向左修正 case 0x03: return 3; // 两侧都压线到达起终点 } return 0; }这段代码把压线定义为低电平有效和原文经过黑线时传感器输出低电平一致。P3.4和P3.5需要配置为输入模式。返回的状态值被主循环用来做转向决策case 3同时意味着小车到了起终点黑线程序转入停车记录里程。LM393是开漏输出上拉电阻通常选4.7kΩ到10kΩ阈值由反相输入端的电位器分压设定。调试时把小车推到黑线上调节电位器到刚好翻转再推回白纸确认输出恢复阈值就定住了不要只在一个位置调完就认为完成。2.3 测速与里程红外光电码盘的双通道计数测距的核心部件是测距轮、遮光盘和槽型光电耦合器。遮光盘安装在车轮轴上圆周开一个缺口缺口转过凹槽型光电耦合器的瞬间红外发射管的光线穿过缺口照到接收管产生一个脉冲。测距轮每转一圈输出一个脉冲车轮周长0.1米的话每个脉冲对应0.1米行程。可逆计数需要两个槽型光电耦合器并列放置遮光盘先后通过两个凹槽产生两个相位差90度的脉冲根据到达先后判断正转还是反转正转时A相先到反转时B相先到这就是工程里常见的正交编码计数思路。// 只把A相接INT0中断B相接P3.3判断方向 void ext0_isr(void) interrupt 0 { if (P3_3) distance; // A相中断时B相为高正转 else distance--; // A相中断时B相为低反转 }INT0中断按A相每个脉冲触发一次B相只作为方向参考避免了两个通道都进中断造成的重复计数。distance是unsigned int类型最大可计数65535个脉冲对应约6.5公里课设场景够用。如果行程更长需要改成unsigned long并在主循环里定期保存。遮光盘和槽型光电耦合器应当封装在不透光的盒子里外部光线一旦干扰接收管脉冲波形会出现毛刺直接影响里程精度。表码盘脉冲与行车参数换算车轮周长0.1米参数计算方式示例里程脉冲数乘单脉冲行程1000脉冲等于100米速度单位时间脉冲数乘单脉冲行程10脉冲每秒等于1米每秒行驶时间定时器中断累计定时器1计数方向A相与B相脉冲先后A先到为正转2.4 光线跟踪光敏三极管的方向检测光线跟踪用两个光敏三极管分别放在车头左右两侧。有光照时三极管c-e间阻值下降检测电路输出高电平无光照时阻值升高输出低电平。左右两个传感器组合决定转向电机动作左侧受光则左转右侧受光则右转两侧同时受光则直行。信号同样经过LM393加74LS14两级处理因为光敏三极管输出是模拟量环境光缓慢变化会让输出处于临界区直接接I/O口会反复跳变加入比较器和施密特触发器后就稳定多了。表左右光敏管状态与转向逻辑左侧光敏管右侧光敏管转向控制10向左转01向右转11直行00保持上一状态检测通道的四个功能到这里就分开了。实际系统里它们不是各自独立工作而是主循环里按优先级读取寻迹状态决定是否到站超声波状态决定是否要避障码盘脉冲保证里程累计光敏管只在追光模式里启用。把这四个信号在单片机侧汇总就进入下一层的执行机构控制——PWM调速。3. 双极式H型PWM调速从方案对比到驱动代码3.1 调速方案对比直流调速有三条常规路线串电阻调速、可控整流V-M系统、脉宽调制PWM。串电阻调速在电机回路串入功率电阻用电阻值调节电机端电压结构最简单但能量全部消耗在电阻上效率低换档时转矩冲击大。V-M系统用晶闸管整流替代旋转变流机组能够平滑调速但晶闸管的单向导电性让电流不能反向可逆运行需要额外配置桥臂低速时功率因数低还产生谐波。PWM让功率管工作在开关状态开关频率高电枢电流靠电机电感滤波就能获得很小的脉动低速平稳、调速范围宽、效率高。对这个项目来说PWM是唯一能同时满足调速范围、效率和可逆控制三个条件的方案。表三种直流调速方案的对比方案效率调速范围可逆性系统复杂度串电阻低窄不支持低V-M系统中中需扩展桥臂高PWM高宽自然支持中3.2 双极式H型变换器的工作原理双极式H型变换器由4个三极管和4个续流二极管组成桥式电路电机接在桥路对角线上。VT1和VT4是一组基极驱动电压相同VT2和VT3是另一组驱动电压与第一组反相。两组管子交替导通电机电枢两端电压极性周期性反转这就是双极式名称的出处。占空比大于50%时正组导通时间更长平均电压为正电机正转小于50%时平均电压为负电机反转等于50%时平均电压为零但电机两端仍然交替承受正负电压产生微振电流能消除静摩擦死区让启动更干脆。双极式变换器最大的优点是电流连续。不管占空比多小续流二极管总在关断期间维持电枢电流低速运行不会有电流断续引起的转速抖动这也是它能做到很宽调速范围的原因。缺点也有四个管子始终处于高频开关状态开关损耗比单极式大但在这个小功率玩具车平台上是完全可接受的。3.3 单片机生成PWM信号的实现用80C51生成PWM有两种做法一种是定时器中断翻转引脚另一种是外接专用PWM芯片。对课设级双电机控制定时器中断足够只是中断频率要规划好。PWM频率高则电流脉动小但中断负担重频率低则开关损耗小但电流脉动变大电机噪音明显。我一般会把PWM频率取在100Hz到1kHz之间下面代码用100us定时加100次计数合成10ms周期100Hz的PWM。// 定时器1中断生成PWMP1.1输出周期10ms占空比由speed变量控制 void timer1_isr(void) interrupt 3 { static unsigned char cnt 0; TH1 0xFF; // 65536-10065436即0xFF9C TL1 0x9C; // 12MHz晶振下定时100us cnt; if (cnt speed) // speed范围0到100即占空比数值 PWM_OUT 1; else PWM_OUT 0; if (cnt 100) cnt 0; // 100次计数构成一个PWM周期 } void motor_speed(unsigned char percent) { if (percent 100) percent 100; speed percent; // 修改占空比目标值中断里自动生效 }定时器1每100us进入一次中断cnt从0递增到99当cnt小于speed时输出高电平否则输出低电平cnt到100清零重来。speed是一个全局变量数值就是占空比百分比motor_speed函数只改这个变量PWM波形自动跟随不需要停掉定时器。初值计算依据12MHz晶振除以12分频得1MHz机器周期100us就是100个机器周期初值65536减100等于65436十六进制0xFF9C。如果把晶振换成11.0592MHz这个值要重新算。提示PWM频率不能无脑提高。三极管和续流二极管的开关损耗与频率成正比频率过高时管子发烫反而抵消PWM的效率优势。调试时先固定频率只看占空比确认车速符合预期后再去优化频率设置。3.4 占空比与变速策略原文提到进入减速区时由单片机控制进行PWM变频调速这里的变频实际含义是改变占空比序列不是改变PWM频率本身。快速行驶和慢速行驶对应两组占空比设定停车场合则用反接制动。反接制动的做法是让占空比瞬时跳到低于50%平均电压反向电机快速停转。// 速度模式控制 void speed_control(unsigned char mode) { switch (mode) { case MODE_FAST: motor_speed(80); break; // 快速巡航 case MODE_SLOW: motor_speed(40); break; // 减速区行驶 case MODE_BRAKE: motor_speed(5); break; // 反接制动停车 default: break; } }停车占空比设成5而不是0是因为完全断电后电机处于自由滑行状态停车位置很难控制。保留5%占空比让电枢平均电压微反向相当于给电机一个倒拖力停车更精准。这个值跟底盘重量、地面摩擦、电池电量都有关系需要现场实测。电池电压下降后同样占空比对应车速会变低所以里程和速度显示要基于码盘脉冲而不是占空比换算。4. 显示电路与软件架构数码管驱动、中断分配与看门狗4.1 两片4位八段数码管的双重显示策略显示部分用两片4位八段数码管gem4561ae。8位数码管按功能拆成两组小车停放时一片显示年月另一片显示时分行驶时一片显示时间另一片显示行驶距离。这样免去了切换按键也不会在行驶中因为切换显示内容而丢失数据。动态扫描是八段数码管的标配驱动方式段选线和位选线分开逐位轮流点亮靠人眼视觉暂留形成同时亮的效果。P0口做段选输出必须外接上拉电阻P2口部分引脚做位选。// 动态扫描显示P0输出段码P2低4位输出位选 void display_scan(void) { unsigned char i; unsigned char code seg_table[] { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, // 共阴段码0-7 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71 // 共阴段码8-F }; for (i 0; i 4; i) { P0 seg_table[disp_buf[i]]; // 取当前位段码 P2 (P2 0xF0) | (1 i); // 选中第i位数码管 delay_ms(1); // 点亮保持1ms } }段码表按共阴数码管排列0x3F对应数字0。P2低4位做位选高4位保留给其他功能所以写P2时先与0xF0保持高位不变。扫描周期是4ms刷新率250Hz肉眼看不到闪烁亮度也均匀。如果显示数据在行驶中变化更新disp_buf和扫描无冲突扫描只读缓冲区主循环只管写缓冲区。4.2 主程序运行框架主程序是初始化加主循环的经典结构。上电先完成时钟、定时器、外部中断和显示缓冲区初始化然后进入循环轮询传感器状态、更新速度输出和显示内容。没有操作系统任务通过中断和主循环两层配合。void main(void) { system_init(); // 时钟、I/O、定时器、中断初始化 while (1) { unsigned char s track_read(); // 读寻迹传感器状态 if (s 3) stop_and_log(); // 压到终点黑线停车并记录数据 if (ultrasonic_check()) handle_obstacle(); // 检测到障碍则避障 update_display_data(); // 更新显示缓冲区数据 delay_ms(10); // 主循环节拍10ms } }主循环是顺序查询所有输入、按优先级处理的骨架。寻迹优先级高于避障因为压到终点黑线表示到站必须立即停车超声波避障在中途行驶时生效。每轮循环固定延时10ms让轮询节拍稳定避免传感器读取频率忽快忽慢。中断部分负责码盘计数、PWM生成和显示扫描主循环不碰这三个硬件模块从结构上减少竞争。4.3 避障子程序与决策逻辑避障逻辑本身不复杂超声波检测正前方左右红外光电传感器判断障碍偏向障碍在哪侧就往另一侧转向。但超声波传感器的探测周期受声速限制40kHz脉冲在空气中往返0.5米约需1.5ms发送加等待至少要3ms所以避障判断不能追求太快要给超声波留完整的发送接收窗口。表避障决策矩阵超声波检测左侧红外右侧红外执行动作有障碍有障碍无障碍向右转有障碍无障碍有障碍向左转有障碍无障碍无障碍减速直行无障碍任意任意保持当前速度这个矩阵没有覆盖两侧都有障碍的情况实际遇到时我一般处理成原地掉头或倒车后退课设场景里很少出现。判断结果直接调用speed_control切换速度模式转向电机的动作由转向继电器或H桥的另一组输出控制。4.4 软件抗干扰与看门狗运行环境里的干扰主要来自电机换向火花和PWM开关噪声。电机是感性负载PWM切换瞬间产生很大的电流变化率通过电源线和地线窜入单片机复位电路轻则程序跑飞重则直接复位。硬件上在电机两端并联续流二极管和RC吸收网络软件上采用指令冗余、软件陷阱和看门狗三重手段。指令冗余是在关键跳转和返回指令前插入NOP软件陷阱在未用程序区填充跳转指令看门狗最后兜底。// 定时器2作看门狗正常运行时周期性喂狗 void watchdog_feed(void) { TL2 0x00; // 清零低字节 TH2 0x00; // 清零高字节防止溢出复位 } void timer2_isr(void) interrupt 5 { while (1); // 溢出复位前的死循环等硬件复位 }喂狗必须在主循环每个周期执行一次一旦主循环卡住定时器2超时溢出就触发复位。喂狗指令不能放在中断服务程序里否则主循环跑飞、中断还在执行时看门狗永远被喂饱就失去了监视作用。如果后续要扩展成串口升级架构这套硬件平台可以直接复用把RXD和TXD预留出来引导程序放低地址区、应用程序放高地址区串口接收固件后写入Flash即可不过课设阶段先把传感器和PWM两条主线调稳更实际。5. 调试与验证传感器标定、车速映射与故障定位5.1 传感器阈值标定红外寻迹传感器的灵敏度不是固定值。地面红外反射率跟纸张颜色、表面粗糙度、环境光强都有关系必须现场标定。标准步骤是小车停白纸上万用表测比较器输出调电位器到输出稳定高电平推到黑线上方确认输出翻转为低电平。两个位置反复切换几次找到同时满足条件的电位器位置后紧固。超声波部分用硬纸板放在20cm、50cm、1m处示波器看LM567输出确认都能稳定输出低电平脉冲。近处检测不到通常是发送过强导致接收饱和需要减小发送幅度远处检测不到则检查LM318放大倍数。5.2 PWM占空比与车速映射占空比和车速不是线性关系。电机端电压是占空比的线性函数但转速还受反电动势和负载影响。调试时用秒表计时让小车在10米直道上分别以固定占空比行驶记录平均速度形成一张对照表。拿到表之后程序里的速度控制就从写占空比变成写目标车速查表得到占空比逻辑清晰得多。表某样车实测占空比与车速对照占空比实测车速米每秒适用场景30%0.4慢速寻迹50%0.8巡航70%1.3快速行驶90%1.6追光5.3 里程计数与停车精度验证码盘计数误差主要来自遮光盘缺口宽度偏差和高速旋转时的中断丢脉冲。验证方法是让小车在已知长度直道上行驶对比累计里程与实际距离。10米直道如果计数在98到102个脉冲之间波动属于合理误差普遍偏少优先查中断服务程序执行时间把非必要指令删掉脉冲数时多时少不稳定检查遮光盘是否偏心、缺口每次都能完整通过凹槽。停车重复性用同一启动点和停车条件跑10次偏差在正负5厘米内可接受超出就要重新调反接制动占空比和制动延时这两个参数跟地面摩擦和电池电压关联很大。// 码盘脉冲数转里程显示 float pulses_to_meter(unsigned int pulses) { return (float)pulses * 0.1f; // 每个脉冲对应0.1米 }5.4 高频信号测量与常见故障排查调试中最容易同时出现的两个症状是数码管闪烁和电机转速不稳它们往往是同一个原因电源线上叠加了PWM开关噪声。排查顺序固定为先用示波器看单片机VCC引脚纹波再检查电机电源和逻辑电源是否共地最后确认续流二极管是否反接。测量PWM波形时探头地线就近接单片机GND不要接电机电源地否则地线回路上叠加的开关噪声会淹没真实波形。另一个高频坑是P0口上拉电阻取值过大数码管亮度不足过小P0口灌电流过大常见做法是4.7kΩ或10kΩ的八联排阻段电流由限流电阻单独决定。本文还有配套的精品资源点击获取
返回列表