找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6781|回复: 0
收起左侧

单片机编程玩具机器人设计 Proteus仿真加源程序

[复制链接]
ID:175881 发表于 2017-3-30 14:50 | 显示全部楼层 |阅读模式
51单片机做的编程玩具机器人仿真原理图(proteus工程文件可到本帖附件下载):
0.png

机器人的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];                             //定义数组,存储红外接收到的数据
  10. void delay(unsigned char x);                 //延时约x*0.1ms 函数
  11. void delay10ms(unsigned int count);          //延时函数
  12. void XQZ() ;                                 //向前走函数
  13. void DT();                                   //倒退走函数
  14. void ZZ();                                   //向前左转函数
  15. void ZZ_Z();                                 //向前左转函数
  16. void YZ();                                   //向前右转函数
  17. void YZ_Z();                                 //向前右转函数
  18. void T_ZZ();                                 //向左瞄准函数
  19. void T_YZ();                                 //向右瞄准函数
  20. void TW();                                   //跳舞函数
  21. void FS();                                   //发射函数
  22. void LFS();                                  //连续发射函数
  23. void SD_LED( );                              //工作灯函数
  24. void SD_JQR( );                              //眼睛闪动函数
  25. void IR_ZX();                                //遥控执行函数

  26. //-------------------------------------- 主函数 --------------------------------------

  27. void main()                                   //主函数
  28. {
  29.         EA=1;                                     //允许总中断
  30.     EX0=1;                                    //允许外部中断INT0中断
  31.         IT0=1;                                    //外部中断INT0采用脉冲触发方式
  32.     SD_LED( );                                //调用工作灯函数
  33.         {        
  34.           IRIN=1;                                 //IR 输入位设置为高电平
  35.       P2=0x00;
  36.              while(1);                               //无限循环
  37.     }
  38. }

  39. //------------------------------------ 延时函数  ------------------------------------

  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. //------------------------------------- 中断解码函数 -----------------------------------

  47. void IR_IN() interrupt 0 using 0                        //外部中断INT0函数
  48. {
  49. unsigned char j,k,n=0;                                            //定义变量,且n=0
  50.     EX0=0;                                                                            //暂时先关中断
  51.          delay(20);                                                        //延时0.10ms*20=2ms
  52.         if(IRIN==1)                                                //如果IRIN出现高电平,是干扰信号
  53.          {                                                                     
  54.            EX0=1;
  55.            return;                                  //返回                 
  56.          }
  57.         while(!IRIN){delay(1);}                                //避开9ms前导低电平信

  58.    for(j=0;j<4;j++)                                                    //一共有4组数据
  59.      {        
  60.           for(k=0;k<8;k++)                                            //每组数据有8位
  61.           {
  62.    while(IRIN){delay(1);}                            // 避开4.5ms高电平
  63.    while(!IRIN){delay(1);}                                 
  64. // 开始接收数据         
  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. //检查接收的数据和数据反码是否相反           
  81.     if(IRDATA[2]!=~IRDATA[3])                         //判断数据码和数据反码是不是相反
  82.            {                                                                        //否则就放弃
  83.              EX0=1;
  84.              return;
  85.            }        
  86. //        遥控执行           
  87.       else
  88.              IR_ZX();  
  89.              EX0=1;                                 //开中断
  90.     }        

  91. //-------------------------------------- 延时函数 ------------------------------------------

  92. void delay10ms(unsigned int count)              //延时函数
  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. //------------------------------------ 向前走函数   ----------------------------------------

  100. void XQZ()                                     //向前走函数
  101.   {
  102.         P2=0x01;                                   //左腿驱动电机正转,机器人向前迈左腿
  103.     delay10ms(50);                             //延时0.5s
  104.     P2=0x00;                                   //停止
  105.     delay10ms(100);                            //延时1s
  106.    
  107.         P2=0x04;                                   //右腿驱动电机正转,机器人向前迈右腿  
  108.     delay10ms(50);                             //延时0.5s
  109.     P2=0x00;                                   //停止
  110.     delay10ms(100);                            //延时1s

  111.         P2=0x01;                                   //左腿驱动电机正转,机器人向前迈左腿
  112.     delay10ms(50);                             //延时0.5s
  113.     P2=0x00;                                   //停止
  114.     delay10ms(100);                            //延时1s
  115.    
  116.         P2=0x04;                                   //右腿驱动电机正转,机器人向前迈右腿  
  117.     delay10ms(50);                             //延时0.5s
  118.     P2=0x00;                                   //停止
  119.     delay10ms(100);                            //延时1s
  120.   }

  121. //------------------------------------ 倒退走函数 ---------------------------------------  
  122.   
  123.   void DT()                                    //倒退函数
  124.   {
  125.         P2=0x08;                                   //右腿驱动电机反转,机器人右腿后退  
  126.     delay10ms(50);                             //延时0.5s
  127.     P2=0x00;                                   //停止
  128.     delay10ms(100);                            //延时1s
  129.    
  130.         P2=0x02;                                   //左腿驱动电机反转,机器人左腿后退  
  131.     delay10ms(50);                             //延时0.5s
  132.     P2=0x00;                                   //停止
  133.     delay10ms(100);                            //延时1s

  134.         P2=0x08;                                   //右腿驱动电机反转,机器人右腿后退  
  135.     delay10ms(50);                             //延时0.5s
  136.     P2=0x00;                                   //停止
  137.     delay10ms(100);                            //延时1s
  138.    
  139.         P2=0x02;                                   //左腿驱动电机反转,机器人左腿后退  
  140.     delay10ms(50);                             //延时0.5s
  141.     P2=0x00;                                   //停止
  142.     delay10ms(100);                            //延时1s
  143.   }

  144. //------------------------------------ 向前左转函数  -------------------------------------------------

  145. void ZZ()                                     //向前左转函数
  146.   {
  147.     P2=0x06;                                  //左腿驱动电机反转,右腿驱动电机正转
  148.     delay10ms(50);                            //延时0.5s
  149.     P2=0x00;                                  //停止
  150.   }

  151. //--------------------------------- 向前左转函数 -------------------------------------------

  152. void ZZ_Z()                                  //向前左转函数
  153.   {
  154.      P2=0x06;                                //左腿驱动电机反转,右腿驱动电机正转
  155.      delay10ms(200);                         //延时2s
  156.      P2=0x00;                                //停止
  157.   }

  158. //--------------------------------- 向前右转函数  ------------------------------------------------
  159.   
  160. void YZ()                                    //向前右转函数
  161.   {
  162.      P2=0x09;                                //右腿驱动电机反转,左腿驱动电机正转
  163.      delay10ms(50);                          //延时0.5s
  164.      P2=0x00;                                //停止
  165.   }

  166. //---------------------------------- 向前右转函数 --------------------------------------------------
  167.   
  168. void YZ_Z()                                  //向前右转函数
  169.   {
  170.      P2=0x09;                                //右腿驱动电机反转,左腿驱动电机正转
  171.      delay10ms(200);                         //延时2s
  172.      P2=0x00;                                //停止
  173.   }

  174. //---------------------------------- 向左瞄准函数 -------------------------------------------------

  175. void T_ZZ()                                  //头左转
  176.   {
  177.      P2=0x10;                                //头驱动电机正转
  178.      delay10ms(30);                          //延时0.3s
  179.      P2=0x00;                                //停止
  180.   }

  181. //------------------------------------- 向右瞄准函数 -----------------------------------------------

  182. void T_YZ()                                  //头右转  
  183.   {
  184.      P2=0x20;                                //头驱动电机反转
  185.      delay10ms(30);                          //延时0.3s
  186.      P2=0x00;                                //停止
  187.   }

  188. //------------------------------------- 跳舞函数 ----------------------------------------------------

  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. //----------------------------------- 发射函数  ------------------------------------------------------

  201. void FS()                                    // 发射
  202.   {   
  203.      P2=0x40;                                //加速驱动电机正转  
  204.      delay10ms(100);                         //延时1s
  205.      P2=0x80;                                //发射驱动电机正转
  206.      delay10ms(50);                          //延时0.5s
  207.      P2=0x00;                                //停止   
  208.   }

  209. //----------------------------------- 连续发射函数  ---------------------------------------------

  210. void LFS()                                   // 连续发射
  211.   {   
  212.      P2=0x40;                                //加速驱动电机正转  
  213.      delay10ms(100);                         //延时1s
  214.      P2=0x80;                                //发射驱动电机正转
  215.      delay10ms(50);                          //延时0.5s
  216.      P2=0x00;                                //停止   
  217.      delay10ms(100);                         //延时1s

  218.          P2=0x40;                                //加速驱动电机正转  
  219.      delay10ms(100);                         //延时1s
  220.      P2=0x80;                                //发射驱动电机正转
  221.      delay10ms(50);                          //延时0.5s
  222.      P2=0x00;                                //停止   
  223.      delay10ms(100);                         //延时1s

  224.      P2=0x40;                                //加速驱动电机正转  
  225.      delay10ms(100);                         //延时1s
  226.      P2=0x80;                                //发射驱动电机正转
  227.      delay10ms(50);                          //延时0.5s
  228.      P2=0x00;                                //停止   
  229.      delay10ms(100);                         //延时1s
  230.   }

  231. //--------------------------------------- 工作灯函数 -------------------------------------------------

  232. void SD_LED( )                               //LED闪动
  233.   {
  234.     int y,i;                                 //变量声明
  235.     for(y=0;y<=30;y++)                       //循环30次
  236.       {
  237.         SLED=~SLED;                          //反相输出
  238.         for(i=0;i<=30000;i++);               //延时
  239.       }
  240.     SLED=1;
  241. }

  242. //---------------------------------------- 眼睛闪动函数   ---------------------------------------------

  243. void SD_JQR( )                               //LED闪动
  244.   {
  245.     int y,i;                                 //变量声明
  246.     for(y=0;y<=4;y++)                        //循环30次
  247.       {
  248.         YJ=~YJ;                              //反相输出
  249.         for(i=0;i<=30000;i++);               //延时
  250.       }
  251.     YJ=1;
  252.   }

  253. //---------------------------------------- 遥控执行函数 -------------------------------------------------

  254. void IR_ZX()                                 //遥控执行函数
  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)              //向前左转              
  272.              {                              
  273.            SD_JQR();
  274.                ZZ();
  275.                    return;
  276.                  }
  277.            else if(IRDATA[2]==0x04)              //向前右转           
  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)              //发射      
  302.              {  
  303.                    SD_JQR();
  304.                FS();
  305.                return;
  306.             }
  307.             else if(IRDATA[2]==0x09)              //连续发射     
  308.              {  
  309.                SD_JQR();


  310. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

0.png

该系列源码包含有很多非常经典,代码风格十分规范,而且注释详细的单片机例程,还带仿真,对于MCU学习特别是初学者是很有帮助的,全部源码下载(共25个项目):http://www.51hei.com/bbs/dpj-79328-1.html

本例程下载(含proteus仿真工程文件与源码):
单片机编程玩具机器人设计.rar (72.33 KB, 下载次数: 58)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表