找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4147|回复: 7
收起左侧

51单片机超声波避障小车

  [复制链接]
ID:314784 发表于 2020-1-4 10:28 | 显示全部楼层 |阅读模式
#include"reg52.h"
#include"intrins.h"
#define  uchar unsigned char
#define  uint  unsigned int

sbit TRIG = P3^2;   // 超声波
sbit ECHO = P3^3;

sbit IN1 = P2^7;    // 电机
sbit IN2 = P2^6;
sbit IN3 = P2^5;
sbit IN4 = P2^4;

sbit Sevro_moto_pwm = P0^0;  // 摇头舵机

//IN1   IN2     IN3   IN4
//P2^7  P2^6   P2^5  P2^4
#define  Left_moto_go    {IN3=1,IN4=0;} //左边两个电机向前走
#define  Left_moto_back  {IN3=0,IN4=1;} //左边两个电机向后转
#define  Left_moto_Stop  {IN3=0,IN4=0;} //左边两个电机停转

#define  Right_moto_go   {IN1=0,IN2=1;} //右边两个电机向前走
#define  Right_moto_back {IN1=1,IN2=0;} //右边两个电机向前走
#define  Right_moto_Stop {IN1=0,IN2=0;} //右边两个电机停转

unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned char const positon[3]={ 0xfe,0xfd,0xfb};
unsigned char disbuff[4] ={ 0,0,0,0,};

unsigned long S=0;
unsigned long S1=0;
unsigned long S2=0;
unsigned long S3=0;
unsigned long S4=0;
unsigned int  time=0;   //时间变量
unsigned int  timer=0;  //延时基准变量
unsigned char timer1=0; //扫描时间变量
unsigned char posit=0;
unsigned char pwm_val_left = 0;  //变量定义
unsigned char push_val_left = 14;//舵机归中,产生约,1.5MS 信号

void Delay10us()        //@11.0592MHz
{
    unsigned char i;
    _nop_();
    _nop_();
    _nop_();
    i = 24;
    while (--i);
}

void delay_us(uint z)
{
    while(z--)
    {
      Delay10us();
    }
}

void Delay1ms()     //@11.0592MHz
{
    unsigned char i, j;

    _nop_();
    i = 11;
    j = 190;
    do
    {
        while (--j);
    } while (--i);
}

void delay_ms(uint z)
{
    while(z--)Delay1ms();
}

/************************************************************************/
void Display(void) //扫描数码管
{
//  if(posit==0)
//  {P0=(discode[disbuff[posit]])&0x7f;}//产生点
//  else
//  {P0=discode[disbuff[posit]];} if(posit==0)
//  { P2_1=0;P2_2=1;P2_3=1;}
//  if(posit==1)
//  {P2_1=1;P2_2=0;P2_3=1;}
//  if(posit==2)
//  {P2_1=1;P2_2=1;P2_3=0;}
//  if(++posit>=3)
//  posit=0;
}

/************************************************************************/
void StartModule() //启动测距信号
{
    TRIG=1;
    Delay10us();
    TRIG=0;
}
/***************************************************/
void Conut(void) //计算距离
{
    while(!ECHO); //当RX为零时等待
    TR0=1; //开启计数
    while(ECHO); //当RX为1计数并等待
    TR0=0; //关闭计数
    time=TH0*256+TL0; //读取脉宽长度
    TH0=0;
    TL0=0;
    S=(time*1.7)/100; //算出来是CM
    disbuff[0]=S%1000/100; //更新显示
    disbuff[1]=S%1000%100/10;
    disbuff[2]=S%1000%10 %10;
}
/************************************************************************/
//前速前进
void run(void)
{
    Left_moto_go ; //左电机往前走
    Right_moto_go ; //右电机往前走
}
/************************************************************************/
//前速后退
void backrun(void)
{
    Left_moto_back ; //左电机往前走
    Right_moto_back ; //右电机往前走
}
/************************************************************************/
//左转
void leftrun(void)
{
    Left_moto_back ; //左电机往前走
    Right_moto_go ; //右电机往前走
}
/************************************************************************/
//右转
void rightrun(void)
{
    Left_moto_go ; //左电机往前走
    Right_moto_back ; //右电机往前走
}
/************************************************************************/
//STOP
void stoprun(void)
{
    Left_moto_Stop ; //左电机停走
    Right_moto_Stop ; //右电机停走
}

