找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超声波测距

[复制链接]
跳转到指定楼层
楼主
ID:276344 发表于 2018-1-15 20:07 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>                         //引入一个reg51.h的头文件
#include <intrins.h>             //引入一个intrins.h的头文件
#define nop() _nop_()                          //#define 是宏定义,起作用就是用 nops(); 代替{_nop_();_nop_();_nop_();_nop_();}
unsigned char code a[4]={0x03,0x06,0x0c,0x09};   //正转,顺时针转,四位显示
unsigned char code b[4]={0x03,0x09,0x0c,0x06};   //反转,逆时针转         四位显示
#define motor P0                 //定义电机P0口,电机接口
sbit Trig=P3^1;                           // TRIG是控制端(输入),TRIG给个高电平脉冲
sbit Echo=P3^2;                         //echo一般接外部中断P32或P33,利用中断确认echo的低电平结束
void Delay20us(void);                  //延时20微秒
void Delay(unsigned int t);                //Delay是一个子函数
int time;                                                  //定义时间
int succeed_flag;                                //定义测量成功标志
unsigned char timeL;                 //定义timeL,timeL=TL1,取出定时器的值
unsigned char timeH;                   //定义timeH,timeH=TH1,取出定时器的值
unsigned int  Totalangle[]={4096,0};                //4096个脉冲           totalangle是转速输出4096个脉冲
/*************************************/
Range_to_angle(unsigned int SS)                         //定义ss,ss为物体距离超声波传感器的距离                 range to是转动的角度
{
        unsigned int i1,i2;                                           //定义i1,i2
        unsigned char j;                                                 //定义j
        if(SS<=5||SS==Totalangle[1]/32)          // 距离小于等于5               
                return(0);                                                   //输出0
                          

        if(SS<70)                        //如果距离大于70,i1=距离减5
        {
            i1=SS-5;                                        //i1为距离减5
       
                    for(i2=0;i2<(i1*64-Totalangle[1]);i2++)                //令i2等于0,如果i2小于,i2累加
                       {
                               motor=0x00;                   //电机显示
                               motor=a[j];                                //电机正转  
                                   j++;                                   //j累加,一共四位
                                   if(j>=4)                                 //如果j大于等于4,j等于0
                                   j=0;
                                   Delay(2);              //延时
                       }

        if(Totalangle[1]>i1*64)                                   //
                for(i2=0;i2<(Totalangle[1]-i1*64);i2++)                                          //
               {
                       motor=0x00;                                        //电机显示
                motor=b[j];                                        //电机反转
                           j++;                                                         //j累加
                           if(j>=4)                                           //j小于等于4
                           j=0;                                                   //j等于0
                           Delay(2);   
               }
           Totalangle[1]=i1*64;           //totalangle1=i1乘以64
}
}
/*************************************/
void main(void)                                   //主函数
{
        unsigned int distance;                          //定义距离
        Trig=0;                                                                 //首先拉低脉冲输入引脚
        TMOD=0x10;       //定时器1 16位定时器
        EA=1;                          //打开总中断0
        while(1)                           //循环
        {       
                EA=0;                                //关闭总中断
                Trig=1;              //超声波模块产生超声波
                Delay20us();                 //延时20us
                Trig=0;                                  //产生一个20us的脉冲
                while(Echo==0);                   //等待ECHO回波引脚变成高电平
                succeed_flag=0;                                 //清测量成功标志       
                EA=1;                                                   //打开总中断0
                EX0=1;                                                  //打开外部中断0
                TH1=0;                                                   //定时器1清零
                TL1=0;                                                        //定时器1清零
                TF1=0;                                                         //计数溢出标志
                TR1=1;                                                   //启动定时器1
                Delay(20);                                                //延时20us
                EX0=0;                                                                //关闭外部中断0
                TR1=0;                                                        //关闭定时器1
                if(succeed_flag==1)                 //至成功测量标志
                {               
                        time=timeH*256+timeL;            
                        distance=time*0.0172;  //厘米
                        //Totalangle[]
                }
                if(succeed_flag==0)
                {
                        distance=0;                  //没有回波则清零
                }
                Range_to_angle(distance);
                Delay(10);                                        //延时
        }
}
/******************************/
void Delay20us()                                 //延时20us
{   unsigned char i;                          //定义i
          for(i=0;i<100;i++);                         //i小于100,i累加
}
/*****************************/
void Delay(unsigned int t)//ms
{        unsigned int j,k;                                          //延时函数
        for(j=0;j<t;j++)
                for(k=0;k<110;k++);
}
/******************************/
void exter(void) interrupt 0     //外部中断
{
        EX0=0;                                           //关闭外部中断
        timeH=TH1;                                         //取出定时器的值
        timeL=TL1;                                          //取出定时器的值
        succeed_flag=1;                                //至成功测量标志
}
/************************************/
void timer1() interrupt 3  //定时器1中断,用做超声波测距计时   
{
TH1=0;                                           //定时器1清零
TL1=0;                                                //定时器1清零
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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