標題: SR-04超聲波測距1602顯示,已經(jīng)調(diào)試成功 [打印本頁]

作者: 釣魚瘋子    時間: 2015-8-9 20:38
標題: SR-04超聲波測距1602顯示,已經(jīng)調(diào)試成功
本人親自調(diào)試成功,顯示穩(wěn)定,準確,歡迎大家一起學(xué)習(xí)!

超聲波測距1602顯示.rar (992.77 KB, 下載次數(shù): 205)

  1. #include<reg52.h>   
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit rs=P2^4;            //1602的數(shù)據(jù)/指令選擇控制線
  6. sbit rw=P2^5;           //1602的讀寫控制線
  7. sbit en=P2^6;          //1602的使能控制線

  8. sbit trig=P1^0;      //超聲波測距模塊Trig
  9. sbit echo=P1^1;     //超聲波測距模塊Echo
  10. bit flag1;         //觸發(fā)信號標志位//

  11. uchar count;           //中斷累加變量
  12. long int distance;    //測量所得距離

  13. unsigned char code table[ ]={"0123456789"}; //定義字符數(shù)組顯示數(shù)字

  14. /*------------------------------------------------
  15.                   延時函數(shù)
  16. ------------------------------------------------*/
  17. void delay(uint n)                           
  18. {
  19.     uint x,y;  
  20.     for(x=n;x>0;x--)
  21.     for(y=110;y>0;y--);
  22. }


  23. /*------------------------------------------------
  24.                   延時函數(shù)
  25. ------------------------------------------------*/
  26. void delayt(uint x)
  27. {
  28.     uchar j;
  29.     while(x-- > 0)
  30.     {
  31.               for(j = 0;j < 125;j++)
  32.         {
  33.           ;
  34.         }
  35.     }
  36. }


  37. /*------------------------------------------------
  38.                 1602寫命令函數(shù)
  39. ------------------------------------------------*/
  40. void lcd_wcom(uchar com)            
  41. {
  42.     rs=0;                //選擇指令寄存器
  43.     rw=0;               //選擇寫
  44.     P0=com;            //把命令字送入P0
  45.     delay(5);         //延時一小會兒,讓1602準備接收數(shù)據(jù)
  46.     en=1;            //使能線電平變化,命令送入1602的8位數(shù)據(jù)口,這點非常重要
  47.     en=0;
  48. }


  49. /*------------------------------------------------
  50.                1602寫數(shù)據(jù)函數(shù)   
  51. ------------------------------------------------*/
  52. void lcd_wdat(uchar dat)        
  53. {
  54.     rs=1;             //選擇數(shù)據(jù)寄存器
  55.     rw=0;            //選擇寫
  56.     P0=dat;         //把要顯示的數(shù)據(jù)送入P0
  57.     delay(5);      //延時一小會兒,讓1602準備接收數(shù)據(jù),也就是檢測忙信號,這點非常重要。
  58.     en=1;         //使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口
  59.     en=0;
  60.   }


  61. /*------------------------------------------------
  62.                 1602初始化函數(shù)      
  63. ------------------------------------------------*/
  64. void lcd_init()              
  65. {
  66.     lcd_wcom(0x38);       //8位數(shù)據(jù),雙列,5*7字形  ,用到功能設(shè)定指令     
  67.     lcd_wcom(0x0c);      //開啟顯示屏,關(guān)光標,光標不閃爍,用到顯示開關(guān)控制指令
  68.     lcd_wcom(0x06);     //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位,用到了寫入模式設(shè)置指令
  69.     lcd_wcom(0x01);    //清屏,用到了清屏指令
  70. }


  71. /*------------------------------------------------
  72.               1602顯示固定字符函數(shù)      
  73. ------------------------------------------------*/
  74. void lcd_xianshi()              
  75. {
  76.     lcd_wcom(0x80+0x40);
  77.         lcd_wdat('D');
  78.         lcd_wdat('i');
  79.         lcd_wdat('s');
  80.         lcd_wdat('t');
  81.         lcd_wdat('a');
  82.            lcd_wdat('n');
  83.         lcd_wdat('c');
  84.         lcd_wdat('e');
  85.         lcd_wdat(':');
  86.         lcd_wcom(0x80+0x4c);
  87.         lcd_wdat('.');
  88.         lcd_wcom(0x80+0x4e);//單位是厘米//
  89.         lcd_wdat('c');
  90.         lcd_wdat('m');

  91. }


  92. /*------------------------------------------------
  93. 定時器0初始化,用于計算響應(yīng)信號時間
  94. ------------------------------------------------*/
  95. void init_t0()
  96. {
  97.         TMOD=0x01;         
  98.         TL0=0x66;
  99.         TH0=0xfc;              //1ms
  100.     ET0=1;             
  101.         EA=1;                     
  102. }


  103. /*------------------------------------------------
  104.     超聲波模塊觸發(fā)信號
  105. ------------------------------------------------*/
  106. void trigger()
  107. {
  108.     trig=1;
  109.         delayt(1);
  110.         trig=0;       
  111. }


  112. /*------------------------------------------------
  113.    超聲波模塊相應(yīng)端口初始化函數(shù)
  114. ------------------------------------------------*/
  115. void init_measuring()
  116. {
  117.         trig=0;
  118.         echo=0;
  119.         count=0;
  120. }


  121. /*------------------------------------------------
  122.      超聲波模塊距離測試函數(shù)
  123. ------------------------------------------------*/
  124. void measuring()
  125. {
  126.         uchar l;
  127.         uint h,y;
  128.         TR0 = 1;
  129.         while(echo)
  130.     {
  131.         ;
  132.     }       
  133.         TR0 = 0;
  134.         l = TL0;
  135.         h = TH0;
  136.         y = (h << 8) + l;
  137.         y = y - 0xfc66;//us部分
  138.         distance = y + 1000 * count;//計算總時間,單位是微秒
  139.         TL0 = 0x66;
  140.         TH0 = 0xfc;
  141.         delayt(30);
  142.         distance = 3453* distance / 20000;//原始為:(0.34毫米/us)*時間/2//       
  143. }


  144. /*------------------------------------------------
  145.    超聲波模塊測量結(jié)果顯示函數(shù)
  146. ------------------------------------------------*/
  147. void display(uint x)
  148. {
  149.         uchar qian,bai,shi,ge;
  150.         qian=x/1000;
  151.         bai=(x/100)%10;
  152.         shi=(x/10)%10;
  153.         ge=x%10;

  154.         lcd_wcom(0x80+0x49);//單位是厘米//
  155.         lcd_wdat(table[qian]);
  156.         lcd_wdat(table[bai]);
  157.         lcd_wdat(table[shi]);
  158.         lcd_wcom(0x80+0x4d);
  159.         lcd_wdat(table[ge]);
  160. }

  161. /*------------------------------------------------
  162.               主函數(shù)
  163. ------------------------------------------------*/
  164. void main()            
  165. {   lcd_init();          //液晶初始化        
  166.     init_t0();          //定時器0初始化   
  167.         init_measuring();  //超聲波相應(yīng)端口初始化


  168.         while(1)
  169.         {
  170.         lcd_xianshi();   //液晶顯示特定字符
  171.         trigger();      //觸發(fā)超聲波啟動

  172.                  while(echo==0)          //等待回聲
  173.          {
  174.            ;
  175.          }

  176.                  measuring();           //進行距離測量
  177.                  display(distance);    //對測量結(jié)果進行顯示
  178.                  init_measuring();    //超聲波相應(yīng)端口初始化
  179.                  delayt(600);        //每次測量間隔60ms
  180.         }
  181. }


  182. //……………………………………………中斷服務(wù)函數(shù)…………………………………………………//

  183. void T_0()interrupt 1
  184. {
  185.         TF0 = 0;
  186.         TL0 = 0x66;
  187.         TH0 = 0xfc;
  188.         count++;
  189.         if(count==18)
  190.         {
  191.           TR0 =0;
  192.           TL0 = 0x66;
  193.           TH0 = 0xfc;
  194.           count = 0;
  195.         }
  196. }

復(fù)制代碼



作者: tmjim    時間: 2015-12-30 19:44
鞋鞋。!
作者: 51黑plc    時間: 2016-3-12 01:17
這么好是程序竟然沒人贊。。。!找了很多超聲波測距然后1602顯示的程序,這個最好,結(jié)構(gòu)清晰,大師級水平
作者: fw911    時間: 2016-4-11 21:55
求接線方法
作者: 編程愛好者i    時間: 2016-4-12 18:12
感覺不行呀 用你的程序 利用超聲波來測距,物體移動后,超聲波傳感器測到的距離不會產(chǎn)生相應(yīng)的變化!  這是什么原因呀???
作者: HAISULING    時間: 2016-6-9 14:52
多謝樓主
作者: qq920188387    時間: 2016-12-10 14:20
很強!!樓主程序思路非常清晰!謝謝!
作者: 201511106109    時間: 2017-4-4 13:24
謝謝,中國好老師!
作者: 201511106109    時間: 2017-4-4 13:26
fw911 發(fā)表于 2016-4-11 21:55
求接線方法

接線你改下程序里的echo trig的端口號,還有你要改你的1602的,我的是成功了
作者: faridzled    時間: 2017-4-4 15:11
thanks for sharing
作者: dzbj    時間: 2017-4-4 16:52
很棒

請教樓主 這個模塊距離最大可以到多少
作者: 曉天狼星10    時間: 2017-4-4 22:57
程序很詳細

作者: 曉天狼星10    時間: 2017-4-4 22:58
程序很詳細
作者: 15936059539    時間: 2017-4-5 11:11
超聲波測距能測多遠啊
作者: jia142    時間: 2017-4-8 11:33
可以用
作者: 小猴子卡勒    時間: 2017-4-9 23:20
15936059539 發(fā)表于 2017-4-5 11:11
超聲波測距能測多遠啊

首先可能的最大距離(由超聲波模塊自身決定),實際最大距離(小于可能的最大距離)由程序決定,接受返回的超聲波的定時器最多計數(shù)18次,大概能知道收到最遠的超聲波花費時間,然后就能知道距離,這里面大概是309.xcm,達不到310cm,也就是三米多點
作者: 2568437477aa    時間: 2017-8-10 09:38
201511106109 發(fā)表于 2017-4-4 13:26
接線你改下程序里的echo trig的端口號,還有你要改你的1602的,我的是成功了

echo trig的借口有特定要求嗎?  主程序到接受回聲信號那里卡死了,沒有接收到回聲信號
作者: 維京    時間: 2017-8-10 19:56
有沒有控制2個超聲波的程序
作者: THY丶CITY    時間: 2018-5-6 14:41
好帖子,謝謝樓主
作者: li4673666776    時間: 2018-5-22 09:00
謝謝分享,對畢業(yè)設(shè)計很有幫助
作者: 564    時間: 2018-5-22 14:49
謝謝分享
作者: 忘川真涼    時間: 2018-11-17 10:43
謝謝樓主,已經(jīng)用上
作者: 鐵木榔頭    時間: 2018-12-8 21:52
感謝樓主,課程設(shè)計需要這個。
作者: 南京電子迷    時間: 2018-12-8 23:07
我有一個是畢業(yè)時的設(shè)計?梢砸源吮容^學(xué)習(xí)一下。
作者: meng28282111    時間: 2021-4-19 21:48
想知道用的是多少M的晶振,可惜不知道。。。
作者: 蕭薰兒的小迷弟    時間: 2021-4-22 20:30
超聲波模塊是US-015能用嗎,求告知 謝謝




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1