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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2531|回復: 1
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:205988 發表于 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//當前進不能走直線的時候,請調節這兩個參數,理想的時候是100,100,最大256,最小0。0的時候最慢,256的時候最快
#define Forward_R_DATA  180        //例如小車前進的時候有點向左拐,說明右邊馬達轉速過快,那可以取一個值大一點,另外一個值小一點,例如 200  190
                            //直流電機因為制造上的誤差,同一個脈寬下也不一定速度一致的,需要自己手動調節

//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()//關數碼管,點陣函數
{
DU=1;  
P0=0X00;
DU=0;
}

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

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);//距離計算函數
                          
unsigned int  time=0;//用于存放定時器時間值
unsigned long S=0;//用于存放距離的值
bit  flag =0; //量程溢出標志位
bit  turn_right_flag;

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

         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聲波能走多遠的距離呢?1s=1000ms=1000000us
                                // 340/1000000=0.00034米
                                //0.00034米/1000=0.34毫米  也就是1us能走0.34毫米
                                //但是,我們現在計算的是從超聲波發射到反射接收的雙路程,
                                //所以我們將計算的結果除以2才是實際的路程

        S=time*2;//先算出一共的時間是多少微秒。
           S=S*0.17;//此時計算到的結果為毫米,并且是精確到毫米的后兩位了,有兩個小數點
         if(S<=300)         //
         {       
            if(turn_right_flag!=1)
                {
                    Stop();
                    Delay1ms(5);//發現小車自動復位的時候,可以稍微延長一點這個延時,減少電機反向電壓對電路板的沖擊。
                }
                turn_right_flag=1;
                P2_3=0;
                Delay1ms(50);
                P2_3=1;
            Turn_Right(120,120);                                 //小于設定距離時電機后退轉彎
         }
         else
         {
            turn_right_flag=0;
            Forward(Forward_R_DATA,Forward_L_DATA);                          //前進(大于20-30CM前進)
         }
         //=======================================
         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中斷用來計數器溢出,超過測距范圍
  {
    flag=1;                         //中斷溢出標志
        RX=0;
  }

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

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

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

        DisplayListChar(0, 0, Range);
        DisplayListChar(0, 1, table);
    TMOD=TMOD|0x10;//設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內判斷50次,如果其中有一次被判斷到K3沒按下,便重新檢測
                   if(P3_6!=0 )//當K3按下時,啟動小車
                   goto B; //跳轉到標號B,重新檢測
                }
        //蜂鳴器響一聲
        BUZZ=0;        //50次檢測K3確認是按下之后,蜂鳴器發出“滴”聲響,然后啟動小車。
        Delay1ms(50);
        BUZZ=1;//響50ms后關閉蜂鳴器
        //=======================================================================================================================                       
        while(1)
          {
                RX=1;
            StartModule();                                 //啟動模塊
        for(a=951;a>0;a--)
            {
                  
               if(RX==1)
                   {
           Timer_Count();                 //超聲波高電平脈沖寬度計算函數
                   }
             }
           }
}





C51FPS.rar

