标题: 单片机小车超声波舵机模块不知道为什么只有舵机转,小车不走 [打印本页]

作者: 1145421628    时间: 2020-3-10 22:09
标题: 单片机小车超声波舵机模块不知道为什么只有舵机转,小车不走
大佬看看是不是代码有问题,已经卡这快一个星期了,
#include<reg52.h>
#include<intrins.h>
#define uint  unsigned int
#define uchar unsigned char
sbit trig=P1^0;
sbit echo=P2^0;    //触发控制信号输入
sbit pwm=P2^6;     //回响信号输出
sbit M1A=P0^0;
sbit M1B=P0^1;
sbit M2A=P0^2;  
sbit M2B=P0^3;
uchar count,jd;
uint  time=0,timer=0;   
bit flag =0;   
unsigned long s=0,zs=0,ys=0;
void delay(uint x)  
{
uint i,j;
     for(i=x;i>0;i--)   
for(j=110;j>0;j--);  
}
  void tingzhi()  //停止
  {
  M1A=0;
    M1B=0;
    M2A=0;
    M2B=0;
  }
  void qianjin()  //前进
  {
  M1A=0;
    M1B=1;
    M2A=0;
    M2B=1;
  }
  void houtui()   //后退
  {
  M1A=1;
    M1B=0;
    M2A=1;
    M2B=0;
  }
  void zuozhuan()  //左转
  {
  M1A=1;
    M1B=0;
    M2A=0;
    M2B=1;
  }  
    void youzhuan()  //右转
{
    M1A=0;
    M1B=1;
    M2A=1;
    M2B=0;
}  
void ceju(void)
{
  while(!echo);   //当echo为零时等待
    TR0=1;          //开启计数
    while(echo);    //当echo为1计数并等待
  TR0=0;
  time=TH0*256+TL0;
  TH0=0;
  TL0=0;
  s=(time*1.7)/100;  //单位cm
}
   void qingling()
   {
    time=0;
    TH1=65036/256;
  TL1=65036%256;
    count=0;
   }
  void zd0()interrupt 1  //T0中断用来计数器溢出,超过测距范围
  {
  flag=1;                //中断溢出标志
  }
  void zd1()interrupt 3
  {
  TH1=65036/256;
  TL1=65036%256;
   if(count<jd) pwm=1;
   else pwm=0;
   count++;
   count=count%40;
   timer++;
    if(timer>=800)
    {
    timer=0;
     trig=1;
  _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
     trig=0;
    }
  }
  void main(void)
  {
  jd=3;
   count=0;
   TMOD=0x11;
   TH0=0;
   TL0=0;
   TH1=65036/256;
  TL1=65036%256;
   IE=0x8a;
   while(1)
   {
   TR1=1;
    ceju();
    if(s<=10);
    {
    tingzhi();
     jd=1;
     count=0;
     delay(20);
     TR1=0;
     qingling();
     TR1=1;
     ceju();
     ys=s;
     jd=5;
     count=0;
     delay(20);
     TR1=0;
     qingling();
     TR1=1;
     ceju();
     zs=s;
     jd=3;
     count=0;
     delay(20);
     TR1=0;
     if((zs>=ys)&&(zs>10))
     {
     zuozhuan();
     }
     else if((ys>=zs)&&(ys>10))
     {
     youzhuan();
     }
     else
     {
     houtui();
     }
     if((s>10)||(flag==1))
     {
      qianjin();
     }
    }
   }
  }



作者: 1145421628    时间: 2020-3-11 09:55
我写了个小车移动的程序,里面没有关于超声波舵机的相关程序,只要插上超声波trig小车就不走,拔了走,求原因
作者: game灬boy    时间: 2020-3-11 15:28
sbit echo=P2^0;    //触发控制信号输入

void ceju(void)
{
  while(!echo);   //当echo为零时等待
    TR0=1;          //开启计数
    while(echo);    //当echo为1计数并等待
  TR0=0;
  time=TH0*256+TL0;
  TH0=0;
  TL0=0;
  s=(time*1.7)/100;  //单位cm
}
P2^0脚的模式是怎样的  后面没看到echo 的变化
这里两个while 如果echo 值没有一直01变化
就必然会产生一个while(1)的死循环;程序就会死在这里

作者: 1145421628    时间: 2020-3-11 19:40
game灬boy 发表于 2020-3-11 15:28
sbit echo=P2^0;    //触发控制信号输入

void ceju(void)

可我看很多资料都这么写啊!

1583926787701.jpg (1.98 MB, 下载次数: 45)

1583926787701.jpg

作者: game灬boy    时间: 2020-3-29 16:10
1145421628 发表于 2020-3-11 19:40
可我看很多资料都这么写啊!

小车不走肯定是程序死在某个地方了,安照你的代码问题应该出在ceju上面

示例代码可能有把ECHO初始化,然后超声波返回时对其进行改变,或者在中断中将其变化
看不到你得硬件很难分析;你的P20脚的电平必须在ceju();时01变化

sbit trig=P1^0;
sbit echo=P2^0;    //触发控制信号输入
sbit pwm=P2^6;     //回响信号输出

你得这些接的什么脚?可能是硬件接法问题
你得分析P20脚的电平到底怎么变的

作者: tyu1    时间: 2020-3-29 19:46
程序看上去没有明显错误,确定硬件也没有问题吗,接线也都是正确的?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1