找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2098|回复: 1
打印 上一主题 下一主题
收起左侧

做超声波避障小车出点问题求高手解惑

[复制链接]
跳转到指定楼层
楼主
ID:171584 发表于 2017-5-30 19:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*   超声波模块的TRIG管脚接在单片机的P24口,ECHO管脚接在单片机的P25口 其他的电源管脚接在单片机
  开发板上电源口即可。      */

#include <reg51.h>
#include <intrins.h>
unsigned long S=0;
unsigned int  timer=0;
unsigned char posit=0;
bit      flag =0;
//--定义使用的IO--//

//--定义全局变量--//
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能     : 使用数码管显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void go1();
void hui1();
void down();
void DigDisplay();
void StartModule();
void comm();
/********************************************************/
void Conut(void);
/********************************************************/
void zd0() interrupt 1    //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;        //中断溢出标志
  }
/********************************************************/
void  zd3()  interrupt 3    //T1中断用来扫描数码管和计800MS启动模块
{
  
  TH1=0xf8;
  TL1=0x30;
  DigDisplay();
  timer++;
}
/*********************************************************/
void  main(void)
{  
    TMOD=0x11;     //设T0为方式1,GATE=1;
  TH0=0;
  TL0=0;         
  TH1=0xf8;     //2MS定时
  TL1=0x30;
  ET0=1;             //允许T0中断
  ET1=1;      //允许T1中断
  TR1=1;      //开启定时器
  EA=1;      //开启总中断
while(1)
  {
   if(timer>=100)
   {
    timer=0;
    StartModule();
    Conut();   //计算
    if(S<30)
    {
     down();
     comm();
    }
    else if(S>30)
     go1();
   }
  }
}



下面是csb.c文件
#include "csb.h"
#include <intrins.h>
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
#define aa 35//左轮速度调节值
#define bb 35//右轮速度调节值
sbit y=P2^1;//右转向灯
sbit z=P2^2;//左转向灯
sbit you1=P0^3;//右轮正转信号端
sbit you2=P0^2;//右轮倒转信号端
sbit zuo1=P0^1;//左轮正转信号端
sbit zuo2=P0^0;  //左轮倒转信号端
sbit RX=P2^5;
sbit TX=P2^4;
unsigned long S1=0;
unsigned long S2=0;
unsigned long S3=0;
unsigned int  time=0;
#define GPIO_DIG P0
sbit LSA=P2^4;
sbit LSB=P2^5;
sbit LSC=P2^6;
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char disbuff[4]    ={ 0,0,0,0,};
void delay(uint z)//一个带参数的延时程序
{
int i,j;//定义两个变量
for(i=10;i>0;i--)
for(j=z;j>0;j--);//将参数z赋值给j
}
void go1()//前进子程序
{
zuo1=1;
zuo2=0;//左边轮子正转
// delay(aa);//pwm有用值,越大左边方向的轮子越快
// zuo2=1;//关闭左边轮子
you1=1;
you2=0; //右边轮子正转
// delay(bb);//pwm有用值,越大右边的轮子越快
// you2=1;//关闭右边轮子
// delay(100);//pwm无用值,越大,小车跑的越慢
z=1;
y=1;//关闭转向灯
}
void hui1()//小车后退的子程序
{
zuo1=0;
zuo2=1;//左边轮子倒转
// delay(aa);//pwm有用值,越大左边方向的轮子越快
// zuo1=1;//关闭左边轮子
you1=0;
you2=1; //右边轮子倒转
// delay(bb);//pwm有用值,越大右边的轮子越快
// you1=1;//关闭右边轮子
// delay(100);//pwm无用值,越大,小车跑的越慢
z=1;
y=1;//关闭转向灯
}
void turnleft()//小车左转弯子程序
{

z=~z;//左转向灯打开
zuo1=1;
zuo2=1;//左边轮子停止转动
you1=1;
you2=0; //右边轮子正转
// delay(bb);//pwm有用值,越大右边的轮子越快
// you2=1;//右边轮子停止
// delay(50);//pwm无用值,越大,小车跑的越慢
//
// z=1;
// y=1;//关闭转向灯
}
void turnright()//小车右转弯子程序
{
y=~y;//右转向灯打开
zuo1=1;
zuo2=0;//左边轮子正转
// delay(aa);//pwm有用值,越大左边方向的轮子越快
// zuo2=1;//左边轮子停止
you1=1;
you2=1; //右边轮子停止
// delay(50);//pwm无用值,越大,小车跑的越慢
// z=1;
// y=1;//关闭转向灯

}
void down()//停止子程序
{
zuo1=1;
zuo2=1;
you1=1;
you2=1; //左右轮全部停止
z=1;
y=1;//关闭转向灯
}
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0;i<8;i++)
{
  switch(i)  //位选,选择点亮的数码管,
  {
   case(0):
    LSA=0;LSB=0;LSC=0; break;//显示第0位
   case(1):
    LSA=1;LSB=0;LSC=0; break;//显示第1位
   case(2):
    LSA=0;LSB=1;LSC=0; break;//显示第2位
   case(3):
    LSA=1;LSB=1;LSC=0; break;//显示第3位
   case(4):
    LSA=0;LSB=0;LSC=1; break;//显示第4位
   case(5):
    LSA=1;LSB=0;LSC=1; break;//显示第5位
   case(6):
    LSA=0;LSB=1;LSC=1; break;//显示第6位
   case(7):
    LSA=1;LSB=1;LSC=1; break;//显示第7位
  }
  GPIO_DIG=disbuff[i];//发送段码
  j=10;       //扫描间隔时间设定
  while(j--);
  GPIO_DIG=0x00;//消隐
}
}
void Conut(void)
{
  while(!RX);  //当RX为零时等待
  TR0=1;       //开启计数
  while(RX);   //当RX为1计数并等待
  TR0=0;    //关闭计数
  time=TH0*256+TL0;
  TH0=0;
  TL0=0;
  S= (long)(time*0.17);     //算出来是CM
  if((S>=4000)||flag==1) //超出测量范围显示“CHAO”
  {  
   flag=0;
   disbuff[0]=0x3f;    //“-”
   disbuff[1]=0x77;    //“-”
   disbuff[2]=0x76;    //“-”
   disbuff[3]=0x39;    //“-”
  }
  else
  {
   disbuff[3]=DIG_CODE[S%10000/1000];
   disbuff[2]=DIG_CODE[S%1000/100];
   disbuff[1]=DIG_CODE[S%100/10];
   disbuff[0]=DIG_CODE[S%10/1];
  }
}
void StartModule() //启动测距信号
{
TX=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
void comm()
{
turnleft();
timer=0;
while(timer==2000);//等待400ms
StartModule();
Conut();
S1=S;
turnright();
timer=0;
while(timer==4000);//等待800ms
StartModule();
Conut();
S2=S;
turnleft();
timer=0;
while(timer==2000);//等待400ms
StartModule();
Conut();
S3=S;
if((S1<30)&&(S2<30))//左右距离都小于30cm
{
  hui1();
  timer=0;
  while(timer==2000);
}
if(S1>S2)
{
  turnright();
  while(timer==2000);
  go1();
  timer=0;
  while(timer==2000);
}
else
{
  turnleft();
  while(timer==2000);
  go1();
  timer=0;
  while(timer==2000);
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:171584 发表于 2017-5-30 19:22 | 只看该作者
下载运行的结果是电机一直叫但不动,左右转向灯有短暂的反应,我感觉是因为程序没有程序执行或者时间太短,哪位大佬帮忙看看到底哪出了问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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