此为初学者掌握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)
|