#include <reg51.h>
#include <absacc.h>
#define IN0 XBYTE[0xFEF8] /* 0通道的绝对地址*/
#define IN1 XBYTE[0xFEFA] /*2通道的绝对地址*/
void abc0809_1(uchar idata *x); /*找球传感器的值*/
void abc0809_2(uchar idata *x); /*灰度传感器的值*/
void line(void); /*直行函数*/
void left(void); /*左转函数*/
void right(void); /*右转函数*/
void xuanzhuang(void); /*碰撞函数*/
void houtui(void); /*后退函数*/
void pengzhuang(void) interrupt 0; /*中断函数*/
void attack(void); /*进攻函数*/
void pwm1(void); /*PWM脉冲产生1函数*/
void pwm2(void); /*PWM脉冲产生2函数*/
void delay(int a); /*延时函数*/
void find(void); /*找球函数*/
sbit p1_1=P1^0;
sbit p1_2=P1^1;
sbit p1_3=P1^2;
sbit p1_4=P1^3;
sbit p1_5=P1^4;
void main (void)
{ uchar idata ab[2]; /*存放找球传感器的数值*/
uchar idata ac[2]; /*存放灰度传感器的数值*/
uchar idata ad[2]; /*存放最原始灰度传感器的值*/
abc0809_2(ad); /*提取灰度传器最原始的值*/
abc0809_1(ab); /*取找球传感器的数值*/
}
void abc0809_1(uchar data *x) /*提取找球传感器值的函数*/
{ uchar i ;
uchar idata *ad_dr;
ad_dr=&IN0;
for(i=0;j<2;i++)
{ do{*ad_dr=i
x
=*ad_dr;
}while(P1_5==0);}}
void abc0809_2(uchar data *x) /*提取灰度传感器值的函数*/
{ uchar i ;
uchar idata *ad_dr;
ad_dr=&IN1;
for(i=0;j<2;i++)
{ do{*ad_dr=i
x=*ad_dr;
}while(P1_5==0);}}
void line(void) /*用于进攻*/
{ p1_1=1; /* 由电机旋转逻辑表得*/
p1_2=0;
p1_3=1;
p1_4=0;
pwm1(); /*长距离运动*/
}
void left(void) /*用于找球*/
{ p1_1=1; /* 由电机旋转逻辑表得*/
p1_2=0;
p1_3=0;
p1_4=0;
pwm2(); /*短距离运动*/
}
void right(void) /*用于找球*/
{ p1_1=0; /* 由电机旋转逻辑表得*/
p1_2=0;
p1_3=0;
p1_4=1;
pwm2(); /*短距离运动*/
}
void xuanzhuang(void) /*用于找球*/
{ p1_1=1; /* 由电机旋转逻辑表得*/
p1_2=0;
p1_3=0;
p1_4=1;
pwm2(); /*短距离运动*/
}
void houtui(void) /*用碰撞时用*/
{ p1_1=0; /* 由电机旋转逻辑表得*/
p1_2=1;
p1_3=0;
p1_4=1;
pwm2(); /*短距离运动*/
p1_1=1;
p1_2=0;
p1_3=0;
p1_4=1;
pwm2(); /*当后退后在旋转调头*/
}
void find(void) /*找球子程序*/
{ uchar a,b;
abc0809_1(ab); /*提取找球传感器的值*/
a=ad[0]-ad[1]; /*判断传感器的值*/
b=abs(a);
if(ab[0]==0||ab[1]==0)
{ xuanzhuang();} /*调用原地旋程序*/
elseif(b<2)
{ line();} /*直线长行走*/
elseif(ab[0]>ab[1])
{ life(); } /*左转*/
else
{ right(); }
}
void attack(void) /*进攻子程序*/
{ uchar a,d;
abc0809_2(ac); /*提取灰度传感器的值*/
a=ac[0]-ac[1];
d=abs(a);
if(!(ac[0]<ad[1]||ac[1]<ad[1])) /*判断进攻方向*/
{ xuanzhuang();}
elseif(abs(a)<2) /*比较左右灰度传感器的值*/
{ line(); } /*长距离运动*/
elseif(ac[0]>ac[1])
{ left();} /*左转*/
else
{ right();} /*右转*/
}
void pengzhuang(void)interrupt 0
{ houtui(); /*用碰撞时用*/}
void delay(int a) /*延时子程序*/
{ int i;
for(i=0;i<a;i++)
{;}}
void pwm1(void) /*输出占空比为80%的PWM调制脉冲*/
{ int i;
for(i=0;i<=20000;i++)
{ p1_4=1;
delay(20); /*延时160us*/
p1_4=0;
delay(4); /* 延时40us*/
} }
void pwm2(void) /*输出占空比为50%的PWM调制脉冲*/
{ int i;
for(i=0;i<=5000;i++)
{ p1_4=1;
delay(12); /*延时100us*/
p1_4=0;
delay(12); /* 延时100us*/
}
}
谢谢帮我修改下程序吧
此帖出自小平头技术问答
一周热门 更多>