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