找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2544|回復(fù): 1
收起左側(cè)

智能車超聲波避障礙程序(LCD1602顯示)

[復(fù)制鏈接]
ID:205988 發(fā)表于 2017-6-17 17:23 | 顯示全部樓層 |閱讀模式
本帖最后由 jiajiajia 于 2017-6-17 17:27 編輯

智能車超聲波避障礙程序(LCD1602顯示)

#include <at89x51.h>       
#include <intrins.h>
#include "LCD1602display.h"
//#include "STC12C5A60S2_PWM.h"
#define  TX  P2_1
#define  RX  P2_0
sbit DU = P2^6;
sbit WE = P2^7;
#define Forward_L_DATA  20//當(dāng)前進(jìn)不能走直線的時候,請調(diào)節(jié)這兩個參數(shù),理想的時候是100,100,最大256,最小0。0的時候最慢,256的時候最快
#define Forward_R_DATA  180        //例如小車前進(jìn)的時候有點(diǎn)向左拐,說明右邊馬達(dá)轉(zhuǎn)速過快,那可以取一個值大一點(diǎn),另外一個值小一點(diǎn),例如 200  190
                            //直流電機(jī)因?yàn)橹圃焐系恼`差,同一個脈寬下也不一定速度一致的,需要自己手動調(diào)節(jié)

//sbit P4_0=0xc0;        //P4口地址

/*****按照原圖接線定義******/
sbit L293D_IN1=P1^2;
sbit L293D_IN2=P1^3;
sbit L293D_IN3=P1^6;
sbit L293D_IN4=P1^7;
sbit L293D_EN1=P1^4;
sbit L293D_EN2=P1^5;

sbit BUZZ=P2^3;

void cmg88()//關(guān)數(shù)碼管,點(diǎn)陣函數(shù)
{
DU=1;  
P0=0X00;
DU=0;
}

void Delay400Ms(void);//延時400毫秒函數(shù)

unsigned char code Range[] ="==Range Finder==";//LCD1602顯示格式
unsigned char code ASCII[13] = "0123456789.-M";
unsigned char code table[]="Distance:000.0cm";
unsigned char code table1[]="!!! Out of range";

unsigned char disbuff[4]={0,0,0,0};//用于分別存放距離的值0.1mm、mm、cm和m的值

void Count(void);//距離計算函數(shù)
                          
unsigned int  time=0;//用于存放定時器時間值
unsigned long S=0;//用于存放距離的值
bit  flag =0; //量程溢出標(biāo)志位
bit  turn_right_flag;

//=========================================================================================================================
void Forward(unsigned char Speed_Right,unsigned char Speed_Left)//           前進(jìn)
{

         L293D_IN1=0;
         L293D_IN2=1;
         L293D_IN3=1;
         L293D_IN4=0;
//     PWM_Set(255-Speed_Right,255-Speed_Left);
}
void Stop(void)        //剎車
{

     L293D_IN1=0;
         L293D_IN2=0;
         L293D_IN3=0;
         L293D_IN4=0;
//         PWM_Set(0,0);
}
void Turn_Right(unsigned char Speed_Right,unsigned char Speed_Left)         //后
{
    L293D_IN1=1;
        L293D_IN2=0;
        L293D_IN3=0;
        L293D_IN4=0;
//        PWM_Set(255-Speed_Right,255-Speed_Left);
}
//=========================================================================================================================
/********距離計算程序***************/
    void Conut(void)
        {
         time=TH1*256+TL1;
         TH1=0;
         TL1=0;
       
         //此時time的時間單位決定于晶振的速度,外接晶振為11.0592MHZ時,
                    //time的值為0.54us*time,單位為微秒
                                //那么1us聲波能走多遠(yuǎn)的距離呢?1s=1000ms=1000000us
                                // 340/1000000=0.00034米
                                //0.00034米/1000=0.34毫米  也就是1us能走0.34毫米
                                //但是,我們現(xiàn)在計算的是從超聲波發(fā)射到反射接收的雙路程,
                                //所以我們將計算的結(jié)果除以2才是實(shí)際的路程

        S=time*2;//先算出一共的時間是多少微秒。
           S=S*0.17;//此時計算到的結(jié)果為毫米,并且是精確到毫米的后兩位了,有兩個小數(shù)點(diǎn)
         if(S<=300)         //
         {       
            if(turn_right_flag!=1)
                {
                    Stop();
                    Delay1ms(5);//發(fā)現(xiàn)小車自動復(fù)位的時候,可以稍微延長一點(diǎn)這個延時,減少電機(jī)反向電壓對電路板的沖擊。
                }
                turn_right_flag=1;
                P2_3=0;
                Delay1ms(50);
                P2_3=1;
            Turn_Right(120,120);                                 //小于設(shè)定距離時電機(jī)后退轉(zhuǎn)彎
         }
         else
         {
            turn_right_flag=0;
            Forward(Forward_R_DATA,Forward_L_DATA);                          //前進(jìn)(大于20-30CM前進(jìn))
         }
         //=======================================
         if((S>=5000)||flag==1) //超出測量范圍
         {       
          flag=0;
      DisplayListChar(0, 1, table1);
         }
         else
         {
      disbuff[0]=S%10;
          disbuff[1]=S/10%10;
          disbuff[2]=S/100%10;
          disbuff[3]=S/1000;
          DisplayListChar(0, 1, table);
          DisplayOneChar(9, 1, ASCII[disbuff[3]]);
          DisplayOneChar(10, 1, ASCII[disbuff[2]]);       
          DisplayOneChar(11, 1, ASCII[disbuff[1]]);
      DisplayOneChar(12, 1, ASCII[10]);
          DisplayOneChar(13, 1, ASCII[disbuff[0]]);
         }
        }

