(一)、超聲波
1、原理(圖 一)
? ????發送信號階段:單片機通過翻轉發送的引腳P1^0,發送8個40MHZ的方波,此時開始計時。
? ? ? 等待接收信號:通過單片機的接收引腳P1^1檢測,未接收到信號時,引腳處于高電平1;接收到信號時,引腳處于低電平0,此時停止計時。如果距離過遠的話,定時器會超出計時的范圍,數據溢出,成為一個無效的數據。
?? ????計算距離:我們通過計算發送與接收之間的時間間隔,再利用數學公式Distance=v * t/2 (v代表聲速340m/s ,v*t代表來回的距離,除2后就是要測量的距離),注意此時我們的單位是cm,而且測量的t單位為us,所以還需Distance還需 *103*10-6,換算成最終公式Distance = 0.017 * t (單位cm)
? ? ? ? ? ? ? ? ? ? ? ? 圖 一 單片機超聲波原理
??
2、代碼解讀
圖 二 前置工作:開始需要引用頭文件,_nop()函數需要定義INTRINS.h,要生成40MHZ方波,通過計算可知周期為25us。注意此時i = 33可以進行少許修改33-37都可以試試,哪個數據更加穩定就用哪個。
? ? ? ? ? ? ? ?? ?圖 二 超聲波代碼解讀(前置階段)
????????????????????????
圖 三 初始化工作:產生8個40MHZ方波,方波占空比為50%,占空比是高電平在一個周期中所占時間比,因此可以先拉高引腳,12us后再拉低引腳。stc-isp無法生成12.5us精度的延時,所以可以通過現象試一試12us、13us哪一個更適合。
? ? ? ? ? ? ? ?? 圖 三 超聲波代碼解讀(初始化階段)
??? ?圖 四做完準備工作后,就可以開始寫測距的函數啦,這里我們用PCA計數器來計時。51單片機本身計時器比較少,定時器0需要用于顯示功能掃描,定時器可能用于NE555頻率獲取,定時器2一般用于串口,當然,超聲波也可以用定時器1。CMOD=0x00就是初始化PCA計數器,CL = CH = 0就是讓它高八位與低八位為0。
? ? ? ? ? ? ? ? ?圖 四 超聲波代碼解讀(測距階段)
附參考底層代碼
#include <STC15F2K60S2.H>
#include <INTRINS.h>sbit Tx = P1^0;
sbit Rx = P1^1;void Delay12us(void) //@12.000MHz
{unsigned char data i;_nop_();_nop_();i = 36; //注意根據獲取數據穩定性作修改while (--i);
}void Ultra_Init(void) //發送8個40HZ方波
{unsigned char i;EA = 0; for(i = 0;i<8;i++){Tx = 1;Delay12us();Tx = 0;Delay12us();}EA = 1;
}unsigned char Ultra_Distance(void)
{unsigned int Time; //注意為int類型數據CMOD = 0x00; //啟動外部定時器CH = CL = 0; //清空高八位與低八位Ultra_Init();CR = 1; //初始化發送后開始計時while((Rx == 1) && (CF == 0)); //等待返回波或者距離太遠跳出循環CR = 0; //停止計時if(CF == 0) //計時變量沒有超限{Time = (CH<<8)|CL;return Time*0.017; //正常返回數據}else //計時變量超限{CF = 0; //手動拉低標志位重新開始計時return 0;}
}