资源描述
装订线X X 大 学 课程设计纸智能寻迹小车设计与实现摘要:本课题是基于AT89C52单片机的智能小车的设计与实验,设计主要有三个模块,包括信号检测模块、主控模块、电机驱动模块。小车完成的主要功能是能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。采用L298电机驱动及PWN电机调速,利用红外对管传感器检测黑线达到循迹目的,以及自动停车,自动循迹。整体系统的电路结构简单,可靠性高。关键词:AT89C52单片机 L298电机驱动及PWN电机调速 自动循迹Smart car tracing Abstract:This subject is the design and experiment of intelligent car based on AT89C52 single-chip microcomputer, the design has three main modules, including the module of signal detection module, main control module, motor. The main function of the car is able to independently identify black guide line and according to the black line to achieve rapid and stable line running. Using L298 motor and PWN motor, the tube sensor to detect black line to tracking objective using infrared, and automatic stop, automatic tracking. The circuit construction of whole system is simple, high reliability.Keyword :AT89S52 Microcomputer L298 motor and PWN motor automatic trackingI目 录第一章 前 言.11.1设计目的21.2设计要求2第二章 智能小车的总体方案设计32.1总体方案的思路32.2总体设计方案和框图3第三章 系统硬件设计与实现53.1单片机单元53.2电机控制单元63.3 串口通讯单元83.4 按键中断单元93.5蜂鸣器单元9第四章 系统软件设计与实现104.1程序流程图104.2程序11总 结23致 谢24参 考 文 献25附录 电路原理图26共 1 页 第 0 页前言科学技术的发展,机器人的感系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。视觉传感器的核心器件是摄像管或CCD,目前的CCD已能做到自动聚焦。但CCD传感器的价格、体积和使用方式上并不占优势,因此在不要求清晰图像只需要粗略感觉的系统中考虑使用接近觉传感器是觉传感器种类越来越多,其中视觉传感器成为自动行走和驾驶的重要部件。视觉的典型应用领域为自主式智能导航一种实用有效的方法。该智能小车可以作为机器人的典型代表。它可以分为三大组成部分:传感器检测部分、CPU、执行部分。机器人要实现自动避障功能,还可以扩展循迹等功能,感知导引线和障碍物。可以实现小车自动识别路线,选择正确的行进路线,并检测到障碍物自动躲避。基于上述要求,传感检测部分考虑到小车一般不需要感知清晰的图像,只要求粗略感知即可,所以可以舍弃昂贵的CCD传感器而考虑使用价廉物美的红外反射式传感器来充当。智能小车的执行部分,是由直流电机来充当的,主要控制小车的行进方向和速度。单片机驱动直流电机一般有两种方案:第一,勿需占用单片机资源,直接选择有PWM功能的单片机,这样可以实现精确调速;第二,可以由软件模拟PWM输出调制,需要占用单片机资源,难以精确调速,但单片机型号的选择余地较大。考虑到实际情况,本文选择第二种方案。CPU使用STC89C52单片机,配合软件编程实现。第1章 设计指导1.1设计目的(1) 掌握小车的基本构件;(2) 掌握电动机齿轮箱的构件;(3) 掌握各电子元器件的基本形状及其功能;(4) 掌握各电子元器件的焊接步骤与工作原理;(5) 掌握单片机内部结构与程序编制方法; (6) 掌握 LED 灯驱动方法,全面掌握流水灯/跑马灯编程技术;(7) 掌握数码管内部结构,掌握数码显示技术;(8) 掌握键盘结构原理,掌握中断查询技术原理;(9) 掌握话筒电路结构,掌握话筒输入技术原理;(10)掌握蜂鸣器驱动技术,实现蜂鸣报警功能;(11)掌握光敏电阻原理,实现光照对小车的控制;(12)掌握红外发射与接收技术,实现小车自动寻迹;(13)掌握R232通信协议,掌握串口通信技术;(14)通过本次设计实验,对自己的专业知识掌握和运用有一个系统的考核;1.2设计要求当前的电动小汽车基本上采取的是基于纯硬件电路的一种开环控制方法,或者是直线行使,或者是在遥控下作出前进、后退、转弯、停车等基本功能。但是它们不能实现在某些特殊的场合下,我们需要能够自动控制的小型设备先采集到一些有用的信息的功能。本文正是在这种需要之下开发设计的一种智能的电动小车的自动控制系统。它以单片机AT89C52为控制核心,附以外围电路,在画有黑线的白纸“路面”上行使,由于黑线和白线对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”黑线。判断信号可通过单片机控制驱动模块修正前进方向,以使其保持沿着黑线行进。轨迹探测用两对红外探头,当小车脱离轨道时,即当置于两边的任何一只红外发射探头脱离轨道时,相对应的接收探头便会接收到反射的红外线,系统便做出相应的转向调整,直到中间的光电管接收不到反射的红外线(即回到轨道),再恢复正向行驶等智能控制系统。第2章 智能小车的总体方案设计2.1总体方案的思路智能寻迹小车寻迹主要是由前方的两对红外发射与接收探头来完成的。根据光有反射的特性。所以说当红外发射出来的光线遇到物体时,就会形成反射的光线,而这个经反射的红外光线刚好被红外接收探头接收到。当红外接收探头接收到信号后,再将信号送到单片机由单片机内部程序来控制电机,由两个电机正转反转来完成小车的前进,转向。2.2总体设计方案和框图整个路系统分为检测、控制、驱动三个模块。首先利用红外探头对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。系统方案方框图如图所示:控制小车驱动电机软件控制检测(黑线)图2-1智能小车寻迹系统框2.2.1驱动模块由于直流电机的控制方法比较简单,只需给电机的两根控制线加上适当的电压即可使电机转动起来,电压越高则电机转速越高。对于直流电机的速度调节,可以采用改变电压的方法,也可采用PWM调速方法。PWM调使加在直流电机两端的速就是电压为方波形式,通过改变方波的占空比实现对电机转速的调节。2.2.2传感器单元由于使用CCD传感器需要有大量图像处理的工作,需要进行大量数据的存储和计算。而本次是以实现小车视觉为目的,实现起来工作量较大,电路相对比较复杂,所以我们使用光电传感器来采集路面信息。使用红外传感器最大的优点就是结构简明,实现方便,成本低廉,免去了复杂的图像处理工作,反应灵敏,响应时间低,便于近距离路面情况的检测。但红外传感器的缺点是,它所获取的信息是不完全的,只能对路面情况作简单的黑白判别,检测距离有限,而且容易受到诸多扰动的影响,抗干扰能力较差,背景光源,器件之间的差异,传感器高度位置的差异等都将对其造成干扰。但在本次设计中,赛道为黑色与白色两种颜色,小车只要能区分黑色就可以采集到准确的路面信息,所以本设计中我们采用了红外光电传感器作为信息采集元件。图2-2红外传感器分布图其中X1与Y1为第一级方向控制传感器,一般中间的一个传感器XY在黑线上并且黑线同一边的两个传感器之间的宽度不得大于黑线的宽度。小车前进时,X1、X2在黑线上,当小车偏离黑线时,第一级传感器X1或Y1就能检测不到黑线时,把检测的信号送给小车的处理、控制系统,控制系统发出信号对小车轨迹予以纠正。这次设计智能小车,可以按指定路线运行,自动区分直线轨道和弯路轨道,在指定弯路处拐弯,实现灵活前进、转弯、倒退等功能,在轨道上划出设定的地图,并且车速自动可调。主要是以AT89C52 为核心,红外传感器进行目标识别与避障,使自动寻迹小车准确跟踪轨迹路线;采用直流电机对车的转向进行控制,由软件实现了小车自动行驶、自动避障,并发出指示信息等功能。图2-1-1智能小车原理图第3章 系统硬件设计与实现3.1单片机单元AT89C52 提供以下标准功能:8k 字节 Flash 闪速存储器,256 字节内部 RAM,32 个 IO 口线,3 个 16 位定时计数器,一个 6 向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C52 可降至 0Hz 的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止 CPU 的工作,但允许 RAM,定时计数器,串行通信口及中断系统继续工作。掉电方式保存 RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位,AT89C52 除了与 AT89C51 所有的定时计数器 0 和定时计数器 l 外,还增加了一个定时计数器 2。定时计数器2 的控制和状态位位于 T2CON 。T2MOD ,寄存器对(RCA02H、RCAP2L)是定时器 2 在 16 位捕获方式或 16 位自动重装载方式下的捕获自动重装载寄存器。 图3-2 AT89C52各引脚P0口是一组8 位漏极开路型双向I/O口也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的P1 是一个带内部上拉电阻的8 位双向I/O 口,P1 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑P2 是一个带有内部上拉电阻的8 位双向I/O 口,P2 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑P3 口是一组带有内部上拉电阻的8 位双向I/O 口。P3 口输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻 RST复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。ALE/PROG当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8 位字节PSEN程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52 由外部程序存储器取指令EA/VPP外部访问允许。欲使CPU 仅访问外部程序存储器(地址为0000HFFFFH),EA 端必须保持低电平XTAL1振荡器反相放大器的及内部时钟发生器的输入端。 XTAL2振荡器反相放大器的输出端。3.2 电机控制单元 从单片机输出的信号功率很弱,即是在没有其他外在负载时也无法带动电机,所以在实现电路中我们加入了电机驱动芯片提高输入电机信号的功率,从而能够根据需要控制电机转动 L9110 是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,将分立电路集成在单片 IC 之中,使外围器件成本降低,整机可靠性提高。该芯片有两个 TTL/CMOS兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的正反向运动,它具有较大的电流驱动能力,每通道能通过 750800mA 的持续电流,峰值电流能力可达 1.52.0A; 同时它具有较低的输出饱和压降; 内置的钳位二极管能释放感性负载的反向冲击电流,使它在驱动继电器、直流电机、步进电机或开关功率管的使用上安全可靠。L9110 被广泛应用于玩具汽车电机驱动、步进电机驱动和开关功率管等电路上。LG9110特点低静态工作电流宽电源电压范围:2.5V-12V每通道具有800mA连续电流输出能力较低的饱和压降输出内置钳位二极管适用于感性负载控制和驱动集成于单片 IC之中具备管脚高压保护功能工作温度:0-80TTL/CMOS输出电平兼容,可直接连 CPU 3.3 串口通讯单元MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。 引脚图片 引脚介绍 主要分为几部分电荷泵电路:由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。 数据转换通道:由7、8、9、10、11、12、13、14脚构成两个数据通道。 其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。 TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。 供电:15脚GND、16脚VCC(+5v)。 由于RS232电平较高,在接通时产生的瞬时电涌非常高,很有可能击毁max232,所以在使用中应尽量避免热插拔。3.4 按键中断单元S1接通后,P3.4端接入低电平,小车中断所进行的动作。S2接通后使P3.4接入低电平,这时会有一个外部输入进入到单片机中,从而使小车停止所进行的动作进行下一个动作。3.5蜂鸣器单元 在单片机应用的设计上,很多方案都会用到蜂鸣器,大部分都是使用蜂鸣器来做提示或报警,比如按键按下、开始工作、工作结束或是故障等等。这里对单片机在蜂鸣器驱动上的应用作一下描述。图3-7为蜂鸣器发声电路原理图。图3-7 蜂鸣器发声电路原理图 由于自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动,只需对驱动口输出驱动电平并通过三极管放大驱动电流就能使蜂鸣器发出声音,由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O 口是无法直接驱动的,所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。第4章 系统软件设计与实现4.1程序流程图开始系统初始化执行主程序小车前进电机模式选择电机左转电机反转电机右转N偏离跑道否控制算法控制算法控制算法返回跑道否返回跑道否返回跑道否NNYNYYY图4-1系统总流程图该系统配套的软件程序采用模块结构,由C语言编写完成。主要由初始化程序、偏道调整程序、偏离光源调整程序、声光指示子程序、读传感器状态、显示程序、定时器0的中断服务程序、定时器1的中断服务程序、外部中断0的服务程序、停车处理等模块组成。系统的主体流程如图3-4所示。4.2程序#include /包含51单片机相关的头文件#define uint unsigned int /重定义无符号整数类型#define uchar unsigned char /重定义无符号字符类型uchar code LedShowData=0x03,0x9F,0x25,0x0D,0x99, /定义数码管显示数据 0x49,0x41,0x1F,0x01,0x19;/0,1,2,3,4,5,6,7,8,9uchar code RecvData=0x07,0x0A,0x1B,0x1F,0x0C,0x0D,0x0E,0x00,0x0F,0x19;uchar IRCOM7;static unsigned int LedFlash; /定义闪动频率计数变量unsigned char RunFlag=0; /定义运行标志位bit EnableLight=0; /定义指示灯使能位/*完成基本数据变量定义*/sbit S1State=P10; /定义S1状态标志位sbit S2State=P11; /定义S2状态标志位sbit B1State=P12; /定义B1状态标志位sbit IRState=P13; /定义IR状态标志位sbit RunStopState=P14; /定义运行停止标志位sbit FontIRState=P15; /定义FontIR状态标志位sbit LeftIRState=P16; /定义LeftIR状态标志位sbit RightIRState=P17; /定义RightIRState状态标志位/*完成状态指示灯定义*/sbit S1=P32; /定义S1按键端口sbit S2=P34; /定义S2按键端口/*完成按键端口的定义*/sbit LeftLed=P20; /定义前方左侧指示灯端口sbit RightLed=P07; /定义前方右侧指示灯端口/*完成前方指示灯端口定义*/sbit LeftIR=P35; /定义前方左侧红外探头sbit RightIR=P36; /定义前主右侧红外探头sbit FontIR=P37; /定义正前方红外探头/*完成红外探头端口定义*/sbit M1A=P00; /定义电机1正向端口sbit M1B=P01; /定义电机1反向端口sbit M2A=P02; /定义电机2正向端口sbit M2B=P03; /定义电机2反向端口/*完成电机端口定义*/sbit B1=P04; /定义话筒传感器端口sbit RL1=P05; /定义光敏电阻端口sbit SB1=P06; /定义蜂鸣端口/*完成话筒,光敏电阻,蜂鸣器.端口定义*/sbit IRIN=P33; /定义红外接收端口/*完成红外接收端口的定义*/#define ShowPort P2 /定义数码管显示端口extern void ControlCar(uchar CarType); /声明小车控制子程序void delay(unsigned char x) /0.14mS延时程序 unsigned char i; /定义临时变量 while(x-) /延时时间循环 for (i = 0; i13; i+) /14mS延时 void Delay() /定义延时子程序 uint DelayTime=5000; /定义延时时间变量 while(DelayTime-); /开始进行延时循环 return; /子程序返回void ControlCar(uchar CarType) /定义小车控制子程序 M1A=0; /将电机1正向电平置低 M1B=0; /将电机1反向电平置低 M2A=0; /将电机2正向电平置低 M2B=0; /将电机2反向电平置低 LeftLed=1; /关闭前方左侧指示灯 RightLed=1; /关闭前方右侧指示灯 Delay(); /将此状态延时一段时间 switch(CarType) /判断小车控制指令类型 case 1: /前进 /判断是否是前进 M1A=1; /将电机1正向端口置高 M2A=1; /将电机2正向端口置高 ShowPort=LedShowData1; /数码管显示前进状态 break; /退出判断 case 2: /后退 /判断是否是后退 M1B=1; /将电机1反向端口置高 M2B=1; /将电机2反向端口置高 ShowPort=LedShowData2; /数码管显示后退状态 RightLed=0; /将前方右侧指示灯置低(亮) LeftLed=0; /将前方左侧指示灯置低(亮) break; /退出判断 case 3: /左转 /判断是否是左转 M1B=1; /将电机1反向端口置高 M2A=1; /将电机2正向端口置高 ShowPort=LedShowData3; /数码管显示左转状态 LeftLed=0; /将前方左侧指示灯置低(亮) break; /退出判断 case 4: /右转 /判断是否是右转 M1A=1; /将电机1正向端口置高 M2B=1; /将电机2反向端口置高 ShowPort=LedShowData4; /数码管显示右转状态 RightLed=0; /将前方右侧指示灯置低(亮) break; /退出判断 case 5: M1A=1; /将电机1反向端口置高 M2A=1; /将电机2正向端口置高 ShowPort=LedShowData5; /数码管显示前进状态 break; /退出判断 case 8: M1A=0; /将电机1正向端口置低 M2A=0; /将电机2反向端口置低 ShowPort=LedShowData8; /数码管显示右转状态 RightLed=0; /将前方右侧指示灯置低(亮) LeftLed=0; /将前方左侧指示灯置低(亮) break; /退出判断 default: /默认情况下的判断 break; /直接退出判断 void ComBreak() interrupt 4 /定义串口通信子程序unsigned char RecvData; /定义串口数据接收变量 if(RI=1) /判断是否接收数据 RecvData=SBUF; /将接收到的数据放入暂时变量 if(RecvData10) /判断接收到的数据是否小于10 ShowPort=LedShowDataRecvData; /将接收到的数据通过数码管显示出来 ControlCar(RecvData); /将串口数据置于小于状态 SBUF=RecvData; /向电脑返回当前接收到的数据 RI=0; /清除接收中断标志位 if(TI=1) /判断是否是发送中断 TI=0; /清除发送中断标志位 void IR_IN() interrupt 2 using 0 /定义INT2外部中断函数 unsigned char j,k,N=0; /定义临时接收变量 EX1 = 0; /关闭外部中断,防止再有信号到达 delay(15); /延时时间,进行红外消抖 if (IRIN=1) /判断红外信号是否消失 EX1 =1; /外部中断开 return; /返回 while (!IRIN) /等IR变为高电平,跳过9ms的前导低电平信号。 delay(1); /延时等待 for (j=0;j4;j+) /采集红外遥控器数据 for (k=0;k=30) /判断计数器累加值 EX1=1; /打开外部中断功能 return; /返回 IRCOMj=IRCOMj 1; /进行数据位移操作并自动补零 if (N=8) /判断数据长度 IRCOMj = IRCOMj | 0x80; /数据最高位补1 N=0; /清零位数计录器 if (IRCOM2!=IRCOM3) /判断地址码是否相同 EX1=1; /打开外部中断 return; /返回 for(j=0;j10;j+) /循环进行键码解析 if(IRCOM2=RecvDataj) /进行键位对应 P2=LedShowDataj; /数码管显示相应数码 switch(IRCOM2) case 0x0A: /前进 ControlCar(1); /小车前进 break; case 0x1B: /后退 ControlCar(2); /小车后退 break; case 0x1F: /左转 ControlCar(3); /小车左转 break; case 0x0C: /右转 ControlCar(4); /小车右转 break; case 0x1A: /前进 ControlCar(1); /小车前进 break; case 0x05: /后退 ControlCar(2); /小车后退 break; case 0x01: /左转 ControlCar(3); /小车左转 break; case 0x03: /右转 ControlCar(4); /小车右转 break; case 0x0D: /电源 ControlCar(5); /前进 break; case 0x0F: /右转 ControlCar(8); /小车停止 break; EX1 = 1; /外部中断开void main(void) /主程序入口 bit ExeFlag=0; /定义可执行位变量 LedFlash=3000; /对闪灯数据进行初始化 TMOD=0x01; /选择定时器0为两个16位定时器 TH0=0xFF; /对定时器进行计数值进行初始化 TL0=0x49; /同上,时间大约为25uS TR0=1; /同意开始定时器0 EX1=1; /同意开启外部中断1 IT1=1; /设定外部中断1为低边缘触发类型 ET0=0; SCON=80; /设置串口模式为8位数据 TMOD=33; /设置定时/计数器模式 TH1=0xFD; /给定时器1高八位初始化初值 TL1=0xFD; /给定时器1低八位初始化初值 TR1=1; /开启定时器1 ES=1; /开启串口通信功能 REN=1; /开启接收中断标志 EA=1; /总中断开启 ControlCar(1); /将小车置于前进状态 ShowPort=LedShowData0; /数码管显示数字0while(1) /程序主循环 while(LedFlash-) /闪灯总延时 if(RL1=0) /判断光敏电阻的状态 RightLed=1; /将前方右侧指示灯点亮 LeftLed=1; /将前方左侧指示灯点亮 else /在光敏电阻为不通的状态下 RightLed=0; /将前方右侧指示灯熄灭 LeftLed=0; /将前方左侧指示灯熄灭 if(IRIN=0) /判断延时期间是否有红外信号输入 ExeFlag=1; /将可执行标志位置1
展开阅读全文