作品以STC89C52為主控制器,通過HC-SR04超聲波測距模塊,從超聲波模塊的發射、接收、檢測、顯示硬件進行分析,模塊發射超聲波到遇到障礙物模塊接收端響應,輸出相應比例的高電平響應到將超聲波,經過時間算法,向主控傳輸時間,轉換后在LCD上顯示出相應的距離,實現距離測量。 以51單片機為主控,外部拓展距離采集的超聲波傳感器和顯示的LCD設備。 利用超聲波模塊的發射、接收、檢測、將數據信息發送到寄存器,控制LCD讀操作,進行顯示。本次系統的設計主要包括兩部分,即硬件電路和軟件程序。 硬件電路主要包括單片機電路、發射電路、接收電路、顯示電路和電源電路等。本次設計采用以AT89C52單片機為核心的低成本、高精度、微型化數字顯示超聲波測距儀的硬件電路。整個電路采用模塊化設計,由信號發射和接收、供電、顯示等模塊組成。發射探頭的信號經放大和檢波后發射出去,單片機的計時器開始計時,超聲波被發射后按原路返回,信號被接受電路接受,然后被單片機接收,計數器停止工作并得到時間。
軟件程序主要由主程序、預置子程序、發射子程序、接收子程序、顯示子程序等模塊組成。它控制單片機進行數據發送與接收,實現數據正確顯示在數碼管上。另外程序控制單片機消除各探頭對發射和接收超聲波的影響。相關部分附有硬件電路圖、程序流程圖。
制作出來的實物圖如下:
2.jpg (37.42 KB, 下載次數: 57)
下載附件
2020-12-20 14:59 上傳
電路原理圖如下:
1.png (74.91 KB, 下載次數: 44)
下載附件
2020-12-20 14:59 上傳
單片機源程序如下:
- #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;
- /*******************************************************************************
- * 函 數 名 : main
- * 函數功能 : 主函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- 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]); //顯示點
- 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]); //顯示點
- 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中斷用來計數器溢出,超過測距范圍
- {
- flag=1; //中斷溢出標志
- }
- void StartModule() //啟動模塊
- {
- Trig=1; //啟動一次模塊
- _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; //設T0為方式1,GATE=1;
- TH0=0;
- TL0=0;
- ET0=1; //允許T0中斷
- EA=1; //開啟總中斷
- InitLcd1602();
- LcdShowStr(0,0,PuZh);
- UsartInit();
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有程序51hei提供下載:
程序.zip
(37.71 KB, 下載次數: 54)
2020-12-20 14:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|