欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5740|回復: 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 單片機教程網

快速回復 返回頂部 返回列表