电子系统设计基于51单片机的循迹测雷小车.docx
《电子系统设计基于51单片机的循迹测雷小车.docx》由会员分享,可在线阅读,更多相关《电子系统设计基于51单片机的循迹测雷小车.docx(13页珍藏版)》请在冰豆网上搜索。
![电子系统设计基于51单片机的循迹测雷小车.docx](https://file1.bdocx.com/fileroot1/2023-1/9/04147ccd-9fba-4328-8380-7648242d4448/04147ccd-9fba-4328-8380-7648242d44481.gif)
电子系统设计基于51单片机的循迹测雷小车
电子系统设计课程设计报告
基于51单片机的智能循迹测雷小车
班级:
组员1:
组员2:
组员3:
任课老师:
高嵩
2013年6月20日
目录
目录
摘要
1.系统方案论证与比较
1.1电机驱动模块
1.27806和7808供电模块
1.3单片机最小系统模块
1.4传感器模块
2.详细软硬件分析
2.1整体框图
2.3核心电路原理图
2.4软件设计
3.系统调试
3.1硬件调试
3.2软件调试
3.3软硬联调
4.结论
参考文献
附录:
源程序
基于51单片机的智能循迹测雷小车
摘要:
本系统以ATMEL公司的89C51单片机为控制核心,采用7805和7808电源模块,采用LM298驱动电路控制直流电机转动,利用5个光电传感器对路面进行检测,制成了传感器控制电机转动的系统,满足题目设计要求,并可通过外部中断0对金属传感器进行检测,从而达到检测到“雷”时停车并报警的作用
关键词:
金属传感器;光电传感器;STC89C51;LM298;7805等
Basedon51single-chipsmartcartrackingminedetection
Abstract:
ThissystemATMELCorporation89C51microcontrollercore,using7805and7808powersupplymodule,drivingcircuitusingLM298DCmotorrotationcontrol,theuseoffivephotoelectricsensorstodetecttheroadsurface,madeofasensorcontrolmotorrotationsystem,designedtomeetthesubjectrequirementsandthroughexternalinterrupt0onthemetalsensortodetect,soastoachievedetection"Ray"stopandalarmwhentheroleof
Keywords:
metalsensor;photoelectricsensor;STC89C51;LM298;7805,etc.
1.系统方案设计
本系统主要由LM298组成的电机驱动模块、7805和7808供电模块、红外检测模块、以STC89C51单片机为控制核心的控制模块组成,下面分别论述这几个模块的选择。
1.1电机驱动模块
本系统最初设想采用ULN2003(图1)进行驱动,当时ULN2003驱动效果太差,电机无法达到所需的转速,所以我们采用了效果更好的LM298驱动电路,
图1
L298N是SGS公司的产品,内部包含4通道逻辑驱动电路。
是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。
可以通过LM298的逻辑功能(图2)表来很好的控制电机的转动
图2
LM298电机驱动模块的电路图如下:
1.27805和7808供电模块
7805三端稳压集成电路,顾名思义,三端IC是指这种稳压用的集成电路,只有三条引脚输出,分别是输入端、接地端和输出端。
用78系列三端稳压IC来组成稳压电源所需的外围元件极少,电路内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜。
在实际应用中,应在三端集成稳压电路上安装足够大的散热器。
下图为具体电路图。
7808与7805类似,这里不作过多解释。
1.3单片机最小系统
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。
对51系列单片机来说,最小系统一般应该包括:
单片机、晶振电路、复位电路。
对于单片机最小系统而言,晶振的大小决定了其处理速度,所以我们采用了11.0592M的晶振。
具体电路图如下:
1.4传感器模块
利用红外对管进行信号的采集,经电压比较后可直接送入单片机I/O口,另外一个为金属传感器,用法较为简单,只需接+8v左右电压即可工作,无需外围电路。
2.详细软硬件分析
2.1整体框图
2.2软件设计
2.2.1功能分析
单片机主要实现以下几个方面的功能:
(1)传感器信号的采集及数据处理;
(2)控制电机驱动;
(3)中断信号采集与处理;
2.2.2软件设计
对各主要功能块的软件设计如下:
(1)传感器信号及数据处理。
采用单片机P0口,对接收到的信号进行处理
(2)根据采集到的信号对电机进行控制。
根据测得的电压值,处理后发给LM298进行控制
2.2.3软件设计流程图
图11程序流程框图
3.系统调试
系统调试分为硬件调试、软件调试及软硬联调
3.1硬件调试
硬件根据理论值进行元器件的选择、绘制电路图、焊接电路、调试。
由于精度和干扰的影响,往往得到的结果和理论分析值又有一定的偏差,所以硬件调试难度很大。
3.2软件调试
本系统的软件程序完全由C51编写,C语言效率高,但同时也存在一些缺点,比如控制电机转速比较困难,需要用到PWM波,故省去了这一控制。
在调试过程中采取的是自上至下的调试方法,单独调试好每一个模块,然后在联结成一个完整的系统调试。
3.3软硬联调
由于本系统的软硬件联系很紧密,一般是一个接收和一个发送就能直接和硬件相联进行工作,因此在软硬件通调的情况下,系统的软硬件联调的难度不大。
4.结论
通过本次电子设计设计课程设计,深刻体会到了理论联系实践的重要性,体会到了调试电路的复杂性,对自己的综合能力有了较大提升。
参考文献
[1]余小平,奚大顺.电子系统设计.第一版.北京:
北京航空航天大学出版社,2007.3
[2]童诗白,华成英.模拟电子技术基础.第四版.北京:
高等教育出版社,2006.5
[3]谭浩强.C程序设计.第三版.北京:
清华大学出版社,2008.11
附录:
源程序
核心控制程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitin1=P0^0;//循迹模块的信号输入管脚配置
sbitin2=P0^1;
sbitin3=P0^2;
sbitin4=P0^3;
sbitin5=P0^4;
sbitout1=P2^0;
sbitout2=P2^1;
sbitout3=P2^2;
sbitout4=P2^3;
ucharx=0;
sbitP06=P0^6;
ucharCount;
sbitSpeak=P0^5;//蜂鸣器器控制脚
voidDelay_xMs(uintx)
{
uinti,j;
for(i=0;i{
for(j=0;j<3;j++);
}
}
voidqianjin()
{
out1=0;
out2=1;
out3=0;
out4=1;
}
voidhoutui()
{
out1=1;
out2=0;
out3=1;
out4=0;
}
voidzuozhuan1()
{
out1=0;
out2=1;
out3=1;
out4=0;
}
voidzuozhuan2()
{
out1=0;
out2=1;
out3=0;
out4=0;
}
voidyouzhuan1()
{
out1=1;
out2=0;
out3=0;
out4=1;
}
voidyouzhuan2()
{
out1=0;
out2=0;
out3=0;
out4=1;
}
voidstop()
{
out1=1;
out2=1;
out3=1;
out4=1;
}
voiddengdai()//使小车停止当前所有动作,停止时间可调。
{
out1=0;
out2=0;
out3=0;
out4=0;
}
voiddelay(uchara)
{
uchari,j;
for(i=150;i>0;i--)
{
for(j=a;j>0;j--)
{}}
}
voiddelay_500ms(uchara)
{
unsignedchari,j,k,l;
for(i=15;i>0;i--)
{
for(j=200;j>0;j--)
{
for(k=150;k>0;k--);
}
for(l=a;l>0;l--);
}
}
voidplay(uchari)
{
while(i)
{
Speak=0;
delay(200);
Speak=1;
delay(200);
i--;
}
}
voidextern0()interrupt0
{
//x=1;
EA=0;
dengdai();
Speak=0;
//delay_500ms(100);
//Play_Song(0);
play(6);
//Speak=~Speak;
qianjin();
delay(200);
EA=1;
}
voidxunji()
{
if(in1==0&&in2==1&&in3==1&&in4==1&&in5==1)
{
while(!
in1)
{
zuozhuan2();
}
}
if(in1==1&&in2==0&&in3==1&&in4==1&&in5==1)
{
while(!
in2)
{
zuozhuan2();
}
}
if(in1==1&&in2==1&&in3==0&&in4==1&&in5==1)
{
while(!
in3)
{
qianjin();
}
}
if(in1==1&&in2==1&&in3==1&&in4==0&&in5==1)
{
while(!
in4)
{
youzhuan2();
}
}
if(in1==1&&in2==1&&in3==1&&in4==1&&in5==0)
{
while(!
in5)
{
youzhuan2();
}
}
}
voidmain()
{
delay_500ms(5);
EA=1;
EX0=1;
IT0=0;
qianjin();
while
(1)
{
xunji();
}
}