找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4890|回复: 7
收起左侧

单片机PWM控制舵机由浅入深各模块源代码(单路与8路)

[复制链接]
ID:387846 发表于 2018-8-19 16:00 | 显示全部楼层 |阅读模式
此为初学者掌握51程序控制舵机的重要程序
0.png

控制一个普通舵机单片机源程序如下:
  1. /**********************************************************************

  2. 该实验例程还是实现一个舵机在两个角度之间摆动。0度和90度
  3. 但定时器中断里的处理与前一节有所区别,目的是让大家更好的
  4. 理解下一节分时复用思想产生多路PWM 。是一个过渡实验例程。
  5. ***********************************************************************/
  6. #include <STC15Fxxxx.H>                  //STC15系列单片机

  7. void delay(uint16 time);        //软件延时函数
  8. void Timer_init();                        //定时器初始化函数
  9. void Timer0(uint32 us);                //定时器0定时函数

  10. uint16 pwm_valu=500;
  11. sbit pwm1=P0^0;                                 //将舵机插到P0^0口上
  12. void main()
  13. {

  14.         P0M1=0;
  15.         P0M0=0XFF;                                //将P2口设置成强推免输出,提高带负载能力

  16.         Timer_init();                        //定时器初始化
  17.         Timer0(31);                                //通过一个定时值进入定时循环
  18.         while(1)
  19.         {
  20.                 pwm_valu=500;           //脉宽=500us=0.5ms即0度位置
  21.                 delay(1000);
  22.                 pwm_valu=1500;           //脉宽=1500us=1.5ms即90度位置
  23.                 delay(1000);           //舵机在两个角度之间摆动
  24.         }
  25. }
  26. void delay(uint16 time)
  27. {
  28.         uint16 i;
  29.         uint16 j;
  30.         for(i=0;i<1000;i++)
  31.         for(j=0;j<time;j++);
  32. }
  33. void Timer_init()
  34. {
  35.         EA=1;
  36.         AUXR|=0xC0;                                //T0,T1工作在1T
  37.         TMOD|= 0x11;                        //T0工作在方式1,16位
  38.                
  39.         ET0 = 1;       
  40. }

  41. void Timer0(uint32 us)                
  42. {       
  43.         uint32 valu;
  44.         valu=0xffff-us*23;                //          

  45.     TH0=valu>>8;          
  46.     TL0=(valu<<8)>>8;
  47.     TR0  = 1;                                //T0开始工作
  48. }
  49. void T0zd(void) interrupt 1   
  50. {
  51.                 static uint8 i=1;
  52.                 switch(i)          //   
  53.                 {
  54.                 case 1:
  55.                         {
  56.                                 pwm1=1;
  57.                                 Timer0(pwm_valu);//       
  58.                         }  break;
  59.                 case 2:
  60.                         {
  61.                                  pwm1=0;//        pwm1变低
  62.                                 Timer0(2500-pwm_valu);//       
  63.                         }  break;
  64.                 case 3:
  65.                         {
  66.                                 Timer0(500);//       
  67.                         }  break;
  68.                 case 4:
  69.                         {
  70.                                 Timer0(2500);//       
  71.                         }  break;
  72.                 case 5:
  73.                         {
  74.                                 Timer0(2500);//       
  75.                         }  break;
  76.                 case 6:
  77.                         {
  78.                                 Timer0(2500);//       
  79.                         }  break;
  80.                 case 7:
  81.                         {
  82.                                 Timer0(2500);//       
  83.                         }  break;
  84.                 case 8:
  85.                         {
  86.                                 Timer0(2500);//       
  87.                         }        break;
  88.                 case 9:
  89.                         {
  90.                                 Timer0(2500);//       
  91.                                 i=0;
  92.                         }        break;
  93.                 default:break;
  94.             }
  95.                 i++;
  96. }   
复制代码

控制多个普通舵机

