久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 想在避障模塊多完善一些 就是讓小車停止一會兒然后向后轉(zhuǎn)再向左轉(zhuǎn),怎么改寫比較好? [打印本頁]

作者: a664254710    時間: 2017-9-2 23:35
標(biāo)題: 想在避障模塊多完善一些 就是讓小車停止一會兒然后向后轉(zhuǎn)再向左轉(zhuǎn),怎么改寫比較好?
#include <reg52.h>
#include " LCD1602.h "
sbit zuo = P1^0;
sbit you = P1^1;
sbit zhong = P1^2;
sbit IN1 = P2^1;           //P2.0到P2.3是電機驅(qū)動輸出控制端
sbit IN2 = P2^2;
sbit IN3 = P2^3;
sbit IN4 = P2^4;
sbit Trig = P2^0;      //產(chǎn)生脈沖引腳
sbit Echo = P3^3;      //回波引腳
uint distance[4];      //測距接收緩沖區(qū)
unsigned char code ASCII[16]  = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
unsigned char disbuff[4]= { 0,0,0,0,};
uint distance1;
bit succeed_flag;      //測量成功標(biāo)志

void chaoshengbo();
void delay_20us();
void delay_ms(uint x);
void delay(uint t);
void Tracking();
void shunback();
//延時程序1
void delay(uint t)     
{
        uchar j;
    while(t--)
        {for(j=5;j>0;j--);}
}
//微妙延時程序
void delay_us(uint x)          
{
do {
     x--;
   }

while(x>1);
}
//毫秒延時
void delay_ms(uint x)
{
        while(x!=0)
        {
                delay_us(500);
                x--;
        }

}
//20微妙延時
void delay_20us()
{  
        uchar bt ;
    for(bt=0;bt<100;bt++);
}
void Init()                          
{

    Trig=0;
        TMOD = 0x11;        //T/C1采用16位定時器/計數(shù)器
        ET1  = 1;                //定時器1開中斷
    ET0  = 1;
        TH0 = 0x00;
    TL0 = 0x00;
        TH1 = 0xff;
    TL1 = 0xce;
        TR1=1;
    TR0        = 1;                //定時計數(shù)器啟動計數(shù)
        EX0         = 1;                //外部中斷0關(guān)中斷
        PT1  = 1;
        EA         = 1;                //CPU開中斷
}
//超聲波測距
void chaoshengbo()
{           
        uint distance_data,S;
        Trig=1;
    delay_20us();
    Trig=0;         //產(chǎn)生一個20us的脈沖,在Trig引腳  

    while(!Echo);   //等待Echo回波引腳變高電平                  
    TR0=1;          //啟動定時器1
        while(Echo);
        TR0=0;
       
        delay_ms(7);
        distance_data=TH0*256+TL0;
        TH0=0;
        TL0=0;
        S=(distance_data*1.7)/100;

        if(succeed_flag==1)
        {        
                distance1=S;
    }
                 
        disbuff[0]=((S/100)%10);
          disbuff[1]=((S/10)%10);
          disbuff[2]=(S%10);
          DisplayOneChar(9, 0, ASCII[disbuff[0]]);
          DisplayOneChar(10, 0, ASCII[10]);               //顯示點
          DisplayOneChar(11, 0, ASCII[disbuff[1]]);
          DisplayOneChar(12, 0, ASCII[disbuff[2]]);
          DisplayOneChar(13, 0, ASCII[12]);               //顯示M

}
//左轉(zhuǎn)
void comeleft()
{
        IN1=0;
        IN2=1;
        IN3=1;
        IN4=1;
}
//右轉(zhuǎn)
void comeright ()
{
        IN1=1;
        IN2=1;
        IN3=1;
        IN4=0;
}
//前進加速;
void comeon()
{         
        IN1=0;
        IN2=1;
        IN3=0;
        IN4=1;
}
void stop()                  
{       
                   IN1=0;
                IN2=0;
                IN3=0;
                IN4=0;
}
void backward()
{
                IN1=1;
                IN2=0;
                IN3=1;
                IN4=0;
}
//紅外尋跡
void Tracking()                  
{       
     if(zuo==1&&zhong==1&&you==1)   //0是接受到黑線,1是白線
     {
                comeon();
         }
         else if(zuo==1&&zhong==0&&you==1)
         {
              comeon();
         }

         else if(zuo==0&&zhong==1&&you==1)
         {
                  comeleft();

         }
         else if(zuo==0&&zhong==0&&you==1)
         {
              comeleft();
         }
         else if(zuo==1&&zhong==1&&you==0)
         {
             comeright();
         }
         else if(zuo==1&&zhong==0&&you==0)
         {
             comeright();
         }
                  else
         {
                stop();
        }   
}
//避障
void shunback()
{       
        chaoshengbo();
        delay_ms(50);
    Tracking();// 避障運行
        if(distance1<8)                //當(dāng)超聲波測距距離小于8則
        {
                stop();                        //小車停止運動
                delay_ms(50);
//                backward();
//                delay_ms(100);
//                comeleft();
//                delay_ms(60);
                 TR1=1;
                 delay_ms(50);
                 TR1=0;
        }
        else
        {

            Tracking();       
          
        }     //否則小車直走
}


