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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12278|回復: 9
收起左側

[經驗] 自編超聲波測距模塊(HC-SR04)STC單片機程序開源

  [復制鏈接]
ID:137255 發表于 2018-7-17 11:27 | 顯示全部樓層 |閱讀模式
各位朋友,大家好~  
       相信很多朋友都用過一款HC-SR04超聲波測距模塊,這個模塊售價很平民,某寶上僅4RMB左右:能測3-400cm,真的很不錯的。
      前一段時間,偶爾看到一款超聲波測距模塊(m**eblock的),控制方式與HC-SR04有所不同,硬件上是大同小異的,但售價非常有逼格。
      本菜出于好奇,在網上找了很久的資料,大多數都是講怎么使用HC-SR04模塊的,而我想找的資料是如何制作HC-SR04這個模塊,關鍵是模塊中STC單片機的程序。

1、原理部分
      HC-SR04這個模塊是2線制的(不包含電源線),
Echo與Trig,Trig負責接收10us以上的觸發信號,Echo則是輸出距離信號;下面是時序圖:
1.png
      而m**eblock的超聲波模塊采用1線制(不包含電源線),,Echo與Trig和二為一(SIG),在一定程度上節省了IO資源,SIG在收到觸發信號后采集并輸出距離信號,其時序圖與HC-SR04類似,使用起來略有不同,需要注意IO模式的轉換,而如果使用m**eblock官方提供的庫(Arduino)就非常簡單了;
             關于HC-SR04系列超聲波傳感器的介紹網上有很多的帖子,本菜不贅述了。


2、硬件部分:
      下面就先看一個原理圖吧,由于本菜的硬件不行,只是簡單的分析一下,有說錯的地方,歡迎大神們吐槽!

2.jpg 3.jpg
左邊是m**eblock的原理圖,右邊是HC-SR04的原理圖,可以看到,硬件部分的實現方式是大同小異的,下面以m**eblock為例。
      這里主要分成三個部分:
      1、主控IC部分:完成觸發信號的檢測、產生8個40KHz脈沖信號、檢測回波信號、輸出距離信號等;
      2、發射部分:由主控IC產生8個40KHz脈沖信號后,經過MAX232放大后驅動超聲波發射端;
      3、接收部分:將微弱的回波信號放大,送到主控IC的IO端檢測回波。

3、軟件部分
下面是程序思路,圍繞STC展開,說一下STC每個管腳的作用~
1、P30(SIG): 負責監測觸發信號;
   配置其為高阻輸入,可以輪詢其高低電平并使用Timer0(2),也可以輪詢高電平后使用INT4低電平,完成一個觸發脈沖的檢測(10us以上),一旦檢測到觸發信號,此管腳配置為推挽輸出,并拉低,當8個40KHz信號發送完成后將其拉高,等到回波到來。

