单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机超高精度6路舵机控制源程序

[复制链接]
跳转到指定楼层
楼主
51控制多路舵机

单片机源程序如下:
  1. #include <reg52.h>  //包含单片机寄存器的头文件
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. P0M1=0X00;
  5. P0M0=0XFF;//设置P0 为强推挽输出

  6. sbit servo0=P0^0;
  7. sbit servo1=P0^1;
  8. sbit servo2=P0^2;
  9. sbit servo3=P0^3;
  10. sbit servo4=P0^4;
  11. sbit servo5=P0^5;
  12. sbit servo6=P0^6;
  13. sbit servo7=P0^7;

  14. uchar serVal[2];
  15. uint pwm[]={1382,1382,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382)
  16. uchar pwm_flag=0;
  17. uint code ms0_5Con=461; //0.5ms计数 (实际是460.8,取整得461)
  18. uint code ms2_5Con=2304; //2.5ms计数

  19. /********************************************************************
  20. * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
  21. ***********************************************************************/
  22. void Com_Init()
  23. {
  24. TMOD |= 0x20;   //用定时器设置串口波特率
  25. TH1=0xFD;   //256-11059200/(32*12*9600)=253 (FD)
  26. TL1=0xFD;//同上
  27. TR1=1;//定时器1开关打开  
  28. REN=1;          //开启允许串行接收位
  29. SM0=0;//串口方式,8位数据
  30. SM1=1;//同上
  31. EA=1;           //开启总中断
  32. ES=1;  //串行口中断允许位
  33. }
  34. /********************************************************************
  35. * 功能 : 舵机PWM中断初始化
  36. ***********************************************************************/
  37. void Timer0Init()
  38. {
  39. //0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
  40. //2.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)  
  41. TMOD |= 0x01;  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  42. TH0=-ms2_5Con>>8;      //给定初值,17ms中断
  43. TL0=-ms2_5Con;
  44. EA=1;            //总中断打开
  45. ET0=1;           //定时器0中断打开
  46. TR0=1;           //定时器0开关打开                                   
  47. }

  48. /********************************************************************
  49. * 功能 : 舵机PWM中断, //舵机控制函数 周期为20ms 一个循环20MS  = 8*2.5ms
  50. ***********************************************************************/
  51. void SteeringGear() interrupt 1
  52. {
  53.     switch(pwm_flag)
  54.     {
  55.         case 1:  servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
  56.         case 2:  servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
  57. case 3:  servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
  58.         case 4:  servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;   
  59. case 5:  servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
  60.         case 6:  servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
  61. case 7:  servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
  62.         case 8:  servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
  63. case 9:  servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
  64.         case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
  65.         case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
  66.         case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
  67. case 13: servo6=1;TH0=-pwm[6]>>8; TL0=-pwm[6]; break;                     
  68.         case 14: servo6=0;TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;  
  69.         case 15: servo7=1;TH0=-pwm[7]>>8;  TL0=-pwm[7]; break;      
  70.         case 16: servo7=0;TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
  71. default: TH0=0xff; TL0=0x80; pwm_flag=0;         
  72.   }
  73.     pwm_flag++;
  74. }

  75.   void SetSteeringGear(uchar i, uchar val)
  76. {
  77. uint a = (val+46)*10;
  78.     if(a<ms0_5Con)
  79. a=ms0_5Con;
  80. if(a>ms2_5Con)
  81. a=ms2_5Con;
  82. pwm[i]=a;
  83. serVal[0]=255; //清除缓存
  84. }

  85.   void SteeringGearUp(uchar i)
  86. {
  87.     if(pwm[i]>ms0_5Con)
  88. pwm[i]=pwm[i]-10;
  89. }

  90.   void SteeringGearDown(uchar i)
  91. {
  92.     if(pwm[i]<ms2_5Con)
  93. pwm[i]=pwm[i]+10;
  94. }

  95. /********************************************************************
  96. * 功能 : 串口中断接收数据
  97. ***********************************************************************/
  98. void ser() interrupt 4
  99. {
  100. serVal[0]=serVal[1];
  101. serVal[1]=SBUF;
  102. RI=0;//串口中断清0
  103. }

  104. /*********************************************************************************
  105. ** 函数功能 : 主函数
  106. *********************************************************************************/
  107. void main()
  108. {
  109. bit started=0; //路由是否已经启动完毕
  110.     Com_Init();//串口初始化
  111.     Timer0Init();//舵机初始化

  112. while(1)
  113. {
  114. if(serVal[0]=='w' && serVal[1]=='d'){
  115. started=1; //路由启动最后会出现:ar71xx-wdt,由此判断路由已经启动
  116. }

  117. if(started)
  118. {
  119. if(serVal[0]==0){
  120. switch(serVal[1])
  121. {
  122. case 'A': SteeringGearUp(0); break;
  123. case 'B': SteeringGearDown(0); break;
  124. case 'C': SteeringGearUp(1); break;
  125. case 'D': SteeringGearDown(1); break;
  126. case 'E': SteeringGearUp(2); break;
  127. case 'F': SteeringGearDown(2); break;
  128. case 'G': SteeringGearUp(3); break;
  129. case 'H': SteeringGearDown(3); break;
  130. case 'I': SteeringGearUp(4); break;
  131. case 'J': SteeringGearDown(4); break;
  132. case 'K': SteeringGearUp(5); break;
  133. case 'L': SteeringGearDown(5); break;
  134. default:break;
  135. }
  136. serVal[0]=255; //清除缓存
  137. }else if(serVal[0]==1){
  138. SetSteeringGear(0,serVal[1]);
  139. }else if(serVal[0]==2){
  140. SetSteeringGear(1,serVal[1]);
  141. }else if(serVal[0]==3){
  142. SetSteeringGear(2,serVal[1]);
  143. }else if(serVal[0]==4){
  144. SetSteeringGear(3,serVal[1]);
  145. }else if(serVal[0]==5){
  146. SetSteeringGear(4,serVal[1]);
  147. }else if(serVal[0]==6){
  148. SetSteeringGear(5,serVal[1]);
  149. }
  150. }
  151. }
  152. }
复制代码

所有资料51hei提供下载:
51单片机超高精度6路舵机控制程序-087b81f04afe04a1b071de51.doc (41 KB, 下载次数: 28)


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

使用道具 举报

沙发
guangxin 发表于 2018-4-8 14:05
51单片机超高精度6路舵机控制程序-087b81f04afe04a1b071de51.doc资源有问题,不能下载

板凳
guangxin 发表于 2018-4-8 14:09 | 只看该作者
51单片机超高精度6路舵机控制程序-087b81f04afe04a1b071de51.doc资源有问题,不能下载
回复

使用道具 举报

地板
guangxin 发表于 2019-5-22 13:39 | 只看该作者
这个程序能用吗,不会有问题吧
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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