找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1571|回复: 1
收起左侧

51单个舵机精确控制程序

[复制链接]
ID:721454 发表于 2020-4-4 12:18 | 显示全部楼层 |阅读模式
舵机控制

  1. #include <12c5a.H>                  //STC12C5A系列单片机
  2. unsigned char count;      //0.5毫秒计数
  3.          //PWM控制
  4. sbit jia =P1^6;           //测试加
  5. sbit jan =P1^5;           //测试减
  6. unsigned char jd;         //角度控制
  7. sbit pwm8=P0^1;
  8. sbit pwm7=P1^1;
  9. sbit pwm6=P2^1;
  10. sbit pwm5=P2^0;
  11. sbit youyan=P3^5;       
  12. sbit zuoyan=P3^7;      
  13. sbit zuojiao=P1^7;
  14. sbit youjiao=P1^2;
  15. sbit zuojiao2=P1^6;
  16. sbit youjiao2=P1^0;
  17. sbit pwm4=P0^4;
  18. sbit pwm3=P1^4;
  19. sbit pwm2=P3^4;       
  20. sbit pwm1=P2^4;
  21. uint16 pwm[9]={1500,1500,1500,1500,1500,1500,1500,1500,1500};                //定时器取定时值从这里取
  22. /**************************************************************************************************       
  23. 函数名:delay(uint16 time)
  24. 功能:        软件延时函数
  25. 参数:        time 定时值,其大小与延时长短成正比
  26. 备注:
  27. /***************************************************************************************************/
  28. void delay(uint16 time)
  29. {
  30.         uint16 i;
  31.         uint16 j;
  32.         for(i=0;i<1000;i++)
  33.         for(j=0;j<time;j++);
  34. }
  35. /**************************************************************************************************       
  36. 函数名:timer_init()
  37. 功能:        定时器初始化函数
  38. 备注: 1T
  39. /***************************************************************************************************/
  40. void Timer_init()
  41. {
  42.         EA=1;                                           //开总中断
  43.         AUXR|=0xC0;                                //T0,T1工作在1T
  44.     TMOD|= 0x11;                        //T0工作在方式1,16位
  45.         ET0 = 1;                                //开定时器0中断
  46. }
  47. /**************************************************************************************************       
  48. 函数名:timer0(uint32 us)
  49. 功能:        定时器0定时函数
  50. 参数:        us,毫秒。  精确定时。
  51. 备注:         晶振12M,工作模式1T
  52. /***************************************************************************************************/
  53. void Timer0(uint32 us)                        
  54. {       
  55.         uint32 valu;
  56.         valu=us*12;                                        //工作在1T,最大定时时间2700us
  57.         valu=valu;
  58.         valu=0xffff-valu;                        //          

  59.     TH0=valu>>8;          
  60.     TL0=(valu<<8)>>8;
  61.     TR0  = 1;                                        //T0开始工作
  62. }
  63. /**************************************************************************************************       
  64. 函数名:T0zd(void) interrupt 1
  65. 功能:        定时器0中断函数
  66. 备注:         控制8个舵机
  67. /***************************************************************************************************/
  68. void T0zd(void) interrupt 1   
  69. {
  70.                 static uint8 i=1;
  71.                 switch(i)                                  //   
  72.                 {
  73.                 case 1:
  74.                         {
  75.                                 pwm1=1;
  76.                                 Timer0(pwm[1]);        //定时
  77.                         }  break;
  78.                 case 2:
  79.                         {
  80.                                  pwm1=0;                        //pwm1变低
  81.                                 Timer0(2500-pwm[1]);//        定时
  82.                         }  break;
  83.                 case 3:
  84.                         {
  85.                                 pwm2=1; //pwm2变高
  86.                                 Timer0(pwm[2]);//        定时时常为pwm[2]
  87.                         }  break;
  88.                 case 4:
  89.                         {
  90.                                 pwm2=0; //pwm2变低
  91.                                 Timer0(2500-pwm[2]);//        定时时常为pwm[2]
  92.                         }         break;
  93.                 case 5:
  94.                         {
  95.                                 pwm3=1; //pwm3变高
  96.                                 Timer0(pwm[3]);//        定时时常为pwm[3]
  97.                         }  break;
  98.                 case 6:
  99.                         {
  100.                                 pwm3=0; //pwm3变低
  101.                                 Timer0(2500-pwm[3]);//        定时
  102.                         }        break;          
  103.                 case 7:
  104.                         {
  105.                                 pwm4=1; //pwm4变高
  106.                                 Timer0(pwm[4]);//        定时
  107.                         }        break;          
  108.                 case 8:
  109.                         {
  110.                                 pwm4=0; //pwm4变低
  111.                                 Timer0(2500-pwm[4]);//        定时
  112.                         }        break;          
  113.                 case 9:
  114.                         {
  115.                                 pwm5=1; //pwm5变高
  116.                                 Timer0(pwm[5]);//        定时
  117.                         }        break;          
  118.                 case 10:
  119.                         {
  120.                                 pwm5=0; //pwm5变低
  121.                                 Timer0(2500-pwm[5]);//        定时
  122.                         }        break;          
  123.                 case 11:
  124.                         {
  125.                                 pwm6=1; //pwm6变高
  126.                                 Timer0(pwm[6]);//        定时
  127.                         }        break;          
  128.                 case 12:
  129.                         {
  130.                                 pwm6=0; //pwm6变低
  131.                                 Timer0(2500-pwm[6]);//        定时
  132.                         }        break;       

  133.                 case 13:
  134.                         {
  135.                                 pwm7=1; //pwm7变高
  136.                                 Timer0(pwm[7]);//        定时
  137.                         }        break;          
  138.                 case 14:
  139.                         {
  140.                                 pwm7=0; //pwm7变低
  141.                                 Timer0(2500-pwm[7]);//        定时
  142.                         }        break;       

  143.                 case 15:
  144.                         {
  145.                                 pwm8=1; //pwm8变高
  146.                                 Timer0(pwm[8]);//        定时
  147.                         }        break;          
  148.                 case 16:
  149.                         {
  150.                                 pwm8=0; //pwm8变低
  151.                                 Timer0(2500-pwm[8]);//        定时

  152.                                 i=0;
  153.                         }        break;       

  154.                 default:break;
  155.                        
  156.             }
  157.                   
  158.                         i++;
  159. }

  160. void keyscan()              //测试按键扫描
  161. {
  162.    if(jia==0)              
  163.   {
  164.               
  165.     if(jia==0)              
  166.      {
  167.       pwm[1]=pwm[1]+3;  

  168. if(pwm[1]>=250)
  169.        pwm[1]=250;        
  170. delay(40);         
  171.                   
  172.             
  173.      }
  174.   }
  175.   if(jan==0)               
  176.   {

  177.     if(jan==0)
  178.      {
  179.        pwm[1]=pwm[1]-3;               
  180.                            
  181.    if(pwm[1]<=20)
  182.        pwm[1]=20;  
  183.          delay(40);       
  184.      }
  185.   }
  186. }

  187. void main()
  188. {
  189.                 P0M1=0;                           //设置P口为强推免输出模式,下同
  190.         P0M0=0XFF;

  191.         P2M1=0;
  192.         P2M0=0XFF;

  193.        

  194.         P3M1=0;
  195.         P3M0=0XFF;

  196.         P4M1=0;
  197.         P4M0=0XFF;

  198.         P5M1=0;
  199.         P5M0=0XFF;
  200.         P4SW|=0X70;
  201.        
  202.        

  203. Timer_init();
  204. Timer0(32);
  205.         delay(40);
  206. pwm[1]=110;
  207. while(1)
  208. {
  209.   keyscan();               //持续监测按键状态
  210.   
  211. }
  212. }
复制代码

舵机精确控制.7z

22.05 KB, 下载次数: 22, 下载积分: 黑币 -5

回复

使用道具 举报

ID:1 发表于 2020-4-7 15:54 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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