小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 11047|回复: 10

用论坛2.1版本安卓APP正确控制51下位机程序。

[复制链接]
发表于 2015-9-17 11:10:25 | 显示全部楼层 |阅读模式
本程序改编自论坛里的,加啦大灯和转向灯,状态灯的延时为了等待WIFI启动。单片机STC12C5608AD.晶振11.0592M。舵机IO口加5.1k上拉。亲测通过
  1. #include<reg52.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uint buffer[3];
  5. uint rec_flag=0;
  6. sbit zhuangtaideng=P3^7;//状态灯
  7. sbit dadeng       =P3^4;  //大灯
  8. sbit zuozhuanxd   =P1^1; //转向灯
  9. sbit youzhuanxd   =P2^7;
  10. sbit in1=P1^2; //电机IO
  11. sbit in2=P1^3;
  12. sbit in3=P1^5;
  13. sbit in4=P1^6;
  14. sbit ena=P1^4;
  15. sbit enb=P1^7;
  16. sbit servo0=P2^0; //舵机IO
  17. sbit servo1=P2^1;
  18. sbit servo2=P2^2;
  19. sbit servo3=P2^3;
  20. sbit servo4=P0^4;
  21. sbit servo5=P0^5;
  22. sbit servo6=P0^6;
  23. sbit servo7=P0^7;

  24. uint pwm[]={1382,1382,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382)
  25. uint pwm_flag=0;
  26. uint code ms0_5Con=461; //0.5ms计数 (实际是460.8,取整得461)
  27. uint code ms2_5Con=2304; //2.5ms计数
  28. /*-----------串口初始化----------------------------*/
  29. void UART_Init(void)
  30. {
  31.         TMOD = 0x21;
  32.         PCON = 0x00;
  33.         SCON = 0x50;
  34.         TH1 = 0xFd; //设置波特率 9600
  35.         TL1 = 0xFd;
  36.         TR1 = 1; //启动定时器1
  37.        
  38.         ES = 1; //开串口中断
  39.         EA = 1; //开总中断
  40.         IT0=0;
  41.         EX0=1;
  42. }
  43. void delay(uint z)
  44. {
  45.           uint x,y;
  46.         for(x=z;x>0;x--)
  47.         for(y=800;y>0;y--);
  48. }
  49. void qianjin()
  50. {
  51.            in1=1;
  52.         in2=0;
  53.         in3=1;
  54.         in4=0;
  55.         ena=1;
  56.         enb=1;
  57. }
  58.   void houtui()
  59. {
  60.            in1=0;
  61.         in2=1;
  62.         in3=0;
  63.         in4=1;
  64.         ena=1;
  65.         enb=1;
  66. }
  67.   void zuozhuan()
  68. {
  69.         youzhuanxd=1;
  70.            in1=1;
  71.         in2=0;
  72.         in3=0;
  73.         in4=1;
  74.         ena=1;
  75.         enb=1;
  76.         zuozhuanxd=0;
  77. }
  78.   void youzhuan()
  79. {
  80.         zuozhuanxd=1;
  81.            in1=0;
  82.         in2=1;
  83.         in3=1;
  84.         in4=0;
  85.         ena=1;
  86.         enb=1;
  87.         youzhuanxd=0;
  88. }
  89. void tingzhi()
  90. {
  91.         youzhuanxd=1;
  92.         zuozhuanxd=1;
  93.            in1=0;
  94.         in2=0;
  95.         in3=0;
  96.         in4=0;
  97.         ena=0;
  98.         enb=0;
  99. }
  100. void zhuangtaizhishi()
  101. {
  102.         uchar i;
  103.         for(i=0;i<80;i++)
  104.         {
  105.                  zhuangtaideng=0;
  106.                 delay(200);       
  107.                 zhuangtaideng=1;
  108.                 delay(200);
  109.         }
  110. }
  111. /*------------------------舵机定时器--------------------------*/
  112. void Timer0Init()
  113. {
  114.         //0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
  115.         //2.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)
  116.         TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  117.         TH0=-ms2_5Con>>8; //给定初值,2.5ms中断
  118.         TL0=-ms2_5Con;
  119.         EA=1; //总中断打开
  120.         ET0=1; //定时器0中断打开
  121.         TR0=1; //定时器0开关打开
  122. }

  123. /*------------------------角度值转换--------------------------*/
  124. uint Transform(uchar val)
  125. {
  126.         //0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
  127.         //2.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)
  128.         //return (uint)(((float)(2/180)*X+0.5)/1000*11059200/12);
  129.         uint a = (val+46)*10;
  130.         if(a<ms0_5Con)
  131.         a=ms0_5Con;
  132.         if(a>ms2_5Con)
  133.         a=ms2_5Con;
  134.         return a;
  135. }

  136. /*------------------主函数---------------------------*/
  137. void main(void)
  138. {
  139.         zhuangtaizhishi();
  140.         UART_Init(); //初始化串口
  141.         Timer0Init();//舵机定时初始化
  142.         while(1)
  143.         {
  144.         }
  145. }

  146. /*--------------------串口解析执行-------------------------*/
  147. void Communication_Decode(void)
  148. {
  149.         if(buffer[0]==0x00)
  150.         {
  151.                 switch(buffer[1])
  152.                 {
  153.                         case 0x01:qianjin(); return;
  154.                         case 0x02:houtui(); return;
  155.                         case 0x03:zuozhuan(); return;
  156.                         case 0x04:youzhuan(); return;
  157.                         case 0x00:tingzhi(); return;
  158.                         default: return;
  159.                 }
  160.         }
  161.         else if(buffer[0]==0x01)
  162.         {
  163.                 if(buffer[2]>180)
  164.                 return;
  165.                 switch(buffer[1])
  166.                 {
  167.                         case 0x01:pwm[0]=Transform(buffer[2]); return; //角度值与脉宽计数值转换
  168.                         case 0x02:pwm[1]=Transform(buffer[2]); return;
  169.                         case 0x03:pwm[2]=Transform(buffer[2]); return;
  170.                         case 0x04:pwm[3]=Transform(buffer[2]); return;
  171.                         case 0x05:pwm[4]=Transform(buffer[2]); return;
  172.                         case 0x06:pwm[5]=Transform(buffer[2]); return;
  173.                         case 0x07:pwm[6]=Transform(buffer[2]); return;
  174.                         case 0x08:pwm[7]=Transform(buffer[2]); return;
  175.                         default : return;
  176.                 }
  177.         }
  178.          else if(buffer[0]==0x04)
  179.         {
  180.                      switch(buffer[1])
  181.                 {
  182.                           case 0x00:dadeng=1;return;
  183.                           case 0x01:dadeng=0;return;
  184.                           default : return;
  185.                 }
  186.         }
  187.         else
  188.         {
  189.         return;
  190.         }
  191. }

  192. /*------------------------舵机中断函数--------------------------*/
  193. void SteeringGear() interrupt 1
  194. {
  195.         switch(pwm_flag)
  196.         {
  197.                 case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
  198.                 case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
  199.                 case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
  200.                 case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
  201.                 case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
  202.                 case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
  203.                 case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
  204.                 case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
  205.                 case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
  206.                 case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
  207.                 case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
  208.                 case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
  209.                 case 13: servo6=1; TH0=-pwm[6]>>8; TL0=-pwm[6]; break;
  210.                 case 14: servo6=0; TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;
  211.                 case 15: servo7=1; TH0=-pwm[7]>>8; TL0=-pwm[7]; break;
  212.                 case 16: servo7=0; TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
  213.                 default:TH0=0xff; TL0=0x80; pwm_flag=0;
  214.         }
  215.         pwm_flag++;
  216. }

  217. /*------------------------串口中断函数--------------------------*/
  218. void INT_UartRcv(void) interrupt 4
  219. {
  220.         static int i;
  221.         if(RI==1)
  222.         {
  223.                 RI = 0;
  224.                 if(rec_flag==0)
  225.                 {
  226.                         if(SBUF==0xff)
  227.                         {
  228.                                 rec_flag=1;
  229.                                 i=0;
  230.                         }
  231.                 }
  232.                 else
  233.                 {
  234.                         if(SBUF==0xff)
  235.                         {
  236.                                 rec_flag=0;
  237.                                 if(i==3)
  238.                                 {
  239.                                         Communication_Decode();
  240.                                 }
  241.                                         i=0;
  242.                         }
  243.                         else
  244.                         {
  245.                                 buffer[i]=SBUF;
  246.                                 i++;
  247.                         }
  248.                 }
  249.         }
  250.         else
  251.         {
  252.                 TI = 0;
  253.         }
  254. }
