当前位置:首页 > 基于STC89C51单片机的智能超声波避障小车 - 图文
L293D_IN3=1; L293D_IN4=0; }
void Stop(void) //刹车 {
L293D_IN1=0; L293D_IN2=0; L293D_IN3=0; L293D_IN4=0; }
void Turn_Right(unsigned char Speed_Right,unsigned char Speed_Left) //后退左转 {
L293D_IN1=1; L293D_IN2=0; L293D_IN3=1; L293D_IN4=0; Delay(100); L293D_IN1=1; L293D_IN2=0; L293D_IN3=1; L293D_IN4=0; }
//========================================================================================================================= /********距离计算程序***************/ void Conut(void) {
time=TH1*256+TL1; TH1=0; TL1=0;
//此时time的时间单位决定于晶振的速度,外接晶振为11.0592MHZ时, //time的值为0.54us*time,单位为微秒 //那么1us声波能走多远的距离呢?1s=1000ms=1000000us // 340/1000000=0.00034米 //0.00034米/1000=0.34毫米 也就是1us能走0.34毫米 //但是,我们现在计算的是从超声波发射到反射接收的双路程, //所以我们将计算的结果除以2才是实际的路程
S=time*2;//先算出一共的时间是多少微秒。
S=S*0.17;//此时计算到的结果为毫米,并且是精确到毫米的后两位了,有两个小数点
if(S<=300) // {
if(turn_right_flag!=1) { Stop(); Delay1ms(5);//发现小车自动复位的时候,可以稍微延长一点这个延时,减少电机反向电压对电路板的冲击。 } turn_right_flag=1; P2_3=0; Delay1ms(50); P2_3=1;
Turn_Right(120,120); //小于设定距离时电机后退转弯 } else {
turn_right_flag=0;
Forward(Forward_R_DATA,Forward_L_DATA); //前进(大于20-30CM前进) }
//======================================= if((S>=5000)||flag==1) //超出测量范围 {
flag=0;
DisplayListChar(0, 1, table1); } else {
disbuff[0]=S; disbuff[1]=S/10; disbuff[2]=S/100; disbuff[3]=S/1000;
DisplayListChar(0, 1, table);
DisplayOneChar(9, 1, ASCII[disbuff[3]]); DisplayOneChar(10, 1, ASCII[disbuff[2]]); DisplayOneChar(11, 1, ASCII[disbuff[1]]); DisplayOneChar(12, 1, ASCII[10]);
DisplayOneChar(13, 1, ASCII[disbuff[0]]); } }
/********************************************************/ void zd0() interrupt 3 //T0中断用来计数器溢出,超过测距范围 {
flag=1; //中断溢出标志 RX=0; }
/********超声波高电平脉冲宽度计算程序***************/ void Timer_Count(void) { TR1=1; //开启计数 while(RX); //当RX为1计数并等待 TR1=0; //关闭计数 Conut(); //计算 }
/********************************************************/ void StartModule() //启动模块 {
TX=1; //启动一次模块 Delay10us(2); TX=0; }
/********************************************************/
/*************主程序********************/ void main(void) {
unsigned char i; unsigned int a;
cmg88();//关数码管
Delay1ms(400); //启动等待,等LCM讲入工作状态 LCMInit(); //LCM初始化 Delay1ms(5);//延时片刻
DisplayListChar(0, 0, Range); DisplayListChar(0, 1, table);
TMOD=TMOD|0x10;//设T0为方式1,GATE=1; EA=1; //开启总中断 TH1=0;
TL1=0;
ET1=1; //允许T0中断
//=============================== //PWM_ini();
//=============================== turn_right_flag=0;
//================================= B: for(i=0;i<50;i++) //判断K3是否按下 { Delay1ms(1);//1ms内判断50次,如果其中有一次被判断到K3没按下,便重新检测 if(P3_6!=0 )//当K3按下时,启动小车 goto B; //跳转到标号B,重新检测 }
//蜂鸣器响一声
BUZZ=0; //50次检测K3确认是按下之后,蜂鸣器发出“滴”声响,然后启动小车。
Delay1ms(50);
BUZZ=1;//响50ms后关闭蜂鸣器
//======================================================================================================================= while(1) { RX=1;
StartModule(); //启动模块 for(a=951;a>0;a--) {
if(RX==1) {
Timer_Count(); //超声波高电平脉冲宽度计算函数 } } } }
结束语:本系统有STC89C52单片机,超声波模块,LCD1602显示器,报警系统等组成。STC89C52控制电机的转动和报警系统的动作。
LCD1602显示智能型小车到障碍物之间的距离便于人查看。智能小车能够实现自动避障,自动报警,实时监控障碍距离的功能。
共分享92篇相关文档