毕业设计0.docx

上传人:b****3 文档编号:5443858 上传时间:2023-05-08 格式:DOCX 页数:36 大小:676.61KB
下载 相关 举报
毕业设计0.docx_第1页
第1页 / 共36页
毕业设计0.docx_第2页
第2页 / 共36页
毕业设计0.docx_第3页
第3页 / 共36页
毕业设计0.docx_第4页
第4页 / 共36页
毕业设计0.docx_第5页
第5页 / 共36页
毕业设计0.docx_第6页
第6页 / 共36页
毕业设计0.docx_第7页
第7页 / 共36页
毕业设计0.docx_第8页
第8页 / 共36页
毕业设计0.docx_第9页
第9页 / 共36页
毕业设计0.docx_第10页
第10页 / 共36页
毕业设计0.docx_第11页
第11页 / 共36页
毕业设计0.docx_第12页
第12页 / 共36页
毕业设计0.docx_第13页
第13页 / 共36页
毕业设计0.docx_第14页
第14页 / 共36页
毕业设计0.docx_第15页
第15页 / 共36页
毕业设计0.docx_第16页
第16页 / 共36页
毕业设计0.docx_第17页
第17页 / 共36页
毕业设计0.docx_第18页
第18页 / 共36页
毕业设计0.docx_第19页
第19页 / 共36页
毕业设计0.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

毕业设计0.docx

《毕业设计0.docx》由会员分享,可在线阅读,更多相关《毕业设计0.docx(36页珍藏版)》请在冰点文库上搜索。

毕业设计0.docx

毕业设计0

智能超声波壁障小车设计

【摘要】本文介绍一壁障;测距;遥控

 

1设计要求………………………………………………………………………………………3

2总体设计方案…………………………………………………………………………………3

2.1系统控制模块设计方案论证…………………2.2超声波壁障设计方案论证………………………………………………………………3

2.3显示模块设计方案论证…………………………………………………………………4

3元器件介绍……………………………………………………………………………………4

3.1L298N电机专用驱动芯片………………………………………………………………4

3.2CX20106A超声波接收芯片………………………………………………………………5

3.33144霍尔传感器…………………………………………………………………………7

3.4ULN2003达林顿驱动器…………………………………………………………………7

4系统硬件电路…………………………………………………………………………………9

4.1超声波发送接收电路……………………………………………………………………9

4.2步进电机驱动电路………………………………………………………………………9

4.3串口下载电路……………………………………………………………………………10

4.4整体系统硬件电路………………………………………………………………………10

4.5系统PCB图………………………………………………………………………………11

5系统软件设计…………………………………………………………………………………11

5.1设计思路…………………………………………………………………………………11

5.2步进电机带动探头测距壁障流程图……………………………………………………12

5.3主程序流程图……………………………………………………………………………13

5.4系统总程序……………………………………………………………………………14

6总结与体会…………………………………………………………………………………14

7设计实物图……………………………………………………………………………14

参考文献…………………………………………………………………………………………15

附录………………………………………………………………………………………………15

 

一、设计要求

1、自动壁障,且壁障距离可调;

2、测距精度为1cm;

3、可遥控小车行驶;

4、可测小车行驶路程

5、可以定时、定路程控制小车停止或启动

二、设计方案

2.1系统控制模块设计方案论证

方案一:

采用STC12C5410单片机控制系统。

STC12C5410单片机带有PWM脉宽调制输出端口,可直接用来控制电机转速,且其运行速度是8051单片机的8~12倍;但其I/O口少,即使是32管脚的芯片也只有27个,不够用时需要扩展I/O口,比较麻烦。

方案二:

采用STC89C52单片机控制系统。

主要是通用I/O口多,一般不需要扩展,而且控制指令简单。

由于对8051系列单片机应用比较熟悉,且系统需要用到的I/O口较多,而控制电机转速的PWM信号用1个定时器即可模拟。

所以此次设计选择采用STC89C52单片机来控制。

2.2超声波壁障设计方案论证

方案一:

采用多方向超声波测距分析来实现壁障。

分别在小车的左、中、右三方向放置超声波探头,通过对三个方向超声波的测距数据分析对比确定障碍物位置,再通过调节小车左右电机转速差控制小车行驶方向实现壁障。

方案二:

通过步进电机带动一对超声波探头旋转进行各方向测距,将各方向测得数据通过单片机对比分析可得到障碍物方向,然后也是通过调节小车左右电机转速差控制小车行驶方向实现壁障。

方案一需要3对的超声波探头,为了防止信号相互干扰各个超声波发送信号要相互间隔,显得繁杂,而且当障碍物与左右侧的超声波探头大于一定角度时将不能接收到超声波信号,方案二通过180度扫描可以很好地检测到各个方向的障碍物,障碍物判断更可靠,壁障效果更好。

