久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2818|回復: 5
打印 上一主題 下一主題
收起左側

關于單片機超聲波測距,大佬們幫忙看看該加點啥,或者怎么改

[復制鏈接]
回帖獎勵 50 黑幣 回復本帖可獲得 10 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
我在讀大學,學習過單片機原理與應用,但是感覺不怎么懂這個東西,但對單片機是很感興趣的。
現在有打算弄一個超聲波測距顯示模塊,網上也買了一些硬件設備。
超聲波測距模塊是US-015,現在將一塊1602顯示屏裝在一個單片機開發板上。
在本論壇也搜了資料,找了找相關的編程資料。想請問現在怎么弄,能讓距離顯示出來。程序該加點什么條件。
硬件方面超聲波的四根線該接在開發板的哪里。
小白是真不太懂,希望有大佬能幫幫,感激不盡!

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

單片機源程序如下:
  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;                                                                //高電平數據,低電平命令
  8. sbit RW=P2^5;                                                                //讀寫控制腳,高電平讀,低電平寫
  9. sbit E=P2^7;                                                                //輸入使能
  10. sbit busy=P0^7;                                                                //忙信號檢測
  11. sbit SDA=P1^0;                                                                //I2C數據線
  12. sbit SCL=P1^1;                                                                //I2C時鐘線
  13. sbit Buzz=P1^2;                                                                //蜂鳴器控制腳
  14. sbit LED_G=P1^3;                                                        //綠色指示燈控制腳
  15. sbit LED_R=P1^4;                                                        //紅色指示燈控制腳
  16. uchar buf[6],dis_buf[6];                                        //數據緩沖區
  17. uint buffer[3];                                                                //測量距離存儲區
  18. uint dis;                                                                        //最小距離存儲器
  19. uchar code tab1[]={"距離障礙物:"};                        //顯示字符
  20. uchar code tab2[]={"無障礙物"};
  21. uchar code tab[]={"0123456789cm"};
  22. /*****************函數聲明*****************/
  23. void start_bit(void);                                                //I2C起始函數
  24. void stop_bit(void);                                                //I2C停止函數
  25. void mast_ack(void);                                                //主答函數
  26. bit write_8bit(uchar ch);                                        //I2C總線寫8位數據函數
  27. bit page_rd(uchar device,uint fir_ad,uint count,uchar *firw_ad);//I2C總線頁面讀函數
  28. uint measure(uchar device);                                        //啟動測距函數
  29. uint get_distance(void);                                        //讀測距值函數
  30. void judge(void);                                                        //判斷距離函數
  31. void init_lcd (void);                                                //LCD初始化函數
  32. void wr_lcd(uchar dat_comm,uchar content);//LCD寫數據函數
  33. void chk_busy (void);                                                //忙信號檢測
  34. void chn_disp(uchar code *chn,uchar pos,uchar n);//顯示提示漢字函數
  35. uchar dat_adj(uint dat1);                                        //顯示數據調整函數
  36. void disp_dist(uchar dat1);                                        //顯示距離函數
  37. void disp(void);                                                        //顯示函數
  38. void delay (uint us);                                                //延時函數
  39. void delay1 (uint ms);                                                //延時函數
  40. /*********************主程序***********************/
  41. void main ()
  42. {
  43.     init_lcd ();                                                        //初始化LCD
  44.     while (1)
  45.     {
  46.                 judge();                                                        //判斷障礙物距離
  47.                 disp();                                                                //顯示提示信息
  48.         }
  49. }
  50. /********************I2C起始函數*******************/
  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停止函數********************/
  59. void stop_bit(void)
  60. {
  61.     SDA=0;_nop_();
  62.     SCL=1;_nop_();
  63.     SDA=1;_nop_();
  64. }
  65. /****************I2C總線寫8位數據函數**************/
  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_();                                //獲取發送位數據
  74.         ch<<=1;
  75.         SCL=1;_nop_();
  76.         SCL=0;_nop_();
  77.     }
  78.     SDA=1;_nop_();
  79.     SCL=1;_nop_();
  80.     fan_w=SDA;                                                                        //應答位
  81.     SCL=0;_nop_();
  82.     return(fan_w);                                                                //返回應答位
  83. }
  84. /*****************I2C總線頁面讀函數****************/
  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);}//送器件地址,寫數據
  92.         if(write_8bit(fir_ad)!=0){stop_bit();return(0);}//送讀數據寄存器首地址
  93.         start_bit();
  94.         if(write_8bit(device|0x01)!=0){stop_bit();return(0);}//準備讀數據
  95.         while(count--)
  96.         {
  97.                 uchar i=8;
  98.                 while(i--)                                                                //讀入數據
  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();                                                                //主機產生應答位
  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數據傳送
  115.         return(1);
  116. }
  117. /*********************主答函數*********************/
  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. /********************測距函數******************/
  127. uint measure(uchar device)
  128. {
  129.         uint temp;
  130.         start_bit();                                                                //啟動I2C
  131.         while(!write_8bit(device));                                        //發器件地址
  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. /*******************求最小測距值函數*****************/
  141. uint get_distance(void)
  142. {
  143.         uint mix;
  144.         buffer[0]=measure(0xe0);                                        //讀左側測距值
  145.         buffer[1]=measure(0xe2);                                        //讀中間測距值
  146.         buffer[2]=measure(0xe4);                                        //讀右側測距值
  147.         if(buffer[0]<buffer[1])
  148.                 mix=buffer[0];
  149.         else
  150.                 mix=buffer[1];
  151.         if(mix>buffer[2])mix=buffer[2];                                //合并為一個16位數據
  152.         return(mix);
  153. }
  154. /*******************判斷距離函數*******************/
  155. void judge(void)
  156. {
  157.         dis=get_distance();                                                        //讀取測量距離最小值
  158.         if(dis<5000)
  159.         {
  160.                 LED_R=0;                                                                //紅色報警燈亮
  161.                 LED_G=1;                                                                //綠色報警燈滅
  162.         }        
  163.         else
  164.         {
  165.                 LED_R=1;                                                                //紅色報警燈滅
  166.                 LED_G=0;                                                                //綠色報警燈亮
  167.         }        
  168.         if(dis<3000)
  169.                 Buzz=0;                                                                        //蜂鳴器報警
  170.         else
  171.                 Buzz=1;                                                                        //蜂鳴器停止報警
  172. }
  173. /******************LCD初始化函數*******************/
  174. void init_lcd (void)
  175. {
  176.         wr_lcd (comm,0x30);                                                        //基本指令動作   
  177.         wr_lcd (comm,0x01);                                                        //清屏
  178.         wr_lcd (comm,0x06);                                                        //光標的移動方向
  179.         wr_lcd (comm,0x0c);                                                        //開顯示,關游標
  180. }
  181. /*******************LCD寫數據函數*****************/
  182. void wr_lcd (uchar dat_comm,uchar content)
  183. {
  184.         chk_busy ();
  185.         if(dat_comm)
  186.         {
  187.                 RS=1;                                                                        //數據
  188.                 RW=0;                                                                        //寫入
  189.         }
  190.         else
  191.         {
  192.                 RS=0;                                                                        //命令
  193.                 RW=0;                                                                        //寫入
  194.         }
  195.         P0=content;                                                                        //輸出數據或命令
  196.         E=1;
  197.         E=0;
  198. }
  199. /********************忙信號檢測********************/
  200. void chk_busy (void)
  201. {
  202.         P0=0xff;
  203.         RS=0;
  204.         RW=1;
  205.         E=1;
  206.         while(busy==1);                                                                //檢驗LCD是否處于忙狀態
  207.         E=0;
  208. }
  209. /****************顯示提示漢字函數******************/
  210. void chn_disp(uchar code *chn,uchar pos,uchar n)
  211. {
  212.         uchar i;
  213.         wr_lcd (comm,0x30);                                                        //基本指令動作
  214.         wr_lcd (comm,pos);                                                        //顯示位置
  215.         for (i=0;i<n;i++)
  216.                 wr_lcd (dat,chn[i]);
  217. }
  218. /****************顯示數據調整函數******************/
  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);                                //高度個位
  226.         dis_buf[4]=10;
  227.         for(i=0;i<3;i++)
  228.         {
  229.                 if(dis_buf[i]!=0)break;                                        //確定顯示位數
  230.         }
  231.         return(i);
  232. }
  233. /******************顯示距離函數********************/
  234. void disp_dist(uchar dat1)
  235. {
  236.         uchar temp,i;
  237.         if(dat1>5000)
  238.         {
  239.                 chn_disp(tab2,0x92,4);                                        //無障礙顯示
  240.         }
  241.         else
  242.         {
  243.                 temp=dat_adj(dat1);
  244.                 wr_lcd(comm,0x30);                                                //基本指令
  245.                 wr_lcd(comm,temp+0x92);                                        //設置顯示起始位置
  246.                 for (i=temp;i<6;i++)                                        //送顯示數據
  247.                         wr_lcd(dat,tab[dis_buf[i]]);
  248.         }
  249. }
  250. /********************顯示函數**********************/
  251. void disp(void)
  252. {
  253.         chn_disp(tab1,0x80,11);                                                //顯示提示漢字
  254.         disp_dist(dis);                                                                //顯示距離值
  255. }
  256. /********************延時函數**********************/
  257. void delay (uint us)
  258. {
  259.         while(us--);
  260. }
  261. /********************延時函數**********************/
  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. }
