找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12806|回复: 10
收起左侧

超声波避障源程序

  [复制链接]
ID:317966 发表于 2018-4-27 18:11 | 显示全部楼层 |阅读模式


#include <reg52.h>//51头文件
#include <intrins.h>   //包含nop等系统函数

sbit RX = P2^0;//ECHO超声波模块回响端
sbit TX = P2^1;//TRIG超声波模块触发端

unsigned char pwm_left_val = 150;//左电机占空比值 取值范围0-170,0最快
unsigned char pwm_right_val = 150;//右电机占空比值取值范围0-170 ,0最快
unsigned char pwm_t;//周期
unsigned int  time = 0;//传输时间
unsigned long S = 0;//距离
bit      flag = 0;//超出测量范围标志位


void delay(unsigned int z)//毫秒级延时
{
        unsigned int x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}
void Delay10us(unsigned char i)            //10us延时函数 启动超声波模块时使用
{
   unsigned char j;
        do{
                j = 10;
                do{
                        _nop_();
                }while(--j);
        }while(--i);
}
/*小车前进*/
void forward()
{
        left_motor_go; //左电机前进
        right_motor_go; //右电机前进
}

/*小车后退*/
void backward()
{
        left_motor_back; //左电机后退
        right_motor_back; //右电机后退       
}

/*定时器1中断输出PWM信号*/
void timer1() interrupt 3
{
        pwm_t++;//周期计时加
        if(pwm_t == 255)
                pwm_t = EN1 = EN2 = 0;
        if(pwm_left_val == pwm_t)//左电机占空比       
                EN1 = 1;               
        if(pwm_right_val == pwm_t)//右电机占空比
                EN2 = 1;                         
}

/*判断S2是否被按下*/
void keyscan()
{
        for(;;)        //死循环
        {
                if(key_s2 == 0)// 实时检测S2按键是否被按下
                {
                        delay(5); //软件消抖
                        if(key_s2 == 0)//再检测S2是否被按下
                        {
                                while(!key_s2);//松手检测
                                beep = 0;        //使能有源蜂鸣器
                                delay(200);//200毫秒延时
                                beep = 1;        //关闭有源蜂鸣器
                                break;                //退出FOR死循环
                        }
                }
        }       
}

/*定时器0中断*/
void timer0() interrupt 1        //T0中断用来计数器溢出,超过测距范围
{
        flag=1;                                                         //中断溢出标志                         
}
void  StartModule()                          //启动超声波模块
{
          TX=1;                                             //启动一次模块
      Delay10us(2);
          TX=0;
}

/*计算超声波所测距离并显示*/
void Conut()
{
        time=TH0*256+TL0;
        TH0=0;
        TL0=0;
       
        S=(float)(time*1.085)*0.17;     //算出来是MM
        if((S>=7000)||flag==1) //超出测量范围
        {         
                flag=0;

        }
}



/*超声波避障*/
void        Avoid()
{
        if(S > 150)//设置避障距离(单位毫米)
        {
                forward();
        }
        else
        {
                backward();       
        }
}
       
void main()
{
        keyscan();//等待按键按下启动
        delay(1000);//延时1秒
        TMOD |= 0x20;//定时器1工作模式2,8位自动重装。用于产生PWM
        TMOD |= 0x01;//定时器0工作模块1,16位定时模式。T0用测ECH0脉冲长度
        TH1 = 220; //
        TL1 = 220; //100HZ T1
        TH0        = 0;
    TL0        = 0;//T0,16位定时计数用于记录ECHO高电平时间         
    ET1        = 1;//允许T1中断
        ET0 = 1;//允许T0中断
        TR1 = 1;//启动定时器1
        EA  = 1;//启动总中断
        while(1)
        {               
                 StartModule();        //启动模块测距
                 while(!RX);                //当RX(ECHO信号回响)为零时等待
                 TR0=1;                            //开启计数
                 while(RX);                        //当RX为1计数并等待
                 TR0=0;                                //关闭计数
             Conut();                        //计算距离
                 Avoid();                        //避障
                 delay(65);       
        }
}

16、超声波实现魔术手实验.zip

46.42 KB, 下载次数: 89, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:321034 发表于 2018-5-21 16:50 | 显示全部楼层
LZ, 我借用你的占空比程序 用在我编写的程序上面,没有效果啊,速度还是那么快~  是那个地方的问题呢
回复

使用道具 举报

ID:595011 发表于 2019-8-5 21:47 | 显示全部楼层
按键是定义的吗 想问一下这个按键是哪个呀
回复

使用道具 举报

ID:324611 发表于 2019-8-15 13:43 | 显示全部楼层
学习下。
回复

使用道具 举报

ID:506687 发表于 2019-8-28 10:07 | 显示全部楼层
看的还是比较明白
回复

使用道具 举报

ID:353061 发表于 2019-9-5 16:03 | 显示全部楼层
很有用,感谢分享。
回复

使用道具 举报

ID:608128 发表于 2019-9-7 10:10 | 显示全部楼层
很完整,值得参考
回复

使用道具 举报

ID:616032 发表于 2019-9-25 09:31 | 显示全部楼层
楼主,请问有对应的电路图吗?
回复

使用道具 举报

ID:28260 发表于 2021-6-27 18:40 | 显示全部楼层

已拜读,非常完整,值得参考!
回复

使用道具 举报

ID:981733 发表于 2021-11-17 11:08 | 显示全部楼层
楼主必须要按键吗
回复

使用道具 举报

ID:969453 发表于 2022-2-28 17:19 | 显示全部楼层
小车其他接线没有了吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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