51微控制器驅動HC-SR04超聲波測距模組(LED1602顯示結果)
阿新 • • 發佈:2019-01-08
HC-SR04超聲波測距模組的使用時非常廣泛的,而且驅動它的微控制器也有很多。在這裡我主要說一下51微控制器的程式碼。
51微控制器雖然簡單,但是實際操作起來也會碰到很多問題:
1.ECHO返回的電平用什麼方式去判斷
2.20us的演示函式怎麼編寫
3.距離怎麼用自己的方法換算
在下面的程式中,我用了以下方法解決上述問題:
1.ECHO的返回電平用外部中斷的方式判斷
2.在12MHz的晶振下,51的機器週期是1us,所以執行一條_nop()指令的時間就是1us。而跳轉需要2us的時間,包括跳入函式和跳出函式,所以具體演示函式就可以根據這個要需要編寫。
3.採集完ECHO電平後,定時器計數器裡存放的是計數值,這個值得倒數是時間,再乘以340/2即可。
另外,LCD1602的驅動程式固定,可以自己去找。
sbit Trig = P3^1; sbit Echo = P3^2; sbit LED1 = P3^4; sbit BEEP = P3^5; uchar ge,shi,bai,outcomeH,outcomeL; bit succeed_flag; unsigned int c=0; void delay_20us(); int Gotdis() { uint distance_data=0; Trig=0; TMOD=0x11; IT0=0; //µÍµçƽ´¥·¢ EX0=0; ET1 = 0; TF1 = 0; EA=0; Trig=1; delay_20us(); Trig=0; while(Echo==0); succeed_flag=0; EX0=1; TH1=0; TL1=0; ET1 = 1; //TF1 = 1; TF1=0; TR1=1; EA=1; while(TH1 < 30); TR1=0; EX0=0; if(succeed_flag==1) { distance_data=outcomeH*256+outcomeL; distance_data= (distance_data*1.87)/100; //cm bai=distance_data/100; shi=distance_data/10%10; ge=distance_data%10; } c++; if(c==5) { c=0; LcdDisplay(); } return ge+shi*10+bai*100; } void delay_20us() { uchar bt; for(bt=0;bt<100;bt++); } void main() { int sss; LcdInit(); BEEP = 0; while(1) { sss = Gotdis(); if(sss<20) { LED1 = 0; BEEP = 1; } else { LED1 = 1; BEEP = 0; } } } INTO_() interrupt 0 //ÍⲿÖжÏ0 { outcomeH =TH1; outcomeL =TL1; succeed_flag=1; EX0=0; } INT1_() interrupt 1 //¶¨Ê±Æ÷0ÖÐ¶Ï { TR1 = 0; ET1 = 0; TH1 = 0; TL1= 0; TR1 = 0; TF1 = 0; ET1 = 0; }