|
舵机控制
- #include <12c5a.H> //STC12C5A系列单片机
- unsigned char count; //0.5毫秒计数
- //PWM控制
- sbit jia =P1^6; //测试加
- sbit jan =P1^5; //测试减
- unsigned char jd; //角度控制
- sbit pwm8=P0^1;
- sbit pwm7=P1^1;
- sbit pwm6=P2^1;
- sbit pwm5=P2^0;
- sbit youyan=P3^5;
- sbit zuoyan=P3^7;
- sbit zuojiao=P1^7;
- sbit youjiao=P1^2;
- sbit zuojiao2=P1^6;
- sbit youjiao2=P1^0;
- sbit pwm4=P0^4;
- sbit pwm3=P1^4;
- sbit pwm2=P3^4;
- sbit pwm1=P2^4;
- uint16 pwm[9]={1500,1500,1500,1500,1500,1500,1500,1500,1500}; //定时器取定时值从这里取
- /**************************************************************************************************
- 函数名:delay(uint16 time)
- 功能: 软件延时函数
- 参数: time 定时值,其大小与延时长短成正比
- 备注:
- /***************************************************************************************************/
- void delay(uint16 time)
- {
- uint16 i;
- uint16 j;
- for(i=0;i<1000;i++)
- for(j=0;j<time;j++);
- }
- /**************************************************************************************************
- 函数名:timer_init()
- 功能: 定时器初始化函数
- 备注: 1T
- /***************************************************************************************************/
- void Timer_init()
- {
- EA=1; //开总中断
- AUXR|=0xC0; //T0,T1工作在1T
- TMOD|= 0x11; //T0工作在方式1,16位
- ET0 = 1; //开定时器0中断
- }
- /**************************************************************************************************
- 函数名:timer0(uint32 us)
- 功能: 定时器0定时函数
- 参数: us,毫秒。 精确定时。
- 备注: 晶振12M,工作模式1T
- /***************************************************************************************************/
- void Timer0(uint32 us)
- {
- uint32 valu;
- valu=us*12; //工作在1T,最大定时时间2700us
- valu=valu;
- 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;
- case 14:
- {
- pwm7=0; //pwm7变低
- Timer0(2500-pwm[7]);// 定时
- } break;
- case 15:
- {
- pwm8=1; //pwm8变高
- Timer0(pwm[8]);// 定时
- } break;
- case 16:
- {
- pwm8=0; //pwm8变低
- Timer0(2500-pwm[8]);// 定时
- i=0;
- } break;
- default:break;
-
- }
-
- i++;
- }
- void keyscan() //测试按键扫描
- {
- if(jia==0)
- {
-
- if(jia==0)
- {
- pwm[1]=pwm[1]+3;
- if(pwm[1]>=250)
- pwm[1]=250;
- delay(40);
-
-
- }
- }
- if(jan==0)
- {
-
- if(jan==0)
- {
- pwm[1]=pwm[1]-3;
-
- if(pwm[1]<=20)
- pwm[1]=20;
- delay(40);
- }
- }
- }
- void main()
- {
- P0M1=0; //设置P口为强推免输出模式,下同
- P0M0=0XFF;
- P2M1=0;
- P2M0=0XFF;
-
- P3M1=0;
- P3M0=0XFF;
- P4M1=0;
- P4M0=0XFF;
- P5M1=0;
- P5M0=0XFF;
- P4SW|=0X70;
-
-
- Timer_init();
- Timer0(32);
- delay(40);
- pwm[1]=110;
- while(1)
- {
- keyscan(); //持续监测按键状态
-
- }
- }
复制代码
|
|