中文题目 基于单片机智能小车设计
英文题目 The Design Of Intelligent Car Based on SCM
学生姓名 班级 学号
学 院 电子科学与工程学院
专 业
指导教师 职称
摘要
21世纪以来,随着计算机、微电子和信息科技的发展,人类已经步入了大数据时代,正在朝着智能化时代发展。在这样一个背景下,车辆的智能化已经成为了现今世界车辆的研究领域的热点和汽车工业的新增长点。智能车辆成为了未来人类出行的重要载体。一种智能小车的控制系统的研制与设计有着重要的实际意义和科学理论价值。根据人类生活出行需求,本文设计了一种能够通过手机蓝牙遥控和智能避障的智能小车。本设计采用了STCC52为核心处理器,由主控模块、蓝牙透传模块、避障模块、电机驱动模块、电源模块等组成。启动后通过直流电源给各个模块供电,智能小车自动检测蓝牙信号,检测到蓝牙信号启动手机遥控,实现智能小车实时控制。否则进入自主控制模式,当智能小车遇到障碍物时,超声波加舵机模块进行水平180度探测,并将探测信号传送给单片机,单片机根据程序运行结果发出相应的控制信号控制智能小车自动避开障碍物。
关键词 智能小车 STCC52 避障 手机遥控
ABSTRACT
Since the 21st century, with the development of computers, microelectronics and information technology, mankind has entered the era of big data, and we are moving in the era of intelligent development. In this context, intelligentialize of vehicles has become the hotspot of research field of the world, and it become a new growth point of automotive industries. Intelligent vehicle has become an important vehicle to humanity in the future. Development and design of the control system of an intelligent car has important practical significance and value of scientific theories. According to the needs of human life, This paper describes the design of a intelligent car controlled by Bluetooth signals, which can obstacle avoidance intelligently. This design uses a MCU called STCC52 to be core processor. The intelligent car is composed of the main control module, Bluetooth transparent transmission module, obstacle avoidance module, motor drive modules, power modules. After connecting the power supply, each module powered via a DC power supply. the intelligent car automatically detects the Bluetooth signal, when detecting Bluetooth signal the intelligent car activate Bluetooth remote control, to achieve real-time control. Otherwise the car enter independent control mode, when the intelligent car encounters an obstacle, the ultrasonic detection module 180 degrees horizontally, and the detection signal is transmitted to the MCU, and MCU sends the corresponding control signals to intelligent car based on the results of the program to control the intelligent car automatically avoids obstructions.
Keywords Intelligent car STCC52 Obstacle avoidance Mobile phone remote control
第一章 绪论 1
1.1 课题提出背景 1
1.2 智能化产品的应用 1
1.3 本文研究内容 1
第二章 方案论证与设计 3
2.1 障碍物检测模块 3
2.2 电机驱动系统 4
2.3 无线控制模块 5
2.4 供电电源 5
2.5 车体设计 6
第三章 硬件设计 7
3.1 总体设计 7
3.2 电机驱动系统 8
3.3 超声波避障系统 12
3.4 蓝牙透传模块 14
3.5 主控电路 15
第四章 方案论证与设计 18
4.1 主程序设计 18
4.2 超声波避障系统程序设计 19
第五章 制作安装与调试 22
5.1 硬件焊接组装 22
5.2 软件程序设计 23
5.3 整体调试 23
结论 24
致谢 25
参考文献 26
附录 27
附录一 智能小车程序 27
第一章绪论
1.1课题提出的背景
自工业以来,第一台蒸汽机的发明及运用大大提高了社会生产力,人类社会完成了从小作坊手工业向工厂机器工业化的过渡。而随着机械化水平的不断提高,诞生了能代替人类完成一些复杂操作的机器人。目前,智能机器人的发展已经遍及了医疗、航天、制造、探测、国防等领域,迅速的改变着人类生活方式。在这一背景下,智能化产品成为了人类不断探讨的方向。
1.2智能化产品的应用
所谓智能化产品,就是指由现代的微电子技术、物联网技术、自动控制技术汇集于一体针对某一特定环境下的产品。智能化产品不需要人为去管理,会自动按照我们设计好的模式运行,从而达到设定的理想目标。
智能化产品的应用前景广阔,也进入了高速发展的时期。目前智能家居的兴起成为当下最热门的话题,也出现了以小米公司为代表的一批智能家居的创业公司,目前投入生活中实际使用的产品有,智能插座、智能锁、智能灯泡等等。当然,这仅仅是智能化产品发展的冰山一角,智能化产品还有很大的想象空间,比如谷歌的无人驾驶汽车,已经进行了公路测试,有望近期投入使用,亚马逊无人机快递发展,极大降低了物流成本等等。
智能化产品对社会生产有着翻天覆地的改变,也会影响到每一个人的平时生活,对社会的进步有着不可估量的作用。
1.3本文研究内容
本设计中基于单片机的智能小车就是一种简单的智能产品,是对机器人模仿的一种尝试。本设计的智能小车主要有四部分组成,分别是主控模块、电机驱动模块、蓝牙透传模块和超声波避障模块。这种智能小车最终实现的功能是通过手机蓝牙信息传输控制智能小车的前进、后退、左转和右转,通过超声波检测感知前方障碍物,并自动寻找无障碍物的前进方向。
本文第一章为绪论,主要阐述选题的背景和智能产品的应用。
第二章介绍了小车的整体设计选择方案,包含车体设计选择、障碍物检测模块选择、无线控制模块选择、电机驱动系统的选择和供电电源的选择等。
第三章系统的介绍了智能小车的各个模块的运行原理和电路设计原理图,完成了整个智能小车的硬件设计介绍。
第四章介绍了智能小车主程序流程图和各模块运行流程图,以及相关模块程序介绍。
第五章介绍了智能小车的硬件焊接安装、软件的设计和智能小车整体故障排查和程序调试方法。
第二章方案论证与设计
根据智能小车实现功能和设计目标,确定智能小车需要器件,分别是障碍物检测模块、驱动电机、电机驱动模块、无线控制模块、供电电源和车体等。各器件的选择设计方案论证如下:
2.1障碍物检测模块
智能小车在运行过程中对前方障碍物进行检测,根据设计要求,有以下两方案来比较:
方案一:使用超声波测距模块结合舵机进行障碍物检测。超声波测距模块通过发出的超声波遇到障碍物反射回来,再被超声波传感器接收,从而判断障碍物距离。声波的波瓣宽度较宽,一个超声波发生器可以检测就可以监测很宽的范围。超声波另一个优点是不受物体表面颜色影响,有较强的抗干扰能力。超声波传感器结合舵机可以实现智能小车自主选择最合适的路径避开障碍物。
方案二:采用光电发射、检测模块进行障碍物检测。其原理是根据发射器发出的光束,被物体反射后,接收电路根据是否接收到光信号判断前方是否有障碍物。因为单个激光管照射范围太小,满足不了设计需求,所以不能使用激光管。其电路的设计与实现较为简单,但是测量距离不远。
综合分析以上两种方案优缺点,选择方案一:使用超声波传感器结合舵机进行障碍物检测。
图2-1 超声波检测模块
2.2电机驱动系统
2.2.1驱动电机的选择
方案一:选用步进电机作为智能小车的驱动电机。脉冲信号的频率和脉冲数的改变可以控制步进电机的转速和停止位置。可以通过控制脉冲数量来控制智能小车的角位移量,从而可以准确定位智能小车的前进距离和位置。但是步进电机的力矩会随着其转动速度的提高而降低,不适用于对行驶速度有一定要求的智能小车系统。
方案二:选用直流电机作为智能小车的驱动电机。直流电机的转动力矩较大,相对体积小,重量轻。可以很方便的通过单片机的高低电平实现直流电机的正反转,且性价比较高。
综合分析以上两种方案的优缺点,选择方案二:选用直流电机作为智能小车的驱动电机。
2.2.2电机驱动模块的选择
方案一:采用电机驱动芯片L298N驱动智能小车电机。做为全桥驱动芯片,L298N具有高电压、大电流的特点,其相应频率也比较高。一个L298N可以驱动两个直流电机。使用L298N芯片作为电机驱动芯片,操作控制方便,稳定性能较好。
方案二:采用集成舵机接口的双L298N模块。双L298N模块集成了两个L298N芯片,可以直接驱动智能小车的四个直流电机。同时该模块集成了LM2596 DC-DC稳压芯片,可以直接输出5V电压,最大电流可达2A。集成的舵机接口,引出了舵机PWM信号端,方便舵机和单片机的对接。一个双L298N电机驱动模块可驱动所有模块和单片机的工作,使用起来非常方便。
综合分析以上两种方案优缺点,选择方案二:采用集成舵机接口的双L298N模块。
图2-2 L298N芯片
2.3无线控制模块
方案一:使用红外控制模块进行无线控制。红外控制模块通过接受单独遥控器发射红外线信号,传送给单片机处理,从而对智能小车进行控制。红外遥控受指向性的,不能穿过或绕过人和物体。
方案二:使用蓝牙透传模块进行无线控制。无线蓝牙透传模块可以直接与有蓝牙功能的手机、PAD等设备连接,通过手机直接对智能小车进行控制。不受指向性,操作方便。
综合分析以上两种方案优缺点,选择方案二:使用蓝牙透传模块进行无线控制。
2.4供电电源
智能小车的设计计划需要使用四个直流电机进行驱动,以及超声波检测模块、舵机模块等,根据设计要求,以下两种方案进行比较:
方案一:采用4节1.5V电池单电源供电,但6V的电压和电源产生的电流较小,满足不了同时给单片机和各模块供电,且智能小车耗电量大,电池更换麻烦。
方案二:采用7.2V的1300MAH的可充电电池为小车提供动力,电源可产生同时满足电机、单片机和各模块的供电,且可充电重复利用。
综合分析以上两个方案优缺点,选择方案二:采用7.2V的1300MAH的可充电电池为小车提供动力。
2.5车体设计
根据设计要求,对于小车车体设计拟定了以下三种方案进行比较:
方案一:自己动手制作智能小车车体。一般来说,由于材料、工具和专业性的,自行制作出来的智能小车车体较为粗糙,对电机、模块的安装适应性不好,后期的小车行驶路线也难以很好的实现。
方案二:玩具电动车改装。玩具电动车具有完整的车架和车轮,整体车型设计较为合理,且装配紧凑,使得电路安装较为方便,看起来也比较美观。但是价格较为昂贵。
方案三:购买智能小车模型。这种智能小车车体完整,专门为学生电子设计制作,各个部件设计适当,方便各个模块的安装拆卸,价格相对便宜。
综合分析以上三个方案的优缺点,选择方案三:购买智能小车模型。
第三章硬件设计
3.1总体设计
经过论证与设计,智能小车的组成模块分别是:超声波测距模块,蓝牙透传模块,双298N电机驱动模块,直流驱动电机和供电电源组成。各个模块由主控系统芯片进行数据的传输与控制。
智能小车四个轮均有直流驱动电机驱动,通过控制四个直流电机的前转、后转和停止来实现小车的前进、后退、左拐和右拐。超声波检测模块装在小车的前端,实时检测前方是否有障碍物,当检测到障碍物时,主控芯片控制电机停止,智能小车停止前进,超声波检测模块进行左右检测,主控芯片控制电机前后转,实现小车的左转和右转,从而智能避障。智能小车实时检测蓝牙信号,主控芯片通过处理接收到的蓝牙信号实现智能小车的无线遥控
3.1.1 智能小车总体设计框图
图3-1 总体设计框图
智能小车总体电路中,蓝牙透传模块与超声波检测模块与主控芯片进行双向信号传递,复位电路、时钟电路和电机驱动模块与主控芯片进行单向信号传递。
3.1.2 智能小车所需元器件清单
元件 | 数量 | 元件 | 数量 | 元件 | 数量 |
直流电机 | 4个 | 电阻 | 若干 | 电机驱动模块 | 1块 |
STCC52 单片机 | 1块 | 9脚排阻 | 1个 | 供电电源 | 1块 |
超声波检测模块 | 1块 | 排针 | 若干 | 蓝牙透传模块 | 1块 |
舵机 | 1个 | 杜邦线 | 若干 | 复位开关 | 1个 |
12M晶振 | 1个 | 电容 | 若干 | 车体 | 1个 |
电机驱动系统包括驱动电机和电机驱动模块。驱动电机选用4个直流电机,电机驱动模块选用双L298N电机驱动模块。主要介绍双L298N电机驱动模块,双L298N电机驱动模块主要由两个L298N电机驱动芯片组成,一个LM2596 DC-DC稳压芯片。可以同时驱动四个直流电机,还可以输出5V电压直接给各个模块供电。同时该模块还集成了舵机接口,引出信号端,方便舵机和单片机对接。
3.2.1 L298N电机驱动芯片
电机驱动模块采用的L298N驱动芯片可直接驱动两路3V-16V直流电机,提供了5V电压输出接口。L298N模块及其引脚示意图如下:
图3-2 电机驱动控制芯片L298N引脚图示
根据上图引脚图示,一个L298N包含四个OUTPUT(输出)引脚,四个INPUT(输入)引脚,其中OUTPUT1和OUTPUT2两个输出引脚共同控制一个直流驱动电机,OUTPUT3和OUTPUT4两个输出引脚共同控制一个直流驱动电机。故一个L298N电机驱动芯片可以控制两个直流驱动电机的运转。LOGIC SUPPLY VOL Vss为逻辑电源端,通过逻辑控制电路使得电源的输入端为5V。
L298N电机驱动芯片驱动直流电机运转原理图为:
图3-3 L298N电机驱动芯片驱动直流电机电路图
L298N电机驱动芯片通过与直流驱动电机的连接直接对电机进行控制。通过主控电路单片机I/O输入的控制,改变控制端的高低电平,实现电机的正转、反转和停止。
3.2.2 双L298N电机驱动模块
本智能小车设计使用的双L298N电机驱动模块包含两个L298N电机驱动芯片,可直接驱动四个直流电机。实物图如下:
图3-4 双L298N电机驱动模块
双L298N电机驱动模块电路原理图如下:
图2-5 双L298电机驱动模块电路原理图
如2-5原理图,H4、H6、H8、H10为双L298电路驱动模块输出端,分别控制智能小车的四个直流电机。若定义四个输入端为A、B、C、D,每个输入端对对接两个单片机端口,分别定义为A1和A2、B1和B2、C1和C2、D1和D2。则 智能小车行进控制逻辑如下:
输入信号 | 行进方式 | |||||||
A1 | A2 | B1 | B2 | C1 | C2 | D1 | D2 | |
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 前进 |
0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 后退 |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 右转 |
0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 左转 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 停止 |
本设计采用超声波避障系统来实现智能小车对障碍物的智能检测。超声波避障系统包括超声波测距模块和舵机。超声波测距模块选用US-100型号,舵机选用SG90型号。
3.3.1 US-100超声波测距模块
US-100型号的超声波测距模块的工作电压最低为2.4V,最高为5.5V,拥有较宽的电压输入范围。运行状态静态电流为2mA。适宜工作温度最低-20°,最高70°,能适应大部分温度状态下的工作环境。其测距工作状态可检测的最远距离为450cm,最近距离为2cm,精度可达到0.3cm+1%,满足智能小车设计需求。由于超声波波瓣较宽,US-100超声波测距模块可实现最高15度的感应角度。US-100超声波测距模块拥有UART模式和电平触发模式,本设计使用电平触发模式进行通信。
US-100型号超声波测距模块实物图如下:
图3-6 US-100超声波测距模块实物图
如图2-6所示,US-100超声波测距模块从左到右共有5个接口,本次设计使用前4个接口,分别是:VCC接口、TRIG接口、ECHO接口和GND接口。使用电平触发模式进行通信状态下,VCC接口接供电范围为2.4V-2.5V的外接电源,GNG接口接外电路地,TRIG接口接单片机控制引脚,ECHO接口接单片机输入引脚。
工作状态下,在TRIG接口输入至少10us的高电平,超声波测距模块接收到高电平后发出多个超声波脉冲,然后超声波测距模块开始检测回波信号。超声波测距模块检测到回波信号后还是对当前的温度值进行测量,根据当前温度值自动矫正测量结果,并将最终的测量结果通过ECHO接口输出至单片机,由单片机进行分析计算。
3.3.2 SG90舵机
SG90舵机是一种可自定义转动角度的驱动器。其工作使用电压范围时3.5V-6V,正常工作温度范围为-30°至60°。SG90舵机的转动角度通过调节脉冲宽度调制信号的占空比来实现。
SG90舵机实物图如下:
图3-7 SG90舵机实物图
SG90舵机有棕、红、黄三根外接线。其中,棕色为接地线,连接外接电路地,红色为电源正极线,接供电范围为3.5V-6V的外接电源。黄色为信号线,对接到单片机的PWM信号控制接口。
工作状态下,通过调节PWM信号的占空比实现舵机的转动角度,PWM信号的周期固定为50Hz。脉冲宽度范围在0.5ms至2.5ms之间,对应舵机的转角0°至180°。
US-100超声波测距模块结合SG90舵机,可以实现超声波水平180°障碍物检测。
3.4蓝牙透传模块
本设计使用HC-07蓝牙透传模块,采用GSR主流蓝牙芯片,蓝牙V2.0协议标准。HC-07蓝牙透传模块正常工作电压为3.3V,配对中最高工作电流达到40mA。蓝牙透传模块适应标准或非标准协议,所收数据就是所发数据。可以与具有蓝牙功能的手机、电脑等产品连接。
HC-07蓝牙透传模块实物图如下:
图3-8 HC-07蓝牙透传模块实物图
如图2-8所示,HC-07蓝牙透传模块拥有7个引脚,本设计使用1、2、4和5引脚。1、2、4和5引脚分别是模块串口发送脚(TX)、模块串口接收脚(RX)、VCC和GND。TX引脚和RX引脚可直接与单片机进行连接进行数据的输出和接收。
3.5主控电路
主控电路使用STCC52单片机为主控芯片,通过对STCC52单片机写入程序,通过单片机的I/O来实现对各个模块的控制,从而达到所有预期运行状态。
主控电路实物图如下:
图3-9 智能小车主控电路
单片机最小系统是最少元件组成的单片机可以工作的系统,为主控电路的主要部分,其电路原理图如下:
图3-10 主控电路单片机最小系统原理图
智能小车以主控电路为核心,控制智能小车的行进、避障和遥控功能。
如图2-10所示,单片机通过引脚I/O的高低电平进行信号的输入和输入。其中,P1_0至P1_7共八个引脚通过输出至电机驱动模块的高低电平来控制智能小车的行进方式。P2_5对接超声波测距模块的控制引脚(TRIG),P2_4对接超声波测距模块的输入引脚(ECHO)。P2_7对接舵机的PWM信号输入端。通过的单片机的程序运行对各个模块进行控制,实现小车智能避障和手机遥控的功能。
第四章软件设计
4.1主程序设计
4.1.1 主程序流程图
智能小车启动系统初始化后,开始智能检测蓝牙信号,检测到蓝牙信号后启动蓝牙模块进入手机遥控模式。没有检测到蓝牙信号检测前方是否有障碍物,若有障碍物,小车进入自主避障模式。
4.1.2单片机接口定义
单片机接口定义如下:
#include #include #define Sevro_moto_pwm P2_7 //接舵机信号端输入PWM信号调节速度 #define ECHO P2_4 //超声波接口定义 #define TRIG P2_5 //超声波接口定义 #define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //左两电机正转 #define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;}//左两电机反转 #define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;}//左两电机停转 #define Right_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右两电机正传 #define Right_moto_back{P1_4=0,P1_5=1,P1_6=0,P1_7=1;}//右两电机后转 #define Right_moto_Stop{P1_4=0,P1_5=0,P1_6=0,P1_7=0;}//右两电机停转 4.2超声波避障系统程序设计 4.2.1 超声波避障系统流程图 4.2.2 超声波避障系统程序 void dd() { push_val_left=14; //舵机归中 if(timer>=1000) //100MS启动一次 { timer=0; StartModule(); //启动检测 Conut(); //计算距离 if(S<20) //距离小于20CM {car_stop(); //小车停止 COMM(); //方向函数} else if(S>30) //距离大于,30CM往前走 go_straight();}} void COMM( void ) { push_val_left=5; //舵机左90度 timer=0; while(timer<=4000); //延时400MS让舵机转到其位置 StartModule(); //启动超声波测距 Conut(); //计算距离 S2=S; push_val_left=23; //舵机右转90度 timer=0; while(timer<=4000); //延时400MS让舵机转到其位置 StartModule(); //启动超声波测距 Conut(); //计算距离 S4=S; push_val_left=14; //舵机归中 timer=0; while(timer<=4000); //延时400MS StartModule(); //启动超声波测距 Conut(); //计算距离 S1=S; if((S1<20)||(S2<20)||(S4<20)) //只要左右各有距离小于,20CM小车后退 { go_back(); //后退 timer=0; while(timer<=4000);} if(S2 while(timer<=6000); timer=0; car_stop(); while(timer<10); } else {turn_left();//左比右距离大 左转 timer=0; while(timer<=4000); timer=0; car_stop(); while(timer<10);}} 第五章制作安装与调试 5.1硬件焊接组装 智能小车的硬件电路焊接较为复杂,需要考虑到每个元件用到的引脚和每个元件的详细资料,对智能小车整体有比较明确认识。根据设计总原理图,为了提高电路焊接效率和各个模块的安全,最终把智能小车分成四个焊接板块,四个焊接板块之间通过杜邦线和排针连接。 智能小车的焊接组装主要用到的工具是电烙铁、吸锡器和万用表。电烙铁主要用来焊接智能小车各个板块的元件和导线。吸锡器用来吸焊锡,来修改焊接错误的电路。万用表用来测量电路导通性和电路运行电压,还可以判断每个元件的好坏。 每个焊接板块单独进行焊接,完成每个板块的电路焊接后进行单独测试,保证各个板块测试正常后再进行整体电路连接。 智能小车最终完成图如下: 图5-1 智能小车 5.2软件程序设计 本设计使用C语言对智能小车的整个主控芯片的程序进行编写。程序编写用到的开发系统是Keil C51。整个程序的设计主要包括接口定义、函数定义和模块运行逻辑。 对接口定义程序编写时对照电路总原理图,对单片机每个使用到的引脚进行定义。模块运行逻辑的程序设计之前,完成每个模块的高低电平控制真值表和模块运行流程图,根据真值表和流程图编写程序。 智能小车主控芯片程序见附录1。 5.3整体调试 智能小车整体设计分为两个主要部分:硬件设计和软件设计。智能小车设计完成后要进行整体调试。智能小车的整体调试按照各个模块来进行,具体步骤如下: 1.对电源工作状态进行测试,确定各个模块工作电压和工作电流在额定的范围之内。 2.检查单片机是否能够正常烧写程序和运行程序。 3.通过插拔线对每个电机进行测试,确定电机工作状态正常。 4.运行智能小车,测试智能小车各个模块是否按照设定的流程运行。 5.设置不同的避障场景,测试小车是否按照正常的程序避障,并记录各场景出现的问题 6.整理各个步骤记录的数据和问题,解决智能小车硬件故障,优化程序设计。 经过以上步骤调试,智能小车实现了手机遥控和智能避障功能,达到了设计要求。 结 论 本设计的智能小车由STCC52单片机、双L298N电机驱动、超声波测距、蓝牙透传、舵机、电源等模块组成。启动后,智能小车检测蓝牙信号,检测到蓝牙信号进入手机遥控模式,单片机根据接收手机发出的蓝牙信号控制智能小车的行进状态。若检测不到蓝牙信号,小车进入自主避障模式,由超声波测距模块配合舵机检测前方的障碍物,检测到障碍物后,进行水平180度探测,并将检测信号送入单片机,由单片机处理后控制智能小车的行进状态,从而完成自主避障的过程。 整个毕业设计过程从立项到完成智能小车制作,一共经历的三个月的时间,这段时间里,我阅读了与使用各个模块相关的很多资料,重新学习了单片机芯片。虽然对于某些模块有学习不透彻的地方,但对整个的单片机控制和智能化产品有了进一步深刻的认识。在智能小车的硬件和软件的设计过程中,借鉴了前人比较好的解决方案,同时融入了自己的设计思想。 论文即将截稿,回想整个智能小车设计制作过程,由于操作不当焊坏了一个最小系统,由于控制不当导致电压过高,烧掉了一个单片机和一个蓝牙透传模块,程序设计也几经修改,最终完成了毕业设计。整个毕业设计过程让我对硬件制作和程序的设计有更深层的认识。 本毕业设计是基于单片机的智能小车设计,由于模块的局限性,智能小车还有很多不足的地方,超声波避障模块无法做到实时避障,手机遥控模式下无法进入自主避障模式,智能小车需要改进的地方还有很多。 随着微电子技术和物联网的发展,我相信的产品的智能化发展的脚步一定会越来越快,期待着智能化新时代的来临。 致 谢 回想整个毕业设计过程,从课题的选择,再到智能小车的制作,以及最后毕业论文的撰写,前后经历了三个月多的时间。这段时间里,老师和同学都给给予了莫大的帮助,帮助我克服了电路设计和程序设计上的困难,在这里,我要对我的老师和我的同学表达最诚挚的谢意。 首先感谢的是指导我毕业设计的***老师,感谢***老师在我毕设整个过程中给予的指导和要求。第一次张老师就有一种亲切感,张老师的平易近人的笑容让我们之间没有隔阂,让我有充分表达自己观点的机会。撰写开题报告的时候,由于自身原因不能在学校,是张老师打电话告诉我开题报告撰写要求和提交时间,让我在校外也顺利的完成了开题报告。整个毕业设计期间,也从张老师负责严谨的态度深深感染到了我,让我学到了很多,希望张老师以后难时不忘,只要我能帮上忙,一定会尽力的。 然后感谢我的同学们,感谢他们在毕设过程中给予的建设性的意见,在我找不到程序故障的时候帮助我调试程序,没有同学们的帮助,我的毕业设计不会像现在这么顺利的完成 最后感谢我的母校,感谢四年来****对我的培养,感谢四年来我所有的老师们,是****让我的生活变得丰富多彩,是老师们让我学会了严谨的思维方式。感谢你们让我有一个愉快进步的大学生活。 随着毕业论文的收尾, 大学四年生活也快要结束,离开大学的日子也开始倒计时。最后的时光,祝福我所有的老师和同学,希望你们工作顺利,希望你们有一个快乐的生活。 参考文献 [1]周兴华.单片机智能化产品C语言设计实例详解.北京航天航空大学出版社,2006 [2]阎石.数字电子技术基础[M].高等教育出版社,2006 [3]沈红卫.单片机应用系统设计实例与分析[M].北京航空航天大学出版社.2003 [4]姜志海,黄玉清,刘连鑫.单片机原理及应用[M].电子工业出版社 [5]楼然苗,李光飞.51系列单片机设计实例[M].北京航空航天大学出版社,2003 [6]余家春.Protel 99 SE电路设计实用教程[M].中国铁道出版社,2004 [7]王为青.单片机Keil Cx51应用开发技术[M].人民邮电出版社,2007 [8]胡汉才.单片机原理及其接口技术[M].清华大学出版社,2000 [9]曹琳琳.单片机原理及其接口技术[M].国防科技大学出版社,2000 [10]陈杰,黄鸿.传感器与检测技术[M].高等教育出版社,2002 [11]李瀚荪.电路分析基础[M].高等教育出版社,2006 [12]谭浩强.C语言程序设计[M].清华大学出版社,2005 [13]赵春晖,张朝柱.微波技术[M].高等教育出版社,2009 附 录 附录一 智能小车程序 #include #include #define Sevro_moto_pwm P2_7 //接舵机信号端输入信号调节速度 #define ECHO P2_4 //超声波接口定义 #define TRIG P2_5 //超声波接口定义 #define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //左边两个电机向前走 #define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左边两个电机向后转 #define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //左边两个电机停转 #define Right_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右边两个电机向前走 #define Right_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右边两个电机向前走 #define Right_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右边两个电机停转 void bb();//蓝牙使用函数 void dd(); //舵机使用函数 void delay(int time);//延时函数 unsigned char pwm_val_left = 0;//变量定义 unsigned char push_val_left =14;//舵机归中,产生约,1.5MS 信号 unsigned long S=0; unsigned long S1=0; unsigned long S2=0; unsigned long S3=0; unsigned long S4=0; unsigned int time=0; //时间变量 unsigned int timer=0; //延时基准变量 unsigned char timer1=0; //扫描时间变量 char num; int t=0; /****定义ASCII码****************/ #define left 'C' #define right 'D' #define up 'A' #define down 'B' #define stop 'F' /***有关串口通信变量的定义****/ bit flag_REC=0; bit flag =0; unsigned char i=0; unsigned char dat=0; unsigned char idata buff[5]=0; //用于接收缓冲字节 /*****字符串发送函数**********/ void send_str( ) // 传送字串 {unsigned char i = 0; while(str[i] != '\\0') {SBUF = str[i]; //串行数据缓冲寄存器 while(!TI); // 等特数据传送 TI = 0; // 清除数据传送标志 i++; // 下一个字符} } void send_str1( ) // 传送字串 { unsigned char i = 0; while(str1[i] != '\\0') {SBUF = str1[i]; while(!TI); // 等特数据传送 TI = 0; // 清除数据传送标志 i++; // 下一个字符}} void send_str2( ) // 传送字串 {unsigned char i = 0; while(str2[i] != '\\0') {SBUF = str2[i]; while(!TI); // 等特数据传送 TI = 0; // 清除数据传送标志 i++; // 下一个字符}} void send_str3() // 传送字串 { unsigned char i = 0; while(str3[i] != '\\0') {SBUF = str3[i]; while(!TI); // 等特数据传送 TI = 0; // 清除数据传送标志 i++; // 下一个字符} } void send_str4() // 传送字串 { unsigned char i = 0; while(str4[i] != '\\0') {SBUF = str4[i]; while(!TI); // 等特数据传送 TI = 0; // 清除数据传送标志 i++; // 下一个字符} } /****** 中断接收3个字节*****/ void sint() interrupt 5 { if(RI) //是否接收中断 { RI=0; dat=SBUF; if(dat=='O'&&(i==0)) //接收数据第一帧 {buff[i]=dat; flag=1; //开始接收数据} else if(flag==1) { i++; buff[i]=dat; if(i>=2) {i=0;flag=0;flag_REC=1 ;} // 停止接收}}} /********************************/ void StartModule() //启动测距信号 {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) //计算距离 {while(!ECHO); //当RX为零时等待 TR0=1; //开启计数 while(ECHO); //当RX为1计数并等待 TR0=0; //关闭计数 time=TH0*256+TL0; //读取脉宽长度 TH0=0; TL0=0; S=(time*1.7)/100; //算出来是CM disbuff[0]=S%1000/100; //更新显示 disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10 %10;} /********************************/ //前速前进 void go_straight(void) {Left_moto_go ; //左电机往前走 Right_moto_go ; //右电机往前走} /************************************************************************/ //前速后退 void go_back(void) {Left_moto_back ; //左电机往前走 Right_moto_back ; //右电机往前走} /********************************/ //左转 void turn_left(void) { Left_moto_back ; //左电机往前走 Right_moto_go ; //右电机往前走} /********************************/ //右转 void turn_right(void) { Left_moto_go ; //左电机往前走 Right_moto_back ; //右电机往前走} /********************************/ //STOP void car_stop(void) { Left_moto_Stop ; //左电机停走 Right_moto_Stop ; //右电机停走} /********************************/ void COMM( void ) { push_val_left=5; //舵机向左转90度 timer=0;while(timer<=4000); //延时400MS让舵机转到其位置 StartModule(); //启动超声波测距 Conut(); //计算距离 S2=S; push_val_left=23; //舵机向右转90度 timer=0;while(timer<=4000); //延时400MS让舵机转到其位置 StartModule(); //启动超声波测距 Conut(); //计算距离 S4=S; push_val_left=14; //舵机归中 timer=0; while(timer<=4000); //延时400MS让舵机转到其位置 StartModule(); //启动超声波测距 Conut(); //计算距离 S1=S; if((S1<20)||(S2<20)||(S4<20)) //只要左右各有距离小于,20CM小车后退 {go_back(); //后退 timer=0; while(timer<=4000);} if(S2 timer=0; while(timer<=6000); timer=0; car_stop(); while(timer<10);} else {turn_left(); //车的左边比车的右边距离大 左转 timer=0; while(timer<=4000); timer=0; car_stop(); while(timer<10); }} /********************************/ /*PWM调制电机转速 / /********************************/ /*左电机调速 */ /*调节push_val_left的值改变电机转速,占空比 */ void pwm_Servomoto(void) { if(pwm_val_left<=push_val_left) Sevro_moto_pwm=1; else Sevro_moto_pwm=0; if(pwm_val_left>=200) pwm_val_left=0;} /********************************/ ///*TIMER1中断服务子函数产生PWM信号*/ void time1()interrupt 3 using 2 {TH1=(65536-100)/256; //100US定时 TL1=(65536-100)%256;timer++; //定时器100US为准。在这个基础上延时 pwm_val_left++; pwm_Servomoto(); timer1++; //2MS扫一次数码管 if(timer1>=20) {timer1=0; Display();}} /********************************/ ///*TIMER0中断服务子函数产生PWM信号*/ void timer0()interrupt 1 using 0 {} /********************************/ void main(void) { di=0; PS=1; PT1=0; PT0=0;T2CON=0x34; //T2定时器为波特率发生器 RCAP2H=0xFF; RCAP2L=0xDC ;SCON=0x50; //串行口控制寄存器,串行口的工作方式,接收、发送控制,设置状态标志 PCON=0x00; //电源管理寄存器,复位清0。波特率正常,单片机处于正常工作状态 ES=1; //启动串行口中断 TMOD=0X11; TH1=(65536-100)/256; //100US定时 TL1=(65536-100)%256; TH0=0;TL0=0; TR1= 1;ET1= 1; ET0= 1;EA = 1; while(1) //无限循环 {bb(); dd();}} void delay( int k) //延时函数 {int x,y; for(x=0;x void bb() {if(flag_REC==1) // {flag_REC=0; if(buff[0]=='O'&&buff[1]=='N') //第一个字节为O,第二个字节为N,第三个字节为控制码 switch(buff[2]) { case up : // 前进 send_str( ); go_straight(); break; case down: // 后退 send_str1( ); go_back(); break; case left: // 左转 send_str2( ); turn_right(); break; case right: // 右转 send_str3( ); turn_left(); break; case stop: // 停止 send_str4( ); car_stop();break; } } } void dd() { push_val_left=14; //舵机归中 if(timer>=1000) //100MS启动检测一次 {timer=0; StartModule(); //启动检测 Conut(); //计算距离 if(S<20) //距离小于20CM {car_stop(); //小车停止 COMM(); //方向函数} else if(S>30) //距离大于,30CM往前走 go_straight();}}