找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7387|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機編程玩具機器人設(shè)計 Proteus仿真加源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:175881 發(fā)表于 2017-3-30 14:50 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
51單片機做的編程玩具機器人仿真原理圖(proteus工程文件可到本帖附件下載):


機器人的51單片機源程序:
  1. //----------------------------------------------------------------------------------------------------------------------------------
  2. // 程序名:JQR12-1.c
  3. // 程序功能:編程玩具機器人
  4. // --------------------------------------------------------------------------------------------------------------------------------
  5. #include<reg51.h>                                             //頭文件
  6. sbit IRIN=P3^2;                                                 //定義紅外IR信號輸入位
  7. sbit SLED=P3^1 ;                             //定義工作指示燈接口
  8. sbit YJ=P3^0 ;                               //定義眼睛閃動LED接口
  9. unsigned char IRDATA[7];                             //定義數(shù)組,存儲紅外接收到的數(shù)據(jù)
  10. void delay(unsigned char x);                 //延時約x*0.1ms 函數(shù)
  11. void delay10ms(unsigned int count);          //延時函數(shù)
  12. void XQZ() ;                                 //向前走函數(shù)
  13. void DT();                                   //倒退走函數(shù)
  14. void ZZ();                                   //向前左轉(zhuǎn)函數(shù)
  15. void ZZ_Z();                                 //向前左轉(zhuǎn)函數(shù)
  16. void YZ();                                   //向前右轉(zhuǎn)函數(shù)
  17. void YZ_Z();                                 //向前右轉(zhuǎn)函數(shù)
  18. void T_ZZ();                                 //向左瞄準函數(shù)
  19. void T_YZ();                                 //向右瞄準函數(shù)
  20. void TW();                                   //跳舞函數(shù)
  21. void FS();                                   //發(fā)射函數(shù)
  22. void LFS();                                  //連續(xù)發(fā)射函數(shù)
  23. void SD_LED( );                              //工作燈函數(shù)
  24. void SD_JQR( );                              //眼睛閃動函數(shù)
  25. void IR_ZX();                                //遙控執(zhí)行函數(shù)

  26. //-------------------------------------- 主函數(shù) --------------------------------------

  27. void main()                                   //主函數(shù)
  28. {
  29.         EA=1;                                     //允許總中斷
  30.     EX0=1;                                    //允許外部中斷INT0中斷
  31.         IT0=1;                                    //外部中斷INT0采用脈沖觸發(fā)方式
  32.     SD_LED( );                                //調(diào)用工作燈函數(shù)
  33.         {        
  34.           IRIN=1;                                 //IR 輸入位設(shè)置為高電平
  35.       P2=0x00;
  36.              while(1);                               //無限循環(huán)
  37.     }
  38. }

  39. //------------------------------------ 延時函數(shù)  ------------------------------------

  40. void delay(unsigned char x)                           //延時約x*0.1ms  
  41. {                                                                                         
  42.         unsigned char i;                                                               
  43.         while(x--)                                                            
  44.         {for(i=0;i<10;i++){}}                                
  45. }

  46. //------------------------------------- 中斷解碼函數(shù) -----------------------------------

  47. void IR_IN() interrupt 0 using 0                        //外部中斷INT0函數(shù)
  48. {
  49. unsigned char j,k,n=0;                                            //定義變量,且n=0
  50.     EX0=0;                                                                            //暫時先關(guān)中斷
  51.          delay(20);                                                        //延時0.10ms*20=2ms
  52.         if(IRIN==1)                                                //如果IRIN出現(xiàn)高電平,是干擾信號
  53.          {                                                                     
  54.            EX0=1;
  55.            return;                                  //返回                 
  56.          }
  57.         while(!IRIN){delay(1);}                                //避開9ms前導(dǎo)低電平信

  58.    for(j=0;j<4;j++)                                                    //一共有4組數(shù)據(jù)
  59.      {        
  60.           for(k=0;k<8;k++)                                            //每組數(shù)據(jù)有8位
  61.           {
  62.    while(IRIN){delay(1);}                            // 避開4.5ms高電平
  63.    while(!IRIN){delay(1);}                                 
  64. // 開始接收數(shù)據(jù)         
  65.    while(IRIN)                                                
  66.          {
  67.            delay(1);                                             //延時0.1ms
  68.        n++;                                                             //每過0.1ms時n就加1
  69.            if(n>=30)                                         //如果超過30,放棄
  70.                 {                                                              
  71.                   EX0=1;
  72.                   return;}                               //返回
  73.                 }
  74.                   
  75.               IRDATA[j]=IRDATA[j]>>1;                //右移1位
  76.           if(n>=8){IRDATA[j]=IRDATA[j]|0x80;}                                                                    
  77.               n=0;                                         //n清0
  78.             }
  79.      }
  80. //檢查接收的數(shù)據(jù)和數(shù)據(jù)反碼是否相反           
  81.     if(IRDATA[2]!=~IRDATA[3])                         //判斷數(shù)據(jù)碼和數(shù)據(jù)反碼是不是相反
  82.            {                                                                        //否則就放棄
  83.              EX0=1;
  84.              return;
  85.            }        
  86. //        遙控執(zhí)行           
  87.       else
  88.              IR_ZX();  
  89.              EX0=1;                                 //開中斷
  90.     }        

  91. //-------------------------------------- 延時函數(shù) ------------------------------------------

  92. void delay10ms(unsigned int count)              //延時函數(shù)
  93.   {  
  94.     unsigned int i,j,k;         
  95.         for(i=0; i<count; i++)
  96.         for(j=0; j<10; j++)   
  97.                    for(k=0; k<120; k++);
  98.   }
  99. //------------------------------------ 向前走函數(shù)   ----------------------------------------

  100. void XQZ()                                     //向前走函數(shù)
  101.   {
  102.         P2=0x01;                                   //左腿驅(qū)動電機正轉(zhuǎn),機器人向前邁左腿
  103.     delay10ms(50);                             //延時0.5s
  104.     P2=0x00;                                   //停止
  105.     delay10ms(100);                            //延時1s
  106.    
  107.         P2=0x04;                                   //右腿驅(qū)動電機正轉(zhuǎn),機器人向前邁右腿  
  108.     delay10ms(50);                             //延時0.5s
  109.     P2=0x00;                                   //停止
  110.     delay10ms(100);                            //延時1s

  111.         P2=0x01;                                   //左腿驅(qū)動電機正轉(zhuǎn),機器人向前邁左腿
  112.     delay10ms(50);                             //延時0.5s
  113.     P2=0x00;                                   //停止
  114.     delay10ms(100);                            //延時1s
  115.    
  116.         P2=0x04;                                   //右腿驅(qū)動電機正轉(zhuǎn),機器人向前邁右腿  
  117.     delay10ms(50);                             //延時0.5s
  118.     P2=0x00;                                   //停止
  119.     delay10ms(100);                            //延時1s
  120.   }

  121. //------------------------------------ 倒退走函數(shù) ---------------------------------------  
  122.   
  123.   void DT()                                    //倒退函數(shù)
  124.   {
  125.         P2=0x08;                                   //右腿驅(qū)動電機反轉(zhuǎn),機器人右腿后退  
  126.     delay10ms(50);                             //延時0.5s
  127.     P2=0x00;                                   //停止
  128.     delay10ms(100);                            //延時1s
  129.    
  130.         P2=0x02;                                   //左腿驅(qū)動電機反轉(zhuǎn),機器人左腿后退  
  131.     delay10ms(50);                             //延時0.5s
  132.     P2=0x00;                                   //停止
  133.     delay10ms(100);                            //延時1s

  134.         P2=0x08;                                   //右腿驅(qū)動電機反轉(zhuǎn),機器人右腿后退  
  135.     delay10ms(50);                             //延時0.5s
  136.     P2=0x00;                                   //停止
  137.     delay10ms(100);                            //延時1s
  138.    
  139.         P2=0x02;                                   //左腿驅(qū)動電機反轉(zhuǎn),機器人左腿后退  
  140.     delay10ms(50);                             //延時0.5s
  141.     P2=0x00;                                   //停止
  142.     delay10ms(100);                            //延時1s
  143.   }

  144. //------------------------------------ 向前左轉(zhuǎn)函數(shù)  -------------------------------------------------

  145. void ZZ()                                     //向前左轉(zhuǎn)函數(shù)
  146.   {
  147.     P2=0x06;                                  //左腿驅(qū)動電機反轉(zhuǎn),右腿驅(qū)動電機正轉(zhuǎn)
  148.     delay10ms(50);                            //延時0.5s
  149.     P2=0x00;                                  //停止
  150.   }

  151. //--------------------------------- 向前左轉(zhuǎn)函數(shù) -------------------------------------------

  152. void ZZ_Z()                                  //向前左轉(zhuǎn)函數(shù)
  153.   {
  154.      P2=0x06;                                //左腿驅(qū)動電機反轉(zhuǎn),右腿驅(qū)動電機正轉(zhuǎn)
  155.      delay10ms(200);                         //延時2s
  156.      P2=0x00;                                //停止
  157.   }

  158. //--------------------------------- 向前右轉(zhuǎn)函數(shù)  ------------------------------------------------
  159.   
  160. void YZ()                                    //向前右轉(zhuǎn)函數(shù)
  161.   {
  162.      P2=0x09;                                //右腿驅(qū)動電機反轉(zhuǎn),左腿驅(qū)動電機正轉(zhuǎn)
  163.      delay10ms(50);                          //延時0.5s
  164.      P2=0x00;                                //停止
  165.   }

  166. //---------------------------------- 向前右轉(zhuǎn)函數(shù) --------------------------------------------------
  167.   
  168. void YZ_Z()                                  //向前右轉(zhuǎn)函數(shù)
  169.   {
  170.      P2=0x09;                                //右腿驅(qū)動電機反轉(zhuǎn),左腿驅(qū)動電機正轉(zhuǎn)
  171.      delay10ms(200);                         //延時2s
  172.      P2=0x00;                                //停止
  173.   }

  174. //---------------------------------- 向左瞄準函數(shù) -------------------------------------------------

  175. void T_ZZ()                                  //頭左轉(zhuǎn)
  176.   {
  177.      P2=0x10;                                //頭驅(qū)動電機正轉(zhuǎn)
  178.      delay10ms(30);                          //延時0.3s
  179.      P2=0x00;                                //停止
  180.   }

  181. //------------------------------------- 向右瞄準函數(shù) -----------------------------------------------

  182. void T_YZ()                                  //頭右轉(zhuǎn)  
  183.   {
  184.      P2=0x20;                                //頭驅(qū)動電機反轉(zhuǎn)
  185.      delay10ms(30);                          //延時0.3s
  186.      P2=0x00;                                //停止
  187.   }

  188. //------------------------------------- 跳舞函數(shù) ----------------------------------------------------

  189. void TW()                                    //跳舞
  190.    {
  191.      SD_JQR();
  192.      XQZ();
  193.      ZZ_Z();
  194.      DT();
  195.      YZ_Z();
  196.      XQZ();
  197.      DT();      
  198.      SD_JQR();
  199.   }

  200. //----------------------------------- 發(fā)射函數(shù)  ------------------------------------------------------

  201. void FS()                                    // 發(fā)射
  202.   {   
  203.      P2=0x40;                                //加速驅(qū)動電機正轉(zhuǎn)  
  204.      delay10ms(100);                         //延時1s
  205.      P2=0x80;                                //發(fā)射驅(qū)動電機正轉(zhuǎn)
  206.      delay10ms(50);                          //延時0.5s
  207.      P2=0x00;                                //停止   
  208.   }

  209. //----------------------------------- 連續(xù)發(fā)射函數(shù)  ---------------------------------------------

  210. void LFS()                                   // 連續(xù)發(fā)射
  211.   {   
  212.      P2=0x40;                                //加速驅(qū)動電機正轉(zhuǎn)  
  213.      delay10ms(100);                         //延時1s
  214.      P2=0x80;                                //發(fā)射驅(qū)動電機正轉(zhuǎn)
  215.      delay10ms(50);                          //延時0.5s
  216.      P2=0x00;                                //停止   
  217.      delay10ms(100);                         //延時1s

  218.          P2=0x40;                                //加速驅(qū)動電機正轉(zhuǎn)  
  219.      delay10ms(100);                         //延時1s
  220.      P2=0x80;                                //發(fā)射驅(qū)動電機正轉(zhuǎn)
  221.      delay10ms(50);                          //延時0.5s
  222.      P2=0x00;                                //停止   
  223.      delay10ms(100);                         //延時1s

  224.      P2=0x40;                                //加速驅(qū)動電機正轉(zhuǎn)  
  225.      delay10ms(100);                         //延時1s
  226.      P2=0x80;                                //發(fā)射驅(qū)動電機正轉(zhuǎn)
  227.      delay10ms(50);                          //延時0.5s
  228.      P2=0x00;                                //停止   
  229.      delay10ms(100);                         //延時1s
  230.   }

  231. //--------------------------------------- 工作燈函數(shù) -------------------------------------------------

  232. void SD_LED( )                               //LED閃動
  233.   {
  234.     int y,i;                                 //變量聲明
  235.     for(y=0;y<=30;y++)                       //循環(huán)30次
  236.       {
  237.         SLED=~SLED;                          //反相輸出
  238.         for(i=0;i<=30000;i++);               //延時
  239.       }
  240.     SLED=1;
  241. }

  242. //---------------------------------------- 眼睛閃動函數(shù)   ---------------------------------------------

  243. void SD_JQR( )                               //LED閃動
  244.   {
  245.     int y,i;                                 //變量聲明
  246.     for(y=0;y<=4;y++)                        //循環(huán)30次
  247.       {
  248.         YJ=~YJ;                              //反相輸出
  249.         for(i=0;i<=30000;i++);               //延時
  250.       }
  251.     YJ=1;
  252.   }

  253. //---------------------------------------- 遙控執(zhí)行函數(shù) -------------------------------------------------

  254. void IR_ZX()                                 //遙控執(zhí)行函數(shù)
  255.      {
  256.       if(IRDATA[2]==0x01)                    //向前走
  257.              {
  258.                   SD_JQR();
  259.               XQZ();
  260.               XQZ();      
  261.               return;
  262.            }
  263.          
  264.            else if(IRDATA[2]==0x02)              //倒退
  265.          {                       
  266.                    SD_JQR();
  267.                DT();
  268.                    DT();
  269.                return;
  270.             }
  271.            else if(IRDATA[2]==0x03)              //向前左轉(zhuǎn)              
  272.              {                              
  273.            SD_JQR();
  274.                ZZ();
  275.                    return;
  276.                  }
  277.            else if(IRDATA[2]==0x04)              //向前右轉(zhuǎn)           
  278.              {
  279.                SD_JQR();
  280.                YZ();
  281.                    return;
  282.                  }
  283.            else if(IRDATA[2]==0x05)              //跳舞         
  284.              {
  285.                SD_JQR();
  286.                TW();
  287.                    return;
  288.                  }
  289.                 else if(IRDATA[2]==0x06)             //向左瞄準         
  290.              {
  291.                SD_JQR();
  292.                T_ZZ();
  293.                    return;
  294.             }
  295.                 else if(IRDATA[2]==0x07)             //向右瞄準        
  296.              {  
  297.                    SD_JQR();
  298.                T_YZ();
  299.                    return;
  300.                  }
  301.                 else if(IRDATA[2]==0x08)              //發(fā)射      
  302.              {  
  303.                    SD_JQR();
  304.                FS();
  305.                return;
  306.             }
  307.             else if(IRDATA[2]==0x09)              //連續(xù)發(fā)射     
  308.              {  
  309.                SD_JQR();


  310. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼



該系列源碼包含有很多非常經(jīng)典,代碼風(fēng)格十分規(guī)范,而且注釋詳細的單片機例程,還帶仿真,對于MCU學(xué)習(xí)特別是初學(xué)者是很有幫助的,全部源碼下載(共25個項目):http://www.torrancerestoration.com/bbs/dpj-79328-1.html

本例程下載(含proteus仿真工程文件與源碼):
單片機編程玩具機器人設(shè)計.rar (72.33 KB, 下載次數(shù): 61)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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