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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

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

  [復(fù)制鏈接]
ID:842962 發(fā)表于 2021-11-5 20:50 | 顯示全部樓層 |閱讀模式
功能:藍(lán)牙遙控超聲波避障oled屏幕顯示
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png 51hei.png

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

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

  10. #define  ECHO  P2_0                                   //超聲波接口定義
  11. #define  TRIG  P2_1                                   //超聲波接口定義
  12. #define Sevro_moto_pwm    P2_2         //接舵機(jī)信號(hào)端輸入PWM信號(hào)調(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'           //手機(jī)軟件1號(hào)鍵
  20. #define Beep     '5'           //手機(jī)軟件5號(hào)鍵

  21.         unsigned char disbuff[4]          ={ 0,0,0,0,};
  22.            unsigned char pwm_val_left  = 0;//變量定義
  23.         unsigned char push_val_left =15;//舵機(jī)歸中,產(chǎn)生約,1.5MS 信號(hào)
  24.                 unsigned int  time=0;                    //時(shí)間變量
  25.   unsigned int  timer=0;                        //延時(shí)基準(zhǔn)變量
  26.                 unsigned long S=0;                                //計(jì)算出超聲波距離值
  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;                                 //串行接收標(biāo)去位
  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í)函數(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. //前速前進(jìn)
  49.      void  run(void)
  50. {
  51.          Left_moto_go ;   //左電機(jī)往前走
  52.          Right_moto_go ;  //右電機(jī)往前走
  53. }

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

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

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

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

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

  69.          Left_moto_go ;   //左電機(jī)往前走
  70.          Right_moto_back ;  //右電機(jī)往前走
  71. }
  72. //STOP
  73.      void  stoprun(void)
  74. {
  75.          Left_moto_Stop ;   //左電機(jī)往前走
  76.          Right_moto_Stop ;  //右電機(jī)往前走
  77. }
  78.                 void   whistle(void)
  79. {
  80.                 BEEP=0;
  81. }
  82. /************************************************************************/
  83.      void  StartModule()                       //啟動(dòng)測距信號(hào)
  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)                   //計(jì)算距離
  111.         {
  112.           while(!ECHO);                       //當(dāng)RX為零時(shí)等待
  113.           TR0=1;                               //開啟計(jì)數(shù)
  114.           while(ECHO);                           //當(dāng)RX為1計(jì)數(shù)并等待
  115.           TR0=0;                                   //關(guān)閉計(jì)數(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;          //舵機(jī)向左轉(zhuǎn)90度
  127.                   timer=0;
  128.                   while(timer<=4000); //延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置
  129.                   StartModule();          //啟動(dòng)超聲波測距
  130.           Conut();                           //計(jì)算距離
  131.                   S2=S;  
  132.                         OLED_ShowNum(103,2,S2,3,16);//左側(cè)距離
  133.                   push_val_left=20;          //舵機(jī)向右轉(zhuǎn)90度
  134.                   timer=0;
  135.                   while(timer<=4000); //延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置
  136.                   StartModule();          //啟動(dòng)超聲波測距
  137.           Conut();                          //計(jì)算距離
  138.                   S4=S;         
  139.                         OLED_ShowNum(103,6,S4,3,16);//右側(cè)距離

  140.                   push_val_left=15;          //舵機(jī)歸中
  141.                   timer=0;
  142.                   while(timer<=4000); //延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置
  143.                   StartModule();          //啟動(dòng)超聲波測距
  144.           Conut();                          //計(jì)算距離
  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();          //車的左邊比車的右邊距離小        右轉(zhuǎn)        
  156.                         timer=0;
  157.                         while(timer<=400);
  158.                      }                                      
  159.                        else
  160.                      {
  161.                        leftrun();                //車的左邊比車的右邊距離大        左轉(zhuǎn)
  162.                        timer=0;
  163.                        while(timer<=400);
  164.                      }
  165.                                              
  166. }
  167. /************************************************************************/
  168. /*                    PWM調(diào)制舵機(jī)信號(hào)                                 */
  169. /************************************************************************/
  170. /*                    左電機(jī)調(diào)速                                        */
  171. /*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比            */
  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中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)*/
  183.          void time1()interrupt 3   using 2
  184. {        
  185.      TH1=(65536-100)/256;          //100US定時(shí)
  186.          TL1=(65536-100)%256;
  187.          timer++;                                  //定時(shí)器100US為準(zhǔn)。在這個(gè)基礎(chǔ)上延時(shí)
  188.          pwm_val_left++;
  189.          pwm_Servomoto();
  190. }

  191. /************************************************************************/
  192. void sint() interrupt 4          //中斷接收3個(gè)字節(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定時(shí)
  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;          //舵機(jī)歸中
  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);//側(cè)
  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);//側(cè)
  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檢測啟動(dòng)檢測一次
  264.              {
  265.                timer=0;
  266.                    StartModule(); //啟動(dòng)檢測
  267.            Conut();                  //計(jì)算距離
  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;          //舵機(jī)歸中
  280.                           stoprun();
  281.                           break;
  282.                         }
  283.           }
  284.           if(flag_REC==1)                                    //
  285.            {
  286.                 flag_REC=0;
  287.                 if(buff[0]=='O'&&buff[1]=='N')        //第一個(gè)字節(jié)為O,第二個(gè)字節(jié)為N,第三個(gè)字節(jié)為控制碼
  288.                         BEEP=1;
  289.                 switch(buff[2])
  290.              {
  291.                       case up :                                                    // 前進(jìn)
  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:                                                // 左轉(zhuǎn)
  302.                           flag_xj=0;
  303.                           flag_bj=0;
  304.                           leftrun();
  305.                           break;

  306.                       case right:                                                // 右轉(zhuǎn)
  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.         
復(fù)制代碼
原理圖和pcb下載: 原理圖和PCB.7z (15.05 MB, 下載次數(shù): 269)

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:913671 發(fā)表于 2021-11-13 17:51 | 顯示全部樓層
樓主這個(gè)非常全面
回復(fù)

使用道具 舉報(bào)

ID:836340 發(fā)表于 2022-3-11 09:04 | 顯示全部樓層
這個(gè)代碼可以的
回復(fù)

使用道具 舉報(bào)

ID:1068002 發(fā)表于 2023-4-27 21:42 | 顯示全部樓層
您好,請(qǐng)問這個(gè)可以做出實(shí)物嗎?求實(shí)物
回復(fù)

使用道具 舉報(bào)

ID:109547 發(fā)表于 2023-5-18 23:14 | 顯示全部樓層
應(yīng)該是好東西
回復(fù)

使用道具 舉報(bào)

ID:1078477 發(fā)表于 2023-5-19 11:05 | 顯示全部樓層
做出來了嗎?效果如何?
回復(fù)

使用道具 舉報(bào)

ID:1083820 發(fā)表于 2023-6-16 08:56 | 顯示全部樓層
壓縮包內(nèi)包含什么內(nèi)容啊
回復(fù)

使用道具 舉報(bào)

ID:143767 發(fā)表于 2024-1-23 14:30 | 顯示全部樓層
沒有藍(lán)牙APP,做了也沒用
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美中文在线 | 亚洲一区二区三区视频 | 天天射视频| 欧美日韩在线一区 | 亚洲精品久久久一区二区三区 | 久久精品国产一区二区三区 | 国产精品久久久99 | 国产中文视频 | 在线免费观看黄网 | 国产午夜精品一区二区三区嫩草 | 免费福利视频一区二区三区 | 亚洲精品在线免费 | 久久久久久蜜桃一区二区 | 亚洲综合网站 | 欧美一区 | 日韩精品 电影一区 亚洲 | 伊人网站 | 久久躁日日躁aaaaxxxx | 伊人操| 免费视频一区 | 九九久久99 | 国产精品片 | 国产亚洲www | 成人三级视频在线观看 | 九九色综合| 国产一级特黄aaa大片评分 | 欧美日韩在线免费 | 在线一区观看 | 成人网在线观看 | 羞羞午夜| 极品的亚洲 | 成人国产午夜在线观看 | 91精品麻豆日日躁夜夜躁 | 亚洲国产网站 | 国产福利91精品一区二区三区 | 天天操天天射天天 | 蜜臀久久99精品久久久久久宅男 | 青青草一区二区三区 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 奇米视频777 | 国产精品一区二 |