|
超聲波測距原理:測出回波和發射脈衝之間的時間間隔,由公式:距離=速度*時間/2計算,輸出顯示。
AT89C2051通過P1.6輸出10個40kHz脈衝,由非門做電流放大,以推挽形式加到變壓器的初級,升壓後推動超聲波換能器。在發射的同時,P1.7輸出一個高電平啟動,給電容C4充電,。發射結束時高電平翻轉為低電平,C4開始對R2、R3組成的分壓器放電並輸出到比較器的負端。
超聲波接收換能器將回波送到放大器進行放大後,送入機內比較器的正輸入端。發射時P1.7輸出的電平用以抑制比較器的翻轉,稱為渡越時間,抑制發射器發射的超聲波直接輻射到接收器。
超聲波測距系統軟件設計採用模塊化設計,由主程序、發射子程序、查蟓接收子程序、定時子程序、顯示子程序等模塊組成。該系統的主程序處於鍵控循環工作方式,當按下測量鍵時,主程序開始調用發射子程序、查詢接收子程序、定時子程序,並把測量結果用顯示子程序在液晶屏上顯示出來。 由於液晶要使用同一P3口,所以必須使用位操作,否則將導致LCD不能正常顯示。在系統還可以加入溫度傳感器來監測環境溫度,可進行溫度被償。為了增強系統的可靠性,應在軟硬件上採用抗干擾措施。
# pragma DB OE CD OT(5,SPEED) ROM(LARGE)IV
/*連接所需要的庫*/
#include
#include
#include
/*定義數據類型*/
typedef unsingned char byte;
typedef unsigned int word
#define uchar unsigned char
#define unint unsigned int
#define ulong unsigned long
/*定義系統常數*/
#define TRUE 1
#define FALSE 0
#define C=340 /*聲速*/
/*定義功能位*/
sbit bflag=ACC7;
sbit VOLCK=P1^5;
sbit MING=P3^5;
sbit QUIET=P1^3;
sbit BACK=P1^2;
/*定義顯示緩衝區*/
uchar idata ON[16]={』,』L』,』E』,』N』,』G』,』T』,』H』,』=』,』8』,』.』,』8
』8』,』m』,』』,』』,』』};
/*主程序用延時子程序*/
woid main-delay(void)
{
register i;
TRO=1;
for(i=0;i<15;i++)
{
TH0=0;
TL0=0;
Do{}while(!TF0);
TF0=0;
}
TR0=0;
}
*/通用延時子程序*/
void delay(void)
{
unint i;
for(i=0;i<200;i++){;}
}
/*鍵盤延時子程序*/
void key-delay(void)
{
unint i;
for(i=0;i<200;i++){;}
}
/*初始化程序*/
void start_main()
{
tegister i;
uchar a[16]={』』,』L』,』E』,』N』,』G』,』T』,』H』,』=,』8』,』.』,』8』,』8[size=+0]
』,』m』,』』,』』,』』};
for(i=0;<16;i++)
{ON=a;}
nitlcd();/*初始化液晶*/
display(ON);/*更新顯示*/
}
/*主程序*/
void main()
{
register s,keycode;
long idata t;
start-main();/*初始化*/
main-delay();/*延時*/;
if(keycoed= =true)
{
keycode=key-scan-wait();
/*判斷是否有測量鍵按下*/
t=measure();*/測量*/
S=0.5*t*C;*/換算*/
Decode-bcd(s.0x09);
/*把測量結果置換入顯示緩衝區*/
init-lcd();/*初始化液晶*/
display(ON);/*更新顯示*/
}
}
』,』m』,』』,』』,』』};
for(i=0;<16;i++)
{ON=a;}
nitlcd();/*初始化液晶*/
display(ON);/*更新顯示*/
}
/*主程序*/
void main()
{
register s,keycode;
long idata t;
start-main();/*初始化*/
main-delay();/*延時*/;
if(keycoed= =true)
{
keycode=key-scan-wait();
/*判斷是否有測量鍵按下*/
t=measure();*/測量*/
S=0.5*t*C;*/換算*/
Decode-bcd(s.0x09);
/*把測量結果置換入顯示緩衝區*/
init-lcd();/*初始化液晶*/
display(ON);/*更新顯示*/
}
}
|
|
|