找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2004|回复: 1
打印 上一主题 下一主题
收起左侧

stc15单片机4足仿生机器人源程序

[复制链接]
跳转到指定楼层
楼主
ID:336397 发表于 2018-9-29 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. #include "stc15.H"
  2. #include "stdio.h"
  3. #include <string.h>
  4. #include   <intrins.h>
  5. #include "类型.h"
  6. #define dingshi 0xfd46 //20us中断一次
  7. #define gao (dingshi>>8)
  8. #define di dingshi

  9. //#define FOSC 11059200L         
  10. //#define FOSC 22118400L
  11. #define FOSC   27000000L
  12. //#define BAUD 115200   
  13. #define BAUD 1200
  14. #define S1_S0 0x40              //P_SW1.6
  15. #define S1_S1 0x80              //P_SW1.7
  16. #define max 20
  17. #define jiange 2000             //接收到两个字节中间的最大间隔 单位是中断个数
  18. #define duo_ji_shu 18             //舵机数
  19. #define su_du 3000


  20. #define qian1 0x45
  21. #define qian2 0x39
  22. #define qian3 0x2b
  23. #define qian4 0x2b
  24. #define hou1 0x33
  25. #define hou2 0x29
  26. #define hou3 0x3b
  27. #define hou4 0x3b
  28. #define shang1 0x29
  29. #define shang2 0x55
  30. #define shang3 0x29
  31. #define shang4 0x55
  32. #define xia1 0x39
  33. #define xia2 0x3f
  34. #define xia3 0x39
  35. #define xia4 0x43

  36. #define jiaozhun1 5
  37. #define jiaozhun2 5
  38. #define jiaozhun3 5
  39. sbit DJ1=P0^5;
  40. sbit DJ2=P0^6;
  41. sbit DJ3=P0^7;
  42. sbit DJ4=P1^0;
  43. sbit DJ5=P1^1;
  44. sbit DJ6=P4^7;
  45. sbit DJ7=P1^2;
  46. sbit DJ8=P1^3;
  47. sbit DJ9=P1^4;
  48. sbit DJ10=P1^5;
  49. sbit DJ11=P1^5;

  50. sbit DJ12=P1^5;
  51. sbit DJ13=P1^5;
  52. sbit DJ14=P1^5;
  53. sbit DJ15=P1^5;
  54. sbit DJ16=P1^5;
  55. sbit DJ17=P1^5;
  56. sbit DJ18=P1^5;

  57. sbit RX=P4^3;
  58. sbit TX=P4^4;

  59. code uchar qian[8*6]={                 //动作数组-向前走
  60. hou1,shang1,qian2,xia2,hou3,shang3,qian4,xia4,
  61. qian1,shang1,hou2,xia2,qian3,shang3,hou4,xia4,
  62. qian1,xia1,hou2,xia2,qian3,xia3,hou4,xia4,
  63. qian1,xia1,hou2,shang2,qian3,xia3,hou4,shang4,
  64. hou1,xia1,qian2,shang2,hou3,xia3,qian4,shang4,
  65. hou1,xia1,qian2,xia2,hou3,xia3,qian4,xia4
  66. };

  67. code uchar hou[8*6]={                 //动作数组-向后走
  68. hou1,xia1,qian2,xia2,hou3,xia3,qian4,xia4,
  69. hou1,xia1,qian2,shang2,hou3,xia3,qian4,shang4,
  70. qian1,xia1,hou2,shang2,qian3,xia3,hou4,shang4,
  71. qian1,xia1,hou2,xia2,qian3,xia3,hou4,xia4,
  72. qian1,shang1,hou2,xia2,qian3,shang3,hou4,xia4,
  73. hou1,shang1,qian2,xia2,hou3,shang3,qian4,xia4
  74. };

  75. code uchar you[8*6]={                 //动作数组-向右转
  76. hou1,shang1,qian2,xia2,qian3,shang3,hou4,xia4,
  77. qian1,shang1,hou2,xia2,hou3,shang3,qian4,xia4,
  78. qian1,xia1,hou2,xia2,hou3,xia3,qian4,xia4,
  79. qian1,xia1,hou2,shang2,hou3,xia3,qian4,shang4,
  80. hou1,xia1,qian2,shang2,qian3,xia3,hou4,shang4,
  81. hou1,xia1,qian2,xia2,qian3,xia3,hou4,xia4
  82. };
  83. code uchar zuo[8*6]={                 //动作数组-向左转
  84. hou1,xia1,qian2,xia2,qian3,xia3,hou4,xia4,
  85. hou1,xia1,qian2,shang2,qian3,xia3,hou4,shang4,
  86. qian1,xia1,hou2,shang2,hou3,xia3,qian4,shang4,
  87. qian1,xia1,hou2,xia2,hou3,xia3,qian4,xia4,
  88. qian1,shang1,hou2,xia2,hou3,shang3,qian4,xia4,
  89. hou1,shang1,qian2,xia2,qian3,shang3,hou4,xia4,
  90. };
  91. code uchar tiao[8*6]={                 //动作数组-跳舞
  92. hou1,xia1,qian2,xia2,qian3,xia3,hou4,xia4,
  93. hou1,xia1,qian2,shang2,qian3,xia3,hou4,shang4,
  94. qian1,xia1,hou2,shang2,hou3,xia3,qian4,shang4,
  95. qian1,xia1,hou2,xia2,hou3,xia3,qian4,xia4,
  96. qian1,shang1,hou2,xia2,hou3,shang3,qian4,xia4,
  97. hou1,shang1,qian2,xia2,qian3,shang3,hou4,xia4,
  98. };
  99. uchar sheding[duo_ji_shu];                //现在设定值
  100. uchar xinzhi[duo_ji_shu];                //新角度

  101. bit   jieshou=0;        //接收成功标志
  102. bit jk=0;//测试
  103. bit jk2=0;//测试
  104. uchar len=0;   //数据长度
  105. uchar ml=0;   //要执行的命令
  106. uchar shuju[max];
  107. uint jishu_jg=0;
  108. bit shijian_l=0;
  109. bit wancheng=0;
  110. bit zhi_xing=0;    //开始执行标志
  111. bit MS_1=0;
  112.         unsigned int  time=0;
  113.         unsigned int  timer=0;
  114.         float         S=0;
  115.     bit           flag =0;
  116. void Delay1ms()                //@27.000MHz
  117. {
  118.         unsigned char i, j;

  119. ;
  120. ;
  121.         i = 7;
  122.         j = 141;
  123.         do
  124.         {
  125.                 while (--j);
  126.         } while (--i);
  127. }
  128. void yanshi_ms(uint m)
  129. {
  130.         while(m--)Delay1ms();
  131. }
  132. void fu_wei()
  133. {
  134.         uchar i=0;
  135.         sheding[0]=0x33;
  136.         sheding[1]=0x3d;//1f
  137.         sheding[2]=0x37;
  138.         sheding[3]=0x43;
  139.         sheding[4]=0x2f;
  140.         sheding[5]=0x39;
  141.         sheding[6]=0x3b;
  142.         sheding[7]=0x41;

  143. }
  144. void chushihua(void)                //初始化20us中断22.1184MHz
  145. {
  146.         uchar i=0;
  147.           ACC = P_SW1;
  148.     ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
  149.     P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
  150.     SCON = 0x50;                //8位可变波特率
  151.     T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
  152.     T2H = (65536 - (FOSC/4/BAUD))>>8;
  153.     AUXR = 0x14;                //T2为1T模式, 并启动定时器2
  154.     AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
  155.         

  156.         AUXR |= 0x80;               
  157.         TMOD &= 0xF0;               
  158.         TL0 = di;               
  159.         TH0 = gao;               
  160.         TF0 = 0;               
  161.         TR0 = 1;               
  162.         ET0=0;
  163.         ES=1;
  164.         EA=1;

  165.         AUXR &= 0xdf;                //定时器时钟12T模式
  166.         TMOD &= 0x0F;                //设置定时器模式

  167.         TF1 = 0;                //清除TF1标志
  168.         TR1 = 0;                //定时器1开始计时

  169.         fu_wei();
  170. }

  171. void yanshi(uint m)
  172. {

  173.         while(m--)
  174.         {
  175.                 if(!zhi_xing)break;
  176.         }
  177. }
  178.         

  179. void send(uchar *j,l)
  180. {
  181.         uchar i=0;
  182.         for(i=0;i<l;i++)
  183.         {
  184.                 SBUF=*(j+i);
  185.                 while(!TI);
  186.                 TI=0;
  187.         }
  188.         yanshi(40000);
  189.         yanshi(40000);
  190.         yanshi(40000);
  191.         yanshi(40000);
  192. }

  193. bit Hand(unsigned char *a)                 //是否包含文本
  194. {
  195.     if(strstr(shuju,a)!=NULL)
  196.             return 1;
  197.         else
  198.                 return 0;
  199. }
  200. void Uart() interrupt 4
  201. {
  202.         if (RI)
  203.         {
  204.                 RI = 0;

  205.                 if(len<max)               
  206.                 {
  207.                         shuju[len++]=SBUF;
  208.                         jishu_jg=0;//清零时间间隔变量
  209.                         shijian_l=1;

  210.                 }
  211.         }
  212. //        if(TI)TI=0;
  213. }
  214. void zhongduan() interrupt 1   //中断服务
  215. {
  216.         uchar i=0;
  217.         static int jishu=0;
  218. //        static uchar MS=0;
  219.         ET0=0;

  220. //        DJ1=!DJ1;

  221.         if(shijian_l)
  222.         {
  223.                 jishu_jg++;

  224.                 if(jishu_jg>jiange)
  225.                 {

  226.                         jieshou=1;//间隔时间到就说明接收到一个完整的字符串
  227.                         shijian_l=0;
  228.                 }
  229.         }
  230.         if(jishu++==900)
  231.         {
  232.                 jishu=0;
  233.         }

  234.         
  235.         DJ1=(jishu<sheding[0]);
  236.         DJ2=(jishu<sheding[1]);
  237.         DJ3=(jishu<sheding[2]);
  238.         DJ4=(jishu<sheding[3]);
  239.         DJ5=(jishu<sheding[4]);
  240.         DJ6=(jishu<sheding[5]);
  241.         DJ7=(jishu<sheding[6]);
  242.         DJ8=(jishu<sheding[7]);
  243.         DJ9=(jishu<sheding[8]);
  244.         DJ10=(jishu<sheding[9]);
  245.         DJ11=(jishu<sheding[10]);
  246.         DJ12=(jishu<sheding[11]);
  247.         DJ13=(jishu<sheding[12]);
  248.         DJ14=(jishu<sheding[13]);
  249.         DJ15=(jishu<sheding[14]);
  250.         DJ16=(jishu<sheding[15]);
  251.         DJ17=(jishu<sheding[16]);
  252.         DJ18=(jishu<sheding[17]);

  253.         TL0 = di;               
  254.         TH0 = gao;
  255.         ET0=1;
  256. }
  257.    void  StartModule()                          //T1中断用来扫描数码管和计800MS启动模块
  258.   {
  259.           TX=1;                                         //800MS  启动一次模块
  260.           _nop_();
  261.           _nop_();
  262.           _nop_();
  263.           _nop_();
  264.           _nop_();
  265.           _nop_();
  266.           _nop_();
  267.           _nop_();
  268.           _nop_();
  269.           _nop_();
  270.           _nop_();
  271.           _nop_();
  272.           _nop_();
  273.           _nop_();
  274.           _nop_();
  275.           _nop_();
  276.           _nop_();
  277.           _nop_();
  278.           _nop_();
  279.           _nop_();
  280.           _nop_();
  281.           TX=0;
  282.   }
  283. float juli()
  284. {
  285.      StartModule();
  286.          TH1=0;
  287.          TL1=0;
  288.          while(!RX);                //当RX为零时等待
  289.          TR1=1;                            //开启计数
  290.           while(RX);                        //当RX为1计数并等待
  291.          TR1=0;                                //关闭计数
  292.          time=TH1*256+TL1;
  293.          TH1=0;
  294.          TL1=0;
  295.          S=(time*2.0)/1000;     //算出来是CM
  296.          if(flag==1)
  297.          {
  298.                  flag=0;
  299.                 S=1000;
  300.          }
  301.          return S;
  302.         
  303. }
  304. void qingkong()                  //清空接收缓存
  305. {
  306.         uchar i=0;
  307.         for(i=0;i<max;i++)
  308.         {
  309.                 shuju[i]=0;
  310.         }
  311. }


  312. void WIFI()
  313. {
  314.         while(!Hand("OK"))                            //判断是否握手成功,如果不成功延时一会,再发送AT握手指令
  315.     {
  316.                         len=0;
  317.                         qingkong();
  318.                         send("AT\r\n",4);                         //发送联机指令
  319.                         yanshi_ms(1000);
  320.     }
  321.                 qingkong();
  322.                 while(!Hand("OK"))                           
  323.                 {
  324.                         len=0;
  325.                         qingkong();
  326.                         send("AT+CWMODE=2\r\n",13);       //设置为AP模式 让手机链接wifi   
  327.                         yanshi_ms(1000);        
  328.                 }
  329.                 qingkong();
  330.                 while(!Hand("OK"))                           
  331.     {
  332.                         len=0;
  333.                         qingkong();
  334.                         send("AT+CIPMUX=1\r\n",13);          //设置为多连接模式   
  335.                         yanshi_ms(1000);                        
  336.     }        
  337.                 qingkong();
  338.                 send("AT+CIPSERVER=1,8349\r\n",21);  
  339.                 yanshi_ms(1000);        
  340.                 send("AT+CIPSERVER=1,8349\r\n",21);  
  341.                 yanshi_ms(1000);
  342.                 send("AT+CIPSERVER=1,8349\r\n",21);
  343.                 qingkong();
  344.                 len=0;
  345.                 yanshi_ms(1000);
  346.                 wancheng=1;             //初始化完成 置标志位

  347. }


  348. uchar to_uchar(uchar g,uchar d)
  349. {
  350.                 if(g>=97)
  351.                 {
  352.                         g=g-87;
  353.                 }
  354.                 else
  355.                 {
  356.                         if(g<=57)
  357.                         {
  358.                                 g=g-48;
  359.                         }
  360.                 }
  361.                 if(d>=97)
  362.                 {
  363.                         d=d-87;
  364.                 }
  365.                 else
  366.                 {
  367.                         if(d<=57)
  368.                         {
  369.                                 d=d-48;
  370.                         }
  371.                 }
  372.                 return (g<<4)|d;
  373. }


  374. void qianjin()
  375. {
  376.         uchar j=0;
  377.         static uchar i=0;
  378.         static uint y=0;
  379.         if(zhi_xing)
  380.         {
  381.                 if(y++>su_du)
  382.                 {
  383.                         y=0;
  384.                         for(j=0;j<8;j++)
  385.                         {
  386.                                 sheding[j]=qian[i*8+j];
  387.                         }
  388.                         if(i++==5)i=0;
  389.                 }
  390.         }
  391. }
  392. void houtui()
  393. {
  394.         uchar j=0;
  395.         static uchar i=0;
  396.         static uint y=0;
  397.         if(zhi_xing)
  398.         {
  399.                 if(y++>su_du)
  400.                 {
  401.                         y=0;
  402.                         for(j=0;j<8;j++)
  403.                         {
  404.                                 sheding[j]=hou[i*8+j];
  405.                         }
  406.                         if(i++==5)i=0;
  407.                 }
  408.         }
  409. }
  410. void zuozhuan()
  411. {
  412.         uchar j=0;
  413.         static uchar i=0;
  414.         static uint y=0;
  415.         if(zhi_xing)
  416.         {
  417.                 if(y++>su_du)
  418.                 {
  419.                         y=0;
  420.                         for(j=0;j<8;j++)
  421.                         {
  422.                                 sheding[j]=zuo[i*8+j];
  423.                         }
  424.                         if(i++==5)i=0;
  425.                 }
  426.         }
  427. }
  428. void youzhuan()
  429. {
  430.         uchar j=0;
  431.         static uchar i=0;
  432.         static uint y=0;
  433.         if(zhi_xing)
  434.         {
  435.                 if(y++>su_du)
  436.                 {
  437.                         y=0;
  438.                         for(j=0;j<8;j++)
  439.                         {
  440.                                 sheding[j]=you[i*8+j];
  441.                         }
  442.                         if(i++==5)i=0;
  443.                 }
  444.         }
  445. }
  446. void tiaowu()
  447. {
  448.         uchar j=0;
  449.         static uchar i=0;
  450.         static uint y=0;
  451.         if(zhi_xing)
  452.         {
  453.                 if(y++>su_du)
  454.                 {
  455.                         y=0;
  456.                         for(j=0;j<8;j++)
  457.                         {
  458.                                 sheding[j]=tiao[i*8+j];
  459.                         }
  460.                         if(i++==5)i=0;
  461.                 }
  462.         }
  463. }                  
  464. void zhixing()        //执行遥控命令
  465. {
  466.         uchar i=0;
  467.         if(zhi_xing)
  468.         {
  469.                 switch(ml)
  470.                 {
  471.                         case 18:
  472.                                 qianjin(); //前进
  473.                         break;
  474.                         case 19:
  475.                                 houtui();  //后退
  476.                         break;
  477.                         case 20:
  478.                                 zuozhuan();//左转
  479.                         break;
  480.                         case 21:
  481.                                 youzhuan();//右转
  482.                         break;
  483.                         case 22:
  484.                                 tiaowu();//跳舞
  485.                         break;
  486.                         case 88:         //遥控按键抬起
  487.                         zhi_xing=0;
  488.                         break;
  489.                 }
  490.         }else fu_wei();
  491. }

  492. void main()
  493. {
  494.         uchar k=0,chang=0,i=0,pian_yi=0;
  495.         bit jj=0;
  496.         chushihua();//初始化
  497.         yanshi(40000);               
  498.         yanshi(40000);
  499.         yanshi(40000);
  500.         yanshi(40000);
  501.         yanshi(40000);               
  502.         yanshi(40000);
  503.         yanshi(40000);
  504.         yanshi(40000);
  505.         WIFI();
  506.         yanshi(40000);
  507.         jk=1;

  508.         ET0=1;
  509. //        while(1)
  510. //        {
  511. //                sheding[0]=0x18;        
  512. //        }
  513.         while(1)
  514.         {

  515.                 if(jieshou)
  516.                 {

  517.                         if(Hand("+IPD"))
  518.                         {
  519.                                 k=(uchar)strstr(shuju,"+IPD");
  520.                                 if(shuju[10]==':')//+IPD,2,9:123456789  +IPD,2,12:123456789012
  521.                                 {
  522.                                         chang=to_uchar('0',shuju[7]);//取出数据长度
  523.                                         pian_yi=11;

  524.                                 }else if (shuju[9]==':')
  525.                                 {
  526.                                         chang=to_uchar(shuju[7],shuju[8]);
  527.                                         pian_yi=10;
  528.                                 }else if (shuju[8]==':')
  529.                                 {
  530.                                         pian_yi=9;
  531.                                 }
  532.                                 ml=to_uchar(shuju[pian_yi],shuju[pian_yi+1]);           //保存命令
  533.                                 if(ml<18)//命令小于18 是设定单个舵机角度值
  534.                                 {
  535.                                         sheding[ml]=to_uchar(shuju[pian_yi+2],shuju[pian_yi+3]);//把接收来的角度值赋给相应的舵机
  536.                                 }else
  537.                                 {
  538.                                    zhi_xing=1;                             //命令大于17 是遥控指令 置执行标志 执行相应的遥控动作
  539.                                 }
  540.                         }
  541.                         jieshou=0;
  542.                         len=0;
  543.                         qingkong();
  544.                 }
  545.                 zhixing();   //调用执行子程序

  546.         }
  547. }
复制代码

所有资料51hei提供下载:
4足仿生机器人.zip (167.91 KB, 下载次数: 14)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-9-29 17:42 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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