/************************************************************************/
/* PWM调制电机转速 */
/*调节push_val_left的值改变电机转速,占空比 */
void pwm_Servomoto(void)
{
    if(pwm_val_left<=push_val_left)     Sevro_moto_pwm=1;   
    else   Sevro_moto_pwm=0;

    if(pwm_val_left>=200)   pwm_val_left=0;
}

/************************************************************************/
//方向控制
void COMM(void)
{
    push_val_left=23; //舵机向左转90度
    timer=0;
    while(timer<=4000); //延时400MS让舵机转到其位置
    StartModule(); //启动超声波测距
    Conut(); //计算距离
    S2=S; //左边距离

    push_val_left=5; //舵机向右转90度
    timer=0;
    while(timer<=4000); //延时400MS让舵机转到其位置
    StartModule(); //启动超声波测距
    Conut(); //计算距离
    S4=S; //右边距离

    push_val_left=14; //舵机归中
    timer=0;
    while(timer<=4000); //延时400MS让舵机转到其位置
    StartModule(); //启动超声波测距
    Conut(); //计算距离
    S1=S;//中间距离

    if((S2<20)||(S4<20)) //只要左右各有距离小于20CM小车后退
    {
        backrun(); //后退
        timer=0;
        while(timer<=4000);
    }

    if(S2>S4)//如果左边距离大于右边距离
    {
        leftrun(); //车的左边比车的右边距离大 左转
        timer=0;
        while(timer<=4000);
    }
    else
    {
        rightrun(); //车的左边比车的右边距离小 右转
        timer=0;
        while(timer<=4000);
    }
}


/************************************************************************/
void main()
{
    TMOD=0X11;
    TH1=(65536-100)/256; //100US定时
    TL1=(65536-100)%256;
    TH0=0;
    TL0=0;
    TR1= 1;
    ET1= 1;
    ET0= 1;
    EA = 1;
    delay_ms(100);
    push_val_left=14; //舵机归中14
    while(1)
    {
        if(timer>=1000) //100MS检测启动检测一次
        {
            timer=0;
            StartModule(); //启动检测
            Conut(); //计算距离
            if(S<30) //距离小于20CM
            {
                stoprun(); //小车停止
                COMM(); //方向函数
            }
            else
            if(S>20) //距离大于,30CM往前走
            run();
        }
    }
}

/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
void timer0()interrupt 1 using 0
{

}

/***************************************************/
///*TIMER1中断服务子函数产生PWM信号*/
void time1()interrupt 3 using 2
{
    TH1=(65536-100)/256; //100US定时
    TL1=(65536-100)%256;
    timer++; //定时器100US为准。在这个基础上延时
    pwm_val_left++;
    pwm_Servomoto();

//  timer1++; //2MS扫一次数码管
//  if(timer1>=20)
//  {
//      timer1=0;
//      Display();
//  }

}


超声波避障小车.zip

82.44 KB, 下载次数: 135, 下载积分: 黑币 -5

回复

使用道具 举报

ID:713570 发表于 2020-3-23 17:19 来自手机 | 显示全部楼层
有电路图吗
回复

使用道具 举报

ID:706331 发表于 2020-3-30 18:41 | 显示全部楼层
同问,有图吗?
回复

使用道具 举报

ID:314784 发表于 2020-4-24 12:02 | 显示全部楼层

有。。。。。。
回复

使用道具 举报

ID:740451 发表于 2020-4-28 22:57 | 显示全部楼层

能发一下吗
回复

使用道具 举报

ID:741061 发表于 2020-4-29 17:12 | 显示全部楼层

求电路图
回复

使用道具 举报

ID:846082 发表于 2021-2-1 13:22 | 显示全部楼层
图在程序里
sbit TRIG = P3^2;   // 超声波
sbit ECHO = P3^3;

sbit IN1 = P2^7;    // 电机
sbit IN2 = P2^6;
sbit IN3 = P2^5;
sbit IN4 = P2^4;

sbit Sevro_moto_pwm = P0^0;  // 摇头舵机

超声波:
TRIG——P3.2
ECHO——P3.3
电机:
P2.4
P2.5
P2.6
P2.7
舵机:
P0.0






回复

使用道具 举报

ID:919762 发表于 2021-5-12 00:10 来自手机 | 显示全部楼层
小悬 发表于 2021-2-1 13:22
图在程序里
sbit TRIG = P3^2;   // 超声波
sbit ECHO = P3^3;

谁知道普中单片机怎么接线吗,我尝试了好多遍都不行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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