找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17352|回复: 0
打印 上一主题 下一主题
收起左侧

单片机智能小车设计论文参考

[复制链接]
跳转到指定楼层
楼主
ID:210306 发表于 2017-6-12 05:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于单片机的智能小车设计
The Design of Smart Car based on SingleChip Microcomputer
                        院:电气工程学院
                  级:自动化1305
                        号:130302508  
                      名:王鹏超
                      师:杨颖镇 (副教授)
20176   


   
随着中国的高科技水平和工业自动化程度的不断进步,不断提高,工业自动化程不断加快,在各种自动化产品或者儿童玩具中都有智能小车的身影,这极大地改变了人们的生活。在科技日新月异的今天,特别是在智能制造2025的大背景下,智能化十年内将成为一种趋势。在大学所学的单片机及C语言基础之上,我利用了软件和硬件的基础知识,软件利用C语言编程、硬件利用电机驱动、避障,蓝牙,单片机的一类超声波避障循迹小车,根据STC89C52单片机设计的小车实用性强,功能齐全,技术先进,由电机驱动部分,单片机,超声波部分,舵机部分,蓝牙模块等组成。它能利用蓝牙模块通信控制小车向前行驶、向后行驶、向左行驶和向右行驶,也可以通过红外对管检测黑线,当左红外检测黑线,车上接收信号,处理信息。当检测到红外线管的右侧,汽车接收信号,处理信息,往右边偏转。也还利用红外对管和超声波检测检测障碍物,当检测到前方的障碍物,在路的左侧行驶,如果距离大于右侧的车的距离,在路的右侧,如果距离大于距离的路的左边,向左边行驶,如果距离小于对后驱动双方20cm,则后退。小车使用STC89C52单片机控制电动汽车的速度和方向,从而实现自动跟踪和避障功能。其中,汽车驱动由L293D驱动电路完成,速度由单片机控制。本系统采用52单片机STC89C52单片机编程来驱动汽车前进和后退,向左行驶、向右行驶、避障,电机的正反调速的电机驱动L293D输出端的逻辑电平控制。从设计过程的角度来看,充分准备是非常重要的,经过前期准备,和开发嵌入式系统学习,避免了很多后续设计的问题。总的来说,已经做了充分的准备。在实践过程中,通过查阅相关资料和咨询相关人员,克服了系统设计过程中的大部分困难,基本达到了设计要求。并通过了软件测试。
关键词: 智能小车;单片机;超声波避碍循迹
Abstract
With the rapid development of China's high-tech industry andthe development of intelligent vehicles, it has been widely used in the designof toys and other products, which has greatly enriched people's livesgreatly enrichedpeople's life. Now it is have a rapid development of science and technologyespecially inintelligent manufacturing time, It will be a trend in ten years. Based on theMCU and C language in the collegeuseSoftware and hardware combine, C languagesensor module, motor drivemodule, steering gear, ultrasonic module and a Bluetooth module. This paperbased on STC89C52 microcontroller design a ultrasonic avoid obstacles cartrackingIt has strongpracticabilitycompleteadvanced technology infraredsensor modulemotor drive module,steering gearultrasonic module anda Bluetooth module. In addition to mobile phone to control the car forward backwardleft and right but also the use ofinfrared to detect black line pipe when on the left side of theinfrared tube test to the black line, car to the left deflection on the right side ofthe infrared tube test to the black linecar to the right deflection.Also the infrared on the tube and the ultrasonic obstacle detection, thedetected obstacles in front when the car stopped steering gear to drive the ultrasonic left and right if left distances greater than theright distance car right, receive informationprocessing signalif the distance on the right greater than left distances on the leftturn, receive informationprocessing signal, if on both sides of the distance are less than20cm retreat. Using the STC89C52 MCU to control the electric car speed andsteering, so as to realize the automatic tracking and obstacle avoidancefunction. Which the car driven by the L293D driver circuit is completedthe speed by the single-chip microcomputercontrol.This design is completed based on Andrewsmobile phone intelligent car control system. The system uses 52 single-chipstc89C52 programming control motor forward and reverse to achieve the carforward backward turn left turn rightobstacle avoidanceand the motor forward and reverse speedfrom the motor drive L293D output logic level to control. From the whole designprocess to see the full preparation of the early is very importantafter the early preparation and the development of embedded systemslearningto avoid a lot offollow-up design may occur in the problem. Overallthe more fully preparedin the course of practice by consulting therelevant information and consulting the relevant personnel to overcome the system design process ofthe vast majority of difficultiesbasically to meet the design requirementsand passed the software test.
Keywords intelligent carMCUultrasonicobstacle avoidance tracking


   
    ... I
Abstract II
1 设计方案分析... 1
1.1 设计目的... 1
1.2 设计构思... 1
1.3 系统框图... 1
2 硬件设计... 3
2.1 电机驱动的选择... 3
2.1.1 方案一 L298N. 3
2.1.2 方案二 L9110S. 4
2.1.3 方案三 L293D. 5
2.2 单片机的选择... 8
2.3 电源的供电方式... 10
2.4 超声波避碍功能设计思路... 10
2.4.1 超声波模块选用及参数... 10
2.4.2 设计原理... 11
2.4.3 实物及接线图... 11
2.5 循迹功能设计思路... 12
2.5.1 四路循迹模块的原理及参数... 12
2.5.2 设计原理... 12
2.6蓝牙模块设计思路... 15
3 软件设计... 16
3.1蓝牙程序设计... 16
3.2 超声波避障程序设计... 19
3.3 循迹程序设计... 22
4 系统调试... 26
4.1 舵机电压过大,舵机无法运行... 26
4.2 无法循迹... 26
5 结论... 27
参考文献... 28
    ... 29
附录... 30
附录一 实物图... 30
附录二 原理图... 31
附录三 源程序... 32


