|
測(cè)距精度不是特別的準(zhǔn)確。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- // 基于AT89C51/52單片機(jī)的超聲波測(cè)距系統(tǒng)
- // 測(cè)量范圍:40-690厘米
- // 晶振:12MH
- // 2015年5月
- #include <REGX51.H> //頭文件
- #include <intrins.h> //頭文件
- #define uchar unsigned char
- #define uint unsigned int
- #define bjh P3_1 //定值輸出(繼電器)
- #define sx P0_2 //報(bào)警值輸出(聲音)
- #define csbout P2_7 //超聲波發(fā)送
- #define csbint P3_5 //超聲波接收
- uchar ec,cls,cs,mq,xm0,xm1,xm2,sec20,sec,sec1,buffer[3]; //程序中使用的變量
- uchar convert[10]={0x81,0xED,0xA2,0xA8,0xCC,0x98,0x90,0xAD,0x80,0x88};//0~9段碼
- uint zzz,dz,i,jsz,t;//程序中使用的變量 zzz:測(cè)量上限,dz:報(bào)警定值,i:延時(shí)變量,jsz:距離測(cè)量結(jié)果,t:時(shí)間
- static uchar bdata ke; //可位尋址的狀態(tài)寄存器
- float csbc; //超聲波速儲(chǔ)存單元
- sbit LED1 = P3^4; //數(shù)碼管位驅(qū)動(dòng)
- sbit LED2 = P3^2; //數(shù)碼管位驅(qū)動(dòng)
- sbit LED3 = P3^3; //數(shù)碼管位驅(qū)動(dòng)
- void delay(i); //延時(shí)函數(shù)
- void scanLED(); //顯示函數(shù)
- void timeToBuffer(); //顯示轉(zhuǎn)換函數(shù)
- void time(); //計(jì)時(shí)處理
- void csbcj(); //超聲波測(cè)量處理
- void bgcl(); //繼電器報(bào)警處理
- void csbfs(); //超聲波發(fā)送
- void offmsd(); //百位為零時(shí)不顯示處理
- void main() //主程序
- {
- EA=1; //開(kāi)中斷
- TMOD=0x11; //設(shè)定時(shí)器1定時(shí)
- csbout=1; //單片機(jī)超聲波輸出端口置高電平
- TR1=0; //定時(shí)器1停止工作
- zzz=699; //測(cè)量上限值
- mq=40; //盲區(qū)值
- dz=120; //報(bào)警值初值
- cls=1; //每秒測(cè)量次數(shù)
- csbc=0.034; //20度時(shí)的超聲波速度:厘米/uS
- bjh=1; //繼電器停止工作
- sx=0; //蜂鳴器停止工作
- ec=100;
- while(1)
- {
- ec++;
- if (ec>100) //超聲波測(cè)量標(biāo)志為100時(shí)進(jìn)行測(cè)量
- {
- cls=~cls;
- ec=0; //超聲波測(cè)量標(biāo)志置0
- csbcj(); //調(diào)用超聲波測(cè)量程序
- timeToBuffer(); //調(diào)用轉(zhuǎn)換段碼功能模塊
- offmsd(); //調(diào)用顯示轉(zhuǎn)換程序
- bgcl(); //調(diào)用報(bào)警處理程序
- }
- scanLED(); //調(diào)用顯示函數(shù)
- if((jsz<dz)&(cls==1)) //判斷是否達(dá)到報(bào)警值
- {
- i=5;
- while(i--)
- {
- sx=~sx; //發(fā)出“滴”聲響
- delay(70);
- }
- }
- else {sx=0;}
- }
- }
- void delay(i) //延時(shí)子程序
- {
- while(--i);
- }
- void scanLED() //顯示功能模塊
- {
- P2=buffer[2]; //顯百位段
- LED1=0; //顯百位位
- delay(40); //百位顯示延時(shí) 程序要下載到實(shí)物中時(shí)改為delay(2); 下同
- LED1=1; //關(guān)閉百位顯示
- delay(2); //關(guān)閉百位顯示延時(shí) 程序要下載到實(shí)物中時(shí)改為delay(50); 下同
- P2=buffer[1]; //顯十位段
- LED2=0; //顯十位位
- delay(40); //百十位顯示延時(shí)
- LED2=1; //關(guān)閉十位顯示
- delay(2); //關(guān)閉十位顯示延時(shí)
- P2=buffer[0]; //顯個(gè)位段
- LED3=0; //顯個(gè)位位
- delay(40); //顯個(gè)位段
- LED3=1; //百關(guān)閉個(gè)位顯示
- delay(2); //百關(guān)閉個(gè)位顯示延時(shí)
- }
- void timeToBuffer() //轉(zhuǎn)換段碼功能模塊
- {
- if (jsz>zzz) //測(cè)量值大于測(cè)量上限時(shí)顯示“CCC”
- {
- buffer[0]=0x93; //顯示 C
- buffer[1]=0x93; //顯示 C
- buffer[2]=0x93; //顯示 C
- }
- else if (jsz<mq) //測(cè)量值小于測(cè)量下限時(shí)顯示“CCC"
- {
- buffer[0]=0xFE; //顯示 -
- buffer[1]=0xFE; //顯示 -
- buffer[2]=0xFE; //顯示 -
- }
- else
- {
- xm0=jsz/100; //計(jì)算百位值
- xm1=(jsz-xm0*100)/10; //計(jì)算十位值
- xm2=jsz-xm0*100-xm1*10; //計(jì)算個(gè)位值
- buffer[0]=convert[xm2]; //進(jìn)行個(gè)位顯示段碼轉(zhuǎn)換
- buffer[1]=convert[xm1]; //進(jìn)行十位顯示段碼轉(zhuǎn)換
- buffer[2]=convert[xm0]; //進(jìn)行百位顯示段碼轉(zhuǎn)換
- if (buffer[2]==0x81) //判斷百位是否為零
- {
- buffer[2]=0xFF; //百位為零時(shí)不顯示
- }
- }
- }
- void csbcj() //超聲波測(cè)距程序
- {
- TR0=0; //停止定時(shí)器1工作
- TH1=0x00; //計(jì)時(shí)器1清零
- TL1=0x00; //計(jì)時(shí)器1清零
- csbint=1; //置單片機(jī)超聲波接收口高高電平
- sx=0; //停止報(bào)警聲響
- delay(1700); //進(jìn)行延時(shí)
- csbfs(); //調(diào)用超聲波發(fā)送子程序:CSBFS.ASM
- csbout=1; //置單片機(jī)超聲波輸出端口P2.7為高電平
- TR1=1; //超聲波發(fā)頭發(fā)送完超聲波后,啟動(dòng)定時(shí)器1進(jìn)行計(jì)時(shí)
- i=250; //盲區(qū)處理系數(shù)
- while(i--) //盲區(qū)延時(shí)處理
- {
- }
- i=0;
- while(csbint) //進(jìn)行超聲波回波判斷,判斷接收回路是否收到超聲波的回波,接收到回波時(shí),csbint=0
- {
- i++;
- if(i>=3300) //規(guī)定時(shí)間沒(méi)收到回波時(shí)退出判斷處理程序
- csbint=0; //規(guī)定時(shí)間內(nèi)接收到回波時(shí),置csbint=0
- }
- TR1=0; //停止計(jì)時(shí)器1計(jì)時(shí)
- t=TH1; //提取計(jì)時(shí)器記錄的高8位值
- t=t*256+TL1; //計(jì)算計(jì)時(shí)的總時(shí)間
- TR0=1; //恢復(fù)定時(shí)器0工作
- csbint=1; //超聲波接收端置高電平,這下次測(cè)量做準(zhǔn)備
- jsz=t*csbc; //計(jì)算測(cè)量結(jié)果
- jsz=jsz/2; //計(jì)算測(cè)量結(jié)果
- }
-
- void bgcl() //報(bào)警處理繼電器動(dòng)作判斷程序
- {
- if (jsz<dz) //測(cè)量值低于設(shè)定的報(bào)警值,繼電器吸合
- {
- bjh=0; //繼電器吸合
- }
- else
- {
- bjh=1; //繼電器斷開(kāi)
- }
- }
- void offmsd() //百位為數(shù)0判斷模塊
- {
- if (buffer[2]==0x81) //如果值為零時(shí)百位不顯示
- buffer[2] = 0xff;
- }
復(fù)制代碼
所有資料51hei提供下載:
超聲波.7z
(27.31 KB, 下載次數(shù): 69)
2019-6-20 14:00 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|