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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3450|回復: 3
收起左側

想在避障模塊多完善一些 就是讓小車停止一會兒然后向后轉再向左轉,怎么改寫比較好?

[復制鏈接]
回帖獎勵 50 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次
ID:229453 發(fā)表于 2017-9-2 23:35 | 顯示全部樓層 |閱讀模式
#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是電機驅動輸出控制端
sbit IN2 = P2^2;
sbit IN3 = P2^3;
sbit IN4 = P2^4;
sbit Trig = P2^0;      //產生脈沖引腳
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;      //測量成功標志

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關中斷
        PT1  = 1;
        EA         = 1;                //CPU開中斷
}
//超聲波測距
void chaoshengbo()
{           
        uint distance_data,S;
        Trig=1;
    delay_20us();
    Trig=0;         //產生一個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

}
//左轉
void comeleft()
{
        IN1=0;
        IN2=1;
        IN3=1;
        IN4=1;
}
//右轉
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)                //當超聲波測距距離小于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; //清測量成功標志        
       
        while(1)
        {
        displayfun();
        chaoshengbo();
        shunback();                  //循環(huán)調用超聲波測距
        Tracking();
}
}

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







#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);                     //顯示模式設置,開始要求每次檢測忙信號
        WriteCommandLCM(0x0C,1);                     //顯示開及光標設置
        WriteCommandLCM(0x06,1);                     //顯示光標移動設置
        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;                 //當要顯示第二行時地址碼 0x40;
        X |= 0x80;                        // 算出指令碼
        WriteCommandLCM(X, 0);            //這里不檢測忙信號,發(fā)送地址碼
        WriteDataLCM(DData);
}

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

        /*顯示 鬧鐘 設置*/   
        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





回復

使用道具 舉報

ID:198530 發(fā)表于 2017-9-3 11:16 | 顯示全部樓層
可以判斷超聲波距離小于一定大小時小車停止延時一定時間在執(zhí)行其他操作
回復

使用道具 舉報

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

我也是這樣想的不過當我在避障模塊加入其它指令,實測小車就一直執(zhí)行我加的命令,比如先停止,然后后退最后左轉,就一直這樣循環(huán)執(zhí)行,超聲波測的顯示的數(shù)據(jù)變化不準,如果不加直stop,就會執(zhí)行尋跡指令...
回復

使用道具 舉報

ID:219796 發(fā)表于 2017-9-6 01:43 來自手機 | 顯示全部樓層
轉彎前加個延遲
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产在线精品一区二区三区 | 亚州无限乱码 | 国产成人精品999在线观看 | 97精品视频在线 | 亚洲精品永久免费 | 999热精品视频 | 国产成人福利 | 中文字幕一区二区三区在线观看 | 久久久资源 | 日韩在线小视频 | 成人免费一区二区三区视频网站 | 欧美黑人一区二区三区 | 欧美一级大片 | 亚洲精品久久久一区二区三区 | 国产xxxx岁13xxxxhd| 精品丝袜在线 | 亚洲电影一区二区三区 | 国产精品高潮呻吟久久av野狼 | 亚洲精久 | 亚洲色图综合 | 国产精品自拍视频 | 国产一区二区三区色淫影院 | av网站免费看| 午夜丁香视频在线观看 | 91看片视频 | 欧美在线视频不卡 | 精品久久久久一区二区国产 | 精品久久av | 一区二区三区久久 | 成人欧美一区二区三区色青冈 | 日日夜夜av| 国产视频一视频二 | 欧美性生活一区二区三区 | 狠狠色香婷婷久久亚洲精品 | 成人在线免费视频 | 国产成人精品av | 成人二区| 9久9久9久女女女九九九一九 | 91免费入口 | 久热9| 国产伦精品一区二区三区精品视频 |