智能循迹小车分析方案.docx
《智能循迹小车分析方案.docx》由会员分享,可在线阅读,更多相关《智能循迹小车分析方案.docx(20页珍藏版)》请在冰豆网上搜索。
智能循迹小车分析方案
智能循迹小车设计
专业:
自动化
班级:
0804班
姓名:
指导老师:
2018年8月——2018年10月
摘要:
本课题是基于AT89C52单片机的智能小车的设计与实现,小车完成的主要功能是能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。
小车系统以AT89S52单片机为系统控制处理器;
采用红外传感获取赛道的信息,来对小车的方向和速度进行控制。
此外,对整个控制软件进行设计和程序的编制以及程序的调试,并最终完成软件和硬件的融合,实现小车的预期功能。
引言
当今世界,传感器技术和自动控制技术正在飞速发展,机械、电气和电子信息已经不再明显分家,自动控制在工业领域中的地位已经越来越重要,“智能”这个词也已经成为了热门词汇。
现在国外的自动控制和传感器技术已经达到了很高的水平,特别是日本,比如日本本田制作的机器人,其仿人双足行走已经做得十分逼真,而且具有一定的学习能力,还据说其智商已达到6岁儿童的水平。
作为机械行业的代表产品—汽车,其与电子信息产业的融合速度也显著提高,呈现出两个明显的特点:
一是电子装置占汽车整车<特别是轿车)的价值量比例逐步提高,汽车将由以机械产品为主向高级的机电一体化方向发展,汽车电子产业也很有可能成为依托整车制造业和用车提升配置而快速成为新的增长点;二是汽车开始向电子化、多媒体化和智能化方向发展,使其不仅作为一种代步工具、同时能具有交通、娱乐、办公和通讯等多种功能。
无容置疑,机电一体化人才的培养不论是在国外还是国内,都开始重视起来,主要表现在大学生的各种大型的创新比赛,比如:
亚洲广播电视联盟亚太地区机器人大赛但很现实的状况是,国内不论是在机械还是电气领域,与国外的差距还是很明显的,所以作为机电一体化学生,必须加倍努力,为逐步赶上国外先进水平并超过之而努力。为了适应机电一体化的发展在汽车智能化方向的发展要求,提出简易智能小车的构想,目的在于:通过独立设计并制作一辆具有简单智能化的简易小车,获得工程整体设计的能力,并掌握多通道多样化传感器综合控制的方法。所以立“智能循迹小车”一题作为尝试。此项设计是在以杨老师提供的小车为基础上,采用AT89C52单片机作为控制核心,实现能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。一、实验目的:通过设计进一步掌握51单片机的应用,特别是在嵌入式系统中的应用。进一步学习51单片机在系统中的控制功能,能够合理设计单片机的外围电路,并使之与单片机构成整个系统。二、设计方案:该智能车采用红外传感器对赛道进行道路检测,单片机根据采集到的信号的不同状态判断小车当前状态,通过电机驱动芯片L298N发出控制命令,控制电机的工作状态以实现对小车姿态的控制。三、报告内容安排:本技术报告主要分为三个部分。第一部分是对整个系统实现方法的一个概要说明,主要内容是对整个技术原理的概述;第二部分是对硬件电路设计的说明,主要介绍系统传感器的设计及其他硬件电路的设计原理等;第三部分是对系统软件设计部分的说明,主要内容是智能模型车设计中主要用到的控制理论、算法说明及代码设计介绍等。 技术方案概要说明本模型车的电路系统包括电源管理模块、单片机模块、传感器模块、电机驱动模块。工作原理:Ø利用红外采集模块中的红外发射接收对管检测路面上的轨迹Ø将轨迹信息送到单片机Ø单片机采用模糊推理求出转向的角度和行走速度,然后去控制行走部分Ø最终完成智能小车可以按照路面上的轨迹运行。 硬件电路的设计1、最小系统:小车采用atmel公司的AT89C52单片机作为控制芯片,图1是其最小系统电路。主要包括:时钟电路、电源电路、复位电路。其中各个部分的功能如下:1、时钟电路:给单片机提供一个外接的16MHz的石英晶振。2、电源电路:给单片机提供5V电源。3、复位电路:在电压达到正常值时给单片机一个复位信号。图1单片机最小系统原理图 2、电源电路设计:模型车通过自身系统,采集赛道信息,获取自身速度信息,加以处理,由芯片给出指令控制其前进转向等动作,各部分都需要由电路支持,电源管理尤为重要。在本设计中,51单片机使用5V电源,电机及舵机使用6V电源。考虑到电源为充电电池组,额定电压为7.2V,实际充满电后电压则为6.5-6.8V,所以单片机及传感器模块采用7805稳压后的5V电源供电,舵机及电机直接由电池供电。 3、传感器电路:光电寻线方案一般由多对红外收发管组成,通过检测接收到的反射光强,判断黑白线。原理图由红外对管和电压比较器两部分组成,红外对管输出的模拟电压通过电压比较器转换成数字电平输出到单片机。 图2赛道检测原理图:4、电机驱动电路:电机驱动芯片L298N是SGS公司的产品,内部包含4通道逻辑驱动电路。是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。其引脚排列如图1中U4所示,1脚和15脚可单独引出连接电流采样电阻器,形成电流传感信号。L298可驱动2个电机,OUT1、OUT2和OUT3、OUT4之间分别接2个电动机。5、7、10、12脚接输入控制电平,控制电机的正反转,ENA,ENB接控制使能端,控制电机的停转。也利用单片机产生PWM信号接到ENA,ENB端子,对电机的转速进行调节。L298N的逻辑功能:表1SHARPGP2D12实物图 外形及封装:图3L298N实物图L298N电路原理图:由于一片L298N可以直接驱动两个电机,但是为了加大驱动力,我们采用两路并联的方式来驱动电机。图3.3L298N电路图 软件系统的实现小车循迹规则:若小车偏左的时候,车轮将向右偏转;若小车偏右,车轮将向左偏转;若没有偏移,小车将继续向前;若小车完全偏离黑色轨迹,小车后退以寻找黑色轨迹。小车程序:#include"reg52.h"#definedet_Dist2.55//单个脉冲对应的小车行走距离,其值为车轮周长/4#defineRD9//小车对角轴长度#definePI3.1415926#defineANG_9090#defineANG_90_T102#defineANG_180189/*============================全局变量定义区============================*/sbitP10=P1^0。//控制继电器的开闭sbitP11=P1^1。//控制金属接近开关sbitP12=P1^2。//控制颜色传感器的开闭sbitP07=P0^7。//控制声光信号的开启sbitP26=P2^6。//接收颜色传感器的信号,白为0,黑为1sbitP24=P2^4。//左sbitP25=P2^5。//右接收左右光传感器的信号,有光为0unsignedcharmType=0。//设置运动的方式,0向前1向左2向后3向右unsignedcharDirection=0。//小车的即时朝向0朝上1朝左2朝下3朝右unsignedsX=50。unsignedcharsY=0。//小车的相对右下角的坐标CMunsignedcharStartTask=0。//获得铁片后开始执行返回卸货任务,StartTask置一unsignedcharInter_EX0=0。//完成一个完整的任务期间只能有一次外部中断//Inter_EX0记录外部中断0的中断状态//0动作最近的前一次未中断过,//1动作最近的前一次中断过unsignedcharcntIorn=0。//铁片数unsignedcharbkAim=2。//回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值>unsignedcharLight_Flag=0。//进入光引导区的标志(1>unsignedintcntTime_5Min=0。//时间周期数,用于T0精确定时unsignedintcntTime_Plues=0。//霍尔开关产生的脉冲数/*============================全局变量定义区============================*/ /*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/voiddelay(unsignedinttime>//time*0.5ms延时{unsignedinti,j。for(j=0。jj++>{for(i=0。i<60。i++>{。}}} /*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*/ /*数码管显示,显示铁片的数目(设接在P0,共阴>*/voidDisplay(unsignedcharn>{charNumb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}。P0=Numb[n]。} /*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*/ /*光源检测程序:*//*用于纠正小车运行路线的正确性*/unsignedcharLightSeek(>{voidDisplay(unsignedchar>。bitl,r。l=P24。r=P25。if(l==0&&r==1>{//Display(1>。return(3>。//偏左,向右开}if(r==0&&l==1>{//Display(3>。return(1>。//偏右,向左开}if((l==1&&r==1>||(l==0&&r==0>>{//Display(9>。return(0>。//没有偏离,前进}} /*铁片检测程序:*//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/voidIornColor(>{delay(4000>。bkAim=(int>(P26>。Display((int>(P26>+2>。} /*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*/ /*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序:*//*对小车的运动进行微调*/voidctrMotor_Adjust(unsignedchart>{if(t==0>{P2=P2&240|11。//用来解决两电机不对称的问题delay(6>。}if(t==3>{P2=P2&250。//向左走delay(1>。}if(t==1>{P2=(P2&245>。delay(1>。//向右走}P2=((P2&240>|15>。delay(10>。}/*直走程序:*//*控制小车运动距离,dist为运动距离(cm>,type为运动方式(02>*//*只改变小车sX和sY的值而不改变Direction的值.*/voidctrMotor_Dist(floatdist,unsignedchartype>{unsignedchart=0。mType=type。P2=((P2&240>|15>。cntTime_Plues=(int>(dist/det_Dist>。while(cntTime_Plues>{if(Inter_EX0==1&&StartTask==0>{cntTime_Plues=0。break。}if(Light_Flag==1>t=LightSeek(>。if(type==0>//向前走{P2=P2&249。delay(40>。ctrMotor_Adjust(t>。}if(type==2>//向后退{P2=P2&246。delay(50>。ctrMotor_Adjust(t>。}P2=((P2&240>|15>。if(mType==2>delay(60>。//刹车制动0.5mselsedelay(75>。} } /*拐弯程序:*//*控制小车运动角度,type为运动方式<13)*//*只改变小车Direction的值而不改变sX和sY的值*/voidctrMotor_Ang(unsignedcharang,unsignedchartype,unsignedchardir>{unsignedchari=0。mType=type。P2=((P2&240>|15>。cntTime_Plues=(int>((PI*RD*90/(180*det_Dist>*1.2>*ang/90>。while(cntTime_Plues>{if(Inter_EX0==1&&StartTask==0>{cntTime_Plues=0。break。}if(type==1>//向左走{P2=P2&250。delay(100>。ctrMotor_Adjust(0>。}if(type==3>//向右走{P2=P2&245。delay(100>。ctrMotor_Adjust(0>。}P2=((P2&240>|15>。delay(50>。//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0>>{Direction=dir。}} /*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场>*/voidrchPlace(>{unsignedinttime,b,s,g。time=(int>(cntTime_5Min*0.065535>。//只有一个数码管时,轮流显示全过程秒数个十百b=time%100。s=(time-b*100>%100。g=(time-b*100-s*10>%10。if(bkAim==2>{//到达停车场了,停车EA=0。P2=((P2&240>|15>。while(1>{Display(10>。//Ndelay(2000>。Display(cntIorn>。delay(2000>。Display(11>。//Adelay(2000>。Display(b>。delay(2000>。Display(s>。delay(2000>。Display(g>。delay(2000>。}}else{if(Inter_EX0==1&&StartTask==1>P10=0。//到达仓库,卸下铁片}} /*无任务模式:*//*设置小车的固定运动路线,未发现铁片时的运动路线*/voidBasicRoute(>{//Light_Flag=1。ctrMotor_Dist(153,0>。//Light_Flag=0。ctrMotor_Ang(ANG_90,1,1>。ctrMotor_Dist(100-sX,0>。ctrMotor_Dist(125,2>。ctrMotor_Dist(73,0>。ctrMotor_Ang(ANG_90,1,2>。//Light_Flag=1。ctrMotor_Dist(153,0>。//Light_Flag=0。ctrMotor_Ang(ANG_180,1,0>。rchPlace(>。} /*任务模式:*//*设置小车的发现铁片后的运动路线*/voidTaskRoute(>{//基本运行路线表,记载拐弯0向前1左拐2向后3右拐,正读去A区。反读去B区StartTask=1。ctrMotor_Ang(ANG_90_T,1,2>。if(bkAim==1>//仓库A{ctrMotor_Dist(10,0>。P2=((P2&240>|15>。delay(60>。ctrMotor_Ang(ANG_90_T,1,3>。ctrMotor_Dist(100-sX,2>。ctrMotor_Ang(ANG_90_T,1,2>。Light_Flag=1。ctrMotor_Dist(153,2>。Light_Flag=0。//ctrMotor_Ang(208,1,0>。}elseif(bkAim==0>//仓库B{ctrMotor_Dist(10,0>。P2=((P2&240>|15>。delay(60>。ctrMotor_Ang(ANG_90_T,1,3>。ctrMotor_Dist(100-sX,0>。ctrMotor_Ang(ANG_90_T,1,0>。Light_Flag=1。ctrMotor_Dist(153,2>。Light_Flag=0。//ctrMotor_Ang(208,1,0>。}delay(5000>。rchPlace(>。} /*---------------------------------------------*//*-------------------主程序段------------------*//*---------------------------------------------*/voidmain(>{delay(4000>。P2=0xff。//初始化端口P07=0。P1=0。TMOD=0x01。//初始化定时器0/1及其中断TL0=0。TH0=0。TR0=1。ET0=1。ET1=1。IT0=1。//初始化外部中断EX0=1。IT1=1。EX1=1。EA=1。P11=1。
但很现实的状况是,国内不论是在机械还是电气领域,与国外的差距还是很明显的,所以作为机电一体化学生,必须加倍努力,为逐步赶上国外先进水平并超过之而努力。
为了适应机电一体化的发展在汽车智能化方向的发展要求,提出简易智能小车的构想,目的在于:
通过独立设计并制作一辆具有简单智能化的简易小车,获得工程整体设计的能力,并掌握多通道多样化传感器综合控制的方法。
所以立“智能循迹小车”一题作为尝试。
此项设计是在以杨老师提供的小车为基础上,采用AT89C52单片机作为控制核心,实现能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。
一、实验目的:
通过设计进一步掌握51单片机的应用,特别是在嵌入式系统中的应用。
进一步学习51单片机在系统中的控制功能,能够合理设计单片机的外围电路,并使之与单片机构成整个系统。
二、设计方案:
该智能车采用红外传感器对赛道进行道路检测,单片机根据采集到的信号的不同状态判断小车当前状态,通过电机驱动芯片L298N发出控制命令,控制电机的工作状态以实现对小车姿态的控制。
三、报告内容安排:
本技术报告主要分为三个部分。
第一部分是对整个系统实现方法的一个概要说明,主要内容是对整个技术原理的概述;第二部分是对硬件电路设计的说明,主要介绍系统传感器的设计及其他硬件电路的设计原理等;第三部分是对系统软件设计部分的说明,主要内容是智能模型车设计中主要用到的控制理论、算法说明及代码设计介绍等。
技术方案概要说明
本模型车的电路系统包括电源管理模块、单片机模块、传感
器模块、电机驱动模块。
工作原理:
Ø利用红外采集模块中的红外发射接收对管检测路面上的轨迹
Ø将轨迹信息送到单片机
Ø单片机采用模糊推理求出转向的角度和行走速度,然后去控制
行走部分
Ø最终完成智能小车可以按照路面上的轨迹运行。
硬件电路的设计
1、最小系统:
小车采用atmel公司的AT89C52单片机作为控制芯片,图1是其最小系统电路。
主要包括:
时钟电路、电源电路、复位电路。
其中各个部分的功能如下:
1、时钟电路:
给单片机提供一个外接的16MHz的石英晶振。
2、电源电路:
给单片机提供5V电源。
3、复位电路:
在电压达到正常值时给单片机一个复位信号。
图1单片机最小系统原理图
2、电源电路设计:
模型车通过自身系统,采集赛道信息,获取自身速度信息,加以处理,由芯片给出指令控制其前进转向等动作,各部分都需要由电路支持,电源管理尤为重要。
在本设计中,51单片机使用5V电源,电机及舵机使用6V电源。
考虑到电源为充电电池组,额定电压为7.2V,实际充满电后电压则为6.5-6.8V,所以单片机及传感器模块采用7805稳压后的5V电源供电,舵机及电机直接由电池供电。
3、传感器电路:
光电寻线方案一般由多对红外收发管组成,通过检测接收到的反射光强,判断黑白线。
原理图由红外对管和电压比较器两部分组成,红外对管输出的模拟电压通过电压比较器转换成数字电平输出到单片机。
图2赛道检测原理图:
4、电机驱动电路:
电机驱动芯片L298N是SGS公司的产品,内部包含4通道逻辑驱动
电路。
是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。
其引脚排列如图1中U4所示,1脚和15脚可单独引出连接电流采样电阻器,形成电流传感信号。
L298可驱动2个电机,OUT1、OUT2和OUT3、OUT4之间分别接2个电动机。
5、7、10、12脚接输入控制电平,控制电机的正反转,ENA,ENB接控制使能端,控制电机的停转。
也利用单片机产生PWM信号接到ENA,ENB端子,对电机的转速进行调节。
L298N的逻辑功能:
表1SHARPGP2D12实物图
外形及封装:
图3L298N实物图
L298N电路原理图:
由于一片L298N可以直接驱动两个电机,但是为了加大驱动力,我们采用两路并联的方式来驱动电机。
图3.3L298N电路图
软件系统的实现
小车循迹规则:
若小车偏左的时候,车轮将向右偏转;若小车偏右,车轮将向左偏转;若没有偏移,小车将继续向前;若小车完全偏离黑色轨迹,小车后退以寻找黑色轨迹。
小车程序:
#include"reg52.h"
#definedet_Dist2.55//单个脉冲对应的小车行走距离,其值为车轮周长/4
#defineRD9//小车对角轴长度
#definePI3.1415926
#defineANG_9090
#defineANG_90_T102
#defineANG_180189
/*============================全局变量定义区============================*/
sbitP10=P1^0。
//控制继电器的开闭
sbitP11=P1^1。
//控制金属接近开关
sbitP12=P1^2。
//控制颜色传感器的开闭
sbitP07=P0^7。
//控制声光信号的开启
sbitP26=P2^6。
//接收颜色传感器的信号,白为0,黑为1
sbitP24=P2^4。
//左
sbitP25=P2^5。
//右接收左右光传感器的信号,有光为0
unsignedcharmType=0。
//设置运动的方式,0向前1向左2向后3向右
unsignedcharDirection=0。
//小车的即时朝向0朝上1朝左2朝下3朝右
unsignedsX=50。
unsignedcharsY=0。
//小车的相对右下角的坐标CMunsignedcharStartTask=0。//获得铁片后开始执行返回卸货任务,StartTask置一unsignedcharInter_EX0=0。//完成一个完整的任务期间只能有一次外部中断//Inter_EX0记录外部中断0的中断状态//0动作最近的前一次未中断过,//1动作最近的前一次中断过unsignedcharcntIorn=0。//铁片数unsignedcharbkAim=2。//回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值>unsignedcharLight_Flag=0。//进入光引导区的标志(1>unsignedintcntTime_5Min=0。//时间周期数,用于T0精确定时unsignedintcntTime_Plues=0。//霍尔开关产生的脉冲数/*============================全局变量定义区============================*/ /*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/voiddelay(unsignedinttime>//time*0.5ms延时{unsignedinti,j。for(j=0。jj++>{for(i=0。i<60。i++>{。}}} /*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*/ /*数码管显示,显示铁片的数目(设接在P0,共阴>*/voidDisplay(unsignedcharn>{charNumb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}。P0=Numb[n]。} /*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*/ /*光源检测程序:*//*用于纠正小车运行路线的正确性*/unsignedcharLightSeek(>{voidDisplay(unsignedchar>。bitl,r。l=P24。r=P25。if(l==0&&r==1>{//Display(1>。return(3>。//偏左,向右开}if(r==0&&l==1>{//Display(3>。return(1>。//偏右,向左开}if((l==1&&r==1>||(l==0&&r==0>>{//Display(9>。return(0>。//没有偏离,前进}} /*铁片检测程序:*//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/voidIornColor(>{delay(4000>。bkAim=(int>(P26>。Display((int>(P26>+2>。} /*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*/ /*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序:*//*对小车的运动进行微调*/voidctrMotor_Adjust(unsignedchart>{if(t==0>{P2=P2&240|11。//用来解决两电机不对称的问题delay(6>。}if(t==3>{P2=P2&250。//向左走delay(1>。}if(t==1>{P2=(P2&245>。delay(1>。//向右走}P2=((P2&240>|15>。delay(10>。}/*直走程序:*//*控制小车运动距离,dist为运动距离(cm>,type为运动方式(02>*//*只改变小车sX和sY的值而不改变Direction的值.*/voidctrMotor_Dist(floatdist,unsignedchartype>{unsignedchart=0。mType=type。P2=((P2&240>|15>。cntTime_Plues=(int>(dist/det_Dist>。while(cntTime_Plues>{if(Inter_EX0==1&&StartTask==0>{cntTime_Plues=0。break。}if(Light_Flag==1>t=LightSeek(>。if(type==0>//向前走{P2=P2&249。delay(40>。ctrMotor_Adjust(t>。}if(type==2>//向后退{P2=P2&246。delay(50>。ctrMotor_Adjust(t>。}P2=((P2&240>|15>。if(mType==2>delay(60>。//刹车制动0.5mselsedelay(75>。} } /*拐弯程序:*//*控制小车运动角度,type为运动方式<13)*//*只改变小车Direction的值而不改变sX和sY的值*/voidctrMotor_Ang(unsignedcharang,unsignedchartype,unsignedchardir>{unsignedchari=0。mType=type。P2=((P2&240>|15>。cntTime_Plues=(int>((PI*RD*90/(180*det_Dist>*1.2>*ang/90>。while(cntTime_Plues>{if(Inter_EX0==1&&StartTask==0>{cntTime_Plues=0。break。}if(type==1>//向左走{P2=P2&250。delay(100>。ctrMotor_Adjust(0>。}if(type==3>//向右走{P2=P2&245。delay(100>。ctrMotor_Adjust(0>。}P2=((P2&240>|15>。delay(50>。//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0>>{Direction=dir。}} /*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场>*/voidrchPlace(>{unsignedinttime,b,s,g。time=(int>(cntTime_5Min*0.065535>。//只有一个数码管时,轮流显示全过程秒数个十百b=time%100。s=(time-b*100>%100。g=(time-b*100-s*10>%10。if(bkAim==2>{//到达停车场了,停车EA=0。P2=((P2&240>|15>。while(1>{Display(10>。//Ndelay(2000>。Display(cntIorn>。delay(2000>。Display(11>。//Adelay(2000>。Display(b>。delay(2000>。Display(s>。delay(2000>。Display(g>。delay(2000>。}}else{if(Inter_EX0==1&&StartTask==1>P10=0。//到达仓库,卸下铁片}} /*无任务模式:*//*设置小车的固定运动路线,未发现铁片时的运动路线*/voidBasicRoute(>{//Light_Flag=1。ctrMotor_Dist(153,0>。//Light_Flag=0。ctrMotor_Ang(ANG_90,1,1>。ctrMotor_Dist(100-sX,0>。ctrMotor_Dist(125,2>。ctrMotor_Dist(73,0>。ctrMotor_Ang(ANG_90,1,2>。//Light_Flag=1。ctrMotor_Dist(153,0>。//Light_Flag=0。ctrMotor_Ang(ANG_180,1,0>。rchPlace(>。} /*任务模式:*//*设置小车的发现铁片后的运动路线*/voidTaskRoute(>{//基本运行路线表,记载拐弯0向前1左拐2向后3右拐,正读去A区。反读去B区StartTask=1。ctrMotor_Ang(ANG_90_T,1,2>。if(bkAim==1>//仓库A{ctrMotor_Dist(10,0>。P2=((P2&240>|15>。delay(60>。ctrMotor_Ang(ANG_90_T,1,3>。ctrMotor_Dist(100-sX,2>。ctrMotor_Ang(ANG_90_T,1,2>。Light_Flag=1。ctrMotor_Dist(153,2>。Light_Flag=0。//ctrMotor_Ang(208,1,0>。}elseif(bkAim==0>//仓库B{ctrMotor_Dist(10,0>。P2=((P2&240>|15>。delay(60>。ctrMotor_Ang(ANG_90_T,1,3>。ctrMotor_Dist(100-sX,0>。ctrMotor_Ang(ANG_90_T,1,0>。Light_Flag=1。ctrMotor_Dist(153,2>。Light_Flag=0。//ctrMotor_Ang(208,1,0>。}delay(5000>。rchPlace(>。} /*---------------------------------------------*//*-------------------主程序段------------------*//*---------------------------------------------*/voidmain(>{delay(4000>。P2=0xff。//初始化端口P07=0。P1=0。TMOD=0x01。//初始化定时器0/1及其中断TL0=0。TH0=0。TR0=1。ET0=1。ET1=1。IT0=1。//初始化外部中断EX0=1。IT1=1。EX1=1。EA=1。P11=1。
unsignedcharStartTask=0。
//获得铁片后开始执行返回卸货任务,StartTask置一
unsignedcharInter_EX0=0。
//完成一个完整的任务期间只能有一次外部中断
//Inter_EX0记录外部中断0的中断状态
//0动作最近的前一次未中断过,
//1动作最近的前一次中断过
unsignedcharcntIorn=0。
//铁片数
unsignedcharbkAim=2。
//回程目的地,0为A仓库,1为B仓库,2为停车场,
//(在MAIN中接受铁片颜色判断传感器的信号来赋值>
unsignedcharLight_Flag=0。
//进入光引导区的标志(1>
unsignedintcntTime_5Min=0。
//时间周期数,用于T0精确定时
unsignedintcntTime_Plues=0。
//霍尔开关产生的脉冲数
/*------------------------------------------------*/
/*-----------------通用延迟程序-------------------*/
voiddelay(unsignedinttime>//time*0.5ms延时
{
unsignedinti,j。
for(j=0。
jj++>{for(i=0。i<60。i++>{。}}} /*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*/ /*数码管显示,显示铁片的数目(设接在P0,共阴>*/voidDisplay(unsignedcharn>{charNumb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}。P0=Numb[n]。} /*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*/ /*光源检测程序:*//*用于纠正小车运行路线的正确性*/unsignedcharLightSeek(>{voidDisplay(unsignedchar>。bitl,r。l=P24。r=P25。if(l==0&&r==1>{//Display(1>。return(3>。//偏左,向右开}if(r==0&&l==1>{//Display(3>。return(1>。//偏右,向左开}if((l==1&&r==1>||(l==0&&r==0>>{//Display(9>。return(0>。//没有偏离,前进}} /*铁片检测程序:*//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/voidIornColor(>{delay(4000>。bkAim=(int>(P26>。Display((int>(P26>+2>。} /*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*/ /*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序:*//*对小车的运动进行微调*/voidctrMotor_Adjust(unsignedchart>{if(t==0>{P2=P2&240|11。//用来解决两电机不对称的问题delay(6>。}if(t==3>{P2=P2&250。//向左走delay(1>。}if(t==1>{P2=(P2&245>。delay(1>。//向右走}P2=((P2&240>|15>。delay(10>。}/*直走程序:*//*控制小车运动距离,dist为运动距离(cm>,type为运动方式(02>*//*只改变小车sX和sY的值而不改变Direction的值.*/voidctrMotor_Dist(floatdist,unsignedchartype>{unsignedchart=0。mType=type。P2=((P2&240>|15>。cntTime_Plues=(int>(dist/det_Dist>。while(cntTime_Plues>{if(Inter_EX0==1&&StartTask==0>{cntTime_Plues=0。break。}if(Light_Flag==1>t=LightSeek(>。if(type==0>//向前走{P2=P2&249。delay(40>。ctrMotor_Adjust(t>。}if(type==2>//向后退{P2=P2&246。delay(50>。ctrMotor_Adjust(t>。}P2=((P2&240>|15>。if(mType==2>delay(60>。//刹车制动0.5mselsedelay(75>。} } /*拐弯程序:*//*控制小车运动角度,type为运动方式<13)*//*只改变小车Direction的值而不改变sX和sY的值*/voidctrMotor_Ang(unsignedcharang,unsignedchartype,unsignedchardir>{unsignedchari=0。mType=type。P2=((P2&240>|15>。cntTime_Plues=(int>((PI*RD*90/(180*det_Dist>*1.2>*ang/90>。while(cntTime_Plues>{if(Inter_EX0==1&&StartTask==0>{cntTime_Plues=0。break。}if(type==1>//向左走{P2=P2&250。delay(100>。ctrMotor_Adjust(0>。}if(type==3>//向右走{P2=P2&245。delay(100>。ctrMotor_Adjust(0>。}P2=((P2&240>|15>。delay(50>。//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0>>{Direction=dir。}} /*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场>*/voidrchPlace(>{unsignedinttime,b,s,g。time=(int>(cntTime_5Min*0.065535>。//只有一个数码管时,轮流显示全过程秒数个十百b=time%100。s=(time-b*100>%100。g=(time-b*100-s*10>%10。if(bkAim==2>{//到达停车场了,停车EA=0。P2=((P2&240>|15>。while(1>{Display(10>。//Ndelay(2000>。Display(cntIorn>。delay(2000>。Display(11>。//Adelay(2000>。Display(b>。delay(2000>。Display(s>。delay(2000>。Display(g>。delay(2000>。}}else{if(Inter_EX0==1&&StartTask==1>P10=0。//到达仓库,卸下铁片}} /*无任务模式:*//*设置小车的固定运动路线,未发现铁片时的运动路线*/voidBasicRoute(>{//Light_Flag=1。ctrMotor_Dist(153,0>。//Light_Flag=0。ctrMotor_Ang(ANG_90,1,1>。ctrMotor_Dist(100-sX,0>。ctrMotor_Dist(125,2>。ctrMotor_Dist(73,0>。ctrMotor_Ang(ANG_90,1,2>。//Light_Flag=1。ctrMotor_Dist(153,0>。//Light_Flag=0。ctrMotor_Ang(ANG_180,1,0>。rchPlace(>。} /*任务模式:*//*设置小车的发现铁片后的运动路线*/voidTaskRoute(>{//基本运行路线表,记载拐弯0向前1左拐2向后3右拐,正读去A区。反读去B区StartTask=1。ctrMotor_Ang(ANG_90_T,1,2>。if(bkAim==1>//仓库A{ctrMotor_Dist(10,0>。P2=((P2&240>|15>。delay(60>。ctrMotor_Ang(ANG_90_T,1,3>。ctrMotor_Dist(100-sX,2>。ctrMotor_Ang(ANG_90_T,1,2>。Light_Flag=1。ctrMotor_Dist(153,2>。Light_Flag=0。//ctrMotor_Ang(208,1,0>。}elseif(bkAim==0>//仓库B{ctrMotor_Dist(10,0>。P2=((P2&240>|15>。delay(60>。ctrMotor_Ang(ANG_90_T,1,3>。ctrMotor_Dist(100-sX,0>。ctrMotor_Ang(ANG_90_T,1,0>。Light_Flag=1。ctrMotor_Dist(153,2>。Light_Flag=0。//ctrMotor_Ang(208,1,0>。}delay(5000>。rchPlace(>。} /*---------------------------------------------*//*-------------------主程序段------------------*//*---------------------------------------------*/voidmain(>{delay(4000>。P2=0xff。//初始化端口P07=0。P1=0。TMOD=0x01。//初始化定时器0/1及其中断TL0=0。TH0=0。TR0=1。ET0=1。ET1=1。IT0=1。//初始化外部中断EX0=1。IT1=1。EX1=1。EA=1。P11=1。
j++>
for(i=0。
i<60。
i++>
{。
}
/*-----------------------------------------------*/
/*-------------------显示控制模块----------------*/
/*数码管显示,显示铁片的数目(设接在P0,共阴>*/
voidDisplay(unsignedcharn>
charNumb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}。
P0=Numb[n]。
/*-------------------传感器模块------------------*/
/*光源检测程序:
*/
/*用于纠正小车运行路线的正确性*/
unsignedcharLightSeek(>
{voidDisplay(unsignedchar>。
bitl,r。
l=P24。
r=P25。
if(l==0&&r==1>
//Display(1>。
return(3>。
//偏左,向右开
if(r==0&&l==1>
//Display(3>。
return(1>。
//偏右,向左开
if((l==1&&r==1>||(l==0&&r==0>>
{//Display(9>。
return(0>。
//没有偏离,前进
/*铁片检测程序:
/*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/
voidIornColor(>
delay(4000>。
bkAim=(int>(P26>。
Display((int>(P26>+2>。
/*------------------运动控制模块-----------------*/
/*====基本动作层:
完成基本运动动作的程序集====*/
/*运动调整程序:
/*对小车的运动进行微调*/
voidctrMotor_Adjust(unsignedchart>
if(t==0>
P2=P2&240|11。
//用来解决两电机不对称的问题
delay(6>。
if(t==3>
P2=P2&250。
//向左走
delay(1>。
if(t==1>
P2=(P2&245>。
//向右走
P2=((P2&240>|15>。
delay(10>。
/*直走程序:
/*控制小车运动距离,dist为运动距离(cm>,type为运动方式(02>*/
/*只改变小车sX和sY的值而不改变Direction的值.*/
voidctrMotor_Dist(floatdist,unsignedchartype>
{unsignedchart=0。
mType=type。
cntTime_Plues=(int>(dist/det_Dist>。
while(cntTime_Plues>
if(Inter_EX0==1&&StartTask==0>
cntTime_Plues=0。
break。
if(Light_Flag==1>t=LightSeek(>。
if(type==0>//向前走
P2=P2&249。
delay(40>。
ctrMotor_Adjust(t>。
if(type==2>//向后退
P2=P2&246。
delay(50>。
if(mType==2>delay(60>。
//刹车制动0.5ms
elsedelay(75>。
/*拐弯程序:
/*控制小车运动角度,type为运动方式<13)*/
/*只改变小车Direction的值而不改变sX和sY的值*/
voidctrMotor_Ang(unsignedcharang,unsignedchartype,unsignedchardir>
unsignedchari=0。
cntTime_Plues=(int>((PI*RD*90/(180*det_Dist>*1.2>*ang/90>。
if(type==1>//向左走
delay(100>。
ctrMotor_Adjust(0>。
if(type==3>//向右走
P2=P2&245。
if(!
(Inter_EX0==1&&StartTask==0>>
Direction=dir。
/*====基本路线层:
描述小车基本运动路线的程序集====*/
/*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场>*/
voidrchPlace(>
{unsignedinttime,b,s,g。
time=(int>(cntTime_5Min*0.065535>。
//只有一个数码管时,轮流显示全过程秒数个十百
b=time%100。
s=(time-b*100>%100。
g=(time-b*100-s*10>%10。
if(bkAim==2>
//到达停车场了,停车
EA=0。
while(1>
Display(10>。
//N
delay(2000>。
Display(cntIorn>。
Display(11>。
//A
Display(b>。
Display(s>。
Display(g>。
else
if(Inter_EX0==1&&StartTask==1>P10=0。
//到达仓库,卸下铁片
/*无任务模式:
/*设置小车的固定运动路线,未发现铁片时的运动路线*/
voidBasicRoute(>
{//Light_Flag=1。
ctrMotor_Dist(153,0>。
//Light_Flag=0。
ctrMotor_Ang(ANG_90,1,1>。
ctrMotor_Dist(100-sX,0>。
ctrMotor_Dist(125,2>。
ctrMotor_Dist(73,0>。
ctrMotor_Ang(ANG_90,1,2>。
//Light_Flag=1。
ctrMotor_Ang(ANG_180,1,0>。
rchPlace(>。
/*任务模式:
/*设置小车的发现铁片后的运动路线*/
voidTaskRoute(>
//基本运行路线表,记载拐弯0向前1左拐2向后3右拐,正读去A区。
反读去B区
StartTask=1。
ctrMotor_Ang(ANG_90_T,1,2>。
if(bkAim==1>//仓库A
ctrMotor_Dist(10,0>。
delay(60>。
ctrMotor_Ang(ANG_90_T,1,3>。
ctrMotor_Dist(100-sX,2>。
Light_Flag=1。
ctrMotor_Dist(153,2>。
Light_Flag=0。
//ctrMotor_Ang(208,1,0>。
elseif(bkAim==0>//仓库B
ctrMotor_Ang(ANG_90_T,1,0>。
delay(5000>。
/*---------------------------------------------*/
/*-------------------主程序段------------------*/
voidmain(>
P2=0xff。
//初始化端口
P07=0。
P1=0。
TMOD=0x01。
//初始化定时器0/1及其中断
TL0=0。
TH0=0。
TR0=1。
ET0=1。
ET1=1。
IT0=1。
//初始化外部中断
EX0=1。
IT1=1。
EX1=1。
EA=1。
P11=1。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1