找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2760|回復(fù): 5
收起左側(cè)

關(guān)于單片機(jī)超聲波測(cè)距,大佬們幫忙看看該加點(diǎn)啥,或者怎么改

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 50 黑幣 回復(fù)本帖可獲得 10 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
ID:852397 發(fā)表于 2021-4-22 20:05 | 顯示全部樓層 |閱讀模式
我在讀大學(xué),學(xué)習(xí)過(guò)單片機(jī)原理與應(yīng)用,但是感覺(jué)不怎么懂這個(gè)東西,但對(duì)單片機(jī)是很感興趣的。
現(xiàn)在有打算弄一個(gè)超聲波測(cè)距顯示模塊,網(wǎng)上也買(mǎi)了一些硬件設(shè)備。
超聲波測(cè)距模塊是US-015,現(xiàn)在將一塊1602顯示屏裝在一個(gè)單片機(jī)開(kāi)發(fā)板上。
在本論壇也搜了資料,找了找相關(guān)的編程資料。想請(qǐng)問(wèn)現(xiàn)在怎么弄,能讓距離顯示出來(lái)。程序該加點(diǎn)什么條件。
硬件方面超聲波的四根線(xiàn)該接在開(kāi)發(fā)板的哪里。
小白是真不太懂,希望有大佬能幫幫,感激不盡!

這是程序,大佬們幫忙看看該加點(diǎn)啥,或者怎么改,

