谁能帮我解释下这个程序吧,,,,谢谢了,,这是一个六个舵机控制机器人走路的程序
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#define uint unsigned int
sbit ctr3=P0^6; //分时发射1 左边
sbit ctr2=P0^4; //分时发射2 中间
sbit ctr1=P0^5; //分时发射3 右边
sbit out=P1^6; //激光接收管 信号端
sbit hi=P2^6;
sbit f=P0^7; //蜂鸣器
sbit pwm1=P2^0; //舵机1
sbit pwm2=P2^4; //舵机2
sbit pwm3=P3^5; //舵机3
sbit pwm4=P3^7; //舵机4
sbit pwm5=P1^6; //舵机5
sbit pwm6=P1^7; //舵机6
char d,e,d1,p;
unsigned int a,b,c;//a是右边的,c是左边的,b是中间的
unsigned int set,m,angle; //set为舵机,电机转角标志位,angle为舵机打角
unsigned int angle1,angle2;//angle1,angle2为电机PWM变化打角
unsigned int aa,bb,cc,dd,ee,ff,aaa,bbb,ccc,ddd,eee,fff;//angle1,angle2为电机PWM变化打角
unsigned int a1,a2,a3,a4,a5;//angle1,angle2为电机PWM变化打角
void delay(uint); //延时函数
void pwmctr( );//电机打角函数
void anglectr( );//舵机打角函数
void angles();
/****中断初始化 */
void Time0_Init()
{
TMOD=0X01;
IE=0X82;
TH0=(65536-130)/256;
TL0=(65536-130)%256;
TR0=1;
}
void main()
{
f=0;//关闭蜂鸣器
a=0;
b=0;
c=0;
set=0;
angle=62; //中值
angle1=62; //电机控制
angle2=200;
Time0_Init();
aa=30;//左上
bb=30;//左下
ff=30;//左底 //
cc=30 ;//右上
dd=30;// 右下
ee=30 ;//右底 //
for(;;)
{
pwmctr( );
anglectr( );
angles( );
}
}
void angles( )
{
if(a5>0){
a5=0;
if(aa==aaa) aa=aaa;
else if(aa<aaa) aa++;
else if(aa>aaa) aa--;
if(bb==bbb) bb=bbb;
else if(bb<bbb) bb++;
else if(bb>bbb) bb--;
if(cc==ccc) cc=ccc;
else if(cc<ccc) cc++;
else if(cc>ccc) cc--;
if(dd==ddd) dd=ddd;
else if(dd<ddd) dd++;
else if(dd>ddd) dd--;
if(ee==eee) ee=eee;
else if(ee<eee) ee++;
else if(ee>eee) ee--;
if(ff==fff) ff=fff;
else if(ff<fff) ff++;
else if(ff>fff) ff--;
}
}
void anglectr( )
{
if(a1>2) a2++,a5++,a1=0;
if(a2>240) a2=30;
if(a2<40){
aaa=30;//左上
bbb=30;//左下
fff=30;//左底 //
ccc=30 ;//右上
ddd=30;// 右下
eee=30 ;//右底 //
}
//====================
if(a2>40&&a2<80){
if(a2>70)aaa=37;//左上
if(a2<50){
fff=21;//左底 //
bbb=32;//左下
eee=40 ;//右底 //
}
if(a2>55){
bbb=32;//左下
ccc=30 ;//右上
ddd=35;// 右下
eee=25 ;//右底 //
}
}
//====================
if(a2>80&&a2<120){
if(a2>110)aaa=37;//左上
if(a2<90){
ccc=37 ;//右上
//eee=40;//右底 //
}
if(a2>95){
fff=29;//左底 //
bbb=31;//左下
//ccc=30 ;//右上
ddd=28;// 右下
eee=30 ;//右底 //
}
}
//====================
if(a2>120&&a2<160){
if(a2>150){aaa=25;//左上
ccc=22 ;//右上
}
if(a2<130){
fff=18;//左底 //
bbb=32;//左下
eee=36;//右底 //
}
if(a2>135){
bbb=24;//左下
fff=31;//左底 //
ddd=29;// 右下
//eee=30 ;//右底 //
}
}
//=---------------------===================
if(a2>160&&a2<230){
if(a2<170){
eee=23 ;//右底 //
ddd=25;// 右下
}
if(a2>170&&a2<185){
bbb=31;//左下
fff=22;//左底 //
}
if(a2>185&&a2<200){
ddd=38;// 右下
eee=23 ;//右底 //
}
if(a2>200){aaa=35;//左上
ccc=35 ;//右上
}
if(a2>220){
ddd=31;// 右下
eee=35 ;//右底 //
bbb=38;//左下
fff=30;//左底 //
}
/*
if(a2>230){
bbb=28;//左下
ddd=28;// 右下
eee=30 ;//右底 //
} */
}
//=---------------------===================
if(a2>230){
aaa=30;//左上
bbb=30;//左下
fff=30;//左底 //
ccc=30 ;//右上
ddd=30;// 右下
eee=30 ;//右底 //
}
/*
*/
}
void pwmctr( ) //电机控制
{
if(set<aa)
pwm1=1;
else
pwm1=0;
//------------------------------
if(set<bb)
pwm2=1;
else
pwm2=0;
//------------------------------
if(set<cc)
pwm3=1;
else
pwm3=0;
//------------------------------
if(set<dd)
pwm4=1;
else
pwm4=0;
//------------------------------
if(set<ee)
pwm5=1;
else
pwm5=0;
//------------------------------
if(set<ff)
pwm6=1;
else
pwm6=0;
//------------------------------
}
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=12;j>0;j--);
}
void T0_time()interrupt 1 //中断
{
TH0=(65536-130)/256; //频率为100HZ,周期20MS
TL0=(65536-130)%256;
if(set==100) a1++;
set++;
if(set>400) set=0; //电机2PWM
#define uint unsigned int
sbit ctr3=P0^6; //分时发射1 左边
sbit ctr2=P0^4; //分时发射2 中间
sbit ctr1=P0^5; //分时发射3 右边
sbit out=P1^6; //激光接收管 信号端
sbit hi=P2^6;
sbit f=P0^7; //蜂鸣器
sbit pwm1=P2^0; //舵机1
sbit pwm2=P2^4; //舵机2
sbit pwm3=P3^5; //舵机3
sbit pwm4=P3^7; //舵机4
sbit pwm5=P1^6; //舵机5
sbit pwm6=P1^7; //舵机6
char d,e,d1,p;
unsigned int a,b,c;//a是右边的,c是左边的,b是中间的
unsigned int set,m,angle; //set为舵机,电机转角标志位,angle为舵机打角
unsigned int angle1,angle2;//angle1,angle2为电机PWM变化打角
unsigned int aa,bb,cc,dd,ee,ff,aaa,bbb,ccc,ddd,eee,fff;//angle1,angle2为电机PWM变化打角
unsigned int a1,a2,a3,a4,a5;//angle1,angle2为电机PWM变化打角
void delay(uint); //延时函数
void pwmctr( );//电机打角函数
void anglectr( );//舵机打角函数
void angles();
/****中断初始化 */
void Time0_Init()
{
TMOD=0X01;
IE=0X82;
TH0=(65536-130)/256;
TL0=(65536-130)%256;
TR0=1;
}
void main()
{
f=0;//关闭蜂鸣器
a=0;
b=0;
c=0;
set=0;
angle=62; //中值
angle1=62; //电机控制
angle2=200;
Time0_Init();
aa=30;//左上
bb=30;//左下
ff=30;//左底 //
cc=30 ;//右上
dd=30;// 右下
ee=30 ;//右底 //
for(;;)
{
pwmctr( );
anglectr( );
angles( );
}
}
void angles( )
{
if(a5>0){
a5=0;
if(aa==aaa) aa=aaa;
else if(aa<aaa) aa++;
else if(aa>aaa) aa--;
if(bb==bbb) bb=bbb;
else if(bb<bbb) bb++;
else if(bb>bbb) bb--;
if(cc==ccc) cc=ccc;
else if(cc<ccc) cc++;
else if(cc>ccc) cc--;
if(dd==ddd) dd=ddd;
else if(dd<ddd) dd++;
else if(dd>ddd) dd--;
if(ee==eee) ee=eee;
else if(ee<eee) ee++;
else if(ee>eee) ee--;
if(ff==fff) ff=fff;
else if(ff<fff) ff++;
else if(ff>fff) ff--;
}
}
void anglectr( )
{
if(a1>2) a2++,a5++,a1=0;
if(a2>240) a2=30;
if(a2<40){
aaa=30;//左上
bbb=30;//左下
fff=30;//左底 //
ccc=30 ;//右上
ddd=30;// 右下
eee=30 ;//右底 //
}
//====================
if(a2>40&&a2<80){
if(a2>70)aaa=37;//左上
if(a2<50){
fff=21;//左底 //
bbb=32;//左下
eee=40 ;//右底 //
}
if(a2>55){
bbb=32;//左下
ccc=30 ;//右上
ddd=35;// 右下
eee=25 ;//右底 //
}
}
//====================
if(a2>80&&a2<120){
if(a2>110)aaa=37;//左上
if(a2<90){
ccc=37 ;//右上
//eee=40;//右底 //
}
if(a2>95){
fff=29;//左底 //
bbb=31;//左下
//ccc=30 ;//右上
ddd=28;// 右下
eee=30 ;//右底 //
}
}
//====================
if(a2>120&&a2<160){
if(a2>150){aaa=25;//左上
ccc=22 ;//右上
}
if(a2<130){
fff=18;//左底 //
bbb=32;//左下
eee=36;//右底 //
}
if(a2>135){
bbb=24;//左下
fff=31;//左底 //
ddd=29;// 右下
//eee=30 ;//右底 //
}
}
//=---------------------===================
if(a2>160&&a2<230){
if(a2<170){
eee=23 ;//右底 //
ddd=25;// 右下
}
if(a2>170&&a2<185){
bbb=31;//左下
fff=22;//左底 //
}
if(a2>185&&a2<200){
ddd=38;// 右下
eee=23 ;//右底 //
}
if(a2>200){aaa=35;//左上
ccc=35 ;//右上
}
if(a2>220){
ddd=31;// 右下
eee=35 ;//右底 //
bbb=38;//左下
fff=30;//左底 //
}
/*
if(a2>230){
bbb=28;//左下
ddd=28;// 右下
eee=30 ;//右底 //
} */
}
//=---------------------===================
if(a2>230){
aaa=30;//左上
bbb=30;//左下
fff=30;//左底 //
ccc=30 ;//右上
ddd=30;// 右下
eee=30 ;//右底 //
}
/*
*/
}
void pwmctr( ) //电机控制
{
if(set<aa)
pwm1=1;
else
pwm1=0;
//------------------------------
if(set<bb)
pwm2=1;
else
pwm2=0;
//------------------------------
if(set<cc)
pwm3=1;
else
pwm3=0;
//------------------------------
if(set<dd)
pwm4=1;
else
pwm4=0;
//------------------------------
if(set<ee)
pwm5=1;
else
pwm5=0;
//------------------------------
if(set<ff)
pwm6=1;
else
pwm6=0;
//------------------------------
}
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=12;j>0;j--);
}
void T0_time()interrupt 1 //中断
{
TH0=(65536-130)/256; //频率为100HZ,周期20MS
TL0=(65536-130)%256;
if(set==100) a1++;
set++;
if(set>400) set=0; //电机2PWM
没有看明白是什么回事
小编出来解说一下吧
谢谢小编的无私分享啊吖啊啊