標(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í)物圖如下:


電路原理圖如下:


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<LCD.h>
  4. typedef unsigned char u8;
  5. typedef unsigned char u16;
  6. sbit Trig = P2^1;
  7. sbit Echo = P2^0;
  8. sbit beep=P1^5;       

  9. void delay(u16 i)
  10. {
  11.         while(i--);       
  12. }

  13. unsigned char PuZh[]=" Pechin Science ";
  14. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

  15. static unsigned char DisNum = 0; //顯示用指針                                  
  16.        unsigned int  time=0;
  17.            unsigned long S=0;
  18.            bit      flag =0;
  19.            unsigned char disbuff[4]           ={ 0,0,0,0,};
  20.                  
  21.                  char data1=0,data2=0,data3=0;
  22.                  
  23. void UsartInit()
  24. {
  25.         SCON=0X50;                       
  26.         TMOD=0X21;                       
  27.         PCON=0X80;                       
  28.         TH1=0XF3;                               
  29.         TL1=0XF3;
  30.         ES=1;                                       
  31.         EA=1;               
  32.   TR1= 1;       
  33. }                 

  34. char dat=0;

  35. /*******************************************************************************
  36. * 函 數(shù) 名         : main
  37. * 函數(shù)功能                   : 主函數(shù)
  38. * 輸    入         : 無
  39. * 輸    出         : 無
  40. *******************************************************************************/
  41. void Conut(void)
  42.         {
  43.          time=TH0*256+TL0;
  44.          TH0=0;
  45.          TL0=0;
  46.        
  47.          S=(time*1.7)/100;     //算出來是CM
  48.          if((S>=700)||flag==1) //超出測量范圍顯示“-”
  49.          {         
  50.           flag=0;
  51.          
  52.           DisplayOneChar(0, 1, ASCII[11]);
  53.           DisplayOneChar(1, 1, ASCII[10]);        //顯示點(diǎn)
  54.           DisplayOneChar(2, 1, ASCII[11]);
  55.           DisplayOneChar(3, 1, ASCII[11]);
  56.           DisplayOneChar(4, 1, ASCII[12]);        //顯示M
  57.          }
  58.          else
  59.          {
  60.           disbuff[0]=S%1000/100;
  61.           disbuff[1]=S%1000%100/10;
  62.           disbuff[2]=S%1000%10 %10;
  63.           DisplayOneChar(0, 1, ASCII[disbuff[0]]);
  64.           DisplayOneChar(1, 1, ASCII[10]);        //顯示點(diǎn)
  65.           DisplayOneChar(2, 1, ASCII[disbuff[1]]);
  66.           DisplayOneChar(3, 1, ASCII[disbuff[2]]);
  67.           DisplayOneChar(4, 1, ASCII[12]);        //顯示M
  68.                  
  69.                  data1=disbuff[0]+48;
  70.                  data2=disbuff[1]+48;
  71.                  data3=disbuff[2]+48;
  72.         if(dat=='1'||dat=='2')
  73.         {               
  74.         SBUF=data1;
  75.         while(!TI);
  76.         TI=0;

  77.         SBUF='.';
  78.         while(!TI);
  79.         TI=0;
  80.                  
  81.         SBUF=data2;
  82.         while(!TI);
  83.         TI=0;
  84.   
  85.         SBUF=data3;
  86.         while(!TI);
  87.         TI=0;
  88.        
  89.                 SBUF='M';
  90.         while(!TI);
  91.         TI=0;
  92.        
  93.                 SBUF=0x0d;
  94.         while(!TI);
  95.         TI=0;
  96.        
  97.         SBUF=0x0a;
  98.         while(!TI);
  99.         TI=0;
  100.          }
  101.         if(dat=='1'){dat=0;}
  102. }
  103.          
  104.          
  105.         }

  106. void zd0() interrupt 1                  //T0中斷用來計(jì)數(shù)器溢出,超過測距范圍
  107.   {
  108.     flag=1;                                                         //中斷溢出標(biāo)志
  109.   }

  110. void  StartModule()                          //啟動(dòng)模塊
  111.   {
  112.           Trig=1;                                             //啟動(dòng)一次模塊
  113.           _nop_();
  114.           _nop_();
  115.           _nop_();
  116.           _nop_();
  117.           _nop_();
  118.           _nop_();
  119.           _nop_();
  120.           _nop_();
  121.           _nop_();
  122.           _nop_();
  123.           _nop_();
  124.           _nop_();
  125.           _nop_();
  126.           _nop_();
  127.           _nop_();
  128.           _nop_();
  129.           _nop_();
  130.           _nop_();
  131.           _nop_();
  132.           _nop_();
  133.           _nop_();
  134.           Trig=0;
  135.   }



  136. void delayms(unsigned int ms)
  137. {
  138.         unsigned char i=100,j;
  139.         for(;ms;ms--)
  140.         {
  141.                 while(--i)
  142.                 {
  143.                         j=10;
  144.                         while(--j);
  145.                 }
  146.         }
  147. }

  148. void main(void)
  149. {

  150.          TMOD=0x01;                   //設(shè)T0為方式1,GATE=1;
  151.          TH0=0;
  152.          TL0=0;         
  153.          ET0=1;             //允許T0中斷
  154.          EA=1;                           //開啟總中斷       

  155.         InitLcd1602();
  156.         LcdShowStr(0,0,PuZh);
  157.         UsartInit();
  158. ……………………

  159. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有程序51hei提供下載:
程序.zip (37.71 KB, 下載次數(shù): 54)


作者: 江紅    時(shí)間: 2020-12-22 12:25
似乎運(yùn)行錯(cuò)誤哦




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1