全国电子设计大赛小车设计论文.docx
《全国电子设计大赛小车设计论文.docx》由会员分享,可在线阅读,更多相关《全国电子设计大赛小车设计论文.docx(18页珍藏版)》请在冰豆网上搜索。
全国电子设计大赛小车设计论文
2011年全国大学生电子设计竞赛
设计报告
智能小车(本科C题)
广西赛区【94组】
摘要
本系统是以AT89S52单片机为控制核心的智能小车的设计,采用L298构成电机驱动电路,,利用红外对管检测黑线,同时还用超声波传感器实现两车距离的测量,完成超车功能,其中速度由单片机输出的PWM波控制。
AT80S52单片机是一款八位单片机,它的易用性和多功能性受到了广大使用者的好评。
由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。
利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量度方面能达到工业实用的要求,因此在移动机器人的研制上也得到了广泛的应用。
一、系统设计
1.1设计要求
甲车车头紧靠起点标志线,乙车车尾紧靠边界,甲、乙两辆小车同时起动,先后通过起点标志线,在行车道同向而行,实现两车交替超车领跑功能。
跑道如图1所示。
1.1.1基本要求
(1)甲车和乙车分别从起点标志线开始,在行车道各正常行驶一圈。
(2)甲、乙两车按图1所示位置同时起动,乙车通过超车标志线后在超车区内实现超车功能,并先于甲车到达终点标志线,即第一圈实现乙车超过甲车。
(3)甲、乙两车在完成
(2)时的行驶时间要尽可能的短。
1.1.2发挥部分
(1)在完成基本要求
(2)后,甲、乙两车继续行驶第二圈,要求甲车通过超车标志线后要实现超车功能,并先于乙车到达终点标志线,即第二圈完成甲车超过乙车,实现了交替领跑。
甲、乙两车在第二圈行驶的时间要尽可能的短。
(2)甲、乙两车继续行驶第三圈和第四圈,并交替领跑;两车行驶的时要尽可能的短。
(3)在完成上述功能后,重新设定甲车起始位置(在离起点标志线前进方向40cm范围内任意设定),实现甲、乙两车四圈交替领跑功能,行驶时间要尽可能的短。
1.2总体方案设计
1.2.1总体方案设计与比较
方案一:
采用各种类数字电路来组成小车的控制系统,对外围黑线检测信号,超声波测距,电机驱动,电源模块进行处理。
本方案电路复杂,灵活性不高,效率低,不利于小车智能化的扩展,对各路信号处理比较困难。
方案二:
采用AT89S51单片机作为整机的控制单元,红外线探头采用市面通用的发射管怀及接收头,经过单片机调制后发射,并用于检测边界线与标志线,控制小车前进及拐弯。
利用超声波检测与前面车辆的距离,从而实现超车。
此方案灵活,采用软件方法解决复杂的硬件电路部分,使系统更加简洁化,各类功能易于实现,能很好地满足题目的要求。
比较以上两种方案的优缺点,方案二简洁、灵活、可扩展性好,能达到题目的设计要求,因此采用方案二来实现。
1.2.2系统组成
本系统主要由单片机系统、红外发射与接收电路、超声波发射电路和超声波检测接收电路、电源电路分别组成。
系统总框架图如图所示:
二、理论分析与计算
2.1信号检测与控制
超声波测距适用于高精度的中长距离测量。
本超声波测距采用AT89S52单片机,晶振:
12M,单片机用P3.4口输出超声波换能器74ALS04转化为所需的40K方波信号,利用外部中断0口监测超声波接收电路输出的返回信号。
通过超声波测距来检测两车的距离,从而判断小车超车的情况。
2.2两车之间的通信方法
进入超车区后,通过让乙车判断两车的距离,实现超车,并让甲车停止行驶。
然后甲车检测乙车是否完成超车,若完成任务继续行驶。
三、电路与程序设计
3.1主要单元电路设计
3.1.1信号产生及单片机系统设计
信号产生设计:
单片机通过P3.4引脚经反相器来控制超声波的发送,然后单片机不停的检测INT1引脚,当INT1引脚的电平由高电平变为低电平时就认为超声波已经返回。
计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍物之间的距离,单片机立即发出令绕过障碍物,实现超车。
单片机系统设计:
单片机采用AT89S52。
采用12MHz高精度的晶振,以获得较稳定的时钟频率,减小测量误差。
单片机用P3.4端口输出超声波并经74ALS04转化为所需的40KHz方波信号,利用外中断1口检测超声波接受电路输出的返回信号。
并由单片机指挥避障,实现超车。
单片机系统及电路图如下图所示:
3.1.2各模块电路
超声波发射原理及电路图:
超声波的发送是有单片机控制,单片机用P3.4端口输出40KHz超声波并经74ALS04转化为所需的方波信号发送出去。
发射电路图如图6所示。
图6超声波发射电路
超声波接收电路:
采用AT89S52来实现对CX20106A红外接收芯片和TCT40-10系列超声波转换模块的控制。
使用CX20106A集成电路对接收探头接收到的信号进行放大、滤波。
其总放大增益80db。
当CX20106A红外接收芯片接收到发出后返回的信号时,就立即向外部中断1发出信号,提示以有一个信号返回,单片机内部马上进行计算此时所在距离,然后进行绕开障碍物,实现超车。
接收电路如图7所示:
图7超声波接收电路
红外线发射与接收电路:
红外收发对管是一种利用红外线的开关管,接受管在接受和不接受红外线时电阻了发生明显变化,利用外围电路可以使输出产生明显的高低电平的变化,高低电平的变化输入单位片机就可使之识别,从而实现智能控制。
电路图如下:
电源电路:
根据题目要求,本系统使用电池供电,单片机必须与大电流器件分开供电,避免大电流器件对单片机造成干扰。
采用两路供电,这样可以使用其中一路单独为单片机、指示灯供电,另外一路为L298等供电。
下图为双5V电源电路:
3.2系统软件设计
3.2.1系统软件的组成
系统软件主要由主程序、超声波发生接收程序。
其中主程序包括边界线的检测和调整,转变标志线的判断与控制基转变,超声波发生子程序、接收中断程序用于实现小车的超车。
3.2.2主程序设计
主程序首先对系统环境初始化,设置定时器T1工作模式为16位的定时计数主程序流程图如下图,程序在附件1
3.2.3超声波发生子程序和超声波接收中断程序
超声波发生子程序的作用是通过P3.4端口发送2个左右的超声波信号频率,有外部中断1接收,约40KHz的方波,脉冲宽度为12us左右,同时把计数器T1打开进行计时。
超声波测距器主程序利用外中断1检测返回超声波信号,一旦接收到返回超声波信号(INT1引脚出现低电平),立即进入中断程序。
进入该中断后就立即关闭计时器T1停止计时,并将测距成功标志字赋值1。
如果当计时器溢出时还未检测到超声波返回信号,则定时器T1溢出中断将外中断1关闭,并将测距成功标志字赋值2以表示此次测距不成功。
程序流程图如下图,程序在附件2
四、系统测试
4.1测试使用的仪器:
包括秒表、直流稳压电源、信号发生器、示波器、数字万用表
测试方法
数字万用表主要用来测试分立元件的电阻、压降、截止/导通状态等参数;
信号发生器与示波器用于测试各光电传感器信号的接收与传输;
直流稳压电源在测试期间为各待测系统供电;
秒表用于产品测试,对制成的智能小车进行产品测试,进行计时。
4.2测试结果及分析
经过实验,甲、乙两辆小车基本可以实现基本要求。
由于时间有限,系统尚存在许多问题有待改进:
(1)抗干扰能力。
小车因赛道上会遇到各种植情况,如交叉线、断续线,以及还有赛道上的干扰点,以及环境光线不均匀造成的干扰。
(2)考虑节能问题。
由于要求小车的行驶时间要尽可能的短,采用功率相对比较大的电动机,但同时消耗电量也大。
还有在调试的过程中,红外线对管经常损坏,耗材多。
五、收获和总结
经过紧张的四天三夜的奋力拼搏,与小组其他成员通力协作,团结互助,终于完成了实验项目。
首先,我代表我们小组全体成员感谢主持本次竞赛的主委会和全体评审老师以及我们的辅导老师,谢谢你们给了我们一个提高自己和展现自己的舞台,让我们在以后的人生中更加自信和坚定。
在国庆节来临之际,我们全体成员祝所有评审老师和辅导教员节日快乐。
回想这四天三夜,短暂而充实,就我个人而言,我在许多方面都有了明显进步和收获,无论是拼搏精神还是团队精神都是对我一生都是一笔丰富的财富。
所以这次竞赛无论能否取得好名次,我都不会有遗憾,我会继续发扬这四天三夜的精神,在以后的日子里更加努力地提高自己、充实自己。
参考文献
[1]李建中编著.单片机原理及应用[M].西安:
西安电子科技大学出版社,2005.
[2]李全利主编.单片机原理及应用技术(第2版)[M]高等教育出版社,2004.
[5]郑国平主编模拟电子技术[M].北京:
清华大学出版社,2008
[4]周兴华编著手把手教你学单片机(第2版)[M].北京:
北京航空航天大学出版社,2007.
[3]求是科技编著单片机典型模块设计实例导航(第2版)[M].北京:
人民邮电出版社,2008.
附件1:
#include#include#defineucharunsignedchar#defineuintunsignedintsbitdi1=P0^0;sbitdi2=P0^1;sbitdi3=P0^2;sbitdi4=P0^3;sbitzuo=P1^3;sbityou=P1^2;sbitqian=P1^1;sbitout=P3^4;//发射超声波端口sbitin=P3^2;//接收超声波端口sbitkong=P2^7;volatileuintsec,count,time,on,t1=0;ucharflag;voidquit(){di1=0;di2=0;di3=0;di4=0;}voiddelayt(uinta){uinti,j;for(i=0;i<100;i++)for(j=0;jzuo)//左转压右线{
j=1;di1=1;di2=0;di3=1;di4=0;delayt(160);quit();delayt(100);qianjin();delayt(200);quit();}}if(j==1){
youzhuang();delayt(100);j=0;
}
}voidyo(){
uchari,j=0;for(i=0;i<100;i++){if(!
you&&zuo)//右转{j=1;di1=0;di2=1;di3=0;di4=1;delayt(200);quit();delayt(100);qianjin();delayt(200);quit();}}if(j==1){zuozhuang();j=0;delayt(100);}}voidqia(){if(!
zuo&&!
you&&!
qian)//前进{di1=1;di2=0;di3=0;di4=1;}}voidjiao(){qianjin();delayt(400);zuozhuang();delayt(350);qianjin();delayt(1400);zuozhuang();delayt(580);}volatileucharshu=0,aa=0,pan=0;voidmain(){TMOD=1;TH0=(65536-10000)/256;TL0=(65536-10000)/256;EA=0;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开while
(1){if(pan==1){quit();delayt(12000);pan=0;aa=1;}zu();yo();qia();if(qian){shu++;if(shu==1){qianjin();delayt(300);}if(shu<5&&shu>1){jiao();if((shu==4)&&kong){zu();yo();qianjin();delayt(1000);zu();yo();delayt(1000);zu();yo();delayt(300);pan=1;}}if(shu>=5){qianjin();delayt(1600);delayt(200);zuozhuang();delayt(1000);qianjin();if(!
aa){while(!
qian);}else{aa=0;tui();delayt(50);}quit();while
(1);}while(qian);}}}voidtim()interrupt1{zu();TH0=(65536-10000)/256;TL0=(65536-10000)/256;}
附件2:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
codeuchartemp1[]="环形跑道";
codeuchartemp2[]="距离前车CM";
codeuchartemp3[]="CM";
codeuchartemp4[]="现在状态为:
";//这是串口程序
/*****P1.0=A;P1.1=B;P1.2=A';P1.3=B'****/
codeunsignedcharGZZ[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};//四相八拍工作方式(正转)(输出为高电平时工作)
codeunsignedcharGFZ[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//四相八拍工作方式(正转)(输出为高电平时工作)
sbitout=P3^4;//发射超声波端口
sbitin=P3^2;//接收超声波端口
sbitPSB=P2^3;
//sbitbell=P3^6;
sbitDJ_1=P3^6;//电机1使能端
sbitDJ_2=P1^1;//电机2使能端
uintsec,count,time,on,t1=0;
ucharflag;
ucharT[3];
voidwrite_bt(ucharstar,ucharcom);
/********按键*****************/
sbitclk=P2^0;//脉冲信号
sbitda=P2^1;//R/W读写选择端口第五脚
sbitjian3=P2^2;
sbitjian4=P2^3;
voidSZ_JIAN();//按键设置自加函数
voidSZ_JIA();//按键设置自减函数
/**************************延时**************************/
voiddelay1()//延时2个空指令
{
_nop_();
_nop_();
}
voiddelay40ms(void)
{
uinti;
for(i=0;i<2000;i++);
}
voiddelay1ms(void)//延时1MS
{
uchari;
for(i=0;i<255;i++);
}
voiddelay(uintk)//延时Kms
{
uinti,j;
for(i=0;ifor(j=0;j<121;j++);
}
voiddelayn(uchari)
{
while(!
i);
}
voiddelay_anjian(uinttime)//按键延时函数
{
uintx,y;
for(x=time;x>0;x--)
for(y=110;y>0;y--);
}
voiddelay_dj(i)//电机延时函数
{
uintj,k;
for(j=0;j
for(k=0;k<250;k++);
}
/******************按键函数*****************************/
/****************************************/
/*******************电机函数***************************/
/*************中断发射频率******************/
voidtim(void)interrupt3
{uinti;
ET1=0;
TR0=0;
TH0=0;
TL0=0;
TR0=1;
for(i
=0;i<4;i++)//超声波发射40KHZ
{
out=~out;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
delayn(50);
IT0=1;//下降边延
ET1=1;
TH1=0Xb0;
TL1=0X3c;
EX0=1;
}
/****************中断*接收**********************/
voidr_int()interrupt0//接收超声波
{
_nop_();
if(in==0)//判接收到
{
TR0=0;
EX0=0;
time=TH0*256+TL0;//数据转换
count=time*0.185;
flag=1;
//bb=1;//置位标志位
while(!
in);//判是否已经完成转换
}
EX0=1;//接收完了就关闭中断接收
}
/*********总初始化********************************/
voidstart()//初始化
{
ET1=1;
TR1=1;
TMOD=0X11;//定时器工作方式
TH0=0;
TL0=0;
TH1=0xb0;//50ms
TL1=0x3c;
IT0=1;
EX0=1;
EA=1;//开启总中断
}
/****************************************************/
voidclk_in(ucharbbyte)//写时序程序
{
uchari;
for(i=0;i<8;i++)//总共移动八位
{
bbyte=bbyte<<1;//一位一位的移动
da=CY;//给一位数据
delay1();
clk=0;//时钟低
delay1();
clk=1;//时钟高
_nop_();
clk=0;//时钟低
}
}
/***********处理接收过来的数据*********************/
voidwrite_bt(ucharstar,ucharcom)
{
ucharH_data,L_data,a;
a=com;
H_data=a&0xf0;
a=com;
L_data=a<<4;
delay1ms();
clk_in(star);
delay1ms();
clk_in(H_data);
delay1ms();
clk_in(L_data);
delay1ms();
}
/*********LCD初始化***********************************/
voidLCDstart(void)
{
write_bt(0xf8,0x30);
write_bt(0xf8,0x01);
write_bt(0xf8,0x0c);
write_bt(0xf8,0x06);
}
/***********======变化的变量函数=====******************/
voidbian(void)
{
write_bt(0xf8,0x94);//给地址
delay40ms();
write_bt(0xfa,0x3a);//写":
"
delay40ms();
write_bt(0xfa,sec/1000+0x30);//百位fa表示写指令0x30表示转将ASCII换成数字
delay40ms();
write_bt(0xfa,sec%1000/100+0x30);//十位
delay40ms();
write_bt(0xfa,sec%100/10+0x30);//个位
delay40ms();
write_bt(0xfa,0X2E);//小数点
delay40ms();
write_bt(0xfa,sec%10+0x30);//十分位
delay40ms();
if(flag==1)//有接收到回来的超声波
{
flag=0;//清除
sec=count-20;
}
}
/********=======LCD写函数====将定义好的数组输出**************************/
voidwrite_lcd()
{
uchari;
write_bt(0xf8,0x80);delay40ms();//赋第一行位地址88表示第一行的起始地址f8表示写指令
for(i=0;i<16;i++)//一行16个字节
{
write_bt(0xfa,temp1[i]);delay40ms();//写第一行显示数组temp[i]
}
write_bt(0xf8,0x90);delay40ms();//第二行90表示第二行起始地址
for(i=0;i<16;i++)
{
write_bt(0xfa,temp2[i]);delay40ms();
}
write_bt(0xf8,0x88);delay40ms();//第三行88表示第三行的起始地址
for(i=0;i<16;i++)
{
write_bt(0xfa,temp3[i]);delay40ms();
}
write_bt(0xf8,0x98);delay40ms();//第四