超声波模块c语言编程,超声波模块
1.超聲波模塊型號
超聲波模塊是一種常用的測距工具,一般用在避障小車,水位監控系統中,本教程使用的模塊型號為HC-SR04,外觀形狀大體如下
模塊除了兩個電源引腳外,還有TRIG,ECHO引腳,這兩個引腳分別接我們開發板的P2.0和P2.1。
工作原理就是起初先給這兩個引腳都拉低,然后讓TRIG引腳拉高10微秒以上再拉低產生一個脈沖起始信號(程序中我們是拉高20微秒)。起始信號一開啟,ECHO引腳就會被拉高的同時,超聲波開始發射,ECHO引腳檢測到反射回來的信號時就會被拉低,因為聲速為340m/s。那么測出的距離就是
(ECHO引腳高電平持續的時間*340m/s)/2。
中學學過用聲波測海底深度,時間*聲速=來回的距離,所以需要除以2才是真正的深度,超聲波模塊也一樣。
2.軟件分析
計算ECHO引腳高電平的持續時間就用定時器的計數功能完成,如果定時器計數溢出,證明測的距離太遠,超出模塊的測距范圍(最多4米),我們就在數碼管上顯示999表示距離太遠。在測量范圍內我們的數碼管就顯示測出的厘米數。
比如說定時器的計數為9216,那么高電平的持續時間就是9216*(12/11059200)=0.01s
測出的距離就是0.01*340/2=1.7m
數碼管就顯示170。
不過為了簡化單片機的計算過程,我們可以這樣算
“( (X*12)/11059200 )*340*100/2”就是厘米數,化簡約為“X/54”,X就是定時器的計數值。
本講代碼需要用到“#include”的“_nop_();”,這個表示延時1微秒左右,請參考《手把手教你學51單片機》文檔14.2節后半段文字。
3.代碼#include?
#include??//詳見第六章第8講
#include?????//詳見第八章第11講
#include?
sbit?TRIG?=?P2^0;
sbit?ECHO?=?P2^1;
u8???FLAG?=?0;
void?delay_20us()
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
void?main()
{
u16?time_data,CM_data;
TRIG?=?0;
ECHO?=?0;
LED_Init();????????//初始化LED硬件模塊
EA?=?1;????????????//閉合總中斷開關
TIM1_Init(1000,0);?//定時1ms,用來刷新數碼管顯示,定時精度要求不高可不微調
TMOD?&=?0xF0;
TMOD?|=?0x01;
ET0??=?1;
while(1)
{
TH0??=?0;
TL0??=?0;
FLAG?=?0;??????//上次如果是超出測量范圍,FLAG被置1,這次再測就要清0
//啟動發射聲波
TRIG?=?1;
delay_20us();
TRIG?=?0;
while(!ECHO);??????????????//聲波開始發射,等待ECHO引腳拉高退出這個循環
TR0?=?1;???????????????????//ECHO引腳一拉高,就打開定時器進行計數
while(ECHO==1?&&?FLAG==0);?//收到聲波返回來的信號ECHO引腳就拉低,退出這個循環;如果定時器溢出,就會進入中斷函數執行“FLAG=1;”
//也就是測量的距離太遠,一直沒有收到反射回來的信號,不滿足“FLAG==0”的條件只能結束這個循環語句
TR0?=?0;???????????????????//關閉定時器結束計數
time_data?=TH0;
time_data=(time_data<<8)|TL0;????????????????//把兩個八位的寄存器里的值組成一個16位變量的值,也就是定時器計數值
CM_data?=?time_data/54;??????????????????????//得到厘米的表達式
if(FLAG==1){ShowNumber(999);?delay_ms(100);}?//超出測量范圍顯示999,延時的目的:比如測得5cm到6cm之間,數碼管會頻繁在5跟6之間顯示,加入延時就會讓它們顯示的沒有那么頻繁
else?{ShowNumber(CM_data);?delay_ms(100);}
}
}
void?TIM0_IRQHandler()??interrupt?1
{
FLAG=1;
}
void?TIM1_IRQHandler()??interrupt?3
{
TH1?=?T1RH;??//重新加載重載值
TL1?=?T1RL;
SEG_Scan();
}
總結
以上是生活随笔為你收集整理的超声波模块c语言编程,超声波模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flutter 微信登录 包名不对,请检
- 下一篇: 开关、电机、断路器、电热偶、电表接线图大