AT89C2051超音波測距程式範例 |
http://www.52dianzi.com/document/44.htm |
超聲波測距原理:測出回波和發射脈衝之間的時間間隔,由公式:距離=速度*時間/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);/*更新顯示*/ } } |
20066375918286.gif (21.19 KB, 下載次數: 530)
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) | Powered by Discuz! X3.2 |