作品以STC89C52為主控制器,通過(guò)HC-SR04超聲波測(cè)距模塊,從超聲波模塊的發(fā)射、接收、檢測(cè)、顯示硬件進(jìn)行分析,模塊發(fā)射超聲波到遇到障礙物模塊接收端響應(yīng),輸出相應(yīng)比例的高電平響應(yīng)到將超聲波,經(jīng)過(guò)時(shí)間算法,向主控傳輸時(shí)間,轉(zhuǎn)換后在LCD上顯示出相應(yīng)的距離,實(shí)現(xiàn)距離測(cè)量。 以51單片機(jī)為主控,外部拓展距離采集的超聲波傳感器和顯示的LCD設(shè)備。 利用超聲波模塊的發(fā)射、接收、檢測(cè)、將數(shù)據(jù)信息發(fā)送到寄存器,控制LCD讀操作,進(jìn)行顯示。本次系統(tǒng)的設(shè)計(jì)主要包括兩部分,即硬件電路和軟件程序。 硬件電路主要包括單片機(jī)電路、發(fā)射電路、接收電路、顯示電路和電源電路等。本次設(shè)計(jì)采用以AT89C52單片機(jī)為核心的低成本、高精度、微型化數(shù)字顯示超聲波測(cè)距儀的硬件電路。整個(gè)電路采用模塊化設(shè)計(jì),由信號(hào)發(fā)射和接收、供電、顯示等模塊組成。發(fā)射探頭的信號(hào)經(jīng)放大和檢波后發(fā)射出去,單片機(jī)的計(jì)時(shí)器開(kāi)始計(jì)時(shí),超聲波被發(fā)射后按原路返回,信號(hào)被接受電路接受,然后被單片機(jī)接收,計(jì)數(shù)器停止工作并得到時(shí)間。
軟件程序主要由主程序、預(yù)置子程序、發(fā)射子程序、接收子程序、顯示子程序等模塊組成。它控制單片機(jī)進(jìn)行數(shù)據(jù)發(fā)送與接收,實(shí)現(xiàn)數(shù)據(jù)正確顯示在數(shù)碼管上。另外程序控制單片機(jī)消除各探頭對(duì)發(fā)射和接收超聲波的影響。相關(guān)部分附有硬件電路圖、程序流程圖。
制作出來(lái)的實(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ù)
- * 輸 入 : 無(wú)
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void Conut(void)
- {
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
-
- S=(time*1.7)/100; //算出來(lái)是CM
- if((S>=700)||flag==1) //超出測(cè)量范圍顯示“-”
- {
- 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中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
- {
- 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; //開(kāi)啟總中斷
- InitLcd1602();
- LcdShowStr(0,0,PuZh);
- UsartInit();
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有程序51hei提供下載:
程序.zip
(37.71 KB, 下載次數(shù): 54)
2020-12-20 14:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|