2390|0

8

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

新手请高手帮看下程序 [复制链接]

#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*/
      }
}

 

谢谢帮我修改下程序吧

此帖出自51单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表