北京邮电大学实习报告实习名称电子工艺实习——智能寻迹小车学院信息与通信工程学院学生姓名**班级学号实习时间2013.7.1-2013.7.12实习地点主楼510实习内容(实习题目、实习进度安排等)实习题目:电子工艺实习——智能寻迹小车实习进度安排:7.1了解实验安排,准备实验材料7.2-7.4学习焊接技术,完成焊接小实验,完成小车焊接7.5购买传感器,了解单片机知识,学习使用KeiluVision47.8-7.10编写程序,进行调试,完成小车外壳设计7.11进行验收,书写实验报告学生实习总结(附页,不少于2000字)详见附页实习成绩评定遵照实习大纲并根据以下三方面按五级分制(优秀、良好、中等、及格、不及格)综合评定成绩:1、思想品德、实习态度、实习纪律等2、技术业务考核、笔试、口试、实际操作等3、实习报告、分析问题、解决问题的能力实习评语:实习成绩:指导教师签名:实习单位公章年月日智能循迹小车摘要:本设计是一种基于单片机控制的简易自动寻迹小车系统,包括小车系统构成软硬件设计方法。小车以AT90C52为控制核心,用单片机控制小车速度。利用红外光电传感器对路面黑色轨迹进行检测,并将路面检测信号反馈给单片机。单片机对采集到的信号予以分析判断,及时控制驱动电机以调整小车转向,从而使小车能够沿着黑色轨迹自动行驶,实现小车自动寻迹的目的,并且可以实现用七段数码管显示时间。关键词:单片机AT90C52红外传感器直流电机智能循迹小车1.任务及要求1.1任务设计一个基于直流电机的自动寻迹小车,使小车能够自动检测地面黑色轨迹,并沿着黑色车轨迹行驶。系统方案方框图如图1-1所示。检测(黑线)驱动电机软件控制控制小车图1-1系统方案方框图2.系统设计方案2.1小车循迹原理循迹是指小车在白色地板上循黑线行走,由于黑线和白色地板对光线的反射系数不同,根据接收到的反射光的强弱来判断“道路”。利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光。单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。2.2控制系统总体设计自动循迹小车控制系统由主控制电路模块、稳压电源模块、红外检测模块、电机及驱动模块等部分组成,控制系统的结构框图如图2-1所示。稳压电源模块主控芯片电机驱动芯片减速电机光电传感器电压比较器1、主控制电路模块:用AT90C52单片机、复位电路,时钟电路2、红外检测模块:红外传感器3、电机及驱动模块:电机驱动芯片、两个直流电机3.系统方案3.1寻迹传感器模块我们使用的红外线传感器安有五个探头,可以很好的提高小车的灵敏度。五个探头从左至右依次为S1,S2,S3,S4,S5。黑线略宽于S2,S3,S4的长度和,但小于五个探头的长度。当中间三个检测到黑线时,小车走直线。当小车偏离轨道时,即S2,S3为黑线,S4,S5为白线(或S3,S4为黑线,S1,S2为白线),小车进行向左(向右)调整。当小车遇到转弯(小角度)或偏离程度过大时,即S1为黑线,S2为白线(或S5为黑线,S4为白线),小车向左(向右)转弯。当小车遇到转弯(大角度)时,即S1,S2为黑线,S3,S4,S5为白线(S4,S5为黑线,S1,S1,S3为白线)时,小车圆周左转(圆周右转)。根据跑道情况,设置了当五个探头全黑时,小车圆周右转。为防止小车因速度过大冲出跑道无法找回跑道,设计了当五个探头检测到全白时,小车停止一段时间(防止电机由正转变为反转时,无法反应),然后后退到黑线上继续行进,这样可以提高小车的稳定性和可靠性,有效的防止了小车在轨道转弯过大时冲出弯道或原地打转。3.2控制器模块采用Atmel公司的AT90C52单片机作为主控制器。它是一个低功耗,高性能的8位单片机,片内含32k空间的可反复擦写100,000次Flash只读存储器,具有4K的随机存取数据存储器(RAM),32个I/O口,2个8位可编程定时计数器,且可在线编程、调试,方便地实现程序的下载与整机的调试。采用外部时钟,晶振频率为12MHZ。采用按键复位3.3电机及驱动模块图2-1控制系统的结构框图3.3.1电机电机采用直流减速电机,直流减速电机转动力矩大,体积小,重量轻,装配简单,使用方便。由于其内部由高速电动机提供原始动力,带动变速(减速)齿轮组,可以产生较大扭力。3.3.2驱动驱动模块采用专用芯片作为电机驱动芯片,将单片机与电机驱动芯片相连接,P1.0,P1.1控制左电机,P1.4,P1.5控制右电机,通过对单片机的编程就可实现两个直流电机的控制。3.4显示模块使用数码管显示行驶时间。数码管具备数字接口,显示清晰,价格较低,作为时间显示的器件性价比非常高,方便易行。本实验中利用七段数码管,与单片机连接,通过单片机语言编写显示行驶时间。3.5自动循迹小车总体设计当红外传感器开始接受信号,通过比较器将信号传如单片机中。小车进入寻迹模式,即开始不停地扫描与探测器连接的单片I/O口,一旦检测到某个I/O口有信号变化,就执行相应的判断程序,把相应的信号发送给电动机从而纠正小车的状态。单片机利用延时函数控制电机转动时间。4.软件设计4.1总体软件流程图小车进入寻迹模式后,即开始不停地扫描与探测器连接的单片I/O口,一旦检测到某个I/O口有信号变化,就执行相应的判断程序,把相应的信号发送给电动机从而纠正小车的状态。软件的主程序流程图如图4-1所示:系统初始化判断小车位置循迹子函数是否完成本次任务?开始NY图4-1主程序流程图4.2小车循迹流程图我们使用的红外线传感器安有五个探头,可以很好的提高小车的灵敏度。五个探头从左至右依次为S1,S2,S3,S4,S5。黑线略宽于S2,S3,S4的长度和,但小于五个探头的长度。当中间三个检测到黑线时,小车走直线。当小车偏离轨道时,即S2,S3为黑线,S4,S5为白线(或S3,S4为黑线,S1,S2为白线),小车进行向左(向右)调整。当小车遇到转弯(小角度)或偏离程度过大时,即S1为黑线,S2为白线(或S5为黑线,S4为白线),小车向左(向右)转弯。当小车遇到转弯(大角度)时,即S1,S2为黑线,S3,S4,S5为白线(S4,S5为黑线,S1,S1,S3为白线)时,小车圆周左转(圆周右转)。根据跑道情况,设置了当五个探头全黑时,小车圆周右转。为防止小车因速度过大冲出跑道无法找回跑道,设计了当五个探头检测到全白时,小车停止一段时间(防止电机由正转变为反转时,无法反应),然后后退到黑线上继续行进,这样可以提高小车的稳定性和可靠性,有效的防止了小车在轨道转弯过大时冲出弯道或原地打转。图4-2循迹流程图启动循迹模式探测黑线是否检测到黑线判断处理程序圆周左转Circleleft左转Turnleft向右调整Correctright右转Turnright后退NY继续前进向左调整Correctleft圆周右转Circleright4.3单片机测序#includereg52.h#defineuintunsignedint#defineucharunsignedcharsbitIN1=P1^0;//控制左电机前进sbitIN2=P1^1;//控制左电机后退sbitIN3=P1^4;//控制右电机前进sbitIN4=P1^5;//控制右电机后退sbitLED1=P2^6;//定义LED灯sbitLED2=P2^7;sbitS1=P3^2;//此处是传感器管脚位声明sbitS2=P3^3;sbitS3=P3^4;sbitS4=P3^5;sbitS5=P3^6;sbitBEEP=0xec;externunsignedcharg_motoCounter;externbdataunsignedcharg_trackResult;uintgate=0;ucharpos[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};ucharseg_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};ucharg_hour,g_min,g_sec;ucharg_msec=0;//************************************************//延时函数,在12MHz的晶振频率下//大约50us的延时//************************************************voiddelay_50us(uintt){ucharj;for(;t0;t--)for(j=19;j0;j--);}voidgo()//小车前进{LED1=0;LED2=0;IN1=0;IN2=1;IN3=1;IN4=0;}voidstop()//小车停止{LED1=0;LED2=0;IN1=0;IN2=0;IN3=0;IN4=0;}voidcorrectleft()//左修正34you{LED1=1;LED2=0;IN1=0;IN2=0;IN3=1;IN4=0;delay_50us(10);IN1=0;IN2=1;IN3=0;IN4=0;delay_50us(3);}voidcorrectright()//右修正{LED1=1;LED2=0;IN1=0;IN2=1;IN3=0;IN4=0;delay_50us(10);IN1=0;IN2=0;IN3=1;IN4=0;delay_50us(5);}voidturnleft()//小车左转{LED1=0;LED2=1;IN1=1;IN2=0;IN3=0;IN4=1;delay_50us(1);IN1=0;IN2=0;IN3=1;IN4=0;delay_50us(3);}voidturnright()//小车右转{LED1=1;LED2=0;IN1=1;IN2=0;IN3=0;IN4=1;delay_50us(1);IN1=0;IN2=1;IN3=0;IN4=0;delay_50us(3);}voidcircleleft()//圆周左转{LED1=0;LED2=1;IN1=1;IN2=0;IN3=0;IN4=1;delay_50us(3);IN1=0;IN2=0;IN3=1;IN4=0;delay_50us(20);IN1=1;IN2=0;IN3=0;IN4=0;delay_50us(3);}voidcircleright()//圆周右转{LED1=1;LED2=0;IN1=1;IN2=0;IN3=0;IN4=1;delay_50us(3);IN1=0;IN2=1;IN3=0;IN4=0;delay_50us(20);IN1=0;IN2=0;IN3=0;IN4=1;delay_50us(3);}voidback(){LED1=0;LED2=0;IN1=1;IN2=0;IN3=0;IN4=1;delay_50us(30);}voidshow_datetime(){staticunsignedcharindex=0;staticunsignedcharj=0;chari=0;switch(index){case0:i=g_hour/10;break;case1:i=g_hour%10;break;case2:i=g_min/10;break;case3:i=g_min%10;break;case4:i=g_sec/10;break;case5:i=g_sec%10;break;default:i=0;}P2=pos[index];P0=seg_data[i];j++;if(j10)return;j=0;index++;if(index5)index=0;}voidtime(){if(g_msec99){g_msec++;return;}g_msec=0;if(g_sec==59){g_sec=0;if(g_min==59){g_min=0;if(g_hour==23){g_hour=0;}else{g_hour++;}}else{g_min++;}}else{g_sec++;}}voidtimer_in