1、51单片机控制多路舵机51单片机控制多路舵机/* 该实验例程是实现8个舵机在两个角度之间摆动。0度和90度 通过该例程,读者要学会 分时复用定时器 ,用1个定时器来产生多路PWM的思想。*/#include /STC12C5A系列单片机void delay(uint16 time); /软件延时函数void Timer_init(); /定时器初始化函数void Timer0(uint32 us); /定时器0定时函数uint16 pos29= /上一节中控制一个舵机这里只需要两个数。 1500,1500,1500,1500,1500,1500,1500,1500,1500, /此节扩展成8个
2、舵机,则此处变为两个数组。 500,500,500,500,500,500,500,500,500 /数组中的18成员代表每一个舵机的两个位置。 ;uint16 pwm9=1500,1500,1500,1500,1500,1500,1500,1500,1500; /定时器取定时值从这里取sbit pwm16=P53; sbit pwm15=P15;sbit pwm14=P16;sbit pwm13=P17;sbit pwm12=P43;sbit pwm11=P32;sbit pwm10=P33;sbit pwm9=P34;sbit pwm8=P05; sbit pwm7=P06;sbit pw
3、m6=P07;sbit pwm5=P46;sbit pwm4=P41;sbit pwm3=P45;sbit pwm2=P44;sbit pwm1=P27;/* 函数名:main()功能: 入口函数备注:/*/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; P4SW|=0X70; Timer_init(); /定时器初始化 Timer0(3
4、1); /通过一个定时值进入定时循环 while(1) for(i=1;i9;i+) /pos0位置 pwmi=pos0i; delay(1000); for(i=1;i9;i+) / pos1位置 pwmi=pos1i; delay(1000); /舵机在两个角度之间摆动 /* 函数名:delay(uint16 time)功能: 软件延时函数参数: time 定时值,其大小与延时长短成正比备注:/*/void delay(uint16 time) uint16 i; uint16 j; for(i=0;i1000;i+) for(j=0;j8; TL0=(valu8; TR0 = 1; /T
5、0开始工作/* 函数名:T0zd(void) interrupt 1 功能: 定时器0中断函数备注: 控制8个舵机/*/void T0zd(void) interrupt 1 static uint8 i=1; switch(i) / case 1: pwm1=1; Timer0(pwm1); /定时 break; case 2: pwm1=0; /pwm1变低 Timer0(2500-pwm1);/ 定时 break; case 3: pwm2=1; /pwm2变高 Timer0(pwm2);/ 定时时常为pwm2 break; case 4: pwm2=0; /pwm2变低 Timer0(
6、2500-pwm2);/ 定时时常为pwm2 break; case 5: pwm3=1; /pwm3变高 Timer0(pwm3);/ 定时时常为pwm3 break; case 6: pwm3=0; /pwm3变低 Timer0(2500-pwm3);/ 定时 break; case 7: pwm4=1; /pwm4变高 Timer0(pwm4);/ 定时 break; case 8: pwm4=0; /pwm4变低 Timer0(2500-pwm4);/ 定时 break; case 9: pwm5=1; /pwm5变高 Timer0(pwm5);/ 定时 break; case 10:
7、 pwm5=0; /pwm5变低 Timer0(2500-pwm5);/ 定时 break; case 11: pwm6=1; /pwm6变高 Timer0(pwm6);/ 定时 break; case 12: pwm6=0; /pwm6变低 Timer0(2500-pwm6);/ 定时 break; case 13: pwm7=1; /pwm7变高 Timer0(pwm7);/ 定时 break; case 14: pwm7=0; /pwm7变低 Timer0(2500-pwm7);/ 定时 break; case 15: pwm8=1; /pwm8变高 Timer0(pwm8);/ 定时 break; case 16: pwm8=0; /pwm8变低 Timer0(2500-pwm8);/ 定时 i=0; break; default:break; i+;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1