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

標題: 單片機PWM控制舵機由淺入深各模塊源代碼(單路與8路) [打印本頁]

作者: 張大哈哈哈    時間: 2018-8-19 16:00
標題: 單片機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)



作者: bemc    時間: 2018-8-19 20:39
不錯 有價值的資料 有時間好好研究一下
作者: jshyda    時間: 2018-8-20 04:11
正在學習如何控制舵的知識,謝LZ!
作者: bbk215    時間: 2019-3-1 17:20
不錯,非常值得學習
作者: bbk215    時間: 2019-3-1 17:21
可以的,值得學習的資料
作者: gdatgb    時間: 2019-3-3 15:04
不錯,值得學習.謝樓主!
作者: 不三不四    時間: 2019-10-15 18:37
可以的

作者: tonggin    時間: 2019-10-16 09:31
自學玩舵機的必要參考資料




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久av影院 | 99视频在线免费观看 | 国产成人网 | 天天影视色综合 | 久久久久免费精品国产小说色大师 | 精品区一区二区 | 三级在线免费观看 | 久久久九九 | 国产精品久久久久免费 | 国产成人精品一区二区在线 | 成人国产一区二区三区精品麻豆 | 亚洲伊人久久综合 | 久久久久久久一区二区三区 | 国产男女猛烈无遮掩视频免费网站 | 伊人久久综合 | 国产精品毛片 | 精品久久久久久久久久久久久久 | 久久久久久久一区二区 | 亚洲+变态+欧美+另类+精品 | 色综合久久久久 | 亚洲 欧美 另类 综合 偷拍 | 成人不卡 | 国产在线资源 | 性国产丰满麻豆videosex | 国产精品激情小视频 | 在线观看深夜视频 | 欧美一区二区三区电影 | 色婷婷久久久亚洲一区二区三区 | 国产精品成人一区二区三区夜夜夜 | 在线91| 欧美一级免费 | 国产精品夜夜夜一区二区三区尤 | 日韩在线视频一区二区三区 | 欧美日韩国产高清 | 岛国精品| a级免费观看视频 | 欧美黄色绿像 | 日韩欧美视频在线 | 91中文字幕 | 国产成人免费网站 | 在线视频中文字幕 |