

超聲波傳感器是將超聲波信號轉換成其他能量信號(通常是電信號)的傳感器,超聲波是振動頻率高于20kHz的機械波,它具有頻率高、波長短、繞射現象小,特別是方向性好、能夠成為射線而定向傳播等特點,超聲波對液體、固體的穿透本領很大,尤其是在陽光不透明的固體中,超聲波碰到雜質或分界面會產生顯著反射形成反射回波,碰到活動物體能產生多普勒效應,超聲波傳感器廣泛應用在工業、國防、生物醫學等方面,
人們能聽到聲音是由于物體振動產生的,它的頻率在20HZ-20KHZ范圍內,超過20KHZ稱為超聲波,低于20HZ的稱為次聲波,常用的超聲波頻率為幾十KHz----幾十MHz,
特性:
(1) 超聲波具有在氣體、液體、固體等介質中進行效傳播的能力,
(2) 超聲波具有很強的傳遞能量的能力,
(3) 超聲波具有反射特性,還會產生干涉、疊加和共振現象,
(4) 超聲波在液體介質中傳播時,可在界面上產生慷訓現象和強烈的沖擊,
應用:
(1) 超聲波在醫學上的應用主要是診斷疾病,它已經成為了臨床醫學中不可缺少的診斷方法,超聲波診斷的優點是:對受檢者無痛苦、無損害、方法簡便、顯像清晰、診斷的準確率高等,
(2) 在工業方面,超聲波的典型應用是對金屬的無損探傷和超聲波測厚兩種,過去,許多技術因為無法探測到物體組織內部而受到阻礙,超聲波傳感技術的出現改變了這種狀況,
可能我能聽過最多關于超聲波的應用不是上面兩條,而是利用超聲進行測距,我們本次的設計內容也是利用超聲波傳感器進行測距并利用數碼管顯示出來,在此之前我們先來看看超聲波在測距方面的其他應用場景吧~
1、超聲波傳感器可以對集裝箱狀態進行探測,將超聲波傳感器安裝在塑料熔體罐或塑料粒料室頂部,向集裝箱內部發出聲波時,就可以據此分析集裝箱的狀態,如滿、慷訓半滿等,
2、超聲波傳感器可用于檢測透明物體、液體、任何表粗糙、光滑、光的密致材料和不規則物體,但不適用于室外、酷熱環境或壓力罐以及泡沫物體,
3、超聲波傳感器可以應用于食品加工廠,實作塑料包裝檢測的倍訓控制系統,配合新的技術可在潮濕環如洗瓶機、噪音環境、溫度極劇烈變化環境等進行探測,
4、超聲波傳感器可用于探測液位、探測透明物體和材料,控制張力以及測量距離,主要為包裝、制瓶、物料搬檢驗煤的設備運、塑料加工以及汽車行業等,超聲波傳感器可用于流程監控以提高產品質量、檢測缺陷、確定有無以及其它方面,
設計內容:
1.第一位數碼管數碼管顯示提示符"C",第二位到第五位數碼管熄滅,后三位數碼管顯示距離,單位CM;
2.超出測量距離范圍數碼管顯示應為999,后三位未使用到的數碼管應熄滅,