因此选用方案二设计。

2.3显示模块设计方案论证

方案一:

采用七段LED数码管显示相关数据。

数码管显示具有高亮、可视距离远、寿命长的优点,但是一位数码管只能显示一位数据,要想同时显示多个数据,只能增加数码管数目来实现,而且数码管的PCB布线繁杂,数目越多布线越困难。

方案二:

采用LCD1602液晶显示。

液晶显示具有耗能少、可同时显示数据多、控制指令简单、PCB布线简单等优点。

通过对比两种显示方案的优缺点,本次设计决定采用方案二。

3、元器件介绍

3.1L298N电机专用驱动芯片:

L298是SGS(通标标准技术服务有限公司)公司的产品,比较常见的是15脚Multiwatt封装的L298N,内部包含4通道逻辑驱动电路。

是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。

其引脚排列如上图中所示。

 L298N的引脚9为LOGICSUPPLYVOLTAGEVss,即逻辑供应电压。

引脚4为SUPPLYVOLTAGEVs,即驱动部分输入电压。

Vss电压要求输入最小电压为4.5V,最大可达36V;Vs电压最大值也是36V,但经过我的实验,Vs电压应该比Vss电压高,否则有时会出现失控现象。

它的引脚2,3,13,14为L298N芯片输入到电动机的输出端,其中引脚2和3能控制两相电机,对于直流电动机,即可控制一个电动机。

同理,引脚13和14也可控制一个直流电动机。

引脚6和11脚为电动机的使能接线脚。

引脚5,7,10,12为单片机输入到L298N芯片的输入引脚。

下表是其使能、输入引脚和输出引脚的逻辑关系:

ENA(B)

IN1(IN3)

IN2(IN4)

电机运行情况

H

H

L

正转

H

L

H

反转

H

同IN2(IN4)

同IN1(IN3)

快速停止

L

X

X

停止

控制使能引脚ENA或者ENB就可以实现PWM脉宽速度调整。

1脚和15脚可单独引出连接电流采样电阻器,形成电流传感信号,也可以直接接地。

在可设计中就将它们直接接地。

引脚8为芯片的接地引脚,它与L298N芯片的散热片连接在一起。

由于本芯片的工作电流比较大,发热量也比较大,所以在本芯片的散热片上又连接了一块铝合金,以增大它的散热面积。

该芯片的一些参数如下:

(1)逻辑部分输入电压:

6~7V

(2)驱动部分输入电压Vs:

4.8~46V

(3)逻辑部分工作电流Iss:

≤36mA

(4)驱动部分工作电流Io:

≤2A

(5)最大耗散功率:

25W(T=75℃)

(6)控制信号输入电平:

高电平:

2.3V≤Vin≤Vss,低电平:

-0.3V≤Vin≤1.5V

(7)工作温度:

-25℃~+130℃

(8)驱动形式:

双路大功率H桥驱动

3.2CX20106A超声波接收芯片

(1)CX20106A内部结构图:

(2)管脚说明:

3.33144霍尔传感器

3端输出需要接上拉电阻。

当有磁铁靠近时,霍尔传感器输出低电平。

3.4ULN2003达林顿驱动器

ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。

可直接驱动继电器等负载。

输入5VTTL电平,输出可达500mA/50V。

ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。

ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器。

ULN2003具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。

  

  

ULN2003芯片引脚图

ULN2003芯片引脚介绍

  引脚1:

CPU脉冲输入端,端口对应一个信号输出端。

  引脚2:

CPU脉冲输入端。

  引脚3:

CPU脉冲输入端。

  引脚4:

CPU脉冲输入端。

  引脚5:

CPU脉冲输入端。

  引脚6:

CPU脉冲输入端。

  引脚7:

CPU脉冲输入端。

  引脚8:

接地。

  引脚9:

该脚是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。

用于感性负载时,该脚接负载电源正极,实现续流作用。

如果该脚接地,实际上就是达林顿管的集电极对地接通。

  引脚10:

脉冲信号输出端,对应7脚信号输入端。

  

参考电路接法

引脚11:

脉冲信号输出端,对应6脚信号输入端。

  引脚12:

脉冲信号输出端,对应5脚信号输入端。

  引脚13:

脉冲信号输出端,对应4脚信号输入端。

  引脚14:

脉冲信号输出端,对应3脚信号输入端。

  引脚15:

脉冲信号输出端,对应2脚信号输入端。

 

引脚16:

脉冲信号输出端,对应1脚信号输入端。

 

四、硬件设计

4.1超声波发送接收电路

4.2步进电机驱动电路

 

4.3串口下载电路