1 设计方案分析
1.1 设计目的
本次设计要求基于52单片机做到可以利用蓝牙模块来控制小车的向前行驶、向后行驶、向左行驶、向右行驶、并且能够停止,实现自动规避障碍物的循迹等基本的功能。熟悉大学单片机定时器和计数器、循环语句、中断语句、跳转、宏定义以及中断等基础功能的使用,会使用基本的C语言编程,绘画基础的原理图、电气接线图,了解单片机引脚的作用,并且能够分清熟练应用。了解基础的电机驱动型号,并且会判断优劣,对其性能熟练掌握。会使用keil4 软件与程序下载。实现小车的智能切换。一号键通过手机方向键控制小车,二号键小车自动避障,三号键小车寻迹,跟踪黑线。
1.2 设计构思
通过搜索数据,进行方案论证和选择,确定系统的整体结构。本设计是基于STC89C52单片机,通过蓝牙控制小车的向前行驶、向后行驶、向左行驶弯、向右行驶弯、停止,通过手机按键切换实现超声波避障、跟踪及其他功能。单片机控制电机驱动,控制电机的正、负,旋转。以实现汽车前进、倒车、左行驶、右驾驶、停车。蓝牙接收模块与手机上的蓝牙相匹配,接收从移动终端发送的动作指令。接收到的指令,然后传递到微控制器,和微控制器跳转到不同的子程序来控制电机驱动器的分析,通过传递的指令,从而使汽车向前移动,向后行驶、向左行驶、向右行驶、停止等不同的动作。电源7.4v 供给电机驱动,电机驱动5v 稳压再给单片机。
1.3 系统框图
小车整体的系统结框图如图1-3所示。该系统采用STC89C52单片机为核心芯片,配合外围基础电路共同完成初始信号采集、外围路线检测、路面障碍检测、手机按键输入、单片机信号显示和小车舞台手势控制功能。道路是跟踪基本信息单片机中断查询信号的反射式红外发射接收脉冲调制的回报获得路面,避障是通过协作中断程序和查询程序完成,以及LED显示信息和汽车障碍运行状态。本次设计的系统采用高性能的52单片机,本系统要求信息处理速度稳定,实时性强,通用性强,稳定可靠,能对汽车进行跟踪和避障,并能达到极低的成本。





第 2 章 硬件设计
2.1 电机驱动的选择
2.1.1 方案一 L298N
采用L298N作为本次设计的电机驱动如图2-1所示。L298N由双电源从5V至46v的H桥电路控制。从板上取电,电压必须是5和7V之间。PWM转速控制也可以进行。L298N是双H桥电机驱动芯片中的每个H桥可以提供2A的电流,电源电压范围的2.5-48v,5V电源的逻辑部分,接受5vttl水平电平。正常情况下,电压的电源部分应大于6V,否则芯片可能无法正常工作。


图2-1  L298N实物图

评价:
优点:使用简单,可以板内取电,稳定性高,适合做毕业设计。
缺点:功率过大,耗电量大。

2.1.2 方案二 L9110S
采用 L9110S 作为本次设计的电机驱动,如图2-2。L9110S也是双H桥电路进行电机控制的,可实现电机正反转。供电范围3v到5v,无法板内取电。但是板子体积较小,容易安装。
9110S一二通道推挽式功率放大电路设计为控制和驱动电机。将分立电路集成到单片集成电路中,降低了外围器件的成本,提高了整个系统的可靠性。该芯片有两个TTL/CMOS兼容的输入级,具有良好的抗干扰性;两个输出端可直接驱动电机的正反向运动,它具有每通道的800ma直流大电流驱动能力,峰值电流能力可达1.5A的;同时它具有较低的输出饱和电压;反向冲击目前的内部钳位二极管可以释放感性负载,使它在驱动继电器、直流电机、步进电机或功率开关管使用安全可靠[1]。9110S广泛应用于玩具、汽车、电机驱动、脉冲电磁阀驱动器、步进电机驱动器和开关功率管等电路。










图2-2  L9110S实物图

评价:
优点:本实用新型体积小,安装方便,电源电压小,功耗小,适合做毕业设计。静态工作电流低,电压范围宽,带负载能力强,外围电路少及价格较便宜。
缺点:无法板内取电,不能PWM调速控制。
2.1.3 方案三 L293D
采用L293D作为本次设计的电机驱动,如图2-3。L293D也是双H桥电路进行电机控制的,可实现电机正反转与及PWM调速控制,其中板内有5v稳压芯片,有三路5v输出。可以给单片机提供5v电压。功耗也比较小。
L293比L293D高四倍,目前是H桥驱动。L293提供从4.5V至36V到1个双向驱动电流和电压;L293D提供双向驱动电流高达600毫安的电流和电压从4.5V至36V的两装置设计用于驱动感性负载如继电器、电磁阀、直流双极步进电机,可还提供电源负载其他高电流/电压高,兼容所有TTL输入。每个输出是推挽驱动电路,与达林顿三极管和伪达林源。启用1、2EN驱动器和3、4EN驱动器。当使能输入高,相关驱动器启用,其输出处于活动状态,并在同一阶段作为他们的输入。当使能输入低,这些驱动器被禁用,他们的产出是在一个高阻抗状态关闭。PS:1,2en1和2使能端(高电平使能);3,4en同样,用适当的数据输入,每对在全H桥可逆驱动形式驱动,适用于电磁阀或电机上的应用[2]。L293,一种高速卡外部输出钳位,应该用于电感瞬态抑制。VCC1和VCC2分离提供逻辑输入减少器件的功耗。对L293和L293D工作温度从0℃到70℃。
电源电压VCC1(见注1),36 V;
输出电源电压VCC2,36V;
输入电压VI,V7 ;
输出电压范围VO,3 V至+3 V;
峰值输出电流,IO(非重复性的,T≤5毫秒)L293:±2 A;
峰值输出电流,IO(非重复性的,T≤100毫秒)L293D:±1.2;
连续输出电流,IO:L293±1;
连续输出电流,IO:L293D±600毫安;
连续总功耗(或低于)25°C自由空气的温度(见注2和3)2075毫瓦;
连续总功耗在80°C外壳温度(见注3)5000毫瓦;
最高结温TJ 150°C;
焊接温度1.6 mm(1/16英寸)的情况下,10秒260°C;
存储温度范围,TSTG-65°C至150°C;
当超过“绝对最大额定值”时,可能会造成设备永久性损坏。这些压力额定值只,该设备的功能操作在这些或任何其他条件超出“推荐工作条件下表示”不暗示。曝光绝对最大额定条件下长时间可能会影响器件的可靠性。原理图如图2-4。
注:
(1)所有电压值与网络的接地端子。
(2)对于上述25°C自由空气的温度,减免率16.6毫瓦/°C线性。
(3)对于上述25°C外壳温度,减免率71.4毫瓦/°C线性的变化,可在个别的移动设备的电气特性和热电阻,内置的热过载保护被激活功率水平略高于或低于额定耗散。