/********************************************************/
     void zd0() interrupt 3                  //T0中斷用來計數(shù)器溢出,超過測距范圍
  {
    flag=1;                         //中斷溢出標(biāo)志
        RX=0;
  }

/********超聲波高電平脈沖寬度計算程序***************/
void Timer_Count(void)
{
                 TR1=1;                            //開啟計數(shù)
             while(RX);                        //當(dāng)RX為1計數(shù)并等待
             TR1=0;                                //關(guān)閉計數(shù)
         Conut();                        //計算

}
/********************************************************/
   void  StartModule()                          //啟動模塊
  {
          TX=1;                                             //啟動一次模塊
      Delay10us(2);
          TX=0;
  }
/********************************************************/

/*************主程序********************/
void main(void)
{
    unsigned char i;
        unsigned int a;
        cmg88();//關(guān)數(shù)碼管
        Delay1ms(400); //啟動等待,等LCM講入工作狀態(tài)
        LCMInit(); //LCM初始化
        Delay1ms(5);//延時片刻

        DisplayListChar(0, 0, Range);
        DisplayListChar(0, 1, table);
    TMOD=TMOD|0x10;//設(shè)T0為方式1,GATE=1;
    EA=1;                                           //開啟總中斷
    TH1=0;
    TL1=0;         
    ET1=1;             //允許T0中斷

        //===============================
        //PWM_ini();
        //===============================
        turn_right_flag=0;
        //=================================
B:                for(i=0;i<50;i++) //判斷K3是否按下
                {
                   Delay1ms(1);        //1ms內(nèi)判斷50次,如果其中有一次被判斷到K3沒按下,便重新檢測
                   if(P3_6!=0 )//當(dāng)K3按下時,啟動小車
                   goto B; //跳轉(zhuǎn)到標(biāo)號B,重新檢測
                }
        //蜂鳴器響一聲
        BUZZ=0;        //50次檢測K3確認(rèn)是按下之后,蜂鳴器發(fā)出“滴”聲響,然后啟動小車。
        Delay1ms(50);
        BUZZ=1;//響50ms后關(guān)閉蜂鳴器
        //=======================================================================================================================                       
        while(1)
          {
                RX=1;
            StartModule();                                 //啟動模塊
        for(a=951;a>0;a--)
            {
                  
               if(RX==1)
                   {
           Timer_Count();                 //超聲波高電平脈沖寬度計算函數(shù)
                   }
             }
           }
}





C51FPS.rar

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

回復(fù)

使用道具 舉報