4.4系统整体硬件电路

 

4.5系统PCB图

 

五、软件设计

5.1设计思路

本次设计软件部分主要包括测距壁障程序、遥控参数设置程序、显示程序、定时器及相关中断程序。

本次设计采用外部中断0接收超声波信号,外部中断1接收霍尔传感器信号测行驶路程,定时器0结合外部中断0为超声波发送接收计时进行测距,定时器1用来产生PWM信号控制小车转速,定时器2为小车行驶计时。

为了避免中断冲突造成错误处理,应该对某些中断设为高优先级,且中断执行程序不应过长。

为了提高壁障灵敏度,步进电机带动超声波探头进行180度来回旋转,且对于占用时间的显示程序能少的应尽量少。

遥控要能实现对小车左右轮控制、定路程停止点调节、定时停止及启动点调节,以及对壁障距离调节。

 

5.2步进电机带动探头旋转测距壁障流程图

 

5.3主程序流程图

 

5.4系统总程序:

见附录

六、总结体会

本次电子系统设计前期实现定时器控制PWM输出编程,步进电机驱动控制,超声波发送接收模块;设计后期画原理图和PCB图,然后腐蚀、焊接电路板;最后程序整合及改善以及调试,同时发现调试出现的问题并寻找解决办法。

经过不断的努力,提前完成了设计任务,并且各个预期功能基本实现。

前期通过观看网上壁障小车相关视频,有了用步进电机带动超声波探头转动的构思。

但是网上视频基本上都是超声波探头横着放的,我通过调试发现探头竖着放效果更好,准确度更高。

遥控模块直接采用TDL-9915*RF和TDL-9915*TF,遥控发射模块TDL-9915*RF按键后,接收模块TDL-9915*TF对应输出高电平,没按键时输出低电平。

这样可方便控制小车各种模式。

整个系统设计进行了半个多月,主要在编程和调试上花了很长时间,从中积累了许多编程经验,同时提高了自己的编程能力。

由于对51单片机及lcd1602液晶都比较熟悉,所以调试在这两模块问题不大。

而对于L298N电机驱动芯片和超声波模块以前都没接触过,因此调试时出现的问题较多,特别是超声波模块,网上相关资料对cx20106a的2脚电阻取值都在10欧姆以下,而自己设计的超声波模块最少也要120欧姆才能有效接收信号,否则小了会有自激信号。

这个问题最后是在网站解决的,许多网友也遇到了同样的问题。

这次的成功,极大地提高了自己电子设计的兴趣。

同时,要感谢赖老师的多番指导和提供意见,以及08电本班其他同学的帮助。

 

七、设计实物图

八、参考文献

1、郭天祥.《新概念51单片机C语言教程》.电子工业出版社.

2、严桂兰.《C语言程序设计与应用教程》.厦门大学出版社.

3、陆应华.《电子系统设计教程》.国防工业出版社.

4、李刚、林凌、姜苇《单片机系统设计与应用技巧》.北京航空航天大学出版社.

 

附录:

#include

#include"intrins.h"

#defineucharunsignedchar

#defineulongunsignedlong

#defineuintunsignedint

intzkb1=2,zkb2=2;

sbitP13=P2^4;

sbitP14=P2^1;

sbitCSOut=P1^6;

sbitRS=P2^6;

sbitEN=P2^7;

sbitLEDL=P1^4;

sbitLEDR=P3^1;

sbitBELL=P1^5;

sbitTEST=P3^0;

sbitkeyD=P3^4;

sbitkeyC=P3^5;

sbitkeyB=P3^6;

sbitkeyA=P3^7;

sbitkk=P3^0;

longintall=0,aa=0,an;

ulongDATA,cc,bb;

xdataucharnum=0,num1=0,miao1=0,fen1=0,miao2=0,fen2=0,YY1=0,YY2=0,dis=50,i,d,t,jj,h,mod,u,fen=0,miao=0,sj=0,g,j,temp=0,avg=0,j0=0,j1=0,j2=0,j3=0,K,m=0,click=0,a[48],b[4],bcd_dis[4],acd_dis[6],ccd_dis[3];

ucharcodeFFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};//反转

ucharcodeFFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//正转

ucharcodetable1[]="Mode2--StateSet";

ucharcodetable3[]="Mode3--TimeSet";

ucharcodetable5[]="Mode4--Distance";

ucharcodetable2[]="Stopat:

cm";

ucharcodetable4[]="OFF-ON-";

ucharcodetable6[]="From:

cm";

ucharcodetable7[]="Mode1--SpeedSet";

ucharcodetable8[]="Left:

Right:

";

ucharcodetable9[]="SDW";

ucharcodetable0[]="AT-M0";