13.83 KB, 下載次數: 12, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:205988 發表于 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//當前進不能走直線的時候,請調節這兩個參數,理想的時候是100,100,最大256,最小0。0的時候最慢,256的時候最快
  10. #define Forward_R_DATA  180        //例如小車前進的時候有點向左拐,說明右邊馬達轉速過快,那可以取一個值大一點,另外一個值小一點,例如 200  190
  11.                             //直流電機因為制造上的誤差,同一個脈寬下也不一定速度一致的,需要自己手動調節

  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()//關數碼管,點陣函數
  22. {
  23. DU=1;  
  24. P0=0X00;
  25. DU=0;
  26. }

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

  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);//距離計算函數
  34.                           
  35. unsigned int  time=0;//用于存放定時器時間值
  36. unsigned long S=0;//用于存放距離的值
  37. bit  flag =0; //量程溢出標志位
  38. bit  turn_right_flag;

  39. //=========================================================================================================================
  40. void Forward(unsigned char Speed_Right,unsigned char Speed_Left)//           前進
  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聲波能走多遠的距離呢?1s=1000ms=1000000us
  75.                                 // 340/1000000=0.00034米
  76.                                 //0.00034米/1000=0.34毫米  也就是1us能走0.34毫米
  77.                                 //但是,我們現在計算的是從超聲波發射到反射接收的雙路程,
  78.                                 //所以我們將計算的結果除以2才是實際的路程

  79.         S=time*2;//先算出一共的時間是多少微秒。
  80.            S=S*0.17;//此時計算到的結果為毫米,并且是精確到毫米的后兩位了,有兩個小數點
  81.          if(S<=300)         //
  82.          {        
  83.             if(turn_right_flag!=1)
  84.                 {
  85.                     Stop();
  86.                     Delay1ms(5);//發現小車自動復位的時候,可以稍微延長一點這個延時,減少電機反向電壓對電路板的沖擊。
  87.                 }
  88.                 turn_right_flag=1;
  89.                 P2_3=0;
  90.                 Delay1ms(50);
  91.                 P2_3=1;
  92.             Turn_Right(120,120);                                 //小于設定距離時電機后退轉彎
  93.          }
  94.          else
  95.          {
  96.             turn_right_flag=0;
  97.             Forward(Forward_R_DATA,Forward_L_DATA);                          //前進(大于20-30CM前進)
  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中斷用來計數器溢出,超過測距范圍
  121.   {
  122.     flag=1;                         //中斷溢出標志
  123.         RX=0;
  124.   }

  125. /********超聲波高電平脈沖寬度計算程序***************/
  126. void Timer_Count(void)
  127. {
  128.                  TR1=1;                            //開啟計數
  129.              while(RX);                        //當RX為1計數并等待
  130.              TR1=0;                                //關閉計數
  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();//關數碼管
  147.         Delay1ms(400); //啟動等待,等LCM講入工作狀態
  148.         LCMInit(); //LCM初始化
  149.         Delay1ms(5);//延時片刻

  150.         DisplayListChar(0, 0, Range);
  151.         DisplayListChar(0, 1, table);
  152.     TMOD=TMOD|0x10;//設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內判斷50次,如果其中有一次被判斷到K3沒按下,便重新檢測
  165.                    if(P3_6!=0 )//當K3按下時,啟動小車
  166.                    goto B; //跳轉到標號B,重新檢測
  167.                 }
  168.         //蜂鳴器響一聲
  169.         BUZZ=0;        //50次檢測K3確認是按下之后,蜂鳴器發出“滴”聲響,然后啟動小車。
  170.         Delay1ms(50);
  171.         BUZZ=1;//響50ms后關閉蜂鳴器
  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();                 //超聲波高電平脈沖寬度計算函數
  183.                    }
  184.              }
  185.            }
  186. }



  187.                
復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 玖草资源| 黄视频网址 | 欧美一级特黄aaa大片在线观看 | 中文字幕高清 | 免费播放一级片 | 999精品视频 | 精品日本久久久久久久久久 | 国产最新精品视频 | 久草中文在线 | 日日干夜夜草 | 日韩精品一区二区三区中文字幕 | 亚洲免费精品 | 高清视频一区二区三区 | 亚洲高清视频一区二区 | 国产伦精品一区二区三区精品视频 | 91久久精品一区 | 久久成 | 日韩免费一区 | 99精品欧美一区二区蜜桃免费 | 午夜在线小视频 | 在线国产视频 | 精品日韩在线 | 国产 91 视频 | 日韩视频一区二区 | 亚洲精品乱码久久久久久蜜桃91 | jlzzjlzz欧美大全 | 亚洲成人毛片 | 欧美激情一区二区三级高清视频 | 色视频在线播放 | 国产精品1区2区3区 一区中文字幕 | 国产精品久久久久久久一区探花 | 日韩一区二区不卡 | 欧美精品久久 | 蜜桃久久 | 91大神新作在线观看 | 91在线看 | 91最新视频 | 久久av一区二区三区 | 在线免费观看a级片 | 欧美一级久久 | 麻豆av网|