多舵机控制程序.docx
《多舵机控制程序.docx》由会员分享,可在线阅读,更多相关《多舵机控制程序.docx(8页珍藏版)》请在冰豆网上搜索。
多舵机控制程序
多舵机控制程序
/*
*Copyright(c)2009,jinzhikai
*Allrightsreserved.
*
*文件名称:
多舵机.c
*文件标识:
舵机
*摘 要:
8舵机控制,8路舵机初始脉冲分别是1ms,,....
*采用C52芯片,C52基本电路。
*当前版本:
*作 者:
*完成日期:
2009年3月10日
*
*取代版本:
*原作者 :
jinzhikai
*完成日期:
2009年3月4日
*
*/
#include<>
#defineuintunsignedint
#defineucharunsignedchar
sbitledlk=P1^0;
sbitsmglk=P1^1;
sbitsmgbitlk=P1^2;
sbitdj0=P2^0; /*设置舵机信号输出端口*/
sbitdj1=P2^1;
sbitdj2=P2^2;
sbitdj3=P2^3;
sbitdj4=P2^4;
sbitdj5=P2^5;
sbitdj6=P2^6;
sbitdj7=P2^7;
tha0=(65535-1000)/256; /*设置tha0代表TH0初值,0代表第一号舵机,a代表高电平,b代表低电平*/
tla0=(65535-1000)%256;
thb0=(65535-(20000-1000))/256;
tlb0=(65535-(20000-1000))%256;
tha1=(65535-1100)/256;
tla1=(65535-1100)%256;
thb1=(65535-(20000-1100))/256;
tlb1=(65535-(20000-1100))%256;
tha2=(65535-1200)/256;
tla2=(65535-1200)%256;
thb2=(65535-(20000-1200))/256;
tlb2=(65535-(20000-1200))%256;
tha3=(65535-1300)/256;
tla3=(65535-1300)%256;
thb3=(65535-(20000-1300))/256;
tlb3=(65535-(20000-1300))%256;
tha4=(65535-1400)/256;
tla4=(65535-1400)%256;
thb4=(65535-(20000-1400))/256;
tlb4=(65535-(20000-1400))%256;
tha5=(65535-1500)/256;
tla5=(65535-1500)%256;
thb5=(65535-(20000-1500))/256;
tlb5=(65535-(20000-1500))%256;
tha6=(65535-1600)/256;
tla6=(65535-1600)%256;
thb6=(65535-(20000-1600))/256;
tlb6=(65535-(20000-1600))%256;
tha7=(65535-1700)/256;
tla7=(65535-1700)%256;
thb7=(65535-(20000-1700))/256;
tlb7=(65535-(20000-1700))%256;
uchardj_set(uchardj_num,uchardp,uchari) /*设置dj_set函数,确定选择计数器初值,dj_num表示舵机号,dp表示电平,i为1等于TH0初值,i为0等于TL0初值*/
{
if(dp)
{ if(i)
switch(dj_num)
{
case'0':
return(tha0);
break;
case'1':
return(tha1);
break;
case'2':
return(tha2);
break;
case'3':
return(tha3);
break;
case'4':
return(tha4);
break;
case'5':
return(tha5);
break;
case'6':
return(tha6);
break;
case'7':
return(tha7);
break;
}
else
switch(dj_num)
{
case'0':
return(tla0);
break;
case'1':
return(tla1);
break;
case'2':
return(tla2);
break;
case'3':
return(tla3);
break;
case'4':
return(tla4);
break;
case'5':
return(tla5);
break;
case'6':
return(tla6);
break;
case'7':
return(tla7);
break;
}
}
else
{ if(i)
switch(dj_num)
{
case'0':
return(thb0);
break;
case'1':
return(thb1);
break;
case'2':
return(thb2);
break;
case'3':
return(thb3);
break;
case'4':
return(thb4);
break;
case'5':
return(thb5);
break;
case'6':
return(thb6);
break;
case'7':
return(thb7);
break;
}
else
switch(dj_num)
{
case'0':
return(tlb0);
break;
case'1':
return(tlb1);
break;
case'2':
return(tlb2);
break;
case'3':
return(tlb3);
break;
case'4':
return(tlb4);
break;
case'5':
return(tlb5);
break;
case'6':
return(tlb6);
break;
case'7':
return(tlb7);
break;
}
}
}
voidmain()
{
uchardj_num=0;
ucharhl=1;
ledlk=0;
smglk=0;
smgbitlk=0;
ET0=1;
ET1=1;
EA=1;
TMOD=0x01; /*选择0号计时器,16位计时器*/
TR0=1;
TR1=1;
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
while
(1)
{ for(dj_num=0;dj_num<8;)
{
while(TF0) /*发生中断循环*/
{
if(!
hl) /*判断低电平中断,换舵机端口*/
{
dj_num++;
}
switch(dj_num) /*按照舵机号,相应端口置反*/
{
case'0':
dj0=!
dj0;
case'1':
dj1=!
dj1;
case'2':
dj2=!
dj2;
case'3':
dj3=!
dj3;
case'4':
dj4=!
dj4;
case'5':
dj5=!
dj5;
case'6':
dj6=!
dj6;
case'7':
dj7=!
dj7;
}
hl=!
hl;
TH0=dj_set(dj_num,hl,1); /*调用dj_set()函数设置计时器初值*/
TL0=dj_set(dj_num,hl,0);
TF0=0; /*清除中断*/
}
}
}
}
编写了一个多舵机控制程序,不知道能否应用,有示波器的朋友帮忙测试一下。
感谢!