voidCCOut(void)

{

TH0=0;

TL0=0;

TR0=1;

//40KHz

CSOut=0;//1

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

CSOut=1;

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

CSOut=0;//2

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

CSOut=1;

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

CSOut=0;//3

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

CSOut=1;

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

CSOut=0;//4

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

CSOut=1;

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

}

voiddelayns(uintxms)

{

uinta,b;

for(a=0;a

for(b=0;b<110;b++);

}

voidwritecom(ucharcom)

{

RS=0;

P0=com;

delayns

(1);

EN=1;

delayns

(1);

EN=0;

}

voidwritedata(uchardata11)

{

RS=1;

P0=data11;

delayns

(1);

EN=1;

delayns

(1);

EN=0;

}

voidinitlcd()

{

EN=0;

writecom(0x38);

writecom(0x0c);

writecom(0x06);

writecom(0x01);

}

voidACD(ulongb)

{

acd_dis[0]=b/10000+0x30;

acd_dis[1]=b/1000%10+0x30;

acd_dis[2]=b/100%10+0x30;

acd_dis[3]=b/10%10+0x30;

acd_dis[4]=b%10+0x30;

acd_dis[5]=0x00;

}

voidBCD(ulongb)

{

voidCCD(ulongb)

{

ccd_dis[0]=b/10+0x30;

ccd_dis[1]=b%10+0x30;

ccd_dis[2]=0x00;

}

voidinit(void)

{

TMOD=0x11;//T0定时器方式1

T2CON=0X00;

TH1=0Xff;

TL1=0Xf6;

TH2=(65536-45872)/256;

TL2=(65536-45872)%256;

TH0=0;

TL0=0;

TR1=1;

TR2=1;

IT0=1;//INT0负边沿触发

IT1=1;

IP=0x01;//INT0高优先级

ET1=1;

ET2=1;

EX1=1;

EX0=1;

EA=1;//开总中断

}

voidLCD_DISP(unsignedcharstring[])

{

inti=0;

while(string[i])

{

writedata(string[i++]);

delayns

(1);

}

}

voidReceive(void)interrupt0

{

TR0=0;

EX0=0;

}

voidt1()interrupt3

{

TR1=0;

++click;

if(click>100)click=0;

if(click<=zkb1)P13=0;

elseP13=1;

if(click<=zkb2)P14=0;

elseP14=1;

TH1=0Xff;

TL1=0XF6;

TR1=1;

}

voidint1()interrupt2

{

bb++;

}

voidt2()interrupt5

{

TF2=0;

sj++;

if(sj==20)

{

sj=0;

miao++;

if(miao==60)

{

miao=0;

fen++;

if(fen==60)fen=0;

}

}

}

voidbeled()

{

BELL=LEDL=LEDR=0;

delayns(150);

BELL=LEDL=LEDR=1;

}

voidbeled1()

{

BELL=LEDL=LEDR=0;

delayns(1000);

BELL=LEDL=LEDR=1;

}

voidmotor_ffw()

{

for(d=0;d<6;d++)//转1*n圈

{

for(t=0;t<8;t++)//一个周期转30度

{

if(keyA==1)gotod;

if(K==1)P1=FFW[t];//取数据

if(K==2)P1=FFZ[t];

if(keyA==1)gotod;

CCOut();

EX0=1;

delayns(30);//地方。

if(keyA==1)gotod;

DATA=(TH0<<8)|TL0;

DATA=DATA*172/10000;

DATA-=7;

a[m]=DATA;

m++;

if(m==48)m=0;

while((keyA==1)|(num!

=0))

{

if(keyA==1)

{

d:

delayns(10);

if(keyA==1)

{

beled();

writecom(0x01);

num++;

if(num==5)

{

num=0;

writecom(0x80);

for(i=0;i<16;i++)

{

writedata(table9[i]);

for(j=0;j<50;j++);

};

writecom(0xc0);

for(i=0;i<16;i++)

{

writedata(table0[i]);

for(j=0;j<50;j++);

};

}

if(num>=2){P2=0XD2;TR2=0;}

else{P2=0XF3;TR2=1;}

while(keyA==1);

}

}

if(keyB==1)

{

delayns(10);

if(keyB==1)

{

beled();

switch(num)

{

case1:

kk=~kk;break;

case3:

num1++;if(num1==4)num1=0;break;

default:

break;

}

while(keyB==1);

}

}

if(keyC==1)

{

delayns(10);

if(keyC==1)

{

beled();

switch(num)

{

case1:

if(kk==0){LEDL=1;LEDR=0;if(zkb1<=0){zkb1=0;beled1();}elsezkb1-=10;}else{LEDL=0;LEDR=1;if(z

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2