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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的手機控制小車和機械臂程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:621334 發表于 2019-10-10 22:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
第一寫帖子,不好的地方請大家指出
最近做了一輛小車,
具體功能如下:1、4個電機和兩個驅動模塊實現小車的運動
                      2、用藍牙模塊實現小車的通信問題,實現小車與手機的通信
                      3、機械臂的應用,用舵機實現機械臂的左右前后移動和夾東西(后來因為舵機的扭矩太小,失敗了)
                      4 、用時鐘配置pwm來控制小車速度
遇到的問題:1、藍牙模塊與手機的通信問題,解決:先要設置波特率,發送的信號是以16進制來發送的,安卓手機下載個串口助手
                    2、舵機的控制問題 :安裝時,沒有把舵機的方向調好  心得:在機械臂組裝時,應把舵機轉向正確的角度

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>   
  3. #define uchar unsignrd char
  4. #define uint unsigned int
  5. unsigned char a,aa,b,c,d ;
  6. uint t , count ,num;
  7. sbit   BIN1=P0^4;    //后右端電機輸入口       奇數等于1,為往前走
  8. sbit   BIN2=P0^5;
  9. sbit   BIN3=P0^6;    //后左端電機輸入口
  10. sbit   BIN4=P0^7;

  11. sbit   FIN1=P0^0;    //前右端電機輸入口
  12. sbit   FIN2=P0^1;
  13. sbit   FIN3=P0^2;    //前左端電機輸入口
  14. sbit   FIN4=P0^3;

  15. sbit   bi = P1^0;     //蜂鳴器

  16. sbit   p11 = P1^1;     //抓手舵機
  17. sbit   p12 = P1^2;     //前后伸長舵機
  18. sbit   p13 = P1^3;     //上下移動舵機
  19. sbit   p14 = P1^4;     //底層旋轉舵機

  20. sbit P14=P1^3;//尋跡左
  21. sbit P15=P1^2;//尋跡中
  22. sbit P16=P1^1;//尋跡右   

  23. void delay_us(uint z)
  24. {
  25.     uint j,k;
  26.   for(j=z;j>0;j--)
  27.     for(k=110;k>0;k--);
  28. }

  29. void delay_ms(uint q)
  30. {
  31.     uint j,k;
  32.   for(j=q;j>0;j--)
  33.     for(k=10;k>0;k--);
  34. }

  35. /*****************小車前進*****************/
  36. void forward()
  37. {   
  38.   if(num<=t)
  39.   {
  40.   BIN3=1;
  41.   BIN1=1;
  42.   FIN3=1;
  43.    FIN1=1;
  44.   }
  45.    
  46.    else
  47.   {BIN3=0;
  48.   BIN1=0;
  49.   FIN3=0;
  50.    FIN1=0;}
  51.    
  52. }

  53. /*****************小車后退*****************/
  54. void back()
  55. {   
  56.   if (num<=t)
  57.   {FIN2=1;
  58.    FIN4=1;  
  59.    BIN2=1;   
  60.    BIN4=1;
  61.   }
  62.   else
  63.    {
  64.    BIN2=0;  
  65.   FIN2=0;
  66.   BIN4=0;
  67.   FIN4=0;}
  68.   }     
  69. /*****************小車右轉*****************/
  70. void right()
  71. {   

  72.   if (num<=t)
  73.   {
  74.   FIN3 = 1;
  75.   BIN3 = 1;
  76.   }   
  77.   else
  78.   {    FIN3 = 0;
  79.    BIN3 = 0;
  80.   }

  81.   if (num<=t/6)
  82.   {
  83.    FIN1 = 1;
  84.    BIN1 = 1;
  85.    }
  86.    else
  87.    {
  88.    FIN1 = 0;
  89.    BIN1 = 0;
  90.    }
  91.   }

  92. /*****************小車左轉*****************/
  93. void left()
  94. {
  95.     if (num<=t)
  96.   {
  97.   FIN1 = 1;
  98.   BIN1 = 1;
  99.   }   
  100.   else
  101.   {
  102.    FIN1 = 0;
  103.    BIN1 = 0;
  104.   }

  105.   if (num<=t/6)
  106.   {
  107.    FIN3 = 1;
  108.    BIN3 = 1;
  109.    }
  110.    else
  111.    {
  112.    FIN3 = 0;
  113.    BIN3 = 0;
  114.    }
  115.   }


  116. /*****************小車停止*****************/ void stop()
  117. {   
  118.    FIN1=0;
  119.    FIN2=0;

  120.    FIN3=0;
  121.   FIN4=0;

  122.    BIN1=0;
  123.    BIN2=0;

  124.    BIN3=0;
  125.    BIN4=0;
  126. }

  127. /*****************小車加速*****************/

  128. void speed_add()
  129. {   
  130.     if (1<=t<20)
  131.     {t = t+2;}
  132.   if (t==20)
  133.   { t = 20;}
  134.   delay_us(200);   
  135. }

  136. /*****************小車減速*****************/

  137. void speed_down()
  138. {  if (1< t <=20)
  139.     { t = t-2;}
  140.   if (t==1)
  141.   { t = 1;}
  142.   delay_us(200);
  143. }

  144. /*****************小車循跡*****************/
  145. void xunji()
  146. {     
  147.     if((P14==0&&P15==1&&P16==0)||(P14==1&&P15==1&&P16==1))   // 為零時,證明紅外
  148. 探測到黑線
  149.   { t = 15; forward();    }
  150.     if(P14==1&&P15==0&&P16==0)
  151.    { t = 10;  left(); }    if(P14==0&&P15==0&&P16==1)
  152.    { t =10; right();}
  153.   if(P14==0&&P15==0&&P16==0)
  154.    {stop();  }
  155.   }



  156. void not_catch ()          //抓手控制
  157. {
  158.   if(count <=4)           
  159.     p11=1;         
  160.   else
  161.     p11=0;
  162. }

  163. void catch()
  164. {
  165.     if(count <=2)           
  166.     p11=1;         
  167.   else
  168.     p11=0;
  169. }

  170. void arm_forward()
  171. {
  172.   if (a == 0x46)
  173.   {
  174.     delay_ms(2);
  175.     if(a == 0x45 && b<4)
  176.     {  
  177.       b=b+1;
  178.     }   
  179.   }
  180.   if (a==0x47)
  181.   {
  182.     delay_ms(2);
  183.     if(a == 0x45 && b>0)
  184.     {  
  185.       b=b-1;
  186.     }   
  187.   }  
  188.   if(count <=b)        
  189.     p12=1;   else
  190.     p12=0;  
  191. }

  192. void arm_turn()
  193. {
  194.   
  195.   if (a == 0x46)
  196.    {
  197.     delay_ms(2);
  198.     if (c<4&&a==0x45)
  199.       {c++;}
  200.                }
  201.   if (a== 0x47)
  202.     {
  203.     delay_ms(2);
  204.     if (c>0&&a==0x45)
  205.       {c--; }
  206.           }
  207.    if(count <=c)           
  208.     p14=1;         
  209.   else
  210.     p14=0;

  211. }




  212. void arm_up()
  213. {   
  214.   if (a == 0x46)
  215.   {
  216.     delay_ms(2);
  217.     if(a == 0x45 && d<4)
  218.     {  
  219.       d=d+1;
  220.     }   
  221.   }
  222.   if (a==0x47)
  223.   {
  224.     delay_ms(2);
  225.     if(a == 0x45 && d>0)
  226.     {        d=d-1;
  227.     }   
  228.   }  
  229.   if(count <=d)        
  230.     p13=1;
  231.   else
  232.     p13=0;  
  233. }

  234. void keep()
  235. {   
  236.   not_catch();   
  237.   if(count <=d)        
  238.     p13=1;
  239.   else  
  240.     p13 = 1;     
  241.   if(count <=c)           
  242.     p14=1;
  243.   else  
  244.     p14 = 1;         
  245.   if(count <=b)        
  246.     p12=1;   
  247.   else
  248.     p12=0;
  249. }

  250. void choose_second()
  251. {   
  252.   while(a != 0x61)       //退出
  253.   {   
  254.   if (a != 0x60)
  255.   {
  256.   keep();
  257.   }
  258.      
  259.    switch(a)
  260.    {
  261.        case 0x41:                 //機械臂前進與后退        
  262. //待修改
  263.                {
  264.             while (a!=0x50)            
  265.              {arm_forward();
  266.               // not_catch();  
  267.             keep();        }
  268.             break;
  269.             }
  270.                                     
  271.            case 0x43 :                //底盤左轉與右轉  
  272.                 {
  273.             while (a!=0x50)              
  274.             {arm_turn();
  275.             //not_catch();
  276.             keep();
  277.             }  
  278.             break;}
  279.                   
  280.            case 0x62:                  //關抓手
  281.                {not_catch();   
  282.             break;}

  283.        case 0x60:                //開抓手
  284.             {
  285.            catch();
  286.            keep();
  287.            break;
  288.           }

  289.        case 0x44:                        //向上與向下
  290.              {   
  291.            while (a!=0x50)  
  292.             {arm_up();
  293.             //not_catch();
  294.             keep();
  295.                 }  
  296.                   break; }                           
  297.    }
  298.    
  299.    
  300.   }


  301. }
  302. /*****************藍牙初始化*****************/
  303. void UART_INIT()
  304. {     
  305.     TMOD |= 0x20;   //8位自動重裝模式
  306.     PCON = 0x00;         TH1 = 0xfd;
  307.         TL1 = 0xfd;   //9600波特率

  308.         SM0 = 0;
  309.         SM1 = 1;     //串口工作方式1
  310.         REN = 1;     //允許串口接收
  311.     RI = 0;  
  312.         EA = 1;      //開總中斷
  313.         ES = 1;      //開串口中斷
  314.         TR1 = 1;    //啟動定時器1   
  315. }
  316. void init()
  317. {   
  318.     num=0;
  319.     count =0;          //給 num 賦初值
  320.     TMOD |= 0X01;
  321.     TH0=(65536-458)/256;   //調整 t的值改變頻率 50HZ
  322.     TL0=(65536-458)%256;

  323.     EA=1;     
  324.     ET0=1;                     
  325.     TR0=1;

  326. }

  327. void chooce()
  328. {    t = 4;
  329.     P0 = 0x00;
  330.      aa = 1;
  331.     b =0;
  332.     c = 0;
  333.     d = 0;
  334.        while(1)
  335.     {
  336.       keep();              
  337.          switch(a)
  338.          {
  339.            case 0x41:                 //前進        //待修改
  340.                {forward();
  341.             break;}      
  342.            case 0x42:                //后退              
  343.            {back();  
  344.             break;}      
  345.            case 0x43 :                //左轉                  {left();        
  346.              break;}      
  347.            case 0x44:                 //右轉
  348.                {right();  
  349.             break;}      
  350.            case 0x45:                  //停止
  351.                {stop();   
  352.             break;}
  353.        case 0x46:                        //加速
  354.              {speed_add();
  355.                   break; }                 
  356.        case 0x47:                 //減速
  357.               {speed_down();         
  358.                break;}
  359. //       case 0x48:  {break;}            //空情況
  360.                
  361.        case 0x49 :                 //蜂鳴器振動
  362.                   { bi  =0;  
  363.               break;}
  364.      
  365.        case 0x50:                 //小車循跡
  366.                   { xunji();   
  367.               break;}  
  368.        case 0x51:   
  369.               {bi = 1;
  370.              break;}
  371.        case 0x52:
  372.             {  choose_second();
  373.             break;
  374.             }
  375.                              
  376.                                     
  377. }

  378. }
  379. }

  380. /*****************主程序*****************/
  381. void main()
  382. {     
  383.     init();
  384.         UART_INIT();     //串口初始化
  385.       chooce();     //手機控制選擇運動
  386. }  

  387. /*****************串口中斷*****************/
  388. void UART_SER() interrupt 4
  389. {
  390.     a = SBUF;
  391.     RI = 0;     //清除接收標志
  392. //    SBUF = a;    //將內容返回到手機端,可在手機查看發送內容
  393. //    while(!TI);
  394.     TI = 0;       //寫標志清零
  395. }


  396. void time0() interrupt 1 //中斷函數
  397. {
  398.   TH0=(65536-458)/256;
  399.   TL0=(65536-458)%256;

  400.   count ++;
  401.   if (count%2 == 0)
  402.   {num ++;}

  403.   if(num>21)
  404.   {   count = 0;
  405.     num=0;  
  406.   }   
  407. }  