图2-3  L293D实物图

评价:
优点:本实用新型具有稳定性高、功耗低、可向单片机提供5V电压的优点。还可以实现正、负电机和PWM调速功能。所以符合本设计的所有要求。
综上所述:我采用 L293D 做本次设计的电机驱动。其稳定性高,功耗小,可以给单片机提供 5v 电压。也可以实现电机正反转及 PWM 调速的功能。所以符合本次设计的所有要求。


图2-4  L293D原理图输入输出
2.2 单片机的选择
单片机芯片选型时,总的原则是[3]:
(1)该芯片所包含的功能或数量略大于设计要求,设计要求尽可能采用芯片,采用外围器件。
(2)技术:从单片机技术指标的角度,选择芯片,保证单片机应用系统在一定技术指标下的可靠运行;
(3)实用性:从单片机供应渠道和信誉程序的角度出发,选择单片机制造商,保证单片机系统在长期可靠运行中的应用;
(4)开发:单片机的选型必须有可靠的开发工具,如程序开发工具、仿真调试方法。单片机是用来控制电机驱动,52结构ATMELat89cXX系列,at89sxx系列,at89c20系列(20针)或STC的单片机可以实现。按照目前比较流行的学习在学校,stc89xx系列单片机STC89C52单片机,和便宜,购买方便,所以选用STC89C52单片机微控制器[4]。单片机有很多种,按照功能可以划分为以下几种类型。
1)基本型。基本型为8XX51,如8051,8751,89c51等。8位CPU和指令系统的基本特性,适用于控制、128字节的内部RAM、21个特殊功能寄存器,32线并行I/O口、2个16位定时器计数器、一个全双工串行通信口,5个中断源,4kb芯片ROM芯片的时钟振荡器等。
2)增强型。8032,8052,8072等等。此类单片机的容量比基本型的大1到数倍,同时计数器数量增加到3个,同时增加了看门狗抗干扰及电源监控器。
3)低功耗型。这类型号带有“C”字型的单片机采用CHMOS工艺,这类的特点就是功耗低。另外,52也有两组程序内存安全系统,防止未经授权的复制程序。
STC89C52RC单片机是一种低功耗,高性能CMOS8位微控制器,采用STC公司生产的。它具有8K字节的系统内可编程闪存。STC89C52采用经典的MCS-51内核,但已经取得了很大的进步,与传统的51单片机制作的芯片不具备的功能。一个8位的CPU和系统可编程Flash单片机STC89C52提供了一个高度灵活和高效的解决方案为许多嵌入式控制应用[5]。
52单片机具有多个定时器,RAM51是128,52是256位。最后的数字代表E2PROM的大小,最后数×4K,E2PROM。C51 4K C52 8K,。此外,RAM是不同的,超过51个2定时器,串行通信可以设置更高的波特率,定时器2的功能与其他两个定时器是不一样的。52是51的增强型,S52比C51定时器T2超过一个以上的RAM,ROM,128B、更多4K,中断超过2个,超过一个看门狗,在掉电,数据指针等,有一些改进。S52的最高外部晶体振荡器可达33MHz,C51,大概只有24mhz。
52具有以下标准功能[6]:8k字节Flash,512字节RAM,32个I/O线,看门狗定时器,内置4KB的EEPROM MAX810复位电路,定时器/计数器的外部中断,一个向量级中断结构(与传统51向量中断结构全双工串行端口兼容)。此外,STC89C52可降至0Hz静态逻辑操作,支持2种软件,你可以选择省电模式。在空闲模式下,CPU停止工作,并允许RAM,定时器/计数器,串行端口,中断继续工作。在掉电保护模式下,RAM的内容被保存,振荡器被冻结,微控制器停止所有的工作,直到下一个中断或硬件复位[7]。最大工作频率35MHz,6t/12t可选。
实物如图2-5。


图2-5  单片机实物图
2.3 电源的供电方式
18650个7.4v系列电池电压供应L293D电机驱动,内置的5V稳压器芯片的电机驱5V输出,分别到转向齿轮,四路跟踪模块,单片机。单片机具有5V输出,然后超声波模块和蓝牙模块电源(如图2-7所示)。


图2-7 供电方式图

2.4 超声波避碍功能设计思路
2.4.1 超声波模块选用及参数
我选择超声波HC-SR04超声波模型。HC-SR04超声波测距模块可以提供2cm-400cm非接触距离传感功能,测距精度可达3mm;模块包括超声波的发射、接收和控制电路。其工作原理是;
(1)IO端口触发用于触发测距,至少10us高电平信号是给定的;
(2)模块自动发送8个40KHz的Fang Bo,自动检测是否有信号返回;
(3)有一个信号返回,通过IO口回波输出一个高电平,超声波的持续时间由发射到返回时间。
2.4.2 设计原理
在小车中超声波模块不是单独工作的,还需要舵机来跟他一起完成这项任务。
因为超声波检测的只是前方的障碍物,很难检测到两边的障碍物。这样就减少了汽车的左右两侧的碰撞。工作原理:舵机向左和右转向齿轮驱动超声波检测的左距离和右距离,然后比较左侧大于右向左运行,右边大于左边就向右行驶。左边等于右边就退后在再向左行驶。超声波原理图如下。


图2-8  超声波原理图

2.4.3 实物及接线图
如图2.4.3接线,VCC供5V电源,GND为地线,TRIG触发控制信号输(单片机p24),ECHO(接单片机p25)回响信号输出等四支线。实物如图2-9。



图2-9 接线图及实物图

