久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5758|回復: 7
打印 上一主題 下一主題
收起左側

單片機PWM控制舵機由淺入深各模塊源代碼(單路與8路)

[復制鏈接]
跳轉到指定樓層
樓主
此為初學者掌握51程序控制舵機的重要程序


控制一個普通舵機單片機源程序如下:
  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 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:285863 發表于 2018-8-19 20:39 | 只看該作者
不錯 有價值的資料 有時間好好研究一下
回復

使用道具 舉報

板凳
ID:374570 發表于 2018-8-20 04:11 | 只看該作者
正在學習如何控制舵的知識,謝LZ!
回復

使用道具 舉報

地板
ID:482847 發表于 2019-3-1 17:20 | 只看該作者
不錯,非常值得學習
回復

使用道具 舉報

5#
ID:482847 發表于 2019-3-1 17:21 | 只看該作者
可以的,值得學習的資料
回復

使用道具 舉報

6#
ID:165117 發表于 2019-3-3 15:04 | 只看該作者
不錯,值得學習.謝樓主!
回復

使用道具 舉報

7#
ID:619273 發表于 2019-10-15 18:37 | 只看該作者
可以的
回復

使用道具 舉報

8#
ID:208849 發表于 2019-10-16 09:31 | 只看該作者
自學玩舵機的必要參考資料
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品久久久| 91av在线免费播放 | 午夜99| 91一区二区三区在线观看 | 狠狠干av| 国产黄色精品在线观看 | 天堂综合网久久 | 国产片侵犯亲女视频播放 | 国产精品人人做人人爽 | 一级毛片色一级 | 粉嫩av久久一区二区三区 | se婷婷| 国产一区二区不卡 | 国产h在线 | 在线欧美一区 | 国产精品亚洲第一区在线暖暖韩国 | 无人区国产成人久久三区 | 国产一区二区三区色淫影院 | 久久亚洲国产精品 | 精品伊人久久 | 色欧美片视频在线观看 | 一区二区三区欧美在线 | 日韩成人精品一区二区三区 | 天天影视亚洲综合网 | 日韩乱码在线 | 天天干视频在线 | 中文字幕高清在线 | 亚洲精品一区二区 | 最新国产精品 | 国产成人av一区二区三区 | 美女天堂 | 日韩在线观看一区 | 久久久久成人精品 | 乳色吐息在线观看 | 欧美视频三区 | 日韩电影在线 | 精品久久一 | 中文字幕视频在线 | 91精品国产91久久综合桃花 | 黄色一级电影在线观看 | 欧美成人a|