//主函數(shù)
void main(void)
{

    Init();                   //初始化
        LCMInit();             //LCM初始化
        TMOD=0x01;
        TH0=0;          //定時器1清零
    TL0=0;          //定時器1清零
        ET0=1;                        //打開外部中斷
        EA=1;
        succeed_flag=0; //清測量成功標(biāo)志        
       
        while(1)
        {
        displayfun();
        chaoshengbo();
        shunback();                  //循環(huán)調(diào)用超聲波測距
        Tracking();
}
}

//外部中斷0,用做判斷回波電平
INTO_()  interrupt 0  // 外部中斷是0號
{   
    succeed_flag=1;   //至成功測量的標(biāo)志
}







#ifndef __lcd1602__
#define __lcd1602__
//定義引腳
sbit LCM_RS = P2^6;
sbit LCM_RW = P2^5;     
sbit LCM_E  = P2^7;
//數(shù)據(jù)口定義
#define LCM_Data P0
sbit BF=LCM_Data^7;                //忙信號線
//數(shù)組變量
unsigned char code  yuyiny[18]={
        0x00,0x10,0x18,0x20,0x28,0x30,0x38,0x40,
        0x48,0x50,0x58,0x60,0x68,0x70,0x78,0x80,0x88,0x98};
unsigned char inittime[7]={0x00,0x00,0x12,0x03,0x04,0x06,0x10};         //初始化時間

//變量
#define uchar unsigned char
#define uint  unsigned int                

/********************************************************************
函 數(shù) 名:unsigned char ReadStatusLCM(void)
功    能:忙檢測
說    明:
入口參數(shù):無
返 回 值:無  
***********************************************************************/
unsigned char ReadStatusLCM(void)
{
        bit busy =0;
        LCM_Data = 0xFF;
        LCM_RS   = 0;
        LCM_RW   = 1;
        LCM_E    = 1;
        LCM_E    = 1;
        busy     = BF;
        LCM_E    = 0;
        return(busy);
}

/********************************************************************
函 數(shù) 名:void WriteCommandLCM(unsigned char WCLCM,BuysC)
功    能:寫命令
說    明:
入口參數(shù):WCLCM
                   BuysC 需要忙檢測
返 回 值:無  
***********************************************************************/
void WriteCommandLCM(unsigned char WCLCM,BuysC)  //BuysC為0時忽略忙檢測
{
        if (BuysC) ReadStatusLCM();                  //根據(jù)需要檢測忙

        while (ReadStatusLCM());
        LCM_RS = 0;
        LCM_RW = 0;
        LCM_Data = WCLCM;
        LCM_E = 1;
        LCM_E = 0;
}

/********************************************************************
函 數(shù) 名:void WriteDataLCM(unsigned char WDLCM
功    能:寫數(shù)據(jù)
說    明:
入口參數(shù):WDLCM
返 回 值:無  
***********************************************************************/
void WriteDataLCM(unsigned char WDLCM)
{
        while(ReadStatusLCM());                      //檢測忙
        LCM_RS = 1;
        LCM_RW = 0;
        LCM_Data = WDLCM;
        LCM_E = 1;
        LCM_E = 0;
}
/********************************************************************
函 數(shù) 名:void LCMInit(void)
功    能:LCM初始化
說    明:
入口參數(shù):無
返 回 值:無  
***********************************************************************/
void LCMInit(void)
{
        WriteCommandLCM(0x38,1);                     //顯示模式設(shè)置,開始要求每次檢測忙信號
        WriteCommandLCM(0x0C,1);                     //顯示開及光標(biāo)設(shè)置
        WriteCommandLCM(0x06,1);                     //顯示光標(biāo)移動設(shè)置
        WriteCommandLCM(0x01,1);                     //顯示清屏
}

/********************************************************************
函 數(shù) 名:void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
功    能:按指定位置顯示一個字符
說    明:
入口參數(shù):X 一行顯示個數(shù)限制
           Y 上下行限制
                   DData 數(shù)據(jù)
返 回 值:無  
***********************************************************************/
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
        Y &= 0x1;
        X &= 0xF;                         //限制X不能大于15,Y不能大于1
        if (Y) X |= 0x40;                 //當(dāng)要顯示第二行時地址碼 0x40;
        X |= 0x80;                        // 算出指令碼
        WriteCommandLCM(X, 0);            //這里不檢測忙信號,發(fā)送地址碼
        WriteDataLCM(DData);
}

/********************************************************************
函 數(shù) 名:void displayfun(void)
功    能:界面顯示
說    明:
入口參數(shù):無
返 回 值:無  
***********************************************************************/
void displayfun(void)
{
        WriteCommandLCM(0x0c,1);                                    //顯示屏打開,光標(biāo)不顯示,不閃爍,檢測忙信號

        /*顯示 鬧鐘 設(shè)置*/   
        DisplayOneChar(0,0,'D');
        DisplayOneChar(1,0,'i');
        DisplayOneChar(2,0,'s');
        DisplayOneChar(3,0,'t');
        DisplayOneChar(4,0,'a');
        DisplayOneChar(5,0,'n');
        DisplayOneChar(6,0,'c');
        DisplayOneChar(7,0,'e');
        DisplayOneChar(8,0,':');
       
}


#endif






作者: king_zxt    時間: 2017-9-3 11:16
可以判斷超聲波距離小于一定大小時小車停止延時一定時間在執(zhí)行其他操作
作者: a664254710    時間: 2017-9-3 13:14
king_zxt 發(fā)表于 2017-9-3 11:16
可以判斷超聲波距離小于一定大小時小車停止延時一定時間在執(zhí)行其他操作

我也是這樣想的不過當(dāng)我在避障模塊加入其它指令,實測小車就一直執(zhí)行我加的命令,比如先停止,然后后退最后左轉(zhuǎn),就一直這樣循環(huán)執(zhí)行,超聲波測的顯示的數(shù)據(jù)變化不準(zhǔn),如果不加直stop,就會執(zhí)行尋跡指令...
作者: sldx    時間: 2017-9-6 01:43
轉(zhuǎn)彎前加個延遲




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 中文字幕亚洲一区二区va在线 | 亚洲精品福利在线 | 欧美一区二区三区大片 | 欧美精品日韩 | 亚洲永久免费观看 | 99精品久久久 | 亚洲一区二区三 | 99视频精品| 午夜精品久久久久久久久久久久 | 亚洲视频在线观看免费 | 日韩在线精品强乱中文字幕 | 黄色成人亚洲 | 一区欧美 | 免费看91| 日韩av大片免费看 | 欧美日韩中文在线观看 | 久久久久久久国产精品 | 看片国产| 欧美日韩专区 | 在线精品亚洲欧美日韩国产 | 古装三级在线播放 | 欧美xxxx性 | 精品一区二区免费视频 | 日韩av中文 | 国产精品永久久久久久久www | 久久www免费人成看片高清 | 在线不卡视频 | 激情 亚洲 | 91aiai| 亚洲精品久久久久久下一站 | 九一在线 | 一区二区三区久久 | 羞羞视频免费在线观看 | 日韩欧美精品一区 | 欧美日韩一区不卡 | 精品国产aⅴ | 成人在线视频网址 | 日本一区二区三区免费观看 | 国产性网| 欧美三级在线 | 亚洲欧美综合 |