2.5 循迹功能设计思路
2.5.1 四路循迹模块的原理及参数
光环境的适应性的传感器模块,它有一对红外发射和接收管、发射管发射的一个红外检测频率,当障碍物的方向(反射),反射红外接收管、比较器电路处理后,输出的数字信号(信号输出接口的低电平信号),可通过电位器旋钮调节探测距离,2 ~ 60cm有效距离范围内,工作电压为3.3v-5v。传感器的探测范围可以电位器调节,具有干扰小、安装方便、使用方便,可广泛应用于机器人避障、避障、车线数和黑白线跟踪和许多其他场合[8]。参数如下:
(1)当模块检测到前面的障碍信号时,电路板上的红色指示灯被点亮,输出口连续输出低电平信号。
(2)传感器是红外反射探测,所以目标的反射率和形状是探测距离的关键。其中,黑色探测距离最小,白色最大,小面积物体小,距离大。
(3)传感器模块输出端口可直接与单片机IO口可以连接,可以直接驱动一个5V继电器模块或蜂鸣器模块;连接:vcc-vcc;gnd-gnd;out-io 4,比较器LM339运行稳定;
(4)3.3v-5v直流电源可用于电源模块。接通电源后,绿色电源指示灯亮。
2.5.2 设计原理
跟踪模块有四个红外探测模块。他们都用红外发射接收管等分立元件探头,因为使用接近传感器的红外反射式传感器,反射光的光电二极管电流与不断变化的强度,从而导致电压连续变化[9]。因此,如果电平信号直接提供给微控制器,它很容易被误读,因此使用LM358比较器LM339或(添加滞后电路)防止关键输出抖动作为中央控制电路的核心部件。当路由为黑色时,接收到的信号返回到微控制器。当信号为白色或接地时,由单片机相应端口接收的信号为0。用于产生基准电平的电位器,当光电二极管的光电流超过一定值时,正输入电平高于运算放大器的参考电平,然后输出电平跳变,信号可以进行单片机处理[10]。通过调整参考电平,传感器的灵敏度和探测距离也可以被调整,以改变所接收的信号的强度和检测的灵敏度。双向探头共同工作,根据两路探头的方向确定不同的返回值方向,通过单片机两直流电机的运行状态,调整小车的姿态,用导丝完成跟踪任务的完成。主控板电路图如图2-10所示,小板原理图如图2-12。
四路寻迹模块使用说明如下:
这个模块提供了一个通用的红外探测系统,智能机,如智能车和机器人。光环境的适应性的传感器模块,它有一对红外发射和接收管、发射管发射的一个红外检测频率,当障碍物的方向(反射),反射红外接收管、比较器电路处理后,输出的数字信号(信号输出接口的低电平信号),可通过电位器旋钮调节探测距离,2 ~ 60cm有效距离范围内,工作电压为3.3v-5v。传感器的探测范围可以电位器调节,具有干扰小、安装方便、使用方便,可广泛应用于机器人避障、避障、车线数和黑白线跟踪和许多其他场合[11]。1当模块检测到前面的障碍信号时,电路板上的红色指示灯被点亮,并输出低电平信号检测模块、2~60cm的检测距离,角度为35度,检测距离可通过电位器顺时针旋转,调整电位器,检测距离增大;逆时针旋转电位器,降低检测距离。传感器是红外反射探测,所以目标的反射率和形状是探测距离的关键[12]。其中,黑色探测距离最小,白色最大,小面积物体小,距离大。传感器模块输出端口可直接与单片机IO口可以连接,可以直接驱动一个5V继电器模块或蜂鸣器模块;连接:vcc-vcc;gnd-gnd;out-io 4,比较器LM339运行稳定;3.3v-5v直流电源可用于电源模块。当电源接通时,绿色电源指示灯亮起;6.3毫米的螺孔,便于固定、安装;尺寸大小:中控板42mm×38mm×12mm(长×宽×高),小板25mm×12mm×12mm(长×宽×高)[13]。在交货的各个模块已经比较的电位器调节阈值电压,买家也可以根据实际情况进行调整(提示:模块反射距离,更容易引发)按照探头的要求和控制面板连接,删除所有对象的前面探针和探针指向太阳(光有探头影响很大),每路调整电位器,直到灯刚熄灭,然后用白盾探头,会发现LED灯,所以如果测试成功,那么我们可以在单片机控制板级测试通过输出信号。


图2-10 主控板电路图


图2-11 小板原理图
2.6蓝牙模块设计思路
在小车中蓝牙模块做的是中间设备,作用是把手机app发来的信号传给单片机,让单片机进行相应的动作。蓝牙模块有vcc、gnd、txd和rxd等几个引脚,但是我们用到的只有vcc、gnd和txd。因为我的小车只要接收手机给蓝牙的信号,不要发送给手机,所以我们只要用到txd这个引脚。其中单片机的rxd是p30,txd是p31。

