標(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