經過一天的調試,終于把STC15F2K60S2單片機測量超聲波HC-SR04的程序搞定,主要存在問題是:
1、單片機時鐘設置為22.1184MHz,而且采取1T模式運行時,觸發信號維持10us以上時間要采用延時函數 Delay_us(250)并一定達到10us以上。
2、等待回聲接收的引腳echo要開啟接收,即echo=1;
3、觸發信號發出后不能馬上開啟計數器計數,一定要等到有回聲信號時(echo被置為高)才開啟,為了防止回聲信號一直不出現,增加超時退出。
4、測量時間(echo維持高電平時間)也增加超時退出,否則程序出現死機。
5、禁止定時計數后要軟件清除一次中斷標志,因是檢測到echo回聲停止,此時不一定出現中斷(默認中斷清除)
6、為保證測量精度,TH1TL1中的計數值要減去初值并除以22,因計數22次為1us。
具體子函數如下:
/*------------------------------------------------
超聲波模塊觸發信號
------------------------------------------------*/
void trigger()
{
trig=0;
NOP(21); //延時
trig=1;
Delay_us(250); //至少10us高電平
trig=0;
}
/*------------------------------------------------
超聲波模塊距離測試函數
------------------------------------------------*/
void measuring() //晶振22.1184MHz
{
uint Return_time; //超聲波返回時間
uint Wait_time;
TL1 = 0x33; //設置定時初值 2ms定時
TH1 = 0x53; //設置定時初值
echo=1; //等待回聲(開啟輸入)
trig=1; //初始狀態
Ping_count=0; //時間計數初值
trigger(); //觸發
Wait_time=0;
while ((!echo)&(Wait_time++<10000)); //觸發后等待echo出現高電平或超時不出現高電平
TR1 = 1; //啟動定時計數器T1
Wait_time=0;
while((echo)&(Wait_time++<10000)); //等待echo=0或超時不出現低電平
TR1 = 0; //停止計數
TF1 = 0; //因不是響應中斷停止,故軟件清除
Return_time = (TH1<< 8) + TL1;
Return_time = (Return_time - 0x5333)/22; //多計時us部分 計數22次為1us
Return_time = 2000*Ping_count + Return_time; //計算總時間,單位是微秒
distance = 34.0*Return_time/200; //計算距離為mm:(34毫米*時間/200)
}
|