復制代碼


這是硬件設備,接線問題也求助一下下。



感激不盡感激不盡。。。。。。。。。。。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:585428 發表于 2021-4-23 07:58 | 只看該作者
  1. /*
  2. 接線方式:超聲波模塊trig接單片機P2^0 ,超聲波模塊echo接單片機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;                   //計時
  15. float distance;           //距離
  16. float cm_per_num=3.40; //按照我的定時器初始化設定,1個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. 設置工作方式為方式1,GATE=1,當中斷0口輸入1且TR0=1 時定時器工作
  29. 因為超聲波模塊的工作原理就是在接收回波時,從開始到結束,ech0=1
  30. 所以在單片機上用杜邦線將ech0的P21口和 中斷0口 P32口鏈接
  31. 使得在回波期間,定時器工作,計算回波的時間,進而s=vt算出距離
  32. */
  33. void TimerInit()          //初始化,定時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          //中斷 每過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一個10us以上的高電平信號
  55.         trig=0;
  56.         if(echo==1)           //如果有反射回的超聲波,echo腳會在這期間持續輸入高電平
  57.         {
  58.                 delay1ms(300);                //接收超聲波期間不做任何動作。
  59.         }
  60.         distance=num*cm_per_num/2;   //計算距離,單位CM
  61.         num=0;
  62.                
  63. }

  64. void datapros()                         //對取得的距離進行處理
  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;         //數字+小數點
  70.         DisplayData[3]=smgduan[(int)a%10000/1000];
  71.         DisplayData[4]=smgduan[(int)a/10000];       
  72.                
  73. }

  74. void DigDisplay()                           //數碼管顯示
  75. {
  76.         uchar i;
  77.         for(i=0;i<6;i++)
  78.         {
  79.                 switch(i)         //位選,選擇點亮的數碼管,
  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];//發送段碼
  95.                 delay1ms(1); //間隔一段時間掃描       
  96.                 P0=0x00;//消隱
  97.         }
  98. }

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