單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uint  unsigned int
  4. #define uchar unsigned char
  5. #define comm  0
  6. #define dat   1
  7. sbit RS=P2^6;                                                                //高電平數(shù)據(jù),低電平命令
  8. sbit RW=P2^5;                                                                //讀寫(xiě)控制腳,高電平讀,低電平寫(xiě)
  9. sbit E=P2^7;                                                                //輸入使能
  10. sbit busy=P0^7;                                                                //忙信號(hào)檢測(cè)
  11. sbit SDA=P1^0;                                                                //I2C數(shù)據(jù)線(xiàn)
  12. sbit SCL=P1^1;                                                                //I2C時(shí)鐘線(xiàn)
  13. sbit Buzz=P1^2;                                                                //蜂鳴器控制腳
  14. sbit LED_G=P1^3;                                                        //綠色指示燈控制腳
  15. sbit LED_R=P1^4;                                                        //紅色指示燈控制腳
  16. uchar buf[6],dis_buf[6];                                        //數(shù)據(jù)緩沖區(qū)
  17. uint buffer[3];                                                                //測(cè)量距離存儲(chǔ)區(qū)
  18. uint dis;                                                                        //最小距離存儲(chǔ)器
  19. uchar code tab1[]={"距離障礙物:"};                        //顯示字符
  20. uchar code tab2[]={"無(wú)障礙物"};
  21. uchar code tab[]={"0123456789cm"};
  22. /*****************函數(shù)聲明*****************/
  23. void start_bit(void);                                                //I2C起始函數(shù)
  24. void stop_bit(void);                                                //I2C停止函數(shù)
  25. void mast_ack(void);                                                //主答函數(shù)
  26. bit write_8bit(uchar ch);                                        //I2C總線(xiàn)寫(xiě)8位數(shù)據(jù)函數(shù)
  27. bit page_rd(uchar device,uint fir_ad,uint count,uchar *firw_ad);//I2C總線(xiàn)頁(yè)面讀函數(shù)
  28. uint measure(uchar device);                                        //啟動(dòng)測(cè)距函數(shù)
  29. uint get_distance(void);                                        //讀測(cè)距值函數(shù)
  30. void judge(void);                                                        //判斷距離函數(shù)
  31. void init_lcd (void);                                                //LCD初始化函數(shù)
  32. void wr_lcd(uchar dat_comm,uchar content);//LCD寫(xiě)數(shù)據(jù)函數(shù)
  33. void chk_busy (void);                                                //忙信號(hào)檢測(cè)
  34. void chn_disp(uchar code *chn,uchar pos,uchar n);//顯示提示漢字函數(shù)
  35. uchar dat_adj(uint dat1);                                        //顯示數(shù)據(jù)調(diào)整函數(shù)
  36. void disp_dist(uchar dat1);                                        //顯示距離函數(shù)
  37. void disp(void);                                                        //顯示函數(shù)
  38. void delay (uint us);                                                //延時(shí)函數(shù)
  39. void delay1 (uint ms);                                                //延時(shí)函數(shù)
  40. /*********************主程序***********************/
  41. void main ()
  42. {
  43.     init_lcd ();                                                        //初始化LCD
  44.     while (1)
  45.     {
  46.                 judge();                                                        //判斷障礙物距離
  47.                 disp();                                                                //顯示提示信息
  48.         }
  49. }
  50. /********************I2C起始函數(shù)*******************/
  51. void start_bit(void)
  52. {
  53.     SCL=1;_nop_();
  54.     SDA=1;_nop_();
  55.     SDA=0;_nop_();
  56.     SCL=0;_nop_();
  57. }
  58. /*******************I2C停止函數(shù)********************/
  59. void stop_bit(void)
  60. {
  61.     SDA=0;_nop_();
  62.     SCL=1;_nop_();
  63.     SDA=1;_nop_();
  64. }
  65. /****************I2C總線(xiàn)寫(xiě)8位數(shù)據(jù)函數(shù)**************/
  66. bit write_8bit(uchar ch)
  67. {
  68.     uchar i=8;
  69.     bit fan_w;
  70.     SCL=0;_nop_();
  71.     while (i--)
  72.     {
  73.         SDA=(bit)(ch&0x80);_nop_();                                //獲取發(fā)送位數(shù)據(jù)
  74.         ch<<=1;
  75.         SCL=1;_nop_();
  76.         SCL=0;_nop_();
  77.     }
  78.     SDA=1;_nop_();
  79.     SCL=1;_nop_();
  80.     fan_w=SDA;                                                                        //應(yīng)答位
  81.     SCL=0;_nop_();
  82.     return(fan_w);                                                                //返回應(yīng)答位
  83. }
  84. /*****************I2C總線(xiàn)頁(yè)面讀函數(shù)****************/
  85. bit page_rd(uchar device,uint fir_ad,uint count,uchar *firw_ad)
  86. {
  87.         uchar j=8;
  88.         uchar data *ufirstwr_ad;
  89.         ufirstwr_ad=firw_ad;
  90.         start_bit();
  91.         if(write_8bit(device)!=0){stop_bit();return(0);}//送器件地址,寫(xiě)數(shù)據(jù)
  92.         if(write_8bit(fir_ad)!=0){stop_bit();return(0);}//送讀數(shù)據(jù)寄存器首地址
  93.         start_bit();
  94.         if(write_8bit(device|0x01)!=0){stop_bit();return(0);}//準(zhǔn)備讀數(shù)據(jù)
  95.         while(count--)
  96.         {
  97.                 uchar i=8;
  98.                 while(i--)                                                                //讀入數(shù)據(jù)
  99.                 {
  100.                         (*ufirstwr_ad)<<=1;
  101.                         SCL=1;_nop_();
  102.                         if(SDA) (*ufirstwr_ad)|=0x01;
  103.                         SCL=0; _nop_();
  104.                 }
  105.                 ufirstwr_ad++;
  106.                 mast_ack();                                                                //主機(jī)產(chǎn)生應(yīng)答位
  107.         }
  108.         while(j--)
  109.         {
  110.                 (*ufirstwr_ad)<<=1;
  111.                 SCL=0;_nop_();_nop_();SCL=1;
  112.                 if(SDA) (*ufirstwr_ad)|=0x01;
  113.         }
  114.         stop_bit();                                                                        //停止I2C數(shù)據(jù)傳送
  115.         return(1);
  116. }
  117. /*********************主答函數(shù)*********************/
  118. void mast_ack(void)
  119. {
  120.    SCL=0;_nop_();
  121.    SDA=0;_nop_();
  122.    SCL=1;_nop_();
  123.    SCL=0;_nop_();
  124.    SDA=1;_nop_();
  125. }
  126. /********************測(cè)距函數(shù)******************/
  127. uint measure(uchar device)
  128. {
  129.         uint temp;
  130.         start_bit();                                                                //啟動(dòng)I2C
  131.         while(!write_8bit(device));                                        //發(fā)器件地址
  132.         while(!write_8bit(0x00));                                        //命令寄存器
  133.         while(!write_8bit(0x51));                                        //以厘米為單位返回距離
  134.         stop_bit();                                                                        //停止I2C
  135.         delay1(100);
  136.         while(!page_rd(device,0x02,2,buf));                        //讀距離值
  137.         temp=(buf[0]<<8)|buf[1];
  138.         return(buffer);                                                                //返回距離值
  139. }
  140. /*******************求最小測(cè)距值函數(shù)*****************/
  141. uint get_distance(void)
  142. {
  143.         uint mix;
  144.         buffer[0]=measure(0xe0);                                        //讀左側(cè)測(cè)距值
  145.         buffer[1]=measure(0xe2);                                        //讀中間測(cè)距值
  146.         buffer[2]=measure(0xe4);                                        //讀右側(cè)測(cè)距值
  147.         if(buffer[0]<buffer[1])
  148.                 mix=buffer[0];
  149.         else
  150.                 mix=buffer[1];
  151.         if(mix>buffer[2])mix=buffer[2];                                //合并為一個(gè)16位數(shù)據(jù)
  152.         return(mix);
  153. }
  154. /*******************判斷距離函數(shù)*******************/
  155. void judge(void)
  156. {
  157.         dis=get_distance();                                                        //讀取測(cè)量距離最小值
  158.         if(dis<5000)
  159.         {
  160.                 LED_R=0;                                                                //紅色報(bào)警燈亮
  161.                 LED_G=1;                                                                //綠色報(bào)警燈滅
  162.         }        
  163.         else
  164.         {
  165.                 LED_R=1;                                                                //紅色報(bào)警燈滅
  166.                 LED_G=0;                                                                //綠色報(bào)警燈亮
  167.         }        
  168.         if(dis<3000)
  169.                 Buzz=0;                                                                        //蜂鳴器報(bào)警
  170.         else
  171.                 Buzz=1;                                                                        //蜂鳴器停止報(bào)警
  172. }
  173. /******************LCD初始化函數(shù)*******************/
  174. void init_lcd (void)
  175. {
  176.         wr_lcd (comm,0x30);                                                        //基本指令動(dòng)作   
  177.         wr_lcd (comm,0x01);                                                        //清屏
  178.         wr_lcd (comm,0x06);                                                        //光標(biāo)的移動(dòng)方向
  179.         wr_lcd (comm,0x0c);                                                        //開(kāi)顯示,關(guān)游標(biāo)
  180. }
  181. /*******************LCD寫(xiě)數(shù)據(jù)函數(shù)*****************/
  182. void wr_lcd (uchar dat_comm,uchar content)
  183. {
  184.         chk_busy ();
  185.         if(dat_comm)
  186.         {
  187.                 RS=1;                                                                        //數(shù)據(jù)
  188.                 RW=0;                                                                        //寫(xiě)入
  189.         }
  190.         else
  191.         {
  192.                 RS=0;                                                                        //命令
  193.                 RW=0;                                                                        //寫(xiě)入
  194.         }
  195.         P0=content;                                                                        //輸出數(shù)據(jù)或命令
  196.         E=1;
  197.         E=0;
  198. }
  199. /********************忙信號(hào)檢測(cè)********************/
  200. void chk_busy (void)
  201. {
  202.         P0=0xff;
  203.         RS=0;
  204.         RW=1;
  205.         E=1;
  206.         while(busy==1);                                                                //檢驗(yàn)LCD是否處于忙狀態(tài)
  207.         E=0;
  208. }
  209. /****************顯示提示漢字函數(shù)******************/
  210. void chn_disp(uchar code *chn,uchar pos,uchar n)
  211. {
  212.         uchar i;
  213.         wr_lcd (comm,0x30);                                                        //基本指令動(dòng)作
  214.         wr_lcd (comm,pos);                                                        //顯示位置
  215.         for (i=0;i<n;i++)
  216.                 wr_lcd (dat,chn[i]);
  217. }
  218. /****************顯示數(shù)據(jù)調(diào)整函數(shù)******************/
  219. uchar dat_adj(uint dat1)
  220. {
  221.     uchar i;
  222.         dis_buf[0]=(uchar)(dat1/1000);                                //高度千位
  223.         dis_buf[1]=(uchar)((dat1%1000)/100);                //高度百位
  224.         dis_buf[2]=(uchar)((dat1%100)/10);                        //高度十位
  225.         dis_buf[3]=(uchar)(dat1%10);                                //高度個(gè)位
  226.         dis_buf[4]=10;
  227.         for(i=0;i<3;i++)
  228.         {
  229.                 if(dis_buf[i]!=0)break;                                        //確定顯示位數(shù)
  230.         }
  231.         return(i);
  232. }
  233. /******************顯示距離函數(shù)********************/
  234. void disp_dist(uchar dat1)
  235. {
  236.         uchar temp,i;
  237.         if(dat1>5000)
  238.         {
  239.                 chn_disp(tab2,0x92,4);                                        //無(wú)障礙顯示
  240.         }
  241.         else
  242.         {
  243.                 temp=dat_adj(dat1);
  244.                 wr_lcd(comm,0x30);                                                //基本指令
  245.                 wr_lcd(comm,temp+0x92);                                        //設(shè)置顯示起始位置
  246.                 for (i=temp;i<6;i++)                                        //送顯示數(shù)據(jù)
  247.                         wr_lcd(dat,tab[dis_buf[i]]);
  248.         }
  249. }
  250. /********************顯示函數(shù)**********************/
  251. void disp(void)
  252. {
  253.         chn_disp(tab1,0x80,11);                                                //顯示提示漢字
  254.         disp_dist(dis);                                                                //顯示距離值
  255. }
  256. /********************延時(shí)函數(shù)**********************/
  257. void delay (uint us)
  258. {
  259.         while(us--);
  260. }
  261. /********************延時(shí)函數(shù)**********************/
  262. void delay1 (uint ms)
  263. {
  264.         uint i,j;
  265.         for(i=0;i<ms;i++)
  266.         for(j=0;j<15;j++)
  267.         delay(1);
  268. }
