找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2479|回复: 0
打印 上一主题 下一主题
收起左侧

单片机自动避障小车

[复制链接]
跳转到指定楼层
楼主
ID:521608 发表于 2019-4-25 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define barrierDis 0.2   //距离障碍物的距离2dm
sbit IN1 =P3^0;  //控制第一个电机,从单片机出来后接L298n模块的IN1
sbit IN2 =P3^1;  //控制第一个电机,从单片机出来后接L298n模块的IN2
sbit IN3 =P3^2;  //控制第二个电机,从单片机出来后接L298n模块的IN3
sbit IN4 =P3^3;  //控制第二个电机,从单片机出来后接L298n模块的IN4
sbit Trig  = P1^5; //产生脉冲引脚
sbit Echo  = P1^4; //回波引脚
sbit servorControl =P1^6;   //舵机的控制引脚
uchar flag=0;     //有障碍物
uint jieshoutime;  //接收返回障碍信号的时间
float juli;       //小车与障碍物距离
uchar control=5;
uchar servorTime=0; //伺服时间 小车 (1).rar (36.83 KB, 下载次数: 34)


uchar leftFlag=0;//左方向是否有障碍的标志
uchar rightFlag=0;//右方向是否有障碍的标志
void delay_ms(uint ms)//延时函数
{
     uchar time;
     while(ms--)
     for(time=0;time<100;time++);
}
void chufa()    //12us脉冲
{
   Trig=1;
   _nop_();     // _nop_()=1us
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Trig=0;
}
void stop()
{   
    IN1=0;
    IN2=0;
    IN3=0;
    IN4=0;
}
void forward()                 
{            
    IN1=0;
    IN2=1;
    IN3=0;
    IN4=1;
}
void anticlockwise()            //←
{            
    IN1=0;
    IN2=1;
    IN3=1;
    IN4=0;
}
void backoff ()
{
    IN1=1;
    IN2=0;
    IN3=1;
    IN4=0;
}
void clockwise()                //→
{            
    IN1=1;
    IN2=0;
    IN3=0;
    IN4=1;
}
uchar getDistance()           //利用超声波模块判断有无障碍物
{  
    TH0=0;
    TL0=0;
    chufa();
    while(!Echo);                          //接收信号取时
    TR0=1;
    while(Echo);
    TR0=0;
    jieshoutime=TH0*256+TL0;               //接收信号转换为10进制
    juli=(jieshoutime*0.000001*344)/2;     //风速设为344m/s
    if(juli<barrierDis&&flag==0)        //无障碍
    {
       return 0;
    }
    else
    {
        flag=0;                         //有障碍
        return 1;
    }
}
/****************************
void bizhang()                   //无舵机避障函数
{
    if(getDistance()==0)
    {
        stop();
        delay_ms(500);
        anticlockwise();
        delay_ms(700);
        forward();
        delay_ms(500);  
    }
    else;
}
****************************/
void  main()
{
    EA=1;
    ET0=1;
    ET1=1;
    TMOD=0x11;
    TH1=0xff;
    TL1=0x9c;
    servorTime=0;
    while(1)
    {
        stop();
        delay_ms(200);     
        control=10;//控制舵机使超声波模块正对前方
        servorTime=0;
        TR1=1;
        delay_ms(100);
        TR1=0;
        forward();
        while(getDistance()==1); //向前行驶,直到前方有障碍物
        do
        {
            stop();
            control=15;       //使舵机向左摆动
            servorTime=0;
            TR1=1;  
            delay_ms(100);
            TR1=0;
            leftFlag=getDistance();
            control=5;   //使舵机向右摆动
            servorTime=0;
            TR1=1;
            delay_ms(100);
            TR1=0;
            rightFlag=getDistance();
            control=20;
            servorTime=0;
            TR1=1;
            delay_ms(100);
            TR1=0;
            backoff ();
            delay_ms(200);
        }
        while(leftFlag==0&&rightFlag==0);
        if(rightFlag==0&&leftFlag==1) //左侧没有障碍物
        anticlockwise();
        else if(rightFlag==1&&leftFlag==0)//右侧没有障碍物
        clockwise();
        else if(rightFlag==1&&leftFlag==1)//两侧都没有障碍物,默认向左走
        anticlockwise();
        delay_ms(1000);
    }
}

void T1_int(void) interrupt 3    //产生舵机所需要的脉冲
{
    TH1=0xff;
    TL1=0x9c;
    servorTime++;
    if(servorTime<=control)
        servorControl=1;
    else
        servorControl=0;
    if(servorTime>=200)
        servorTime=0;
}
void T0_int(void) interrupt 1      //超声波超出测量范围
{
        flag=1;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表