2、P33(T2)、P32(T1):8個40KHz脈沖信號;
   配置為推挽輸出,當SIG檢測到觸發信號后,其同時發送8個40KHz信號,注意這兩個信號存在半個周期的相位差(重要。,發射完成之后將SIG拉高。

3、P31(T_PWR):MAX232供、斷電;
   配置其為推挽輸出;通過NPN控制232,低電平有效,只在8個40KHz脈沖信號時給232供電,防止雜波出現,232在這里起到一個驅動放大功率的作用;

4、P34(PWM): 比較電壓;
   一開始我以為這是一個PWM信號,后來發現我錯了,可以看一下電路圖中的放大器A,是作為一個比較器使用的。其實只要在檢測回波信號的時候將其拉高就行了。(目前我是這樣做的)

5、P35(CHK):回波檢測;
    配置為高阻輸入;可以利用INT3來檢測下降沿并使用Timer2(0)計算周期,并檢測回波頻率,判斷是否為發射出去的40KHz信號,檢測完成后將SIG拉高,完成一次測量。

    第一次發表這么長的開源貼子,歡迎大家吐槽(鼓勵~~),源代碼中幾乎每一條代碼后都跟有注釋,相信大家讀起來不會太費時間的。程序中難免有些處理不妥的地方,歡迎大家下載優化,記得分享您的成果哈~~~

單片機源程序如下:
  1. /*-----------------------------------------------
  2.   名稱:HC-SR04內源碼
  3.   版本:v1.1
  4.   編寫:XiaoKai
  5.         環境:MDK51 Pro V9.50a
  6.   日期:2017.2.23
  7.   修改:無
  8.   內容:超聲波測距模塊源碼
  9. ------------------------------------------------*/

  10. #include "main.h"

  11. bit TRRIG  = FALSE;  //標志是否接收到觸發信號:FALSE(否)、TRUE(是)
  12. /*------------------------------------------------
  13.                     主函數
  14. ------------------------------------------------*/
  15. void main (void)
  16. {
  17.         Clock_Init();  //系統時鐘初始化
  18.         GPIO_Init();  //GPIO 口初始化
  19.         Timer0_Init();  //Timer0 初始化,負責測量回波信號頻率
  20.         Timer2_Init();  //Timer2 初始化,負責測量觸發脈沖寬度
  21.         Exint3_Init();  //INT3 初始化,負責檢測回波信號
  22.         
  23.         DelayMs(10);  //延時等待完成
  24.         
  25.         while (1)  //主循環
  26.   {
  27.                 //---------------監測觸發信號-------------
  28.                 TRIGGER();
  29.                 //--------------監測到觸發信號------------
  30.                 if(TRRIG)
  31.                 {
  32.                         //------------P3.0 設置為推挽輸出----------
  33.                         P3M0 |=  (1 << 0);  //P3.0 設置為推挽輸出
  34.                         P3M1 &= ~(1 << 0);
  35.                         //-----------------拉低 SIG----------------
  36.                         SIG = LOW;  //SIG 由輸入模式變為輸出模式后默認輸出高
  37.                         //-----------發送 8 個 40KHz 信號----------
  38.                         EIGHT();  //發送脈沖后應該立即拉高SIG,這樣測量更加精準???
  39.                         //-----------------拉高 SIG----------------
  40.                         SIG = HIGH;  //發送完 8 個 40KHz 后,拉高 SIG 表示測量開始
  41.                         //----------開啟Timer0及接收INT3-----------
  42.                         INT_CLKO |= (1<<5);  //接收INT3
  43.                         //--------------等待 SIG 被拉低------------
  44.                         while(SIG)  //SIG 在 exint3.c 中被檢測
  45.                         {
  46.                                 //--------------比較電壓輸出高-----------
  47.                                 PWM = HIGH;  //P34輸出比較電壓,允許信號通過
  48.                         }
  49.                 }
  50.                 //-----------------拒收INT3----------------
  51.                 INT_CLKO &= ~(1<<5);  //拒收INT3
  52.                 //----------------關閉Timer2---------------
  53.                 TR0=0;  //關閉Timer0
  54.                 //---------------比較電壓輸出低------------
  55.                 PWM = LOW;//不允許信號通過
  56.                 //----------表示沒有接收到觸發信號---------
  57.                 TRRIG = FALSE;
  58.   }
  59. }
復制代碼
0.png

所有資料51hei提供下載:
HC-SR04-V1.2.zip (4.27 MB, 下載次數: 192)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:403531 發表于 2018-10-25 10:47 | 顯示全部樓層
psb.jpg
回復

使用道具 舉報

ID:343102 發表于 2018-10-25 19:39 | 顯示全部樓層
學習一下。樓主可以做個大功率的。
回復

使用道具 舉報

ID:393140 發表于 2019-4-8 22:45 | 顯示全部樓層
可以用嘛
回復

使用道具 舉報

ID:476328 發表于 2019-5-16 23:07 | 顯示全部樓層
寫的真棒 學習了
回復

使用道具 舉報

ID:725010 發表于 2020-4-8 18:43 | 顯示全部樓層
終于找到自編HC-04的制作方法了
回復

使用道具 舉報

ID:701637 發表于 2020-5-24 20:10 | 顯示全部樓層
STC的是編寫GPIO嗎
回復

使用道具 舉報

ID:284659 發表于 2020-6-4 17:07 | 顯示全部樓層
樓主自己驗證過嗎
回復

使用道具 舉報

ID:829442 發表于 2020-10-13 18:50 | 顯示全部樓層
誰親測過?
回復

使用道具 舉報

ID:241273 發表于 2021-10-20 10:50 | 顯示全部樓層
void exint3() interrupt 11  //INT3ÖD¶Ïèë¿ú
{
        INT_CLKO &= 0xDF;  
        INT_CLKO |= 0x20;  
       
        //T_PWR =!T_PWR;
        if(EX_COUNT > 2) EX_COUNT++;  //這里應該有問題吧      
        else EX_COUNT=0;
       
        if(TRRIG&&SIG)  
        {
                if(EX_COUNT == 1)
                {
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人国产精品久久久 | 国产中文字幕在线观看 | 欧美一区二区黄 | 成人免费影院 | 精品欧美| 日韩快播电影 | 久久精品男人的天堂 | 色免费在线视频 | 九九在线精品视频 | 亚洲永久精品国产 | 久久高清精品 | 五月天天色 | 久久在线免费 | 在线亚洲免费视频 | 国产成人精品一区二 | 免费视频一区二区 | 久久国产精品99久久久久久丝袜 | 久久精品视频亚洲 | 欧美一区二区三区在线观看 | 搞黄视频免费看 | 国产精品国产馆在线真实露脸 | 日韩一区二区三区在线观看 | 又黄又爽的网站 | 6080yy精品一区二区三区 | 成人午夜激情 | 色综合激情 | 国产精品激情 | 欧美日日 | 日本不卡高字幕在线2019 | 殴美成人在线视频 | 国产成人综合在线 | 日韩a| 亚洲成网 | 欧美成人aaa级毛片在线视频 | av黄色在线 | 一区二区电影网 | 91精品国产99| www.99热这里只有精品 | 二区久久 | 一级高清视频 | 欧美一区二区免费视频 |