復制代碼
程序打包:
控制小車和機械臂程序.pdf (202.28 KB, 下載次數: 57)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:328014 發表于 2019-10-10 22:59 | 只看該作者
好東東啊 有原理圖嗎?
回復

使用道具 舉報

板凳
ID:621334 發表于 2019-10-10 23:04 | 只看該作者
51hei團團 發表于 2019-10-10 22:59
好東東啊 有原理圖嗎?

過幾天加上,還沒完善這一部分
回復

使用道具 舉報

地板
ID:735007 發表于 2020-4-22 10:56 | 只看該作者
晨晨晨晨晨晨 發表于 2019-10-10 23:04
過幾天加上,還沒完善這一部分

樓主,請問有原理圖嗎?
回復

使用道具 舉報

5#
ID:721592 發表于 2020-5-25 03:15 | 只看該作者
感謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜激情视频在线 | 精品一区二区三区免费视频 | 日韩欧美三区 | 日韩视频精品在线 | 中文字幕久久精品 | 免费黄色录像片 | 爱草视频 | 国产精品91网站 | 国产夜恋视频在线观看 | 成年人在线视频 | 国产成人精品一区二区三区在线 | 国产四区| 亚洲人成人一区二区在线观看 | 欧美日韩国产在线 | 天天躁人人躁人人躁狂躁 | 在线国产一区 | 日本色高清 | 在线婷婷 | 欧美男人天堂 | 成人在线免费视频 | 97日日碰人人模人人澡分享吧 | 一区二区三区av | 亚洲国产成人精品女人久久久野战 | 欧美一区二区三区在线观看 | 日韩区 | 成人久久视频 | 精品日韩欧美一区二区 | 欧美黄色片 | 九九热免费观看 | 精品视频在线观看 | 成人免费视频在线观看 | 国产精品伦一区二区三级视频 | 国产激情免费视频 | 国产污视频在线 | 亚洲一区不卡 | 毛片一区二区三区 | 欧美国产日韩在线观看 | 激情小说综合网 | 人人干免费 | 亚洲一区二区免费视频 | 久久久久久久亚洲精品 |