复制代码


评分

参与人数 2威望 +1 金钱 +6 贡献 +2 收起 理由
e6656 + 3 很给力!
liuviking + 1 + 3 + 2

查看全部评分

回复

使用道具 举报

发表于 2015-9-20 23:21:05 | 显示全部楼层
写的不错{:soso_e179:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-21 11:05:43 | 显示全部楼层
谢谢。再加进循迹和避障。
回复 支持 反对

使用道具 举报

发表于 2015-10-9 16:38:33 | 显示全部楼层
不错,学习学习了
回复 支持 反对

使用道具 举报

发表于 2015-10-11 11:53:50 | 显示全部楼层

不错,学习学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-11 13:26:38 | 显示全部楼层
我现在的WIFI视频机器人小车就用的这个程序一直很正常,论坛里的上位机程序要用22M晶振,我这个是用11.0592M的晶振。
回复 支持 反对

使用道具 举报

发表于 2015-12-25 22:04:58 | 显示全部楼层
学习学习了,高人啊。。。。。。
回复 支持 反对

使用道具 举报

发表于 2016-4-21 15:38:57 | 显示全部楼层
多谢楼主分享!
回复 支持 反对

使用道具 举报

发表于 2017-4-30 22:37:53 | 显示全部楼层
很好的程序,学习了
回复 支持 反对

使用道具 举报

发表于 2017-5-6 10:01:03 | 显示全部楼层
好,学些了,,但是还没有入门
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-4-25 07:58 , Processed in 1.103645 second(s), 22 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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