当前位置:
文档之家› 51单片机超高精度6路舵机控制程序
51单片机超高精度6路舵机控制程序
case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
}else if(serVal[0]==3){
SetSteeringGear(2,serVal[1]);
}else if(serVal[0]==4){
SetSteeringGear(3,serVal[1]);
}else if(serVal[0]==5){
SetSteeringGear(4,serVal[1]);
void ser() interrupt 4
{
serVal[0]=serVal[1];
serVal[1]=SBUF;
RI=0;//串口中断清0
}
/*********************************************************************************
51单片机超高精度6路舵机控制程序
#include <reg52.h> //包含单片机寄存器的头文件
#defineucharunsigned char
#defineuintunsignedint
P0M1=0X00;
P0M0=0XFF;//设置P0为强推挽输出
sbitservo0=P0^0;
sbitservo1=P0^1;
TL1=0xFD;//同上
TR1=1;//定时器1开关打开
REN=1; //开启允许串行接收位
SM0=0;//串口方式,8位数据
SM1=1;//同上
EA=1; //开启总中断
ES=1; //串行口中断允许位
}
/********************************************************************
**函数功能:主函数
*********************************************************************************/
void main()
{
bit started=0; //路由是否已经启动完毕
Com_Init();//串口初始化
Timer0Init();//舵机初始化
//2.5 ms初始值F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=-ms2_5Con>>8; //给定初值,17ms中断
***********************************************************************/
voidSteeringGear() interrupt 1
{
switch(pwm_flag)
{
case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
case 'L':SteeringGearDown(5); break;
default:break;
}
serVal[0]=255; //清除缓存
}else if(serVal[0]==1){
SetSteeringGear(0,serVal[1]);
}else if(serVal[0]==2){
SetSteeringGear(1,serVal[1]);
*功能:舵机PWM中断初始化
***********************************************************************/
void Timer0Init()
{
//0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
}else if(serVal[0]==6){
SetSteeringGear(5,serVal[1]);
}
}
}
}
case 14: servo6=0;TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;
case 15: servo7=1;TH0=-pwm[7]>>8; TL0=-pwm[7]; break;
case 16: servo7=0;TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
while(1)
{
if(serVal[0]=='w' &&serVal[1]=='d'){
started=1; //路由启动最后会出现:ar71xx-wdt,由此判断路由已经启动
}
if(started)
{
if(serVal[0]==0){
switch(serVal[1])
{
case 'A':SteeringGearUp(0); break;
case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
TL0=-ms2_5Con;
EA=1; //总中断打开
ET0=1; //定时器0中断打开
TR0=1; //定时器0开关打开
}
/********************************************************************
*功能:舵机PWM中断, //舵机控制函数周期为20ms一个循环20MS = 8*2.5ms
case 'G':SteeringGearUp(3); break;
case 'H':SteeringGearDown(3); break;
case 'I':SteeringGearUp(4); break;
case 'J':SteeringGearDown(4); break;
case 'K':SteeringGearUp(5); break;
case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
sbitservo2=P0^2;
sbitservo3=P0^3;
sbitservo4=P0^4;
sbitservo5=P0^5;
sbitservo6=P0^6;
sbitservo7=P0^7;
ucharserVal[2];
uintpwm[]={1382,1382,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382)
ucharpwm_flag=0;
uintcode ms0_5Con=461; //0.5ms计数(实际是460.8,取整得461)
uintcode ms2_5Con=2304; //2.5ms计数
/********************************************************************
pwm[i]=a;
serVal[0]=255; //清除缓存
}
voidSteeringGearUp(uchari)
{
if(pwm[i]>ms0_5Con)
pwm[i]=pwm[i]-10;
}
voidSteeringGearDown(uchari)
{
if(pwm[i]<ms2_5Con)
pwm[i]=pwm[i]+10;
case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
case 13: servo6=1;TH0=-pwm[6]>>8; TL0=-pwm[6]; break;
default: TH0=0xff; TL0=0x80;pwm_flag=0;
}
pwm_flag++;
}
voidSetSteeringGear(uchari,ucharval)