找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1358|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

超聲波測(cè)距

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:276344 發(fā)表于 2018-1-15 20:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <reg51.h>                         //引入一個(gè)reg51.h的頭文件
#include <intrins.h>             //引入一個(gè)intrins.h的頭文件
#define nop() _nop_()                          //#define 是宏定義,起作用就是用 nops(); 代替{_nop_();_nop_();_nop_();_nop_();}
unsigned char code a[4]={0x03,0x06,0x0c,0x09};   //正轉(zhuǎn),順時(shí)針轉(zhuǎn),四位顯示
unsigned char code b[4]={0x03,0x09,0x0c,0x06};   //反轉(zhuǎn),逆時(shí)針轉(zhuǎn)         四位顯示
#define motor P0                 //定義電機(jī)P0口,電機(jī)接口
sbit Trig=P3^1;                           // TRIG是控制端(輸入),TRIG給個(gè)高電平脈沖
sbit Echo=P3^2;                         //echo一般接外部中斷P32或P33,利用中斷確認(rèn)echo的低電平結(jié)束
void Delay20us(void);                  //延時(shí)20微秒
void Delay(unsigned int t);                //Delay是一個(gè)子函數(shù)
int time;                                                  //定義時(shí)間
int succeed_flag;                                //定義測(cè)量成功標(biāo)志
unsigned char timeL;                 //定義timeL,timeL=TL1,取出定時(shí)器的值
unsigned char timeH;                   //定義timeH,timeH=TH1,取出定時(shí)器的值
unsigned int  Totalangle[]={4096,0};                //4096個(gè)脈沖           totalangle是轉(zhuǎn)速輸出4096個(gè)脈沖
/*************************************/
Range_to_angle(unsigned int SS)                         //定義ss,ss為物體距離超聲波傳感器的距離                 range to是轉(zhuǎn)動(dòng)的角度
{
        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;                   //電機(jī)顯示
                               motor=a[j];                                //電機(jī)正轉(zhuǎn)  
                                   j++;                                   //j累加,一共四位
                                   if(j>=4)                                 //如果j大于等于4,j等于0
                                   j=0;
                                   Delay(2);              //延時(shí)
                       }

        if(Totalangle[1]>i1*64)                                   //
                for(i2=0;i2<(Totalangle[1]-i1*64);i2++)                                          //
               {
                       motor=0x00;                                        //電機(jī)顯示
                motor=b[j];                                        //電機(jī)反轉(zhuǎn)
                           j++;                                                         //j累加
                           if(j>=4)                                           //j小于等于4
                           j=0;                                                   //j等于0
                           Delay(2);   
               }
           Totalangle[1]=i1*64;           //totalangle1=i1乘以64
}
}
/*************************************/
void main(void)                                   //主函數(shù)
{
        unsigned int distance;                          //定義距離
        Trig=0;                                                                 //首先拉低脈沖輸入引腳
        TMOD=0x10;       //定時(shí)器1 16位定時(shí)器
        EA=1;                          //打開(kāi)總中斷0
        while(1)                           //循環(huán)
        {       
                EA=0;                                //關(guān)閉總中斷
                Trig=1;              //超聲波模塊產(chǎn)生超聲波
                Delay20us();                 //延時(shí)20us
                Trig=0;                                  //產(chǎn)生一個(gè)20us的脈沖
                while(Echo==0);                   //等待ECHO回波引腳變成高電平
                succeed_flag=0;                                 //清測(cè)量成功標(biāo)志       
                EA=1;                                                   //打開(kāi)總中斷0
                EX0=1;                                                  //打開(kāi)外部中斷0
                TH1=0;                                                   //定時(shí)器1清零
                TL1=0;                                                        //定時(shí)器1清零
                TF1=0;                                                         //計(jì)數(shù)溢出標(biāo)志
                TR1=1;                                                   //啟動(dòng)定時(shí)器1
                Delay(20);                                                //延時(shí)20us
                EX0=0;                                                                //關(guān)閉外部中斷0
                TR1=0;                                                        //關(guān)閉定時(shí)器1
                if(succeed_flag==1)                 //至成功測(cè)量標(biāo)志
                {               
                        time=timeH*256+timeL;            
                        distance=time*0.0172;  //厘米
                        //Totalangle[]
                }
                if(succeed_flag==0)
                {
                        distance=0;                  //沒(méi)有回波則清零
                }
                Range_to_angle(distance);
                Delay(10);                                        //延時(shí)
        }
}
/******************************/
void Delay20us()                                 //延時(shí)20us
{   unsigned char i;                          //定義i
          for(i=0;i<100;i++);                         //i小于100,i累加
}
/*****************************/
void Delay(unsigned int t)//ms
{        unsigned int j,k;                                          //延時(shí)函數(shù)
        for(j=0;j<t;j++)
                for(k=0;k<110;k++);
}
/******************************/
void exter(void) interrupt 0     //外部中斷
{
        EX0=0;                                           //關(guān)閉外部中斷
        timeH=TH1;                                         //取出定時(shí)器的值
        timeL=TL1;                                          //取出定時(shí)器的值
        succeed_flag=1;                                //至成功測(cè)量標(biāo)志
}
/************************************/
void timer1() interrupt 3  //定時(shí)器1中斷,用做超聲波測(cè)距計(jì)時(shí)   
{
TH1=0;                                           //定時(shí)器1清零
TL1=0;                                                //定時(shí)器1清零
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表