久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1345|回復: 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清零
}


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色在线免费观看视频网站 | 日本视频在线播放 | 午夜成人免费视频 | 亚洲黄色高清视频 | 欧美v在线| 欧美日韩大陆 | 中文字幕一区在线观看视频 | 国产成人精品一区二区三区视频 | 国产一区视频在线 | 中文字幕在线观看日韩 | 高清亚洲 | 国产精品一区二 | 人人九九精 | 免费一级片| 91免费福利在线 | 欧美国产日韩成人 | 爱爱无遮挡 | 日批的视频 | 久久久精品 | 国产成人精品网站 | 国产精品波多野结衣 | 中文字幕一区二区三区日韩精品 | 亚洲一区中文字幕在线观看 | 亚洲一区网站 | 国产精品久久久久久久久久久久 | 国产乱性| 欧美 日韩 亚洲91麻豆精品 | 久久精品中文 | av在线三级| 成人激情视频网 | 狠狠的干 | 成人影院一区二区三区 | 91大神xh98xh系列全部 | 成人免费视频 | 欧美日韩一区精品 | 国产精品爱久久久久久久 | 91免费在线视频 | 欧美 日韩精品 | 91成人免费观看 | 日韩亚洲视频 | 亚洲一区二区三区在线免费 |