復(fù)制代碼


這是硬件設(shè)備,接線(xiàn)問(wèn)題也求助一下下。
7C40D95133CA35F763DC54F68DE1D2A5.jpg


感激不盡感激不盡。。。。。。。。。。!
回復(fù)

使用道具 舉報(bào)

ID:585428 發(fā)表于 2021-4-23 07:58 | 顯示全部樓層
  1. /*
  2. 接線(xiàn)方式:超聲波模塊trig接單片機(jī)P2^0 ,超聲波模塊echo接單片機(jī)P2^1
  3.           P3^2接P2^1
  4. */

  5. #include "reg52.h"

  6. typedef unsigned char uchar;
  7. typedef unsigned int uint;

  8. sbit trig=P2^0;
  9. sbit echo=P2^1;
  10. sbit beep=P1^5;

  11. sbit LSA=P2^2;
  12. sbit LSB=P2^3;
  13. sbit LSC=P2^4;

  14. uint num=0;                   //計(jì)時(shí)
  15. float distance;           //距離
  16. float cm_per_num=3.40; //按照我的定時(shí)器初始化設(shè)定,1個(gè)num是100us
  17. uchar DisplayData[6];
  18. uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  19.                                         0x7f,0x6f};//顯示0~9的值

  20. void delay1ms(uchar xms)   
  21. {
  22.     uchar a,b,c;
  23.     for(c=xms;c>0;c--)
  24.         for(b=142;b>0;b--)
  25.             for(a=2;a>0;a--);
  26. }

  27. /*
  28. 設(shè)置工作方式為方式1,GATE=1,當(dāng)中斷0口輸入1且TR0=1 時(shí)定時(shí)器工作
  29. 因?yàn)槌暡K的工作原理就是在接收回波時(shí),從開(kāi)始到結(jié)束,ech0=1
  30. 所以在單片機(jī)上用杜邦線(xiàn)將ech0的P21口和 中斷0口 P32口鏈接
  31. 使得在回波期間,定時(shí)器工作,計(jì)算回波的時(shí)間,進(jìn)而s=vt算出距離
  32. */
  33. void TimerInit()          //初始化,定時(shí)10us
  34. {
  35.     TMOD = 0x09;         
  36.     TH0 = 0xFF;
  37.     TL0 = 0x9C;
  38.     EA = 1;
  39.     ET0 = 1;
  40.     TR0 = 1;
  41. }

  42. void Timer0() interrupt 1          //中斷 每過(guò)100us,num+1
  43. {
  44.     TH0 = 0xFF;
  45.     TL0 = 0x9C;
  46.         num++;
  47. }

  48. void value_distance()
  49. {
  50.         trig=0;
  51.         echo=0;
  52.         delay1ms(1);
  53.         trig=1;
  54.         delay1ms(11); //給trig一個(gè)10us以上的高電平信號(hào)
  55.         trig=0;
  56.         if(echo==1)           //如果有反射回的超聲波,echo腳會(huì)在這期間持續(xù)輸入高電平
  57.         {
  58.                 delay1ms(300);                //接收超聲波期間不做任何動(dòng)作。
  59.         }
  60.         distance=num*cm_per_num/2;   //計(jì)算距離,單位CM
  61.         num=0;
  62.                
  63. }

  64. void datapros()                         //對(duì)取得的距離進(jìn)行處理
  65. {
  66.         float a= distance*100;       
  67.         DisplayData[0]=smgduan[(int)a%10];
  68.         DisplayData[1]=smgduan[(int)a%100/10];
  69.         DisplayData[2]=smgduan[(int)a%1000/100]+0x80;         //數(shù)字+小數(shù)點(diǎn)
  70.         DisplayData[3]=smgduan[(int)a%10000/1000];
  71.         DisplayData[4]=smgduan[(int)a/10000];       
  72.                
  73. }

  74. void DigDisplay()                           //數(shù)碼管顯示
  75. {
  76.         uchar i;
  77.         for(i=0;i<6;i++)
  78.         {
  79.                 switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  80.                 {
  81.                         case(0):
  82.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  83.                         case(1):
  84.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  85.                         case(2):
  86.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  87.                         case(3):
  88.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  89.                         case(4):
  90.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  91.                         case(5):
  92.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  93.                 }
  94.                 P0=DisplayData[i];//發(fā)送段碼
  95.                 delay1ms(1); //間隔一段時(shí)間掃描       
  96.                 P0=0x00;//消隱
  97.         }
  98. }

  99. void main()
  100. {
  101.         while(1)
  102.         {
  103.                 TimerInit();
  104.                 value_distance();
  105.                 datapros();
  106.                 DigDisplay();
  107.         }
  108. }
復(fù)制代碼

這是我以前寫(xiě)的,測(cè)試過(guò),是可以正常工作,并顯示距離的。
回復(fù)

使用道具 舉報(bào)

ID:895440 發(fā)表于 2021-4-23 08:02 | 顯示全部樓層
gnd接地,vcc接高電平的。剩下兩個(gè)看程序端口定義接
回復(fù)

使用道具 舉報(bào)

ID:844772 發(fā)表于 2021-4-23 09:25 | 顯示全部樓層
你主要不是接線(xiàn)問(wèn)題,用的超聲測(cè)距模塊US-015,不是IIC設(shè)備,不能按你的程序使用,二樓的是正確的。
回復(fù)

使用道具 舉報(bào)

ID:838572 發(fā)表于 2021-11-29 17:06 | 顯示全部樓層
Trig Echo腳接好就行
回復(fù)

使用道具 舉報(bào)

ID:523803 發(fā)表于 2021-12-12 23:43 | 顯示全部樓層
你那個(gè)超聲波模塊不是IIC協(xié)議的好像
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表