1/19基于AT89S52单片机的巡线小车组员:潘伟裕、马李、梁海洋目录摘要················································2一、电路设计方案的分析····························21.1电源模块··································21.2红外传感模块······························31.3控制模块··································41.4电机驱动模块······························5二、硬件设计······································6三、程序编写·····································四、设计失败的分析及补救方案················五、心得体会································2/19摘要:本作品以AT89S52为核心,采用红外光传感器收集信号,再经LM339处理传输,采用双电机,利用“H桥”驱动。本次项目设计,目的是促进小组成员之间的沟通,增进小组成员之间的感情,提高动手能力。通过这次项目培训,我们的成员相互沟通交流、相互帮助学习,锻炼了我们的动手能力,促进了相互间的交流认识。一、电路设计方案的分析1.1电源模块用12v电池供电,12v经“H桥”驱动电机,同时经过7805输出稳定的5v电压为红外系统、控制系统供电。电路如图(1.1):3/191.2红外传感模块本车子用5个红外传感器,每个红外发射管接1K电阻限流,接收管则串联一个6.8k电阻和一个10k可调电阻,以适应不同的光线环境(注:6.8k后改为250k,10k可调电阻失去作用)。电路如图1.2:红外传感器由left_21、left_11、middle、right_11、right_21输出图1.2红外传感电路4/19感应信号。由于信号若直接输给单片机,单片机没法辨认,故经比较器LM339处理,再传给单片机,电路如图1.3(注:图中R1_1、R1_2、R1_3、R1_4后改为每个LM339接10k可调电阻)图中两芯片的“in+4”脚没有用做红外信号的输入,但直接接vcc,是为了不让管脚悬空,利于芯片工作的稳定。LM339的输出管脚以被外界拉低,故接上拉电阻,再接到单片机管脚。图1.3LM339电路5/191.3控制模块控制模块使用AT89S52单片机,用P2.0、P2.1、P2.2、P2.3、P2.4接收信号,用管脚P1.0、P1.1、P1.2、P1.3控制电机的驱动。电路如图1.4:1.4电机驱动模块采用双电机驱动,”H桥”可双向驱动电机。电机调速由单片机输出的方波实现,频率为30HZ左右,脉宽占空比大,则电机转速图1.4单片机电路6/19大。电路如图1.5:图中“电机1_1”、“电机1_2”是一个电机的两个接口。另外一个电机的驱动电路与之相同。图1.5电机驱动电路7/19二、硬件设计三、程序编写实现程序如下:#includereg52.h#defineucharunsignedchar#definerun_right(){left_f=1;left_b=0;right_f=1;right_b=1;}#definerun_left(){left_f=1;left_b=1;right_f=0;right_b=1;}#defineforward(){left_f=1;left_b=0;right_f=0;right_b=1;}sbitleft_2=P2^0;sbitleft_1=P2^1;sbitmid=P2^2;sbitright_1=P2^3;sbitright_2=P2^4;sbitleft_f=P1^0;sbitleft_b=P1^1;sbitright_b=P1^2;sbitright_f=P1^3;/******************延时函数*********************/8/19voiddelay(intx){inta;for(;x0;x--)for(a=30;a--;);}/***********************************************//*****************电机控制*********************/voidfor_left_2()//车子要右转,速度最慢{while(1){run_right();delay(4);run_left();delay(1);//右转脉宽大于左转脉宽,实现右拐弯if(!mid){delay(20);if(!mid)9/19{run_left();delay(20);//调整车身至压线forward();break;}}}}voidfor_left_1()//车子要右转,速度较慢{while(1){run_right();delay(3);run_left();delay(2);//右转脉宽大于左转脉宽,实现右拐弯if(!mid){delay(20);if(!mid){run_left();delay(20);//调整车身至压线10/19forward();break;}}}}voidfor_right_1()//车子要左传,速度较慢{while(1){run_left();delay(3);run_right();delay(2);//左转脉宽大于右转脉宽,实现左拐弯if(!mid){delay(20);if(!mid){run_right();delay(20);//调整车身至压线forward();break;11/19}}}}voidfor_right_2()//车子左转,{while(1){run_left();delay(4);run_right();delay(1);//左转脉宽大于右转脉宽,实现左拐弯if(!mid){delay(20);if(!mid){run_right();delay(20);//调整车身至压线forward();break;}}12/19}}voidfor_mid(){forward();}/***********************************************//*******************读取、处理信号***************/voidget_deal(){if(!left_2||(!left_2&&!left_1)){delay(1);if(!left_2||(!left_2&&!left_1))for_left_2();}if(!left_1||(!left_1&&!mid)){delay(1);if(!left_1||(!left_1&&!mid))for_left_1();}if(!mid){delay(1);if(!mid)for_mid();}if(!right_1||(!right_1&&!mid)){delay(1);if(!right_1||(!right_1&&!mid))for_right_1();}13/19if(!right_2||(!right_2&&!right_1)){delay(1);if(!right_2||(!right_2&&!right_1))for_right_2();delay(1);}}/***********************************************/voidmain(){forward();while(1){get_deal();}}四、设计失败的分析及补救方案:该设计最终不能实现预期效果,主要出现以下问题:1、红外传感器对自身到地面的距离相当敏感,地面折皱对其影响比较大。另外,电路中“6.8K的电阻+10k可调电阻”对红外接收的信号几乎不起任何作用,后改为250k,信号才明显,但此时10k可调电阻不14/19能工作了,故LM339处参考电压改用10k可调电阻实现,以代替红外接收管所串联的10k可调电阻的工作任务。改过后,信号能够正确传到单片机。2、驱动电机的“H桥”本可以正常工作,接上LM339模块后失常(单片机控制电机的管脚被拉高)。同时7805的输出电压也失常,红外模块也没法正常工作。经检测,当12v电源用大功率电源,电机会不受单片机控制而转动,同时“H桥”中的8550三极管发烫(经检测,无烧坏);当用限流300mA的电源时,电机低速转动,三极管不发烫,但7805输出电压为0,红外传感、控制模块不工作,单片机从实验板上输信号控制(共地)才正常。原因可能有二:一是“H桥”错误,偏置电阻不正确;二是驱动电机时,电源输出的功率几乎被电机吃掉,以致7805不正常工作,单片机不断掉电复位。补救方案:1、把电源部分修改为:双电源供电,12v直接驱动“H桥”,5v电源供电给其他模块(两电源共地),仍然不能正常工作。放弃该方案。2、把电路简化,利用继电器控制电机,由单片机P1.0、P1.1分别控制两电机的开关。比较器改用LM324,使用其中3组比较,红外改用三个(左中右)。可以实现车子沿15/19着简单的路线行走。(因直接用万用板焊接,故暂无电路图。)其实现程序如下:#includereg52.hsbitright=P1^1;sbitleft=P1^0;sbitR=P2^3;sbitcenter=P2^2;sbitL=P2^0;#defineucharunsignedchar#defineuintunsignedint//宏定义标志位uchartemp;uchari;16/19voiddelay10ms(uchart){uchari,j,k;for(k=0;kt;k++)for(i=75;i0;i--)for(j=60;j0;j--);}voidturn(){if(R==1){delay10ms(10);if(R==1){while(center==1){right=0;17/19left=1;}}}if(L==1){delay10ms(10);if(L==1){while(center==1){right=1;left=0;}}}}voidsearching(){if(center==1){right=1;18/19left=1;}else{turn();}}voidmain(){while(1){searching();}}六、心得体会本次项目设计没有实现项目要求,其中有很多细锁的问题考虑19/19不周。但通过这次动手,我们学了很多知识,熟悉了用AltiumDesigner6.6画电路图、做PCB图并做出电路板;学会了用SolidWorks画实物图。更重要的是,这次项目设计让我们与小组成员相互交流、合作学习、增进感情;并且与其他同学的联系紧密了许多,从他们身上学到很多知识。