此為初學者掌握51程序控制舵機的重要程序
控制一個普通舵機單片機源程序如下:
控制多個普通舵機
單片機源程序如下:
- /**********************************************************************
- 該實驗例程是實現8個舵機在兩個角度之間擺動。0度和90度
- 通過該例程,讀者要學會 分時復用定時器 ,用1個定時器來產生多路PWM的思想。
- ***********************************************************************/
- #include "STC15Fxxxx.H" //STC12C5A系列單片機
- void delay(uint16 time); //軟件延時函數
- void Timer_init(); //定時器初始化函數
- void Timer0(uint32 us); //定時器0定時函數
- uint16 pos[2][9]={ //上一節中控制一個舵機這里只需要兩個數。
- {1500,1500,1500,1500,1500,1500,1500,1500,1500}, //此節擴展成8個舵機,則此處變為兩個數組。。
- {500,500,500,500,500,500,500,500,500} //數組中的1~8成員代表每一個舵機的兩個位置。
- };
- uint16 pwm[9]={1500,1500,1500,1500,1500,1500,1500,1500,1500}; //定時器取定時值從這里取
- sbit pwm16=P5^3;
- sbit pwm15=P1^5;
- sbit pwm14=P1^6;
- sbit pwm13=P1^7;
- sbit pwm12=P4^3;
- sbit pwm11=P3^2;
- sbit pwm10=P3^3;
- sbit pwm9=P3^4;
- sbit pwm8=P0^5;
- sbit pwm7=P0^6;
- sbit pwm6=P0^7;
- sbit pwm5=P4^6;
- sbit pwm4=P4^1;
- sbit pwm3=P4^5;
- sbit pwm2=P4^4;
- sbit pwm1=P2^7;
- /**************************************************************************************************
- 函數名:main()
- 功能: 入口函數
- 作者: 許長華
- 時間: 2012-3-3
- 備注:
- /***************************************************************************************************/
- void main()
- {
- uint8 i=0;
- P0M1=0; //設置P口為強推免輸出模式,下同
- P0M0=0XFF;
- P1M1=0;
- P1M0=0XFF;
- P2M1=0;
- P2M0=0XFF;
- P3M1=0;
- P3M0=0XFF;
- P4M1=0;
- P4M0=0XFF;
- P5M1=0;
- P5M0=0XFF;
- Timer_init(); //定時器初始化
- Timer0(31); //通過一個定時值進入定時循環
- while(1)
- {
- for(i=1;i<9;i++) //pos[0]位置
- pwm[i]=pos[0][i];
- delay(1000);
- for(i=1;i<9;i++) // pos[1]位置
- pwm[i]=pos[1][i];
- delay(1000); //舵機在兩個角度之間擺動
- }
- }
- /**************************************************************************************************
- 函數名:delay(uint16 time)
- 功能: 軟件延時函數
- 參數: time 定時值,其大小與延時長短成正比
- 作者: 許長華
- 時間: 2012-3-3
- 備注:
- /***************************************************************************************************/
- void delay(uint16 time)
- {
- uint16 i;
- uint16 j;
- for(i=0;i<2000;i++)
- for(j=0;j<time;j++);
- }
- /**************************************************************************************************
- 函數名:timer_init()
- 功能: 定時器初始化函數
- /***************************************************************************************************/
- void Timer_init()
- {
- EA=1; //開總中斷
- AUXR|=0xC0; //T0,T1工作在1T
- TMOD|= 0x11; //T0工作在方式1,16位
- ET0 = 1; //開定時器0中斷
- }
- /**************************************************************************************************
- 函數名:timer0(uint32 us)
- 功能: 定時器0定時函數
- /***************************************************************************************************/
- void Timer0(uint32 us)
- {
- uint32 valu;
- valu=us*23; //工作在1T,最大定時時間2700us
- valu=valu - 120;
- valu=0xffff-valu; //
-
- TH0=valu>>8;
- TL0=(valu<<8)>>8;
- TR0 = 1; //T0開始工作
- }
- /**************************************************************************************************
- 函數名:T0zd(void) interrupt 1
- 功能: 定時器0中斷函數
- 備注: 控制8個舵機
- /***************************************************************************************************/
- void T0zd(void) interrupt 1
- {
- static uint8 i=1;
- switch(i) //
- {
- case 1:
- {
- pwm1=1;
- Timer0(pwm[1]); //定時
- } break;
- case 2:
- {
- pwm1=0; //pwm1變低
- Timer0(2500-pwm[1]);// 定時
- } break;
- case 3:
- {
- pwm2=1; //pwm2變高
- Timer0(pwm[2]);// 定時時常為pwm[2]
- } break;
- case 4:
- {
- pwm2=0; //pwm2變低
- Timer0(2500-pwm[2]);// 定時時常為pwm[2]
- } break;
- case 5:
- {
- pwm3=1; //pwm3變高
- Timer0(pwm[3]);// 定時時常為pwm[3]
- } break;
- case 6:
- {
- pwm3=0; //pwm3變低
- Timer0(2500-pwm[3]);// 定時
- } break;
- case 7:
- {
- pwm4=1; //pwm4變高
- Timer0(pwm[4]);// 定時
- } break;
- case 8:
- {
- pwm4=0; //pwm4變低
- Timer0(2500-pwm[4]);// 定時
- } break;
- case 9:
- {
- pwm5=1; //pwm5變高
- Timer0(pwm[5]);// 定時
- } break;
- case 10:
- {
- pwm5=0; //pwm5變低
- Timer0(2500-pwm[5]);// 定時
- } break;
- case 11:
- {
- pwm6=1; //pwm6變高
- Timer0(pwm[6]);// 定時
- } break;
- case 12:
- {
- pwm6=0; //pwm6變低
- Timer0(2500-pwm[6]);// 定時
- } break;
- case 13:
- {
- pwm7=1; //pwm7變高
- Timer0(pwm[7]);// 定時
- } break;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
1.普通PWM舵機由淺入深各模塊代碼.rar
(309.12 KB, 下載次數: 82)
2018-8-19 15:59 上傳
點擊文件名下載附件
|