|
我想做超聲波測(cè)距,用89c51系列的很簡(jiǎn)單,再這個(gè)系列的單片機(jī)太慢,現(xiàn)在基本上都
用stc15系列了吧,我現(xiàn)在都是stc15系列了,價(jià)格便宜,速度快。電壓還是寬電壓,在3.3v~5v之間
都可以,主要是速度快了,就可以處理更多的程序了。
好了,不說(shuō)費(fèi)話(huà)了,
其實(shí)用過(guò)stc15系列做超聲波測(cè)距,就知道有個(gè)問(wèn)題就是,單片機(jī)的速度快了,那么定時(shí)器
跑一圈的時(shí)間就少了,像stc15t系列跑一圈才 1除以12乘以65536,計(jì)算公式
1/12*65536=5.461ms左右。聲音的速度大概為 us/58cm, 5461/58=94.2cm左右,發(fā)現(xiàn)計(jì)時(shí)器不夠用了,
這個(gè)時(shí)候就得想辦法了,
一般新手就不知道怎么辦了,
其它很簡(jiǎn)單,定一個(gè)全局變量,記錄跑了幾圈,然后乘以65536,
具體的程序可以了看下面我發(fā)的 馬偉的教程
上面有詳細(xì)介紹。這里我就不多說(shuō),
那個(gè)教程寫(xiě)的很清楚。
寫(xiě)教程太花時(shí)間了。
教程:
本教程用的硬件清單:
單片機(jī):stc12c5a60s2、stc15w408as、stc15f2k60等
超聲波模塊:HC-SR04
超聲波測(cè)距的特點(diǎn)就是便宜,缺點(diǎn)就不說(shuō)了,主要說(shuō)說(shuō)超聲波器距離模塊的用法原理吧,模塊圖如下:
2017032910503010506.png (127.76 KB, 下載次數(shù): 187)
下載附件
2017-3-31 18:43 上傳
2017032910511011227.png (30.74 KB, 下載次數(shù): 199)
下載附件
2017-3-31 18:43 上傳
2017032910541752019.png (85.32 KB, 下載次數(shù): 190)
下載附件
2017-3-31 18:43 上傳
好了,超聲波模塊的簡(jiǎn)介就這么多了,話(huà)不多說(shuō),直接上程序
源程序:
- #include "STC12C5A.H"
-
- typedef unsigned char u8;
- typedef unsigned int u16;
-
- sbit Trig = P2^1;
- sbit Echo = P2^0;
-
- //聲明函數(shù)
- void getDistance();//獲取距離
- void Timer0Init();//初始化定時(shí)器0
- void UartInit();//初始化串口
- void SendData(u8 data_buf); //發(fā)送數(shù)據(jù)到串口
- void DelayXms(u16 n); //延時(shí)N ms
-
- //定義全局變量
- u8 cnt=0; //定時(shí)器0中斷次數(shù)
- u16 time; //計(jì)時(shí)
- u16 distance; //距離
-
-
- void main(){
- EA = 1;//開(kāi)啟總中斷
-
- UartInit();//初始化串口
- Timer0Init();//初始化定時(shí)器0
-
- while(1){
- getDistance(); //獲取距離
- DelayXms(800); //延時(shí)
- }
-
- }
-
- //獲取距離
- void getDistance()
- {
- u8 i,j=60;
- u8 str[] = "D:-.--M";
-
- TH0 = TL0 = cnt = 0; //初始化定時(shí)器0
- Trig = 1; //拉高超聲波模塊觸發(fā)IO
- while(j--); // 延時(shí)20us
- Trig = 0; //拉低超聲波模塊觸發(fā)IO
- while(!Echo);//等待超聲波模塊輸出IO拉高
- TR0 = 1; //開(kāi)啟定時(shí)器計(jì)時(shí)
- while(Echo); //等待超聲波模塊輸出IO拉低
- TR0 = 0; //關(guān)閉定時(shí)器計(jì)時(shí)
-
- //判斷是否超出模塊最大測(cè)距 4m
- if(cnt < 5){
- //計(jì)算出時(shí)間
- time = (TH0 * 256 + TL0 + cnt * 65536) * (1 / 12.000) + 0.5;
- //計(jì)算出距離 340m/s 或 us/58cm
- distance = time / 58 + 0.5;
- }else
- distance = 0;
-
- str[2] = (distance % 1000 / 100) + '0';
- str[4] = (distance % 100 / 10) + '0';
- str[5] = (distance % 10) + '0';
- //從串口發(fā)出,也可以用顯示器顯示,自己接顯示驅(qū)動(dòng)就可以了
- for(i=0;i<7;i++){
- SendData(str[i]);
- }
- SendData('');
- //復(fù)位定時(shí)器
- cnt = 0;
- TH0 = TL0 = 0;
- }
- //定時(shí)器0寄存器初始化
- void Timer0Init(void) //100微秒@12.000MHz
- {
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TMOD |= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0x50; //設(shè)置定時(shí)初值
- TH0 = 0xFB; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 0; //定時(shí)器0開(kāi)始計(jì)時(shí)
- ET0 = 1; //開(kāi)啟定時(shí)器中斷
- }
-
- void T0() interrupt 1
- {
- cnt++;
- }
- //串口初始化定時(shí)器1
- void UartInit(void) //4800bps@12.000MHz
- {
- SCON=0x52;
- AUXR &= 0xFE;
- TMOD=0x20;
- TH1=TL1=0xf3;
- PCON=0x80;
- TR1=1;
- }
-
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
下載:
超聲波測(cè)距程序.rar
(1.25 KB, 下載次數(shù): 505)
2017-3-31 18:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|