找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1489|回复: 5
收起左侧

单片机小车超声波舵机模块不知道为什么只有舵机转,小车不走

[复制链接]
ID:702493 发表于 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();
     }
    }
   }
  }


回复

使用道具 举报

ID:702493 发表于 2020-3-11 09:55 | 显示全部楼层
我写了个小车移动的程序,里面没有关于超声波舵机的相关程序,只要插上超声波trig小车就不走,拔了走,求原因
回复

使用道具 举报

ID:367369 发表于 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)的死循环;程序就会死在这里
回复

使用道具 举报

ID:702493 发表于 2020-3-11 19:40 来自手机 | 显示全部楼层
game灬boy 发表于 2020-3-11 15:28
sbit echo=P2^0;    //触发控制信号输入

void ceju(void)

可我看很多资料都这么写啊!
1583926787701.jpg
回复

使用道具 举报

ID:367369 发表于 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脚的电平到底怎么变的
回复

使用道具 举报

ID:477107 发表于 2020-3-29 19:46 | 显示全部楼层
程序看上去没有明显错误,确定硬件也没有问题吗,接线也都是正确的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表