ID:205988 發(fā)表于 2017-6-17 17:26 | 顯示全部樓層
  1. #include <at89x51.h>        
  2. #include <intrins.h>
  3. #include "LCD1602display.h"
  4. //#include "STC12C5A60S2_PWM.h"
  5. #define  TX  P2_1
  6. #define  RX  P2_0
  7. sbit DU = P2^6;
  8. sbit WE = P2^7;
  9. #define Forward_L_DATA  20//當(dāng)前進(jìn)不能走直線的時候,請調(diào)節(jié)這兩個參數(shù),理想的時候是100,100,最大256,最小0。0的時候最慢,256的時候最快
  10. #define Forward_R_DATA  180        //例如小車前進(jìn)的時候有點(diǎn)向左拐,說明右邊馬達(dá)轉(zhuǎn)速過快,那可以取一個值大一點(diǎn),另外一個值小一點(diǎn),例如 200  190
  11.                             //直流電機(jī)因?yàn)橹圃焐系恼`差,同一個脈寬下也不一定速度一致的,需要自己手動調(diào)節(jié)

  12. //sbit P4_0=0xc0;        //P4口地址

  13. /*****按照原圖接線定義******/
  14. sbit L293D_IN1=P1^2;
  15. sbit L293D_IN2=P1^3;
  16. sbit L293D_IN3=P1^6;
  17. sbit L293D_IN4=P1^7;
  18. sbit L293D_EN1=P1^4;
  19. sbit L293D_EN2=P1^5;

  20. sbit BUZZ=P2^3;

  21. void cmg88()//關(guān)數(shù)碼管,點(diǎn)陣函數(shù)
  22. {
  23. DU=1;  
  24. P0=0X00;
  25. DU=0;
  26. }

  27. void Delay400Ms(void);//延時400毫秒函數(shù)

  28. unsigned char code Range[] ="==Range Finder==";//LCD1602顯示格式
  29. unsigned char code ASCII[13] = "0123456789.-M";
  30. unsigned char code table[]="Distance:000.0cm";
  31. unsigned char code table1[]="!!! Out of range";

  32. unsigned char disbuff[4]={0,0,0,0};//用于分別存放距離的值0.1mm、mm、cm和m的值

  33. void Count(void);//距離計算函數(shù)
  34.                           
  35. unsigned int  time=0;//用于存放定時器時間值
  36. unsigned long S=0;//用于存放距離的值
  37. bit  flag =0; //量程溢出標(biāo)志位
  38. bit  turn_right_flag;

  39. //=========================================================================================================================
  40. void Forward(unsigned char Speed_Right,unsigned char Speed_Left)//           前進(jìn)
  41. {

  42.          L293D_IN1=0;
  43.          L293D_IN2=1;
  44.          L293D_IN3=1;
  45.          L293D_IN4=0;
  46. //     PWM_Set(255-Speed_Right,255-Speed_Left);
  47. }
  48. void Stop(void)        //剎車
  49. {

  50.      L293D_IN1=0;
  51.          L293D_IN2=0;
  52.          L293D_IN3=0;
  53.          L293D_IN4=0;
  54. //         PWM_Set(0,0);
  55. }
  56. void Turn_Right(unsigned char Speed_Right,unsigned char Speed_Left)         //后
  57. {
  58.     L293D_IN1=1;
  59.         L293D_IN2=0;
  60.         L293D_IN3=0;
  61.         L293D_IN4=0;
  62. //        PWM_Set(255-Speed_Right,255-Speed_Left);
  63. }
  64. //=========================================================================================================================
  65. /********距離計算程序***************/
  66.     void Conut(void)
  67.         {
  68.          time=TH1*256+TL1;
  69.          TH1=0;
  70.          TL1=0;
  71.         
  72.          //此時time的時間單位決定于晶振的速度,外接晶振為11.0592MHZ時,
  73.                     //time的值為0.54us*time,單位為微秒
  74.                                 //那么1us聲波能走多遠(yuǎn)的距離呢?1s=1000ms=1000000us
  75.                                 // 340/1000000=0.00034米
  76.                                 //0.00034米/1000=0.34毫米  也就是1us能走0.34毫米
  77.                                 //但是,我們現(xiàn)在計算的是從超聲波發(fā)射到反射接收的雙路程,
  78.                                 //所以我們將計算的結(jié)果除以2才是實(shí)際的路程

  79.         S=time*2;//先算出一共的時間是多少微秒。
  80.            S=S*0.17;//此時計算到的結(jié)果為毫米,并且是精確到毫米的后兩位了,有兩個小數(shù)點(diǎn)
  81.          if(S<=300)         //
  82.          {        
  83.             if(turn_right_flag!=1)
  84.                 {
  85.                     Stop();
  86.                     Delay1ms(5);//發(fā)現(xiàn)小車自動復(fù)位的時候,可以稍微延長一點(diǎn)這個延時,減少電機(jī)反向電壓對電路板的沖擊。
  87.                 }
  88.                 turn_right_flag=1;
  89.                 P2_3=0;
  90.                 Delay1ms(50);
  91.                 P2_3=1;
  92.             Turn_Right(120,120);                                 //小于設(shè)定距離時電機(jī)后退轉(zhuǎn)彎
  93.          }
  94.          else
  95.          {
  96.             turn_right_flag=0;
  97.             Forward(Forward_R_DATA,Forward_L_DATA);                          //前進(jìn)(大于20-30CM前進(jìn))
  98.          }
  99.          //=======================================
  100.          if((S>=5000)||flag==1) //超出測量范圍
  101.          {        
  102.           flag=0;
  103.       DisplayListChar(0, 1, table1);
  104.          }
  105.          else
  106.          {
  107.       disbuff[0]=S%10;
  108.           disbuff[1]=S/10%10;
  109.           disbuff[2]=S/100%10;
  110.           disbuff[3]=S/1000;
  111.           DisplayListChar(0, 1, table);
  112.           DisplayOneChar(9, 1, ASCII[disbuff[3]]);
  113.           DisplayOneChar(10, 1, ASCII[disbuff[2]]);        
  114.           DisplayOneChar(11, 1, ASCII[disbuff[1]]);
  115.       DisplayOneChar(12, 1, ASCII[10]);
  116.           DisplayOneChar(13, 1, ASCII[disbuff[0]]);
  117.          }
  118.         }

  119. /********************************************************/
  120.      void zd0() interrupt 3                  //T0中斷用來計數(shù)器溢出,超過測距范圍
  121.   {
  122.     flag=1;                         //中斷溢出標(biāo)志
  123.         RX=0;
  124.   }

  125. /********超聲波高電平脈沖寬度計算程序***************/
  126. void Timer_Count(void)
  127. {
  128.                  TR1=1;                            //開啟計數(shù)
  129.              while(RX);                        //當(dāng)RX為1計數(shù)并等待
  130.              TR1=0;                                //關(guān)閉計數(shù)
  131.          Conut();                        //計算

  132. }
  133. /********************************************************/
  134.    void  StartModule()                          //啟動模塊
  135.   {
  136.           TX=1;                                             //啟動一次模塊
  137.       Delay10us(2);
  138.           TX=0;
  139.   }
  140. /********************************************************/

  141. /*************主程序********************/
  142. void main(void)
  143. {
  144.     unsigned char i;
  145.         unsigned int a;
  146.         cmg88();//關(guān)數(shù)碼管
  147.         Delay1ms(400); //啟動等待,等LCM講入工作狀態(tài)
  148.         LCMInit(); //LCM初始化
  149.         Delay1ms(5);//延時片刻

  150.         DisplayListChar(0, 0, Range);
  151.         DisplayListChar(0, 1, table);
  152.     TMOD=TMOD|0x10;//設(shè)T0為方式1,GATE=1;
  153.     EA=1;                                           //開啟總中斷
  154.     TH1=0;
  155.     TL1=0;         
  156.     ET1=1;             //允許T0中斷

  157.         //===============================
  158.         //PWM_ini();
  159.         //===============================
  160.         turn_right_flag=0;
  161.         //=================================
  162. B:                for(i=0;i<50;i++) //判斷K3是否按下
  163.                 {
  164.                    Delay1ms(1);        //1ms內(nèi)判斷50次,如果其中有一次被判斷到K3沒按下,便重新檢測
  165.                    if(P3_6!=0 )//當(dāng)K3按下時,啟動小車
  166.                    goto B; //跳轉(zhuǎn)到標(biāo)號B,重新檢測
  167.                 }
  168.         //蜂鳴器響一聲
  169.         BUZZ=0;        //50次檢測K3確認(rèn)是按下之后,蜂鳴器發(fā)出“滴”聲響,然后啟動小車。
  170.         Delay1ms(50);
  171.         BUZZ=1;//響50ms后關(guān)閉蜂鳴器
  172.         //=======================================================================================================================                        
  173.          while(1)
  174.           {
  175.                 RX=1;
  176.             StartModule();                                 //啟動模塊
  177.         for(a=951;a>0;a--)
  178.             {
  179.                   
  180.                if(RX==1)
  181.                    {
  182.            Timer_Count();                 //超聲波高電平脈沖寬度計算函數(shù)
  183.                    }
  184.              }
  185.            }
  186. }



  187.                
復(fù)制代碼
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表