標題: C51單片機 9G舵機 0-180自動轉(zhuǎn)動的程序 [打印本頁]

作者: 踩踩踩c    時間: 2017-3-14 20:15
標題: C51單片機 9G舵機 0-180自動轉(zhuǎn)動的程序
單片機:stc12c5a60s2
晶振:12M
功能:舵機自動從0至180度來回擺動
  1. /*********************************************************************************************
  2. 單片機:stc12c5a60s2
  3. 晶振:12M
  4. 功能:舵機自動從0至180度來回擺動

  5. /*********************************************************************************************/

  6. /*********************************************************************************************
  7. 說明:
  8. 高電平值0.5到2.5mS 對應(yīng) 舵機的 -90度到+90度。
  9. 一個高、低電平的總長是20mS

  10. /*********************************************************************************************/


  11. #include <STC12C5A60S2.H> //STC12Cx052或STC12Cx052AD系列單片機頭文件
  12. sbit R_Key = P3 ^ 4;//右轉(zhuǎn)鍵
  13. sbit L_Key = P3 ^ 5;//左轉(zhuǎn)鍵
  14. sbit PWM_OUT = P3 ^ 6;//PWM輸出接口
  15. bit OUT;//高低電平切換標志位
  16. unsigned char SG1;//舵機角度設(shè)置

  17. /*********************************************************************************************
  18. 函數(shù)名:毫秒級CPU延時函數(shù)
  19. 調(diào)  用:DELAY_MS (?);
  20. 參  數(shù):1~65535(參數(shù)不可為0)
  21. 返回值:無
  22. 結(jié)  果:占用CPU方式延時與參數(shù)數(shù)值相同的毫秒時間
  23. 備  注:應(yīng)用于1T單片機時i<600,應(yīng)用于12T單片機時i<125
  24. /*********************************************************************************************/
  25. void DELAY_MS (unsigned int a){
  26.         unsigned int i;
  27.         while( a-- != 0){
  28.                 for(i = 0; i < 600; i++);
  29.         }
  30. }
  31. /*********************************************************************************************/

  32. /*********************************************************************************************
  33. 函數(shù)名:定時/計數(shù)器初始化函數(shù)
  34. 調(diào)  用:T_C_init();
  35. 參  數(shù):無
  36. 返回值:無
  37. 結(jié)  果:設(shè)置SFR中T/C1和(或)T/C0相關(guān)參數(shù)
  38. 備  注:本函數(shù)控制T/C1和T/C0,不需要使用的部分可用//屏蔽
  39. /**********************************************************************************************/
  40. void T_C_init (void){
  41.         TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
  42.         EA = 1;        //中斷總開關(guān)

  43.         TH0 = 0xFF; //16位計數(shù)寄存器T0高8位
  44.         TL0 = 0xF5; //16位計數(shù)寄存器T0低8位
  45.         ET0 = 1; //T/C0中斷開關(guān)
  46.         //TR0 = 1; //T/C0啟動開關(guān)
  47. }
  48. /**********************************************************************************************/

  49. /*********************************************************************************************
  50. 函數(shù)名:定時/計數(shù)器0中斷處理函數(shù)
  51. 調(diào)  用:[T/C0溢出后中斷處理]
  52. 參  數(shù):無
  53. 返回值:無
  54. 結(jié)  果:重新寫入16位計數(shù)寄存器初始值,處理用戶程序
  55. 備  注:必須允許中斷并啟動T/C本函數(shù)方可有效,重新寫入初值需和T_C_init函數(shù)一致
  56. /**********************************************************************************************/
  57. void T_C0 (void) interrupt 1  using 1{ //切換寄存器組到1
  58.         unsigned int a;
  59.         if(OUT==0){//判斷高低脈沖標志//
  60.                 a= 0x0A*SG1+0x01F3;//0x0A是1度的時間長,0x01F3是0.5mS時間長。
  61.                 a= 0xFFFF - a;//算出定時開始值
  62.                 TH0 = a/0xFF; //16位計數(shù)寄存器T0高8位
  63.                 TL0 = a%0xFF; //16位計數(shù)寄存器T0低8位
  64.                 OUT = 1;//標志切換
  65.                 PWM_OUT=1;//PWM輸出高電平
  66.         }else{
  67.                 a= 0x4E1F - (0x0A*SG1+0x01F3);//0x4E1F是20mS的時間長
  68.                 a= 0xFFFF - a;//算出定時開始值
  69.                 TH0 = a/0xFF;
  70.                 TL0 = a%0xFF;
  71.                 OUT = 0;
  72.                 PWM_OUT=0;//PWM輸出低電平
  73.         }
  74. }
  75. /**********************************************************************************************/

  76. /*********************************************************************************************
  77. 函數(shù)名:主函數(shù)
  78. 調(diào)  用:無
  79. 參  數(shù):無
  80. 返回值:無
  81. 結(jié)  果:程序開始處,無限循環(huán)
  82. 備  注:
  83. /**********************************************************************************************/
  84. void main (void){
  85.         P3M0 = 0x60;        //
  86.         P3M1 = 0x00;        //設(shè)置推挽輸出
  87.         DELAY_MS (500);
  88.         

  89. …………余下代碼請下載附件…………
復(fù)制代碼



下載:
自動0~180度回來擺動.rar (1.38 KB, 下載次數(shù): 202)

作者: admin    時間: 2017-3-14 22:17
好資料,51黑有你更精彩


作者: LXJ50    時間: 2017-3-14 23:34
已買了兩個9G舵機 ,正好用上,感謝樓主分享,謝謝!
作者: 左手陽光右手沙    時間: 2017-12-27 19:02
在做舵機SG90的課設(shè)
作者: 王毅波    時間: 2018-5-21 17:37
樓主好人,剛好需要
作者: gjf    時間: 2018-9-30 20:26
89c52rc能用嗎
作者: gjf    時間: 2018-9-30 23:25
        共享資料的黑幣獎勵!
作者: xiou    時間: 2018-10-19 09:30
能精確控制舵機轉(zhuǎn)角嗎?比如按鍵一下 5度
作者: zhang7309    時間: 2018-10-21 22:22
感謝分享     
作者: 七九六    時間: 2018-12-27 08:20
想問一下,9g舵機回中原理是什么???
作者: hhwsljb    時間: 2021-10-18 23:41
不知道一開始通電的時候會不會自動轉(zhuǎn)?
作者: harbour374859    時間: 2021-11-10 23:20
謝謝樓主,這個不錯,正需要看舵機的。
作者: harbour374859    時間: 2021-11-10 23:28
我以前抄了一個程序,但舵機就是不能正常轉(zhuǎn)動起來,到現(xiàn)在都不知道是什么原因。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1