標題: 51單片機超聲波避障小車 [打印本頁]

作者: supormao    時間: 2020-1-4 10:28
標題: 51單片機超聲波避障小車
#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;} //左邊兩個電機向后轉(zhuǎn)
#define  Left_moto_Stop  {IN3=0,IN4=0;} //左邊兩個電機停轉(zhuǎn)

#define  Right_moto_go   {IN1=0,IN2=1;} //右邊兩個電機向前走
#define  Right_moto_back {IN1=1,IN2=0;} //右邊兩個電機向前走
#define  Right_moto_Stop {IN1=0,IN2=0;} //右邊兩個電機停轉(zhuǎn)

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;//舵機歸中,產(chǎn)生約,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) //掃描數(shù)碼管
{
//  if(posit==0)
//  {P0=(discode[disbuff[posit]])&0x7f;}//產(chǎn)生點
//  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; //開啟計數(shù)
    while(ECHO); //當RX為1計數(shù)并等待
    TR0=0; //關閉計數(shù)
    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 ; //右電機往前走
}
/************************************************************************/
//左轉(zhuǎn)
void leftrun(void)
{
    Left_moto_back ; //左電機往前走
    Right_moto_go ; //右電機往前走
}
/************************************************************************/
//右轉(zhuǎn)
void rightrun(void)
{
    Left_moto_go ; //左電機往前走
    Right_moto_back ; //右電機往前走
}
/************************************************************************/
//STOP
void stoprun(void)
{
    Left_moto_Stop ; //左電機停走
    Right_moto_Stop ; //右電機停走
}

/************************************************************************/
/* PWM調(diào)制電機轉(zhuǎn)速 */
/*調(diào)節(jié)push_val_left的值改變電機轉(zhuǎn)速,占空比 */
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; //舵機向左轉(zhuǎn)90度
    timer=0;
    while(timer<=4000); //延時400MS讓舵機轉(zhuǎn)到其位置
    StartModule(); //啟動超聲波測距
    Conut(); //計算距離
    S2=S; //左邊距離

    push_val_left=5; //舵機向右轉(zhuǎn)90度
    timer=0;
    while(timer<=4000); //延時400MS讓舵機轉(zhuǎn)到其位置
    StartModule(); //啟動超聲波測距
    Conut(); //計算距離
    S4=S; //右邊距離

    push_val_left=14; //舵機歸中
    timer=0;
    while(timer<=4000); //延時400MS讓舵機轉(zhuǎn)到其位置
    StartModule(); //啟動超聲波測距
    Conut(); //計算距離
    S1=S;//中間距離

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

    if(S2>S4)//如果左邊距離大于右邊距離
    {
        leftrun(); //車的左邊比車的右邊距離大 左轉(zhuǎn)
        timer=0;
        while(timer<=4000);
    }
    else
    {
        rightrun(); //車的左邊比車的右邊距離小 右轉(zhuǎn)
        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(); //方向函數(shù)
            }
            else
            if(S>20) //距離大于,30CM往前走
            run();
        }
    }
}

/***************************************************/
///*TIMER0中斷服務子函數(shù)產(chǎn)生PWM信號*/
void timer0()interrupt 1 using 0
{

}

/***************************************************/
///*TIMER1中斷服務子函數(shù)產(chǎn)生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掃一次數(shù)碼管
//  if(timer1>=20)
//  {
//      timer1=0;
//      Display();
//  }

}


超聲波避障小車.zip

82.44 KB, 下載次數(shù): 136, 下載積分: 黑幣 -5


作者: 伊小蝦米    時間: 2020-3-23 17:19
有電路圖嗎
作者: 劉鵬隆    時間: 2020-3-30 18:41
同問,有圖嗎?
作者: supormao    時間: 2020-4-24 12:02
伊小蝦米 發(fā)表于 2020-3-23 17:19
有電路圖嗎

有。。。。。。
作者: szwdn    時間: 2020-4-28 22:57
supormao 發(fā)表于 2020-4-24 12:02
有。。。。。。

能發(fā)一下嗎
作者: 測控小熙    時間: 2020-4-29 17:12
szwdn 發(fā)表于 2020-4-28 22:57
能發(fā)一下嗎

求電路圖

作者: 小懸    時間: 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







作者: 震驚長安第一拳    時間: 2021-5-12 00:10
小懸 發(fā)表于 2021-2-1 13:22
圖在程序里
sbit TRIG = P3^2;   // 超聲波
sbit ECHO = P3^3;

誰知道普中單片機怎么接線嗎,我嘗試了好多遍都不行




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1