標(biāo)題: 基于51單片機(jī)的超聲波測距制作 附程序 [打印本頁]
作者: 余清風(fēng) 時(shí)間: 2020-12-20 15:00
標(biāo)題: 基于51單片機(jī)的超聲波測距制作 附程序
作品以STC89C52為主控制器,通過HC-SR04超聲波測距模塊,從超聲波模塊的發(fā)射、接收、檢測、顯示硬件進(jìn)行分析,模塊發(fā)射超聲波到遇到障礙物模塊接收端響應(yīng),輸出相應(yīng)比例的高電平響應(yīng)到將超聲波,經(jīng)過時(shí)間算法,向主控傳輸時(shí)間,轉(zhuǎn)換后在LCD上顯示出相應(yīng)的距離,實(shí)現(xiàn)距離測量。
以51單片機(jī)為主控,外部拓展距離采集的超聲波傳感器和顯示的LCD設(shè)備。
利用超聲波模塊的發(fā)射、接收、檢測、將數(shù)據(jù)信息發(fā)送到寄存器,控制LCD讀操作,進(jìn)行顯示。本次系統(tǒng)的設(shè)計(jì)主要包括兩部分,即硬件電路和軟件程序。
硬件電路主要包括單片機(jī)電路、發(fā)射電路、接收電路、顯示電路和電源電路等。本次設(shè)計(jì)采用以AT89C52單片機(jī)為核心的低成本、高精度、微型化數(shù)字顯示超聲波測距儀的硬件電路。整個(gè)電路采用模塊化設(shè)計(jì),由信號發(fā)射和接收、供電、顯示等模塊組成。發(fā)射探頭的信號經(jīng)放大和檢波后發(fā)射出去,單片機(jī)的計(jì)時(shí)器開始計(jì)時(shí),超聲波被發(fā)射后按原路返回,信號被接受電路接受,然后被單片機(jī)接收,計(jì)數(shù)器停止工作并得到時(shí)間。
軟件程序主要由主程序、預(yù)置子程序、發(fā)射子程序、接收子程序、顯示子程序等模塊組成。它控制單片機(jī)進(jìn)行數(shù)據(jù)發(fā)送與接收,實(shí)現(xiàn)數(shù)據(jù)正確顯示在數(shù)碼管上。另外程序控制單片機(jī)消除各探頭對發(fā)射和接收超聲波的影響。相關(guān)部分附有硬件電路圖、程序流程圖。
制作出來的實(shí)物圖如下:
2.jpg (37.42 KB, 下載次數(shù): 57)
下載附件
2020-12-20 14:59 上傳
電路原理圖如下:
1.png (74.91 KB, 下載次數(shù): 44)
下載附件
2020-12-20 14:59 上傳
單片機(jī)源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #include<LCD.h>
- typedef unsigned char u8;
- typedef unsigned char u16;
- sbit Trig = P2^1;
- sbit Echo = P2^0;
- sbit beep=P1^5;
- void delay(u16 i)
- {
- while(i--);
- }
- unsigned char PuZh[]=" Pechin Science ";
- unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
- static unsigned char DisNum = 0; //顯示用指針
- unsigned int time=0;
- unsigned long S=0;
- bit flag =0;
- unsigned char disbuff[4] ={ 0,0,0,0,};
-
- char data1=0,data2=0,data3=0;
-
- void UsartInit()
- {
- SCON=0X50;
- TMOD=0X21;
- PCON=0X80;
- TH1=0XF3;
- TL1=0XF3;
- ES=1;
- EA=1;
- TR1= 1;
- }
- char dat=0;
- /*******************************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Conut(void)
- {
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
-
- S=(time*1.7)/100; //算出來是CM
- if((S>=700)||flag==1) //超出測量范圍顯示“-”
- {
- flag=0;
-
- DisplayOneChar(0, 1, ASCII[11]);
- DisplayOneChar(1, 1, ASCII[10]); //顯示點(diǎn)
- DisplayOneChar(2, 1, ASCII[11]);
- DisplayOneChar(3, 1, ASCII[11]);
- DisplayOneChar(4, 1, ASCII[12]); //顯示M
- }
- else
- {
- disbuff[0]=S%1000/100;
- disbuff[1]=S%1000%100/10;
- disbuff[2]=S%1000%10 %10;
- DisplayOneChar(0, 1, ASCII[disbuff[0]]);
- DisplayOneChar(1, 1, ASCII[10]); //顯示點(diǎn)
- DisplayOneChar(2, 1, ASCII[disbuff[1]]);
- DisplayOneChar(3, 1, ASCII[disbuff[2]]);
- DisplayOneChar(4, 1, ASCII[12]); //顯示M
-
- data1=disbuff[0]+48;
- data2=disbuff[1]+48;
- data3=disbuff[2]+48;
- if(dat=='1'||dat=='2')
- {
- SBUF=data1;
- while(!TI);
- TI=0;
- SBUF='.';
- while(!TI);
- TI=0;
-
- SBUF=data2;
- while(!TI);
- TI=0;
-
- SBUF=data3;
- while(!TI);
- TI=0;
-
- SBUF='M';
- while(!TI);
- TI=0;
-
- SBUF=0x0d;
- while(!TI);
- TI=0;
-
- SBUF=0x0a;
- while(!TI);
- TI=0;
- }
- if(dat=='1'){dat=0;}
- }
-
-
- }
- void zd0() interrupt 1 //T0中斷用來計(jì)數(shù)器溢出,超過測距范圍
- {
- flag=1; //中斷溢出標(biāo)志
- }
- void StartModule() //啟動(dòng)模塊
- {
- Trig=1; //啟動(dòng)一次模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- Trig=0;
- }
- void delayms(unsigned int ms)
- {
- unsigned char i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- void main(void)
- {
- TMOD=0x01; //設(shè)T0為方式1,GATE=1;
- TH0=0;
- TL0=0;
- ET0=1; //允許T0中斷
- EA=1; //開啟總中斷
- InitLcd1602();
- LcdShowStr(0,0,PuZh);
- UsartInit();
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有程序51hei提供下載:
程序.zip
(37.71 KB, 下載次數(shù): 54)
2020-12-20 14:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: 江紅 時(shí)間: 2020-12-22 12:25
似乎運(yùn)行錯(cuò)誤哦
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |