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

QQ登錄

只需一步,快速開始

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

超聲波測(cè)距,液晶屏1602顯示的51單片機(jī)源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:101545 發(fā)表于 2023-3-22 14:20 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
超聲波測(cè)距,單片機(jī)51控制液晶屏1602顯示的源程序~
接線方法:(老版本就是板子沒有集成超聲波插座,需要自己I/O口接線)

VCC----VCC
TRIG---P1.0
ECHO---P3.2
GND----GND

單片機(jī)源程序如下:
  1. /******************
  2. *  晶振:11.0592MHZ
  3. ******************************************************************/
  4. /**********************************包含頭文件**********************************/
  5. #include <reg52.h>
  6. #include "1602.h"
  7. /************************************宏定義************************************/
  8. #define VELOCITY_30C        3495       //30攝氏度時(shí)的聲速,聲速V= 331.5 + 0.6*溫度;
  9. #define VELOCITY_23C        3453       //23攝氏度時(shí)的聲速,聲速V= 331.5 + 0.6*溫度;
  10. /************************************位定義************************************/
  11. sbit INPUT  = P3^2;                //回聲接收端口
  12. sbit OUTPUT = P1^0;                //超聲觸發(fā)端口
  13. sbit Beep   = P2^3 ;                           // 蜂鳴器 
  14. /********************************定義變量和數(shù)組********************************/
  15. long int distance=0;               //距離變量
  16. uchar table[]="    Welcome to   ";
  17. uchar table0[]=" 0000hjmcu0000  ";
  18. uchar table1[]="There's no echo.";
  19. uchar table2[]=" 0000hjmcu0000  ";
  20. uchar table3[]="Distance:";
  21. uchar count;
  22. /***********************************函數(shù)聲明***********************************/
  23. extern void initLCD();
  24. extern void write_date(uchar date);
  25. extern void write_com(uchar com);
  26. extern void delay(uint x);
  27. /******************************************************************************/
  28. /* 函數(shù)名稱  : Delay_xMs                                                      */
  29. /* 函數(shù)描述  : 延時(shí)函數(shù)                                                       */
  30. /* 輸入?yún)?shù)  : x                                                              */
  31. /* 參數(shù)描述  : 延時(shí)時(shí)間                                                       */
  32. /* 返回值    : 無                                                             */
  33. /******************************************************************************/
  34. void Delay_xMs(unsigned int x)
  35. {
  36.     unsigned int i,j;
  37.     for(i = 0;i < x;i++ )
  38.     {
  39.         for(j = 0;j < 3;j++ )
  40.         {
  41.             ;
  42.         }
  43.     }
  44. }
  45. /******************************************************************************/
  46. /* 函數(shù)名稱  : Alarm                                                          */
  47. /* 函數(shù)描述  : 蜂鳴器發(fā)聲函數(shù)                                                 */
  48. /* 輸入?yún)?shù)  : t                                                              */
  49. /* 參數(shù)描述  : 發(fā)聲的次數(shù)                                                     */
  50. /* 返回值    : 無                                                             */
  51. /******************************************************************************/
  52. void Alarm(uchar t)
  53. {
  54.         uchar i;
  55.         for(i = 0;i < t;i++)
  56.         {
  57.                 Beep = 0;
  58.                 Delay_xMs(1000);
  59.                 Beep = 1;
  60.                 Delay_xMs(1000);
  61.         }
  62. }        
  63. /******************************************************************************/
  64. /* 函數(shù)名稱  : delayt                                                         */
  65. /* 函數(shù)描述  : 延時(shí)函數(shù)                                                       */
  66. /* 輸入?yún)?shù)  : x                                                              */
  67. /* 參數(shù)描述  : 延時(shí)時(shí)間數(shù)據(jù)                                                   */
  68. /* 返回值    : 無                                                             */
  69. /******************************************************************************/        
  70. void delayt(uint x)
  71. {
  72.     uchar j;
  73.     while(x-- > 0)
  74.     {
  75.               for(j = 0;j < 125;j++)
  76.         {
  77.             ;
  78.         }
  79.     }
  80. }
  81. /******************************************************************************/
  82. /* 函數(shù)名稱  : Init_MCU                                                       */
  83. /* 函數(shù)描述  : 初始化單片機(jī)函數(shù)                                               */
  84. /* 輸入?yún)?shù)  : 無                                                             */
  85. /* 參數(shù)描述  : 無                                                             */
  86. /* 返回值    : 無                                                             */
  87. /******************************************************************************/
  88. void Init_MCU(void)
  89. {
  90.         TMOD = 0x01;          //定時(shí)器2初始化,設(shè)置為16位自動(dòng)重裝模式
  91.          TL0 = 0x66;
  92.         TH0 = 0xfc;              //1ms
  93.     ET0 = 1;              //開定時(shí)器2
  94.         EA = 1;                      //總中斷使能
  95. }
  96. /******************************************************************************/
  97. /* 函數(shù)名稱  : Init_Parameter                                                 */
  98. /* 函數(shù)描述  : 初始化參數(shù)和IO口函數(shù)                                           */
  99. /* 輸入?yún)?shù)  : 無                                                             */
  100. /* 參數(shù)描述  : 無                                                             */
  101. /* 返回值    : 無                                                             */
  102. /******************************************************************************/
  103. void Init_Parameter(void)
  104. {
  105.          OUTPUT =1;
  106.          INPUT = 1;
  107.          count = 0;
  108.          distance = 0;
  109. }
  110. /******************************************************************************/
  111. /* 函數(shù)名稱  : display_char                                                   */
  112. /* 函數(shù)描述  : 顯示字符串函數(shù)                                                 */
  113. /* 輸入?yún)?shù)  : point,address                                                  */
  114. /* 參數(shù)描述  : 寫入的字符串的地址指針 1602顯示對(duì)應(yīng)的地址                      */
  115. /* 返回值    : 無                                                             */
  116. /******************************************************************************/
  117. void display_char(uchar *point,uchar address)
  118. {
  119.         uchar i;
  120.         write_com(0x80 + address);
  121.         for(i = 0;i < 16; i++)
  122.         {
  123.                 write_date(*point);
  124.                 point++;
  125.         }
  126. }
  127. /******************************************************************************/
  128. /* 函數(shù)名稱  : display                                                        */
  129. /* 函數(shù)描述  : 顯示數(shù)字                                                       */
  130. /* 輸入?yún)?shù)  : number,address                                                */
  131. /* 參數(shù)描述  : number寫入的數(shù)據(jù),address地址                                  */
  132. /* 返回值    : 無                                                             */
  133. /******************************************************************************/        
  134. void display(int number,uchar address)
  135. {
  136.         uchar b,c,d,e;
  137.         b= (number / 1000);
  138.         c= (number / 100) % 10;
  139.         d = (number / 10) % 10;
  140.         e = number % 10;

  141.         write_com(0x80 + address);
  142.     write_date(b + 48);
  143.         write_date(c + 48);
  144.         write_date(d + 48);
  145.         write_date(46);           //小數(shù)點(diǎn)的ASCII
  146.         write_date(e + 48);
  147.     write_date(99);           //"c"的ASCII
  148.         write_date(109);          //"m"的ASCII
  149. }
  150. /******************************************************************************/
  151. /* 函數(shù)名稱  : Trig_SuperSonic                                                */
  152. /* 函數(shù)描述  : 發(fā)出聲波函數(shù)                                                   */
  153. /* 輸入?yún)?shù)  : 無                                                             */
  154. /* 參數(shù)描述  : 無                                                             */
  155. /* 返回值    : 無                                                             */
  156. /******************************************************************************/
  157. void Trig_SuperSonic(void)//出發(fā)聲波
  158. {
  159.          OUTPUT = 1;
  160.          delayt(1);
  161.          OUTPUT = 0;
  162. }
  163. /******************************************************************************/
  164. /* 函數(shù)名稱  : Measure_Distance                                               */
  165. /* 函數(shù)描述  : 計(jì)算距離函數(shù)                                                   */
  166. /* 輸入?yún)?shù)  : 無                                                             */
  167. /* 參數(shù)描述  : 無                                                             */
  168. /* 返回值    : 無                                                             */
  169. /******************************************************************************/
  170. void Measure_Distance(void)
  171. {
  172.         uchar l;
  173.         uint h,y;
  174.         TR0 = 1;
  175.         while(INPUT)
  176.     {
  177.         ;
  178.     }        
  179.         TR0 = 0;
  180.         l = TL0;
  181.         h = TH0;
  182.         y = (h << 8) + l;
  183.         y = y - 0xfc66;//us部分
  184.         distance = y + 1000 * count;//計(jì)算總時(shí)間
  185.         TL0 = 0x66;
  186.         TH0 = 0xfc;
  187.         delayt(30);
  188.         distance = VELOCITY_30C * distance / 20000;
  189. }
  190. /******************************************************************************/
  191. /* 函數(shù)名稱  : main                                                           */
  192. /* 函數(shù)描述  : 主函數(shù)                                                         */
  193. /* 輸入?yún)?shù)  : 無                                                             */
  194. /* 參數(shù)描述  : 無                                                             */
  195. /* 返回值    : 無                                                             */
  196. /******************************************************************************/                                       
  197. void main(void)
  198. {        
  199.     rw = 0;
  200.         initLCD();
  201.         Init_MCU();
  202.         Init_Parameter();
  203.         Alarm(2);
  204.         display_char(table,0x00);
  205.         display_char(table0,0x40);
  206.         Delay_xMs(30000);
  207.         display_char(table2,0x00);
  208.         display_char(table1,0x40);

  209.         while(1)
  210.         {
  211.                  Trig_SuperSonic();         //觸發(fā)超聲波發(fā)射
  212.                  while(INPUT == 0)          //等待回聲
  213.          {
  214.              ;
  215.          }
  216.                  Measure_Distance();        //計(jì)算脈寬并轉(zhuǎn)換為距離
  217.                  display_char(table3,0x40);
  218.                  display(distance,0x49);    //顯示距離
  219.                  Init_Parameter();          // 參數(shù)重新初始化
  220.                  delayt(100);               //延時(shí),兩次發(fā)射之間要至少有10ms間隔
  221.          }        
  222. }
  223. /******************************************************************************/
  224. /* 函數(shù)名稱  : timer0                                                         */
  225. /* 函數(shù)描述  : T0中斷處理函數(shù)                                                 */
  226. /* 輸入?yún)?shù)  : 無                                                             */
  227. /* 參數(shù)描述  : 無                                                             */
  228. /* 返回值    : 無                                                             */
  229. /******************************************************************************/
  230. void timer0 (void) interrupt 1
  231. {
  232.         TF0 = 0;
  233.         TL0 = 0x66;
  234.         TH0 = 0xfc;
  235.         count++;
  236.         if(count == 18)//超聲波回聲脈寬最多18ms
  237.         {
  238.                 TR0 =0;
  239.                 TL0 = 0x66;
  240.                 TH0 = 0xfc;
  241.                 count = 0;
  242.         }
  243. }
  244. /******************************************************************************/
復(fù)制代碼
Keil代碼下載:
程序.7z (124.54 KB, 下載次數(shù): 42)

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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