標(biāo)題: 超聲波測距 [打印本頁]

作者: 江南皮革廠廠長1    時間: 2018-1-15 20:07
標(biāo)題: 超聲波測距
#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};   //正轉(zhuǎn),順時針轉(zhuǎn),四位顯示
unsigned char code b[4]={0x03,0x09,0x0c,0x06};   //反轉(zhuǎn),逆時針轉(zhuǎn)         四位顯示
#define motor P0                 //定義電機(jī)P0口,電機(jī)接口
sbit Trig=P3^1;                           // TRIG是控制端(輸入),TRIG給個高電平脈沖
sbit Echo=P3^2;                         //echo一般接外部中斷P32或P33,利用中斷確認(rèn)echo的低電平結(jié)束
void Delay20us(void);                  //延時20微秒
void Delay(unsigned int t);                //Delay是一個子函數(shù)
int time;                                                  //定義時間
int succeed_flag;                                //定義測量成功標(biāo)志
unsigned char timeL;                 //定義timeL,timeL=TL1,取出定時器的值
unsigned char timeH;                   //定義timeH,timeH=TH1,取出定時器的值
unsigned int  Totalangle[]={4096,0};                //4096個脈沖           totalangle是轉(zhuǎn)速輸出4096個脈沖
/*************************************/
Range_to_angle(unsigned int SS)                         //定義ss,ss為物體距離超聲波傳感器的距離                 range to是轉(zhuǎn)動的角度
{
        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);              //延時
                       }

        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;       //定時器1 16位定時器
        EA=1;                          //打開總中斷0
        while(1)                           //循環(huán)
        {       
                EA=0;                                //關(guān)閉總中斷
                Trig=1;              //超聲波模塊產(chǎn)生超聲波
                Delay20us();                 //延時20us
                Trig=0;                                  //產(chǎn)生一個20us的脈沖
                while(Echo==0);                   //等待ECHO回波引腳變成高電平
                succeed_flag=0;                                 //清測量成功標(biāo)志       
                EA=1;                                                   //打開總中斷0
                EX0=1;                                                  //打開外部中斷0
                TH1=0;                                                   //定時器1清零
                TL1=0;                                                        //定時器1清零
                TF1=0;                                                         //計數(shù)溢出標(biāo)志
                TR1=1;                                                   //啟動定時器1
                Delay(20);                                                //延時20us
                EX0=0;                                                                //關(guān)閉外部中斷0
                TR1=0;                                                        //關(guān)閉定時器1
                if(succeed_flag==1)                 //至成功測量標(biāo)志
                {               
                        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;                                          //延時函數(shù)
        for(j=0;j<t;j++)
                for(k=0;k<110;k++);
}
/******************************/
void exter(void) interrupt 0     //外部中斷
{
        EX0=0;                                           //關(guān)閉外部中斷
        timeH=TH1;                                         //取出定時器的值
        timeL=TL1;                                          //取出定時器的值
        succeed_flag=1;                                //至成功測量標(biāo)志
}
/************************************/
void timer1() interrupt 3  //定時器1中斷,用做超聲波測距計時   
{
TH1=0;                                           //定時器1清零
TL1=0;                                                //定時器1清零
}







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1