找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機超聲波避障智能小車(附帶原理圖+PCB文件)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:842962 發(fā)表于 2021-11-5 20:50 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
功能:藍牙遙控超聲波避障oled屏幕顯示
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機源程序如下:
  1. #include<AT89x52.H>
  2. #include <intrins.h>   
  3. #include "oled.h"

  4. #define Left_moto_go      {P1_2=1,P1_3=0;}    //左邊兩個電機向前走
  5. #define Left_moto_back    {P1_2=0,P1_3=1;}         //左邊兩個電機向后轉
  6. #define Left_moto_Stop    {P1_2=0,P1_3=0;}    //左邊兩個電機停轉                     
  7. #define Right_moto_go     {P1_6=1,P1_7=0;}        //右邊兩個電機向前走
  8. #define Right_moto_back   {P1_6=0,P1_7=1;}        //右邊兩個電機向前走
  9. #define Right_moto_Stop   {P1_6=0,P1_7=0;}        //右邊兩個電機停轉   

  10. #define  ECHO  P2_0                                   //超聲波接口定義
  11. #define  TRIG  P2_1                                   //超聲波接口定義
  12. #define Sevro_moto_pwm    P2_2         //接舵機信號端輸入PWM信號調(diào)節(jié)速度
  13. #define BEEP                P2_3
  14. #define left     'C'
  15. #define right    'D'
  16. #define up       'A'
  17. #define down     'B'
  18. #define stop     'F'
  19. #define Car1     '2'           //手機軟件1號鍵
  20. #define Beep     '5'           //手機軟件5號鍵

  21.         unsigned char disbuff[4]          ={ 0,0,0,0,};
  22.            unsigned char pwm_val_left  = 0;//變量定義
  23.         unsigned char push_val_left =15;//舵機歸中,產(chǎn)生約,1.5MS 信號
  24.                 unsigned int  time=0;                    //時間變量
  25.   unsigned int  timer=0;                        //延時基準變量
  26.                 unsigned long S=0;                                //計算出超聲波距離值
  27.   unsigned long S1=0;
  28.                 unsigned long S2=0;
  29.         unsigned long S3=0;
  30.                 unsigned long S4=0;

  31.         bit  flag_REC=0;                                 //串行接收標去位
  32.         bit  flag    =0;  
  33.         bit  flag_xj =0;
  34.         bit  flag_bj =0;
  35.         
  36.         unsigned char  i=0;
  37.         unsigned char  dat=0;
  38.   unsigned char  buff[5]=0;       //接收緩沖字節(jié)

  39. /************************************************************************/        
  40. //延時函數(shù)        
  41.    void delay(unsigned int k)
  42. {   
  43.      unsigned int x,y;
  44.          for(x=0;x<k;x++)
  45.            for(y=0;y<2000;y++);
  46. }
  47. /************************************************************************/
  48. //前速前進
  49.      void  run(void)
  50. {
  51.          Left_moto_go ;   //左電機往前走
  52.          Right_moto_go ;  //右電機往前走
  53. }

  54. //前速后退
  55.      void  backrun(void)
  56. {

  57.          Left_moto_back ;   //左電機往前走
  58.          Right_moto_back ;  //右電機往前走
  59. }

  60. //左轉
  61.      void  leftrun(void)
  62. {

  63.          Left_moto_back ;   //左電機往前走
  64.          Right_moto_go ;    //右電機往前走
  65. }

  66. //右轉
  67.      void  rightrun(void)
  68. {

  69.          Left_moto_go ;   //左電機往前走
  70.          Right_moto_back ;  //右電機往前走
  71. }
  72. //STOP
  73.      void  stoprun(void)
  74. {
  75.          Left_moto_Stop ;   //左電機往前走
  76.          Right_moto_Stop ;  //右電機往前走
  77. }
  78.                 void   whistle(void)
  79. {
  80.                 BEEP=0;
  81. }
  82. /************************************************************************/
  83.      void  StartModule()                       //啟動測距信號
  84.    {
  85.           TRIG=1;                                       
  86.           _nop_();
  87.           _nop_();
  88.           _nop_();
  89.           _nop_();
  90.           _nop_();
  91.           _nop_();
  92.           _nop_();
  93.           _nop_();
  94.           _nop_();
  95.           _nop_();
  96.           _nop_();
  97.           _nop_();
  98.           _nop_();
  99.           _nop_();
  100.           _nop_();
  101.           _nop_();
  102.           _nop_();
  103.           _nop_();
  104.           _nop_();
  105.           _nop_();
  106.           _nop_();
  107.           TRIG=0;
  108.    }
  109. /***************************************************/
  110.           void Conut(void)                   //計算距離
  111.         {
  112.           while(!ECHO);                       //當RX為零時等待
  113.           TR0=1;                               //開啟計數(shù)
  114.           while(ECHO);                           //當RX為1計數(shù)并等待
  115.           TR0=0;                                   //關閉計數(shù)
  116.           time=TH0*256+TL0;                   //讀取脈寬長度
  117.           TH0=0;
  118.           TL0=0;
  119.           S=(time*1.7)/100;        //算出來是CM
  120.                 OLED_ShowNum(103,4,S,3,16);//距離
  121.         }
  122.             
  123. /************************************************************************/

  124. void  COMM( void )                       
  125.   {
  126.                   push_val_left=10;          //舵機向左轉90度
  127.                   timer=0;
  128.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  129.                   StartModule();          //啟動超聲波測距
  130.           Conut();                           //計算距離
  131.                   S2=S;  
  132.                         OLED_ShowNum(103,2,S2,3,16);//左側距離
  133.                   push_val_left=20;          //舵機向右轉90度
  134.                   timer=0;
  135.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  136.                   StartModule();          //啟動超聲波測距
  137.           Conut();                          //計算距離
  138.                   S4=S;         
  139.                         OLED_ShowNum(103,6,S4,3,16);//右側距離

  140.                   push_val_left=15;          //舵機歸中
  141.                   timer=0;
  142.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  143.                   StartModule();          //啟動超聲波測距
  144.           Conut();                          //計算距離
  145.                   S1=S;         

  146.           if((S2<20)||(S4<20)) //只要左右各有距離小于,20CM小車后退
  147.                   {
  148.                   backrun();                   //后退
  149.                   timer=0;
  150.                   while(timer<=4000);
  151.                   }
  152.                   
  153.                   if(S2>S4)                 
  154.                      {
  155.                                 rightrun();          //車的左邊比車的右邊距離小        右轉        
  156.                         timer=0;
  157.                         while(timer<=400);
  158.                      }                                      
  159.                        else
  160.                      {
  161.                        leftrun();                //車的左邊比車的右邊距離大        左轉
  162.                        timer=0;
  163.                        while(timer<=400);
  164.                      }
  165.                                              
  166. }
  167. /************************************************************************/
  168. /*                    PWM調(diào)制舵機信號                                 */
  169. /************************************************************************/
  170. /*                    左電機調(diào)速                                        */
  171. /*調(diào)節(jié)push_val_left的值改變電機轉速,占空比            */
  172.                 void pwm_Servomoto(void)
  173. {  

  174.     if(pwm_val_left<=push_val_left)
  175.                Sevro_moto_pwm=1;
  176.         else
  177.                Sevro_moto_pwm=0;
  178.         if(pwm_val_left>=200)
  179.         pwm_val_left=0;

  180. }
  181. /***************************************************/
  182. ///*TIMER1中斷服務子函數(shù)產(chǎn)生PWM信號*/
  183.          void time1()interrupt 3   using 2
  184. {        
  185.      TH1=(65536-100)/256;          //100US定時
  186.          TL1=(65536-100)%256;
  187.          timer++;                                  //定時器100US為準。在這個基礎上延時
  188.          pwm_val_left++;
  189.          pwm_Servomoto();
  190. }

  191. /************************************************************************/
  192. void sint() interrupt 4          //中斷接收3個字節(jié)
  193. {

  194.     if(RI)                         //是否接收中斷
  195.     {
  196.        RI=0;
  197.        dat=SBUF;
  198.        if(dat=='O'&&(i==0)) //接收數(shù)據(jù)第一幀
  199.          {
  200.             buff[i]=dat;
  201.             flag=1;        //開始接收數(shù)據(jù)
  202.          }
  203.        else
  204.       if(flag==1)
  205.      {
  206.       i++;
  207.       buff[i]=dat;
  208.       if(i>=2)
  209.       {i=0;flag=0;flag_REC=1 ;}  // 停止接收
  210.      }
  211.          }
  212. }
  213. /*********************************************************************/                 
  214. /*--主函數(shù)--*/
  215.         void main(void)
  216. {
  217.         TMOD=0x11;  
  218.   TH1=(65536-100)/256;          //100US定時
  219.         TL1=(65536-100)%256;
  220.         TH0=0;
  221.         TL0=0;

  222.   T2CON=0x34;
  223.         T2MOD=0x00;
  224.         RCAP2H=0xFF;
  225.         RCAP2L=0xDC;
  226.   SCON=0x50;  
  227.   PCON=0x00;

  228.   PS=1;
  229.         TR1=1;
  230.         ET1=1;
  231.         ES=1;
  232.   EA=1;  
  233.         
  234.         delay(100);
  235.         OLED_Init();                        //初始化OLED  
  236.         OLED_Clear();
  237.         BEEP=1;
  238.   push_val_left=15;          //舵機歸中
  239.         OLED_ShowCHinese(0,0,0);//信
  240.                 OLED_ShowCHinese(16,0,1);//息
  241.                 OLED_ShowString(32,0,"1902",16);
  242.                 OLED_ShowCHinese(64,0,2);//王
  243.                 OLED_ShowCHinese(80,0,3);//晨
  244.                 OLED_ShowCHinese(0,2,6);//左
  245.                 OLED_ShowCHinese(16,2,9);//側
  246.                 OLED_ShowCHinese(32,2,4);//距
  247.                 OLED_ShowCHinese(48,2,5);//離
  248.                 OLED_ShowCHinese(64,2,10);//:
  249.                
  250.                 OLED_ShowCHinese(32,4,4);//距
  251.                 OLED_ShowCHinese(48,4,5);//離
  252.                 OLED_ShowCHinese(64,4,10);//:
  253.                
  254.                 OLED_ShowCHinese(0,6,7);//右
  255.                 OLED_ShowCHinese(16,6,9);//側
  256.                 OLED_ShowCHinese(32,6,4);//距
  257.                 OLED_ShowCHinese(48,6,5);//離
  258.                 OLED_ShowCHinese(64,6,10);//:
  259.         while(1)                                                        /*無限循環(huán)*/
  260.         {
  261.                 while(flag_bj)                       /*無限循環(huán)*/
  262.            {
  263.              if(timer>=1000)          //100MS檢測啟動檢測一次
  264.              {
  265.                timer=0;
  266.                    StartModule(); //啟動檢測
  267.            Conut();                  //計算距離
  268.            if(S<20)                  //距離小于20CM
  269.                    {
  270.                    stoprun();          //小車停止
  271.                    COMM();                   //方向函數(shù)
  272.                    }
  273.                    else
  274.                    if(S>30)                  //距離大于,30CM往前走
  275.                    run();
  276.              }

  277.                          if(flag_REC==1)
  278.                         {
  279.                           push_val_left=15;          //舵機歸中
  280.                           stoprun();
  281.                           break;
  282.                         }
  283.           }
  284.           if(flag_REC==1)                                    //
  285.            {
  286.                 flag_REC=0;
  287.                 if(buff[0]=='O'&&buff[1]=='N')        //第一個字節(jié)為O,第二個字節(jié)為N,第三個字節(jié)為控制碼
  288.                         BEEP=1;
  289.                 switch(buff[2])
  290.              {
  291.                       case up :                                                    // 前進
  292.                           flag_xj=0;
  293.                           flag_bj=0;
  294.                           run();
  295.                           break;

  296.                       case down:                                                // 后退
  297.                           flag_xj=0;
  298.                           flag_bj=0;
  299.                           backrun();
  300.                           break;

  301.                       case left:                                                // 左轉
  302.                           flag_xj=0;
  303.                           flag_bj=0;
  304.                           leftrun();
  305.                           break;

  306.                       case right:                                                // 右轉
  307.                           flag_bj=0;
  308.                           rightrun();
  309.                           break;

  310.                       case stop:                                                // 停止
  311.                           flag_bj=0;
  312.                           stoprun();
  313.                           break;

  314.                           case Car1:                                                //                 
  315.                           flag_bj=1;
  316.                           break;
  317.                                 
  318.                                 case Beep:
  319.                           flag_bj=0;
  320.                                 whistle();
  321.                           break;
  322.              }                 
  323.          }               
  324.         }
  325. }                                   
  326.         
復制代碼
原理圖和pcb下載: 原理圖和PCB.7z (15.05 MB, 下載次數(shù): 269)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:913671 發(fā)表于 2021-11-13 17:51 | 只看該作者
樓主這個非常全面
回復

使用道具 舉報

板凳
ID:836340 發(fā)表于 2022-3-11 09:04 | 只看該作者
這個代碼可以的
回復

使用道具 舉報

地板
ID:1068002 發(fā)表于 2023-4-27 21:42 | 只看該作者
您好,請問這個可以做出實物嗎?求實物
回復

使用道具 舉報

5#
ID:109547 發(fā)表于 2023-5-18 23:14 | 只看該作者
應該是好東西
回復

使用道具 舉報

6#
ID:1078477 發(fā)表于 2023-5-19 11:05 | 只看該作者
做出來了嗎?效果如何?
回復

使用道具 舉報

7#
ID:1083820 發(fā)表于 2023-6-16 08:56 | 只看該作者
壓縮包內(nèi)包含什么內(nèi)容啊
回復

使用道具 舉報

8#
ID:143767 發(fā)表于 2024-1-23 14:30 | 只看該作者
沒有藍牙APP,做了也沒用
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表