#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*/ } }
谢谢帮我修改下程序吧
|