3章 软件设计
3.1蓝牙程序设计
在本次设计中,蓝牙程序主要是在单片机的控制下,对蓝牙模块的输入信息进行存储分析,以控制电机的驱动,以控制小车前进,向后行驶、向左行驶、向右行驶。在这个过程中,单片机首先进行初始化,包括单片机各端口的设置方向,各变量的初始化,以及单片机的振荡频率的标定[14]。单片机定时读取串口上蓝牙模块的数据,如果数据读出串口,则读取数据分析,蓝牙程序流程图如图3-1所示。
void main(void)
{
TMOD=0x11;
TH1=(65536-100)/256; //100US
定时
TL1=(65536-100)%256;
TH0=0;
TL0=0;
T2CON=0x34;
T2MOD=0x00;
RCAP2H=0x FF;
RCAP2L=0x DC;
SCON=0x50;
PCON=0x00;
PS=1;
TR1=1;
ET1=1;
ES=1;
EA=1;
push_val_duoji=10; //舵机归中
while(1) /*无限循环*/
if(flag_REC==1)
{
flag_REC=0;
if(buff[0]=='O'&&buff[1]=='N') //第一个字节为O,第二个字节为 N,第三个字节为控制码
switch(buff[2])
{
case up : // 向前行驶
send_str( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
run();
break;
case down: // 向后行驶
send_str1( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
backrun();
break;
case left: // 向左行驶
send_str2( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
leftrun();
break;
case right: // 向右行驶


图3-1 蓝牙程序流程图
3.2 超声波避障程序设计
当按下2号键后,启动超声波避碍功能,小车向前行驶,一边检测中间、左边和右边有无障碍物,当超声波距离30cm,左、右红外有障碍,车停,舵机向右行驶90度,再向左行驶90度,检查左边的距离和右边的距离。如果双方之间的距离小于20cm,汽车将搬回。如果左边的距离大于右边,车就向右边行驶。否则汽车将向左行驶。流程图如图3.1所示。部分程序如下:
void Start Module() //启动测距信号
{
TRIG=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG=0;
}
/***************************************************/
void Conut(void) //计算距离
{
time=TH0*256+TL0; //读取脉宽长度
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是 CM
void juli(void)
{
Start Module();
while(!ECHO); //当 RX 为零时等待
TR0=1; //开启计数
while(ECHO); //当 RX 为 1 计数并等待
TR0=0; //关闭计数
Conut();
}
这部分程序是启动测距,计算两边距离。
void COMM( void ) //小车方向函数
{
push_val_duoji=4; //舵机向向左行驶90 度
timer=0;
while(timer<=2500); //延时250MS 让舵机转到其位置
juli(); //计算距离
Delay Ms(20);
S2=S;
push_val_duoji=20; //舵机向右行驶90 度
timer=0;
while(timer<=2500); /延时250MS 让舵机转到其位置
juli(); //计算距离
Delay Ms(20);
S4=S;
push_val_duoji=10; //舵机归中
timer=0;
while(timer<=2500); //延时250MS 让舵机转到其位置
if((S2<25)||(S4<25)) //只要左右各有距离小于25CM小车向后行驶
{
bjbackrun(); //向后行驶
timer=0;
while(timer<=4000);
}
if(S2>S4)
{
bjleftrun(); //车的左边比车的右边距离小向右行驶
timer=0;
while(timer<=2000);
}
else
{
bjrightrun(); //车的左边比车的右边距离大向左行驶
timer=0;
while(timer<=2000);
}
}
这段程序即是当测试出距离之后,小车选择前进或者行进的方向。






图3-2 超声波程序流程图
3.3 循迹程序设计
当按下3号键后,小车启动循迹功能,小车流程图如图3.2所示。小车向前行驶的同时,检测左边和右边是否有黑线,当左边有黑线时向左行驶,当右边有黑线时向右行驶。两路红外都没有感应到地板时,小车停止。小车在循迹过程中的速度必须减慢,否则速度太快,小车会冲出黑线[15]。就无法完成循迹任务了。所以说,在循迹时,小车的速度必须要用PWM要控制。
while(flag_bj) /*无限循环
*/
{
if(timer>=1000) //100MS 检测启动检测一次
{
timer=0;
juli(); //计算距离
Delay Ms(20);
if((S<30)||Right_led1==0||Left_led1==0) //超声波小于30CM 、红外 1、红外 2 其中一个有遇到障碍物都停车进行超声波测距(红外 1,2 是超声波两边的)
{
stoprun(); //小车停止
COMM(); //方向函数
}
else
if((S>30)&&Right_led1==1&&Left_led1==1) //超声波大于30CM 红外 1 和红外2 都没有遇到障碍就向前行驶。
bjrun();
}
if(flag_REC==1)
{
push_val_duoji=10; //舵机归中
stoprun();
break;
}
}
while(flag_xj) /*无限循环*/
{
if(Left_led==0&&Right_led==0) //有信号为0 没有信号为 1
{
xjrun();
}
else
{
if(Right_led==1&&Left_led==0) //左边检测到黑线向左行驶
{
xjleftrun();
}
if(Left_led==1&&Right_led==0) //右边检测到黑线向右行驶
{
xjrightrun();
}
if(Left_led==1&&Right_led==1) //两边检测到黑线停止
{
stoprun();


图5-3 自动寻迹模块流程图

第4章 系统调试
4.1 舵机电压过大,舵机无法运行
在初步设计中避免超声波车的障碍,自己写的程序烧进去,但是超声波舵机禁用函数无法运行。后来,我写了一个程序,只适用于超声波单独作用,其结果是,超声波可以工作。但我使用材料时,发现舵机的电源是从4.8V至6V。我经过咨询别人,他告诉我,转向齿轮和超声波一起使用转向电源3.3V。最后,我买了一个5V至3.3V模块,将电机驱动5V到3.3V的功率转向齿轮,成功解决了问题。
4.2 无法循迹
当按下3按钮时,汽车跟踪功能打开。在第一次测试中,汽车不能沿黑线行驶。正常来说,两个红外线传感器安装在汽车底部的左右两侧,当黑色线在左边相遇时,汽车向左行驶;当右侧遇到黑线时,汽车向右移动。但第一次,方向正好相反。修改后的程序来解决这个问题,但它仍然没有跟踪。汽车遇到黑线车轻微转弯,直接走出黑线。后来,经过观察,才发现车速太快了。小车的速度是1到10档,程序可以改变跟踪的速度。经过调节小车速度,完成了循迹功能。

5章 结论
本毕业设计是基于AT89C52单片机的智能小车控制,包括程序选型、硬件设计、软件设计、软件测试结果以及调试电路中遇到的问题。在此期间,完成的主要工作包括以下几个方面。
(1)在设计前期收集电机驱动、单片机等相关数据,实现智能小车的工作原理。
(2)确定系统图,电源模块,单片机最小系统模块,超声波模块、蓝
比较了轮齿电路模块和电机及其驱动电路模块的实现方案,确定了最终智能小车控制的设计方案。
(3)根据智能小车控制原理图,给出了电路接线图。
(4)根据系统要实现向前行驶、向后行驶、向左行驶、向右行驶、避障、循迹功能编写出小车端的软件程序。
(5)经过硬件和软件的调试,对整个系统进行了调试,并对系统的缺陷进行了查找完善。
(6)最终小车能够实现向前行驶、向后行驶、左右行驶、避障、循迹等功能,实现了老师给出的基本要求。本设计完成了基于Android手机的智能小车控制系统。本系统采用52单片机STC89C52单片机编程来驱动汽车前进和后退运动的阳性和阴性对照,向左行驶、向右行驶、避障,电机的正反调速的电机驱动L293D输出端的逻辑电平控制。从设计过程的角度充分准备是非常重要的,经过前期准备,并开发嵌入式系统学习,避免了很多后续设计的问题。总的来说,我们已经做了充分的准备。在实践过程中,通过查阅相关资料和咨询相关人员,克服了系统设计过程中的大部分困难,基本达到了设计要求。并通过了软件测试。
参考文献
[1]     郭惠,吴迅.单片机 C 语言程序设计完全自学手册[M].电子工业出版社,2008.
[2]     王东锋,王会良,董冠强. 单片机 C 语言应用 100 例[M].电子工业出版社,2009-03.
[3]     王晓明. 电动机的单片机控制[J]. 学术期刊,2002,13-15.
[4]     王淑芳,电机驱动技术[M].科学出版社,2008.
[5]      Graham J. Lee ,ProfessionalCocoa Application Security,2010:117-119
[6]     李学军. 如何用MCS-52单片机扩展串口进行通讯[J]. 宁夏机械,2003,24-43.
[7]     韩毅,杨天. 基于HCS12单片机的智能寻迹模型车的设计与实现[J].学术期刊,2008,29(18):1535-1955.
[8]      B.Chopard,P.O.Luthi andP.-A.Queloz-«Cellular automata model of car traffic in a two-dimensional streetnetwork»in Journal of Physics A:Mathematical and General,29(10): 2325-2336,1996.
[9]     蔡自兴,徐光佑.人工智能及应用(第二版)[M],清华大学出版社,1996
[10]  A.Cheng and K.Rajan-«A digital map/GPS based routing andaddressing scheme for wireless ad hoc networks»In Proc.of IEEE IntelligentVehicle Symposium (IV‘03),2003.
[11]张凯,钱锋,刘漫丹.模糊神经网络技术综述.信息与控制[J],2003,32(5):431-435
[12]刘瑞正,赵海兰.人工神经网络研究五十年.计算机应用研究[J],1997(1):11-13
[13]  ChenZ F,Shi H Y,An Y J. Globally convergent approach based on chaotic theory for underwaterrobot motor optimization [A].InternationalConference on Robotics, Intelligent Systems andSignal Processing [C]. Chansha, 2003. 996-1001.
[14]  C.Bonnet-CHAUFFEUR 2 Final Report,Deliverable D24,Version 1.0,Contract numberIST-1999-10048,July 10,2003.
[15] 陈伯时著.电力拖动自动控制系统[M].第四版.北京:机械工业出版社,2009
[16]  Chen Z F, Shi H Y, An Y J.Globally convergent approach based on chaotic theory for underwater robot motoroptimization [A].International Conference on Robotics, Intelligent Systems andSignal Processing [C]. Chansha, 2003. 996-1001
致    谢
毕业设计完成了,在这个过程中学到了很多东西。首先要感谢我的导师,他在我完成论文的过程中,给予了我很大的帮助。在论文开始的初期,我对于论文的结构以及文献选取等方面都有很多问题,是在老师的帮助下进行修改和完善的。本毕业设计是在指导老师悉心的关怀与指导下完成,在此对老师献上最衷心地感谢。老师从毕业设计一开始就对我们严格要求,每周的周三都会和我们开见面会,询问我们的毕设进度并了解我们遇到的困难,积极协助我们解决设计过程中的各种难题,并要求我们每天记录在毕业设计中所作的工作进度及遇到的问题,让我们去发现问题,解决问题。在我遇到难已解决的问题心中急躁时,老师总是及时的给予鼓励,使我能够有勇敢的克服困难,把毕业设计继续进行下去。老师对学生的高度关注和对工作高度负责的精神值得我们尊敬,也是我今后走向工作岗位的榜样。通过本次毕业设计,我不仅是对我们所学知识的一个汇总,同时也是考验我们学习能力和动手能力的一个平台;让我们能学到更多的相关知识,更重要的是学到了面对困难的不放弃、不气馁的态度,不骄不躁的办事风格,奋发向上的精神,这些在我今后的生活和学习中都是一笔宝贵的财富。最后,我要再次感谢在毕业设计过程中对我提供过制作电路板等工具的同学和老师,以及在毕业设计中对我进行过指导的所有老师和同学。











附录
附录一  实物图

























附录二  原理图

附录三 源程序
#include<AT89x52.H>
#include<intrins.h>
#define uchar unsignedchar
#define uint unsignedint
#define Left_moto_go  {P1_0=1,P0_0=1;P0_1=0;}  //左电机正转
#define Left_moto_back  {P1_0=1,P0_0=0;P0_1=1;} //左电机反转
#define Lef_moto_Stop  {P1_0=0;}              //左电机停转
#define Right_moto_go  {P1_1=1,P0_2=1;P0_3=0;} //右电机正转
#define Right_moto_back  {P1_1=1,P0_2=0;P0_3=1;} //右电机反转
#define Righ_moto_Stop  {P1_1=0;}              //右电机停转
/***************************************************************/
#define ECHO  P2_4                        //超声波接口定义
#define TRIG  P2_5                         //超声波接口定义
#define Sevro_moto_PWM  P1_6 //接舵机信号端输入PWM 信号调节速度 接P2_7
#define Left_moto_PWM  P1_0           //PWM 信号端左电机使能端借 P1_0
#define right_moto_PWM  P1_1           //PWM 信号端右电机使能端借 P1_1
#define Left_led  P2_2                 //P3_4 接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3
#define Right_led P2_3                //P3_5 接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4
#define Left_led1 P1_2                 //P1_2 接四路寻迹模块接口第二路输出信号即中控板上面标记为 OUT2(超声波左边的红外)
#define Right_led1 P1_3              //P1_3 接四路寻迹模块接口第一路输出信号即中控板上面标记为 OUT1 (超声波右边的红外)
unsigned char PWM_val_duoji= 0;      //变量定义
unsigned charpush_val_duoji =10     ;//舵机归中,产生约,1.5MS 信号
unsigned char PWM_val_left=0;      //变量定义
unsigned charpush_val_left =0;       // 左电机占空比N/10
unsigned char PWM_val_right=0;    //变量定义
unsigned charpush_val_right =0;     // 左电机占空比N/10

bit Left_moto_stop =1;
bit right_moto_stop =1;

#define left 'D'
#define right 'C'
#define up 'A'
#define down 'B'
#define stop 'F'

#define Car '1' //手机软件 1 号键
#define Car1 '2' //手机软件 2 号键
#define Car2 '3' //手机软件 3 号键

char code str[] = "收到指令,向前!\n";
char code str1[] ="收到指令,向后!\n";
char code str2[] ="收到指令,向左!\n";
char code str3[] ="收到指令,向右!\n";
char code str4[] ="收到指令,停止!\n";

unsigned int time=0; //时间变量
unsigned int timer=0; //延时基准变量
unsigned int timer1=0; //延时基准变量
unsigned long S=0; //计算出超声波距离值
unsigned long S1=0;
unsigned long S2=0;
unsigned long S3=0;
unsigned long S4=0;

bit flag_REC=0;      //串行接收标去位
bit flag =0;
bit flag_mss =0;
bit flag_bj =0;
bit flag_xj =0;
bit flag_hw =0;
unsigned char i=0;
unsigned char dat=0;
unsigned char buff[5]=0; /接收缓冲字节

/***************************************************************/
//延时函数
void Delay Us2x(uchar t)
{
while(--t);
}
void Delay Ms(uchar t)
{
while(t--)
{
Delay Us2x(245); //大致延时 1m S
Delay Us2x(245);
}
}
/***************************************************************/
//
前速向前行驶 可以调节各功能速度占空比调节小车的速度
void run(void)
{
push_val_left=6; //手机遥控向前行驶速度的占空比是5 0 到 10 10 最大
push_val_right=6;
Left_moto_go ; /左电机往前走
Right_moto_go ; //右电机往前走
}
void bjrun(void)
{
push_val_left=4; //舵机避碍和魔术手速度的占空比是5 0 到 10 10 最大
push_val_right=4;
Left_moto_go ; //左电机往前走
Right_moto_go ; //右电机往前走
}
void xjrun(void) //循迹速度的占空比是 1 0 到 10 10 最大
{
push_val_left=1;
push_val_right=1;
Left_moto_go ; //左电机往前走
Right_moto_go ; //右电机往前走
}
//前速向后行驶
void backrun(void)
{
push_val_left=6;
push_val_right=6;
Left_moto_back ; //左电机往后走
Right_moto_back ; //右电机往后走
}
void bjbackrun(void)
{
push_val_left=4;
push_val_right=4;
Left_moto_back ; //左电机往后走
Right_moto_back ; //右电机往后走
}
//向左行驶
void leftrun(void)
{
push_val_left=5;
push_val_right=3;
Left_moto_go ; //左电机往前走
//STOP
void stoprun(void)
{
push_val_left=0;
push_val_right=0;
Lef_moto_Stop ; // 停止
Righ_moto_Stop ; //停止
}
/**************************************************************/
void Start Module() //启动测距信号
{
TRIG=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG=0;
}
/***************************************************/
void Conut(void) //计算距离
{
time=TH0*256+TL0; //读取脉宽长度
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是 CM
void juli(void)
{
Start Module();
while(!ECHO); //当 RX 为零时等待
TR0=1; //开启计数
while(ECHO); //当 RX 为 1 计数并等待
TR0=0; //关闭计数
Conut();
}
/***************************************************************/
/* PWM 调制舵机信号 */
/***************************************************************/
/* 舵机调速 */
/*调节 push_val_duoji 的值改变电机转速,占空比 */
void PWM_Servomoto(void)
{
if(PWM_val_duoji<=push_val_duoji)
Sevro_moto_PWM=1;
else
Sevro_moto_PWM=0;
if(PWM_val_duoji>=100)
PWM_val_duoji=0;
}
/**************************************************************/
/* PWM 调制电机转速 */
/***************************************************************/
/* 左电机调速 */
/*调节 push_val_left 的值改变电机转速,占空比 */
void PWM_out_left_moto(void)
{
if(Left_moto_stop)
{
if(PWM_val_left<=push_val_left)
{
Left_moto_PWM=1;
}
else
{
Left_moto_pwm=0;
}
f(pwm_val_left>=10)
pwm_val_left=0;
}
else   
{
Left_moto_pwm=0;
       }
}

/********************************************************/
/*  PWM调制电机转速                                   */
/*******************************************************/
/*     右电机调速                                   */
/*调节push_val_right的值改变电机转速,占空比            */
      void pwm_out_right_moto(void)
{  if(right_moto_stop)
  {
if(pwm_val_right<=push_val_right)
{
right_moto_pwm=1;
}
else
  {
right_moto_pwm=0;
}
if(pwm_val_right>=10)
pwm_val_right=0;

else   
   {
right_moto_pwm=0;
}


{
unsigned char i = 0;
while(str != '\0')
{
SBUF = str
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void send_str1( )// 传送字串
{
unsigned char i = 0;
while(str1 != '\0')
{
SBUF = str1
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void send_str2( )// 传送字串
{
unsigned char i = 0;
while(str2 != '\0')
{
SBUF = str2
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void send_str3()
// 传送字串
{
unsigned char i = 0;
while(str3 != '\0')
{
SBUF = str3
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void send_str4()
// 传送字串
{
unsigned char i = 0;
while(str4 != '\0')
{
SBUF = str4
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void COMM( void ) //小车方向函数
{
push_val_duoji=4; //舵机向向左行驶90 度
timer=0;
while(timer<=2500); //延时2500MS 让舵机转到其位置
juli(); //计算距离
Delay Ms(20);
S2=S;
push_val_duoji=20; //舵机向向右行驶90 度
timer=0;
while(timer<=4500); /延时400MS 让舵机转到其位置
juli(); //计算距离
Delay Ms(20);
S4=S;
push_val_duoji=10; //舵机归中
timer=0;
while(timer<=2500); //延时250MS 让舵机转到其位置
if((S2<25)||(S4<25)) //只要左右各有距离小于,25CM小车向后行驶
{
bjbackrun(); //向后行驶
timer=0;
while(timer<=4000);
}
if(S2>S4)
{
bjleftrun(); //车的左边比车的右边距离小向右行驶
timer=0;
while(timer<=2000);
}
else
{
bjrightrun(); //车的左边比车的右边距离大向左行驶
timer=0;
while(timer<=2000);
}
}
/***************************************************/
///*TIMER1 中断服务子函数产生 PWM 信号*/
void time1()interrupt 3 using 2
{
TH1=(65536-100)/256; //100US
定时
TL1=(65536-100)%256;
timer++;
PWM_val_duoji++;
PWM_val_left++;
PWM_val_right++;
PWM_Servomoto();
PWM_out_left_moto();
PWM_out_right_moto();
}
/***************************************************************/
void sint() interrupt 4 //中断接收 3 个字节
{
if(RI) //是否接收中断
{
RI=0;
dat=SBUF;
}
else
{
Left_moto_PWM=0;
}
if(PWM_val_left>=10)
PWM_val_left=0;
}
else
{
Left_moto_PWM=0;
}
}
/********************************************************/
/* PWM 调制电机转速 */
/********************************************************/
/* 右电机调速 */
/*调节 push_val_right 的值改变电机转速,占空比 */
void PWM_out_right_moto(void)
{
if(right_moto_stop)
{
if(PWM_val_right<=push_val_right)
{
right_moto_PWM=1;
}
else
{
right_moto_PWM=0;
}
if(PWM_val_right>=10)
PWM_val_right=0;
}
else
{
right_moto_PWM=0;
}
}
/***************************************************************/
//字符串发送函数void send_str( )//
传送字串
if(flag_REC==1)
{
push_val_duoji=10; //舵机归中
stoprun();
break;
}
}
while(flag_xj) /*无限循环*/
{
if(Left_led==0&&Right_led==0) //有信号为0 没有信号为 1
{
xjrun();
}
else
{
if(Right_led==1&&Left_led==0) //左边检测到黑线向左行驶
{
xjleftrun();
}
if(Left_led==1&&Right_led==0) //右边检测到黑线向右行驶
{
xjrightrun();
}
if(Left_led==1&&Right_led==1) //两边检测到黑线停止
{
stoprun();
}
}
if(flag_REC==1)
{
push_val_duoji=10; //舵机归中
stoprun();
break;
}
}
if(flag_REC==1)
{
flag_REC=0;
if(buff[0]=='O'&&buff[1]=='N') //第一个字节为O,第二个字节为 N,第三个字节为控制码
switch(buff[2])
{
case up : // 向前行驶
send_str( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
run();
break;
case down: // 向后行驶
send_str1( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
backrun();
break;
case left: // 向左行驶
send_str2( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
leftrun();
break;
case right: // 向右行驶
send_str3( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
rightrun();
break;
case stop: // 停止
send_str4( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
{
while(flag_mss) //循线标志位
{
if(timer>=2000) //1000*100US 检测一次
{
timer=0;
juli(); //计算距离
Delay Ms(20); //计算距离
if(S<20) //距离小于25CM
{
bjbackrun(); //小车向后行驶
}
else
if(S>20) //距离大于,25CM 往前走
bjrun();
}
if(flag_REC==1)
{
push_val_left=10; //舵机归中
stoprun();
break;
}
}
while(flag_bj) /*无限循环*/
{
if(timer>=1000) //100MS
检测启动检测一次
{
timer=0;
juli(); //计算距离
Delay Ms(20);
if((S<30)||Right_led1==0||Left_led1==0) //超声波小于30CM 、红外 1、红外 2 其中一个有遇到障碍物都停车进行超声波测距(红外 1,2 是超声波两边的)
{
stoprun(); //
小车停止
COMM(); //方向函数
}
else
if((S>30)&&Right_led1==1&&Left_led1==1) //超声波大于30CM 红外 1 和红外 2 都没有遇到障碍就向前行驶。
bjrun();
}
if(dat=='O'&&(i==0)) //接收数据第一帧
{
buff=dat;
flag=1; //开始接收数据
}
else
if(flag==1)
{
i++;
buff=dat;
if(i>=2)
{i=0;flag=0;flag_REC=1 ;} // 停止接收
}
}
}
/***************************************************************/
/*--主函数--*/
void main(void)
{
TMOD=0x11;
TH1=(65536-100)/256; //100US
定时
TL1=(65536-100)%256;
TH0=0;
TL0=0;
T2CON=0x34;
T2MOD=0x00;
RCAP2H=0x FF;
RCAP2L=0x DC;
SCON=0x50;
PCON=0x00;
PS=1;
TR1=1;
ET1=1;
ES=1;
EA=1;
push_val_duoji=10; //舵机归中
while(1) /*无限循环*/
{
while(flag_mss) //循线标志位
{
if(timer>=2000) //1000*100US 检测一次
{
timer=0;
juli(); //计算距离
Delay Ms(20); //计算距离
if(S<20) //距离小于25CM
{
bjbackrun(); //小车向后行驶
}
else
if(S>20) //距离大于,25CM 往前走
bjrun();
}
if(flag_REC==1)
{
push_val_left=10; //舵机归中
stoprun();
break;
}
}
while(flag_bj) /*无限循环
*/
{
if(timer>=1000) //100MS 检测启动检测一次
{
timer=0;
juli(); //计算距离
Delay Ms(20);
if((S<30)||Right_led1==0||Left_led1==0) //超声波小于30CM 、红外 1、红外 2 其中一个有遇到障碍物都停车进行超声波测距(红外 1,2 是超声波两边的)
{
stoprun(); //小车停止
COMM(); //方向函数
}
else
if((S>30)&&Right_led1==1&&Left_led1==1) //超声波大于30CM 红外 1 和红外2 都没有遇到障碍就向前行驶。
bjrun();
}
if(flag_REC==1)
{
push_val_duoji=10; //舵机归中
stoprun();
break;
}
}
while(flag_xj) /*无限循环*/
{
if(Left_led==0&&Right_led==0) //有信号为0 没有信号为 1
{
xjrun();
}
else
{
if(Right_led==1&&Left_led==0) //左边检测到黑线向左行驶
{
xjleftrun();
}
if(Left_led==1&&Right_led==0) //右边检测到黑线向右行驶
{
xjrightrun();
}
if(Left_led==1&&Right_led==1) //两边检测到黑线停止
{
stoprun();
}
}
if(flag_REC==1)
{
push_val_duoji=10; //舵机归中
stoprun();
break;
}
}
if(flag_REC==1)
{
flag_REC=0;
if(buff[0]=='O'&&buff[1]=='N') //第一个字节为O,第二个字节为 N,第三个字节为控制码
switch(buff[2])
{
case up : // 向前行驶
send_str( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
run();
break;
case down: // 向后行驶
send_str1( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
backrun();
break;
case left: // 向左行驶
send_str2( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
leftrun();
break;
case right: // 向右行驶
send_str3( );
flag_mss=0;
flag_bj=0;
flag_xj=0;
rightrun();
break;
case stop: // 停止
send_str4( );
flag_mss=0;
flag_bj=0;
flag_xj=0;}
}
} stoprun();
break;
case Car : // 开启魔术手
flag_mss=1;
break;
case Car1 : // 开启超声波避碍
flag_bj=1;
break;
case Car2 : // 开启红外循迹
flag_xj=1;
break;
}
}
}

附录四 高清大图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表