這是我以前寫的,測試過,是可以正常工作,并顯示距離的。
回復

使用道具 舉報

板凳
ID:895440 發表于 2021-4-23 08:02 | 只看該作者
gnd接地,vcc接高電平的。剩下兩個看程序端口定義接
回復

使用道具 舉報

地板
ID:844772 發表于 2021-4-23 09:25 | 只看該作者
你主要不是接線問題,用的超聲測距模塊US-015,不是IIC設備,不能按你的程序使用,二樓的是正確的。
回復

使用道具 舉報

5#
ID:838572 發表于 2021-11-29 17:06 | 只看該作者
Trig Echo腳接好就行
回復

使用道具 舉報

6#
ID:523803 發表于 2021-12-12 23:43 | 只看該作者
你那個超聲波模塊不是IIC協議的好像
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线观看成人 | h视频免费观看 | 久久免费观看一级毛片 | 日韩av一区二区在线观看 | 国产男人的天堂 | 欧美一级黄色片在线观看 | 有码在线| 九色 在线 | 久久久久久综合 | 欧美 日韩 在线播放 | 亚洲高清三级 | 成人在线播放网址 | 超碰免费在线观看 | 91 视频网站 | 精品成人av| 国产精品久久久久久久久久久久午夜片 | 亚洲小视频在线观看 | 亚洲精品国产成人 | 九九热在线视频免费观看 | 国产美女h视频 | 亚洲精品乱码久久久久久蜜桃91 | 久久久天天 | 日本一区二区不卡 | 久久久久亚洲精品 | 亚洲狠狠丁香婷婷综合久久久 | 欧美精品一区二区三区蜜桃视频 | 日日干夜夜操 | 国产精品乱码一区二区三区 | 久草电影网 | 天天狠狠| 日韩精品在线观看免费 | 美女131mm久久爽爽免费 | 日韩高清一区二区 | 久久久久久成人 | 国产伦精品一区二区三区精品视频 | 久久成人免费视频 | 国产91丝袜在线播放 | 国产精品国产三级国产aⅴ中文 | 久久91视频| 亚洲国产高清高潮精品美女 | 狠狠狠|