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

QQ登錄

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

搜索
查看: 15541|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

HC-SR04超聲波測(cè)距模塊接線圖和程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
接線圖:


單片機(jī)程序:
  1. #include <AT89X52.h>       //調(diào)用51單片機(jī)的頭文件
  2. #include <intrins.h>
  3. #include <math.h>
  4. //---------------------------------------
  5. //1602液晶相關(guān)I/O設(shè)置
  6. sbit E=P2^3;               //1602液晶的E腳接在P2.3口上
  7. sbit RW=P2^4;              //1602液晶的RW腳接在P2.4口上
  8. sbit RS=P2^5;              //1602液晶的RS腳接在P2.5口上
  9. //---------------------------------------
  10. //---------------------------------------
  11. //HC-SR04相關(guān)I/O設(shè)置
  12. sbit TIRG=P3^4;                   //定義IO口,具體可以去查看原理圖
  13. sbit ECHO=P3^2;                   //定義IO口,具體可以去查看原理圖        
  14. //---------------------------------------         
  15. bit      flag =0;
  16. unsigned char k;
  17. //---------------------------------------
  18. //名稱:1602液晶用延時(shí)函數(shù)
  19. //---------------------------------------
  20. void Delay1602(unsigned int t)
  21. {
  22.      unsigned int k;      //定義一個(gè)16位寄存器用來(lái)做延時(shí)用
  23.      for(k=0;k<t;k++);    //延時(shí)
  24. }

  25. //---------------------------------------
  26. //名稱:1602液晶忙檢測(cè)函數(shù)
  27. //---------------------------------------
  28. void LCD1602_busy(void)
  29. {
  30.      P0_7=1;              //將P0.7置1,為讀狀態(tài)做準(zhǔn)備
  31.      RS=0;                //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
  32.      RW=1;                //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
  33.      E=1;                 //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
  34.      while(P0_7==1);      //由P0.7讀入1,表示1602液晶忙,需要等待
  35.      E=0;                 //讀完以后,恢復(fù)E的電平
  36. }

  37. //---------------------------------------
  38. //名稱:1600寫命令函數(shù)
  39. //---------------------------------------
  40. void LCD1602_Write_com(unsigned char combuf)
  41. {
  42.      RS=0;                //選擇指令寄存器
  43.      RW=0;                //選擇寫狀態(tài)
  44.      P0=combuf;           //將命令字通過(guò)P0口送至DB
  45.      E=1;                 //E高電平將命令字寫入1602液晶
  46.      E=0;                 //寫完以后,恢復(fù)E的電平
  47. }

  48. //---------------------------------------
  49. //名稱:1602寫命令函數(shù)(帶忙檢測(cè))
  50. //---------------------------------------
  51. void LCD1602_Write_com_busy(unsigned char combuf)
  52. {
  53.      LCD1602_busy();            //調(diào)用忙檢測(cè)函數(shù)
  54.      LCD1602_Write_com(combuf); //調(diào)用忙檢測(cè)函數(shù)
  55. }

  56. //---------------------------------------
  57. //名稱:1602寫數(shù)據(jù)函數(shù)(帶忙檢測(cè))
  58. ------------------------
  59. void LCD1602_Write_data_busy(unsigned char databuf)
  60. {
  61.      LCD1602_busy();      //調(diào)用忙檢測(cè)函數(shù)
  62.      RS=1;                //選擇數(shù)據(jù)寄存器
  63.      RW=0;                //選擇寫狀態(tài)
  64.      P0=databuf;          //將命令字通過(guò)P0口送至DB
  65.      E=1;                 //E高電平將命令字寫入1602液晶
  66.      E=0;                 //寫完以后,恢復(fù)E的電平
  67. }

  68. //---------------------------------------
  69. //名稱:1602液晶顯示地址寫函數(shù)
  70. //---------------------------------------
  71. void LCD1602_Write_address(unsigned char x,unsigned char y)
  72. {
  73.      x&=0x0f;             //列地址限制在0-15間
  74.      y&=0x01;             //行地址限制在0-1間
  75.      if(y==0)             //如果是第一行
  76.          LCD1602_Write_com_busy(x|0x80);        //將列地址寫入
  77.      else                 //如果是第二行
  78.          LCD1602_Write_com_busy((x+0x40)|0x80); //將列地址寫入
  79. }

  80. //---------------------------------------
  81. //名稱:1602液晶初始化函數(shù)
  82. //---------------------------------------
  83. void LCD1602_init(void)
  84. {
  85.      Delay1602(1500);               //調(diào)用延時(shí)函數(shù)
  86.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  87.      Delay1602(500);                //調(diào)用延時(shí)函數(shù)
  88.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  89.      Delay1602(500);                //調(diào)用延時(shí)函數(shù)
  90.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  91.      LCD1602_Write_com_busy(0x38);  //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  92.      LCD1602_Write_com_busy(0x08);  //顯示功能關(guān),無(wú)光標(biāo)
  93.      LCD1602_Write_com_busy(0x01);  //清屏
  94.      LCD1602_Write_com_busy(0x06);  //寫入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動(dòng)
  95.      LCD1602_Write_com_busy(0x0C);  //顯示功能開(kāi),無(wú)光標(biāo)
  96. }

  97. //---------------------------------------
  98. //名稱:1602液晶指定地址顯示函數(shù)
  99. //---------------------------------------
  100. void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
  101. {
  102.      LCD1602_Write_address(x,y);    //先將地址信息寫入
  103.      LCD1602_Write_data_busy(buf);  //再寫入要顯示的數(shù)據(jù)
  104. }
  105. //---------------------------------------
  106. //名稱:定時(shí)器0中斷服務(wù)程序
  107. //---------------------------------------
  108. void Timer0(void) interrupt 1
  109. {                       
  110.    //***此處用戶自行添加定時(shí)器T0中斷處理程序***
  111.         flag=0;
  112.    //******************************************
  113. }
  114. //---------------------------------------
  115. //名稱: 主函數(shù)
  116. -----------------------
  117. void main(void)            //主函數(shù),單片機(jī)開(kāi)機(jī)后就是從這個(gè)函數(shù)開(kāi)始運(yùn)行
  118. {
  119.         long S;
  120.         unsigned int i;
  121.         unsigned int  Timeout;
  122.    LCD1602_init();        //調(diào)用1602液晶初始化函數(shù)
  123.         //***定時(shí)器Timer0初始化***
  124.    TMOD&=0xF0;                    //將TMOD的低4位定時(shí)器0控制部分清零
  125.    TMOD|=0x01;                    //設(shè)置定時(shí)器0為方式1
  126.         TMOD=0x01;
  127.    TL0=0;                              //設(shè)置定時(shí)器0初值低8位
  128.    TH0=0;                              //設(shè)置定時(shí)器0初值高8位
  129.    TR0=0;                         //停止定時(shí)器0
  130.    ET0=1;                         //Timer0中斷允許
  131.    //**********************
  132.    //***開(kāi)全局中斷設(shè)置****
  133.    //定時(shí)器Timer0設(shè)置了中斷允許,此處要開(kāi)全局中斷
  134.    EA=1;                          //開(kāi)全局中斷
  135.    //*********************
  136.         while(1)
  137.         {               
  138.                 TIRG=1;                                             //發(fā)一個(gè)脈沖觸發(fā)信號(hào)
  139.                   i=4;                                             //維持約17US,符合不低于10US的要求
  140.       while(i>0)                                  //維持約17US,符合不低于10US的要求
  141.               i--;                                     //維持約17US,符合不低于10US的要求               
  142.                   TIRG=0;                                             //撤銷觸發(fā)信號(hào)
  143.                 TR0=0;                                                //關(guān)閉定時(shí)器
  144.                 TL0=0;                             //設(shè)置定時(shí)器0初值低8位為0
  145.            TH0=0;                              //設(shè)置定時(shí)器0初值高8位為0
  146.                 k=0;                         //清除溢出標(biāo)志
  147.                 flag=0;
  148.                 Timeout=0;
  149.            while((ECHO==0)&&((Timeout++)<50000));                                //等待回響高電平               
  150.            TR0=1;                                            //回響高電平來(lái)后啟動(dòng)定時(shí)器
  151.                 Timeout=0;
  152.            while((ECHO==1)&&((Timeout++)<50000));                                //等待回響高電平結(jié)束后
  153.            TR0=0;                                                //關(guān)閉定時(shí)器
  154.       S=((TH0*256+TL0)*0.5425)/58;        
  155.                 if(flag==1||S>400)                //超出測(cè)量范圍顯示“-”
  156.                 {                                                         
  157.                            LCD1602_Disp(0, 0, '-');                                  //顯示百位-
  158.                            LCD1602_Disp(1, 0, '-');                                  //顯示十位-
  159.                            LCD1602_Disp(2, 0, '-');                                  //顯示個(gè)位-
  160.                            LCD1602_Disp(3, 0, 'C');                                  //顯示C
  161.                            LCD1602_Disp(4, 0, 'M');                                //顯示M
  162.                 }
  163.                 else                                                                  
  164.                 {                           
  165.                                 LCD1602_Disp(0, 0, S%1000/100+'0');                  //顯示百位
  166.                            LCD1602_Disp(1, 0, S%1000%100/10+'0');  //顯示十位
  167.                            LCD1602_Disp(2, 0, S%1000%100%10+'0');        //顯示個(gè)位
  168.                            LCD1602_Disp(3, 0, 'C');                                          //顯示C
  169.                            LCD1602_Disp(4, 0, 'M');                                        //顯示M
  170.                 }
  171.                 i=18000;                                          //維持約77400US,符合不低于60MS的要求
  172.       while(i>0)                                  //維持約77400US,符合不低于60MS的要求
  173.               i--;                                     //維持約77400US,符合不低于60MS的要求

  174.         }
  175. }



復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:89286 發(fā)表于 2017-7-12 20:19 | 只看該作者
此帖僅作者可見(jiàn)

使用道具 舉報(bào)

板凳
ID:238009 發(fā)表于 2017-10-11 15:05 | 只看該作者
此帖僅作者可見(jiàn)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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