单片机源程序如下:
  1. /**********************************************************************
  2. 该实验例程是实现8个舵机在两个角度之间摆动。0度和90度
  3. 通过该例程,读者要学会  分时复用定时器 ,用1个定时器来产生多路PWM的思想。
  4. ***********************************************************************/
  5. #include "STC15Fxxxx.H"                    //STC12C5A系列单片机

  6. void delay(uint16 time);        //软件延时函数
  7. void Timer_init();                        //定时器初始化函数
  8. void Timer0(uint32 us);                //定时器0定时函数



  9. uint16 pos[2][9]={                                                                                                        //上一节中控制一个舵机这里只需要两个数。
  10.                                         {1500,1500,1500,1500,1500,1500,1500,1500,1500},        //此节扩展成8个舵机,则此处变为两个数组。。
  11.                                         {500,500,500,500,500,500,500,500,500}                        //数组中的1~8成员代表每一个舵机的两个位置。
  12.                                  };


  13. uint16 pwm[9]={1500,1500,1500,1500,1500,1500,1500,1500,1500};                //定时器取定时值从这里取


  14. sbit pwm16=P5^3;                 
  15. sbit pwm15=P1^5;
  16. sbit pwm14=P1^6;
  17. sbit pwm13=P1^7;
  18. sbit pwm12=P4^3;
  19. sbit pwm11=P3^2;
  20. sbit pwm10=P3^3;
  21. sbit pwm9=P3^4;

  22. sbit pwm8=P0^5;                 
  23. sbit pwm7=P0^6;
  24. sbit pwm6=P0^7;
  25. sbit pwm5=P4^6;
  26. sbit pwm4=P4^1;
  27. sbit pwm3=P4^5;
  28. sbit pwm2=P4^4;
  29. sbit pwm1=P2^7;

  30. /**************************************************************************************************       
  31. 函数名:main()
  32. 功能:        入口函数
  33. 作者:        许长华
  34. 时间:        2012-3-3
  35. 备注:
  36. /***************************************************************************************************/
  37. void main()
  38. {
  39.         uint8 i=0;

  40.         P0M1=0;                           //设置P口为强推免输出模式,下同
  41.         P0M0=0XFF;

  42.         P1M1=0;
  43.         P1M0=0XFF;

  44.         P2M1=0;
  45.         P2M0=0XFF;

  46.         P3M1=0;
  47.         P3M0=0XFF;

  48.         P4M1=0;
  49.         P4M0=0XFF;

  50.         P5M1=0;
  51.         P5M0=0XFF;


  52.         Timer_init();        //定时器初始化
  53.         Timer0(31);                //通过一个定时值进入定时循环


  54.         while(1)
  55.         {
  56.                 for(i=1;i<9;i++)                   //pos[0]位置
  57.                         pwm[i]=pos[0][i];
  58.                 delay(1000);

  59.                 for(i=1;i<9;i++)                   // pos[1]位置
  60.                         pwm[i]=pos[1][i];

  61.                 delay(1000);                           //舵机在两个角度之间摆动
  62.         }
  63. }
  64. /**************************************************************************************************       
  65. 函数名:delay(uint16 time)
  66. 功能:        软件延时函数
  67. 参数:        time 定时值,其大小与延时长短成正比
  68. 作者:        许长华
  69. 时间:        2012-3-3
  70. 备注:
  71. /***************************************************************************************************/
  72. void delay(uint16 time)
  73. {
  74.         uint16 i;
  75.         uint16 j;
  76.         for(i=0;i<2000;i++)
  77.         for(j=0;j<time;j++);
  78. }
  79. /**************************************************************************************************       
  80. 函数名:timer_init()
  81. 功能:        定时器初始化函数
  82. /***************************************************************************************************/
  83. void Timer_init()
  84. {
  85.         EA=1;                                           //开总中断
  86.         AUXR|=0xC0;                                //T0,T1工作在1T
  87.     TMOD|= 0x11;                        //T0工作在方式1,16位
  88.         ET0 = 1;                                //开定时器0中断
  89. }
  90. /**************************************************************************************************       
  91. 函数名:timer0(uint32 us)
  92. 功能:        定时器0定时函数
  93. /***************************************************************************************************/
  94. void Timer0(uint32 us)                        
  95. {       
  96.         uint32 valu;
  97.         valu=us*23;                                        //工作在1T,最大定时时间2700us
  98.         valu=valu - 120;
  99.         valu=0xffff-valu;                        //          
  100.        
  101.     TH0=valu>>8;          
  102.     TL0=(valu<<8)>>8;
  103.     TR0  = 1;                                        //T0开始工作
  104. }

  105. /**************************************************************************************************       
  106. 函数名:T0zd(void) interrupt 1
  107. 功能:        定时器0中断函数
  108. 备注:         控制8个舵机
  109. /***************************************************************************************************/
  110. void T0zd(void) interrupt 1   
  111. {
  112.                 static uint8 i=1;
  113.                 switch(i)                                  //   
  114.                 {
  115.                 case 1:
  116.                         {
  117.                                 pwm1=1;
  118.                                 Timer0(pwm[1]);        //定时
  119.                         }  break;
  120.                 case 2:
  121.                         {
  122.                                  pwm1=0;                        //pwm1变低
  123.                                 Timer0(2500-pwm[1]);//        定时
  124.                         }  break;
  125.                 case 3:
  126.                         {
  127.                                 pwm2=1; //pwm2变高
  128.                                 Timer0(pwm[2]);//        定时时常为pwm[2]
  129.                         }  break;
  130.                 case 4:
  131.                         {
  132.                                 pwm2=0; //pwm2变低
  133.                                 Timer0(2500-pwm[2]);//        定时时常为pwm[2]
  134.                         }         break;
  135.                 case 5:
  136.                         {
  137.                                 pwm3=1; //pwm3变高
  138.                                 Timer0(pwm[3]);//        定时时常为pwm[3]
  139.                         }  break;
  140.                 case 6:
  141.                         {
  142.                                 pwm3=0; //pwm3变低
  143.                                 Timer0(2500-pwm[3]);//        定时
  144.                         }        break;          
  145.                 case 7:
  146.                         {
  147.                                 pwm4=1; //pwm4变高
  148.                                 Timer0(pwm[4]);//        定时
  149.                         }        break;          
  150.                 case 8:
  151.                         {
  152.                                 pwm4=0; //pwm4变低
  153.                                 Timer0(2500-pwm[4]);//        定时
  154.                         }        break;          
  155.                 case 9:
  156.                         {
  157.                                 pwm5=1; //pwm5变高
  158.                                 Timer0(pwm[5]);//        定时
  159.                         }        break;          
  160.                 case 10:
  161.                         {
  162.                                 pwm5=0; //pwm5变低
  163.                                 Timer0(2500-pwm[5]);//        定时
  164.                         }        break;          
  165.                 case 11:
  166.                         {
  167.                                 pwm6=1; //pwm6变高
  168.                                 Timer0(pwm[6]);//        定时
  169.                         }        break;          
  170.                 case 12:
  171.                         {
  172.                                 pwm6=0; //pwm6变低
  173.                                 Timer0(2500-pwm[6]);//        定时
  174.                         }        break;       

  175.                 case 13:
  176.                         {
  177.                                 pwm7=1; //pwm7变高
  178.                                 Timer0(pwm[7]);//        定时
  179.                         }        break;          
  180. ……………………

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


所有资料51hei提供下载:
1.普通PWM舵机由浅入深各模块代码.rar (309.12 KB, 下载次数: 82)

评分

参与人数 1黑币 +5 收起 理由
zqy181818 + 5 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:285863 发表于 2018-8-19 20:39 | 显示全部楼层
不错 有价值的资料 有时间好好研究一下
回复

使用道具 举报

ID:374570 发表于 2018-8-20 04:11 | 显示全部楼层
正在学习如何控制舵的知识,谢LZ!
回复

使用道具 举报

ID:482847 发表于 2019-3-1 17:20 | 显示全部楼层
不错,非常值得学习
回复

使用道具 举报

ID:482847 发表于 2019-3-1 17:21 | 显示全部楼层
可以的,值得学习的资料
回复

使用道具 举报

ID:165117 发表于 2019-3-3 15:04 | 显示全部楼层
不错,值得学习.谢楼主!
回复

使用道具 举报

ID:619273 发表于 2019-10-15 18:37 | 显示全部楼层
可以的
回复

使用道具 举报

ID:208849 发表于 2019-10-16 09:31 | 显示全部楼层
自学玩舵机的必要参考资料
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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