#include <stc15f2k60s2.h>
#include <intrins.h>
#define uchar unsigned char //定義無符號字符型別uchar
#define uint unsigned int //定義無符號整型型別uint
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
sbit TX = P1^0;
sbit RX = P1^1;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0x8e,0xc6};//數字0~9,“-”,“關”,“F”,“C”
uchar yi,er,san,si,wu,liu,qi,ba; //定義字符型變數yi,er,san,si,wu,liu,qi,ba,當作數碼管顯示控制變數
uint time,Distance,trie;
bit flag=0;
void delayms(int ms); //延時函式
void allinit(); //初始化函式
void display1(uchar yi,uchar er); //第一、二段數碼管函式
void display2(uchar san,uchar si); //第三、四段數碼管函式
void display3(uchar wu,uchar liu); //第五、六段數碼管函式
void display4(uchar qi,uchar ba); //第七、八段數碼管函式
void Timer0Init(void); //2毫秒@12.000MHz
void Timer1Init(void); //2毫秒@12.000MHz
void send_fb();
void Ultrasonic();
void main()//主函式
{
allinit(); //初始化函式
Timer0Init();
Timer1Init();
yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;//關閉所有數碼管
while(1)
{
yi=13;er=11;san=11;si=11;wu=11;
if(Distance>=100){liu=Distance/100;qi=Distance%100/10;ba=Distance%10;}
else if(Distance>=10){liu=11;qi=Distance/10;ba=Distance%10;}
else if(Distance<10){liu=11;qi=11;ba=Distance;}
Ultrasonic();
display1(yi,er); //第一、二段數碼管函式
display2(san,si); //第三、四段數碼管函式
display3(wu,liu); //第五、六段數碼管函式
display4(qi,ba); //第七、八段數碼管函式
}
}
void Ultrasonic()
{
if(flag == 1)
{
flag = 0;
send_fb();
TR1 = 1;
while((RX == 1)&&(TF1 == 0));
TR1 = 0;
if(TF1 == 1)
{
TF1 = 0;
Distance = 999;
}
else
{
time = TH1 << 8;
time |= TL1;
Distance = time*0.017;
Distance = Distance/12;
}
TH1 = 0;
TL1 = 0;
}
}
void send_fb()
{
unsigned int i = 8;
do
{
TX = 1;
somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
TX = 0;
somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
}while(i--);
}
void Timer0Init(void) //2毫秒@12.000MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設定定時器模式
TL0 = 0x40; //設定定時初值
TH0 = 0xA2; //設定定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
EA = 1;ET0 = 1;
}
void Timer1Init(void) //2毫秒@12.000MHz
{
AUXR |= 0x40; //定時器時鐘1T模式
TMOD &= 0x0F; //設定定時器模式
}
void time0() interrupt 1
{
TL0 = 0x40; //設定定時初值
TH0 = 0xA2; //設定定時初值
if(++trie == 100)
{
trie = 0;
flag = 1;
}
}
void delayms(int ms)//延時函式
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()//初始化函式
{
P2=0XA0;P0=0X00; //關閉蜂鳴器繼電器
P2=0X80;P0=0XFF; //關閉所有LED燈
P2=0XC0;P0=0XFF; //選中所有數碼管段選
P2=0XFF;P0=0XFF; //關閉所有數碼管
}
void display1(uchar yi,uchar er)//第一、二段數碼管函式
{
P2=0XC0;P0=0X01; //選中第一個數碼管段選
P2=0XFF;P0=tab[yi]; //讓第一個數碼管顯示yi指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X02; //選中第二個數碼管段選
P2=0XFF;P0=tab[er]; //讓第一個數碼管顯示er指向的值
delayms(1); //延時1ms
}
void display2(uchar san,uchar si)//第三、四段數碼管函式
{
P2=0XC0;P0=0X04; //選中第s三個數碼管段選
P2=0XFF;P0=tab[san]; //讓第一個數碼管顯示san指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X08; //選中第四個數碼管段選
P2=0XFF;P0=tab[si]; //讓第一個數碼管顯示si指向的值
delayms(1); //延時1ms
}
void display3(uchar wu,uchar liu)//第五、六段數碼管函式
{
P2=0XC0;P0=0X10; //選中第五個數碼管段選
P2=0XFF;P0=tab[wu]; //讓第一個數碼管顯示wu指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X20; //選中第六個數碼管段選
P2=0XFF;P0=tab[liu]; //讓第一個數碼管顯示liu指向的值
delayms(1); //延時1ms
}
void display4(uchar qi,uchar ba)//第七、八段數碼管函式
{
P2=0XC0;P0=0X40; //選中第七個數碼管段選
P2=0XFF;P0=tab[qi]; //讓第一個數碼管顯示qi指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X80; //選中第八個數碼管段選
P2=0XFF;P0=tab[ba]; //讓第一個數碼管顯示ba指向的值
delayms(1); //延時1ms
}
![]()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278938.html
標籤:其他
上一篇:基于51單片機實作在LCD1602液晶的第一行顯示i like studying,第二局顯示i love you,并依次向右移入
