找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机循迹功能可以实现,但超声波避障却怎么也弄不好

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:340666 发表于 2019-5-20 22:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在做循迹避障小车,实现的功能就是循迹和碰到障碍物停止,我用的HCSR04超声波避障模块,在编写程序时,循迹功能可以实现,但避障却怎么也弄不好,我感觉我的程序应该是有问题,但不知道哪里出问题了,还是我一开始就错了,求助
我的程序
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char        
#define uint  unsigned int
sbit IN1=P0^0;
sbit IN2=P0^1;
sbit IN3=P0^2;
sbit IN4=P0^3;
sbit ENA=P0^4;
sbit ENB=P0^5;
sbit hong1=P2^0;
sbit hong2=P2^1;
sbit hong3=P2^2;
sbit Trig=P2^3;
sbit Echo=P2^4;
uchar time;
void zhixing()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void zuozhuan()
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
void youzhuan()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
}
void tingzhi()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void xunji()
{
uchar flag;           //定义一个标志位,用于状态判断
        if(hong1==0 & hong2==0 & hong3==0)         //未检测到黑线
        {flag=0;}
         else if(hong1==0 & hong2==1 & hong3==0)        //中间检测到黑线
        {flag=1;}
         else if(hong1==1 & hong2==0 & hong3==0)        //左边检测到黑线
        {flag=2;}
         else if(hong1==1 & hong2==1 & hong3==0)        //左边和中间检测到黑线
        {flag=3;}
         else if(hong1==0 & hong2==0 & hong3==1)        //右边检测到黑线
        {flag=4;}
         else if(hong1==0 & hong2==1 & hong3==1)        //右边和中间检测到黑线
        {flag=5;}
         else if(hong1==1 & hong2==1 & hong3==1)        //全部检测到黑线
        {flag=6;}
        else flag=7;   //其他情况标志位置7
        switch (flag)
        {
                case 0: zhixing(); break;        //情况0,前进
                case 1: zhixing(); break;        //情况1,前进
                case 2: zuozhuan(); break;        //情况2,左转
                case 3: zuozhuan(); break;        //情况3,左转
                case 4: youzhuan(); break;        //情况4,右转
                case 5: youzhuan(); break;        //情况5,右转
                case 6: tingzhi(); break;        //情况6,停止
                case 7: tingzhi(); break;
                default:zhixing(); break;        
        }
}
void kaishi()
{
Trig=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//10us
Trig=0;
}
void bizhang()
{
while(!Echo) xunji();
while(Echo) tingzhi();
}

void main()
{
TMOD=0x01;//定时器0 工作方式1
TH0=0xff;//赋初值定时
TL0=0xf7;//0.1ms
EA=1; //开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1)
{
  kaishi();
  bizhang();
}
}
void time0() interrupt 1
{
TR0=0;         //关闭定时器
TH0=0xff; //赋初值定时
TL0=0xf7; //0.01ms
TR0=1;         //打开定时器
time++;
if(time>=100) {time=0;}  //10khz
if(time<=75)  {ENA=0;ENB=0;}  //设置占空比
else {ENA=1;ENB=1;}
}

小车的主要表现就是,可以实现循迹功能,尽管前方有障碍,但不能避障,我哪里错了,求大神指出,谢谢谢谢...
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:330198 发表于 2019-5-21 09:23 | 只看该作者
你超声波判断程序错误,好好看看例程
回复

使用道具 举报

板凳
ID:443843 发表于 2019-5-21 10:50 | 只看该作者
避障用红外光电传感器,很好用的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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