打印

错误的程序,跪求大神指教

[复制链接]
1261|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
五月风里人|  楼主 | 2011-4-14 17:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit Z0 = P3^0;                                                      
sbit Z1 = P3^1;                                                         
sbit Y0 = P3^2;                                                        
sbit Y1 = P3^3;
sbit r2=P1^0;
sbit r1=P1^1;
sbit m=P1^2;
sbit l1=P1^3;
sbit l2=P1^4;
int a;
int b;
void delay10ms (uchar time)      //10msÑÓʱ
{ int i;
     int j;
  for(i=0;i<time;i++)
   for(j=0;j<0x390;j++);
}
unsigned char  PWM(int x)
{
if(++a == 100)
{ a = 0;}
      if(a<x)
  {return 1;}
else  
  {return 0;}
}
void right()
{
    Z0=0;
    Z1=1;
    Y0=0;
    Y1=0;
}
void bigright()
{
    Z0=0;
    Z1=1;
    Y0=1;
    Y1=0;
}
void left()
{
    Z0=0;
    Z1=0;
    Y0=0;
    Y1=PWM(98);
}
void bigleft()
{
    Z0=1;
    Z1=0;
    Y0=0;
    Y1=PWM(98);
}
void ahead()
{
    Z0=0;
    Z1=1;
    Y0=0;
    Y1=PWM(98);
}
void back()
{
    Z0=1;
    Z1=0;
    Y0=PWM(98);
    Y1=0;
}
void stop()
{
    Y0=0;
    Y1=0;
    Z0=0;
Z1=0;
}     
void xunji()
{   
   if(l2==0&&l1==0&&m==1&&r2==0&&r1==0)                                                               //Ç°½ø
                   { ahead(); }
   else if((l2==0&&l1==0&&r2==1&&m==1)||(l2==0&&l1==0&&r2==1&&m==0)||(r1==1&&l2==0&&l1==0)||(r1==1&&r2==1&&l2==0&&l1==0))            //ÓÒת
                   { right(); }
   else if((r2==0&&r1==0&&l2==1&&m==1)||(r2==0&&r1==0&&l2==1&&m==0)||(l1==1&&r2==0&&r1==0)||(l1==1&&l2==1&&r2==0&&r1==0))            //×óת
                   { left(); }
   else if ((l1==0&&l2==1&&m==0&&r2==0&&r1==0)||(l1==1&&l2==0&&m==0&&r2==0&&r1==0))
                     { left(); }
      // else if((l1==0&&l2==0&&m==0&&r2==1&&r1==0)||(l1==0&&l2==0&&m==0&&r2==0&&r1==1))
                     // {right(); }
   
   else if((m==1&&r1==1&&r2==1&&l1==0&&l2==0)||(m==1&&r1==1&&r2==1&&l1==1&&l2==0))
     {  
       bigright();     }
   else if((m==1&&l1==1&&l2==1&&r1==0&&r2==0)||(m==1&&r1==1&&r2==0&&l1==1&&l2==1))
      {
     bigleft();}
// else if(m==0&&r1==0&&r2==0&&l1==0&&l2==0)
    // { stop();}
  }
void main()
{ EA = 1;
  TMOD = 0X01;
  TH0 =( 65535 - 1000)/256;
  TL0 =( 65535 - 1000)%256;
  ET0 = 1;
  TR0 = 1;
  
  while (1)
    {  
   xunji();
}
}
void t_40ms() interrupt 1
{
TH0 =( 65535 - 1000)/256;
TL0 =( 65535 - 1000)%256;
a++;
}



这段程序是小车循迹的程序,但是烧进去之后小车直走的时候总是停住,可能是逻辑错误,跪求大神指教


相关帖子

沙发
joyme| | 2011-4-14 18:05 | 只看该作者
m,l1,l2,r1,r2是什么值,输入采样的吗?如是看这些pin脚波形是否状态有改变

你的程序里注释了stop的调用,还会出现停车?
1、电机是否只受Z0,Z1,Y0,Y1的控制(即这些pin都必须同时为0才停止),还是别的地方也可以控制停车?
2、如果不是1则是这些pin有干扰了

程序PWM函数里的if(++a == 100)直接改为if(a==100)

使用特权

评论回复
板凳
五月风里人|  楼主 | 2011-4-14 18:41 | 只看该作者
m,l1,l2,r1,r2是定义红外对管的,不过你的建议也是一种情况,谢了!

使用特权

评论回复
地板
joyme| | 2011-4-15 09:13 | 只看该作者
为了防止输入量m,l1,l2,r1,r2 的干扰,建议对这些信号做一下防干扰的滤波操作,如连续几次为同样的电平才认为是有效的控制电平,具体看你需要的响应速度。在主程序调用xunji()函数也不需要这么频繁,根据具体的响应速度,比如可以考虑10ms调用一次

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

17

帖子

1

粉丝