超聲波測距原理:測出回波和發(fā)射脈沖之間的時間間隔,由公式:距離=速度*時間/2計算,輸出顯示。 AT89C2051通過P1.6輸出10個40kHz脈沖,由非門做電流放大,以推挽形式加到變壓器的初級,升壓后推動超聲波換能器。在發(fā)射的同時, P1.7輸出一個高電平啟動,給電容C4充電,。發(fā)射結束時高電平翻轉為低電平,C4開始對R2、R3組成的分壓器放電并輸出到比較器的負端。 超聲波接收換能器將回波送到放大器進行放大后,送入機內比較器的正輸入端。發(fā)射時P1.7輸出的電平用以抑制比較器的翻轉,稱為渡越時間,抑制發(fā)射器發(fā)射的超聲波直接輻射到接收器。 超聲波測距系統軟件設計采用模塊化設計,由主程序、發(fā)射子程序、查蟓接收子程序、定時子程序、顯示子程序等模塊組成。該系統的主程序處于鍵控循環(huán)工作方式,當按下測量鍵時,主程序開始調用發(fā)射子程序、查詢接收子程序、定時子程序,并把測量結果用顯示子程序在液晶屏上顯示出來。由于液晶要使用同一P3口,所以必須使用位操作,否則將導致LCD不能正常顯示。在系統還可以加入溫度傳感器來監(jiān)測環(huán)境溫度,可進行溫度被償。為了增強系統的可靠性,應在軟硬件上采用抗干擾措施。 # pragma DB OE CD OT(5,SPEED) ROM(LARGE)IV /*連接所需要的庫*/ #i nclude #i nclude #i nclude /*定義數據類型*/ 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; /*定義顯示緩沖區(qū)*/ uchar idata ON[16]={’,’L’,’E’,’N’,’G’,’T’,’H’,’=’,’8’,’.’,’8
’8’,’m’,’’,’’,’’}; /*主程序用延時子程序*/ woid main-delay(void) { register i; TRO=1; & nbsp; 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 ’,’m’,’’,’’,’’}; for(i=0;<16;i++) {ON[i]=a[i];} 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); /*把測量結果置換入顯示緩沖區(qū)*/ init-lcd();/*初始化液晶*/ display(ON);/*更新顯示*/ } } |