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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 22223|回復: 28
收起左側

程序資料齊全的51單片機的液晶顯示超聲波測距儀

  [復制鏈接]
ID:76686 發表于 2015-4-11 19:24 | 顯示全部樓層 |閱讀模式
     這款基于51單片機的液晶顯示超聲波測距儀,超聲波模塊使用的是US-100。這個基本上很常見的:通過一個矩形脈沖啟動超聲波,通過echo引腳計算出高電平的時間,這個已經有溫度補償!所以計算出來的時間是可以乘340m/s的。蜂鳴器用的是無源的,用PWM波就可以驅動啦!1k到5k。使用的液晶是1602液晶,以前也用過,實物圖如下圖所示:具體使用就不多說啦!下面是實物圖及源程序,貼出來方便大家仿制。



第一個文件:
  1. #ifndef _1602_H_

  2. #define _1602_H_

  3. #include "reg52.h"

  4. sbit RS=P1^0;

  5. sbit RW=P1^1;

  6. sbit EN=P1^2;


  7. void delay();

  8. void delay1(int z);

  9. void write_com(unsigned char com);

  10. void write_date(unsigned char date);

  11. void L1602_init();

  12. void L1602_char(unsigned char hang,unsigned char lie,char sign);

  13. void L1602_string(unsigned char hang,unsigned char lie,unsigned char *p);

  14. void L1602_int(unsigned char hang, unsigned char lie, int num);


  15. #endif

  16. #include "1602.H"

  17. #include "reg52.h"

  18. #define uint unsigned int

  19. #define uchar unsigned char

  20. void delay()

  21. {

  22.    int i,j;

  23.    for(i=1;i>0;i--)

  24.     for(j=15;j>0;j--);   

  25. }

  26. void delay1(int z)

  27. {

  28.    int i,j;

  29.    for(i=z;i>0;i--)

  30.     for(j=110;j>0;j--);   

  31. }

  32. void write_com(uchar com)

  33. {

  34.   P0 = com;

  35. RS = 0;

  36. RW = 0;//寫

  37. EN = 0;

  38. delay();

  39. EN = 1;

  40. delay();

  41. }

  42. void write_date(uchar date)

  43. {

  44. P0 = date;

  45. RS = 1;

  46. RW = 0;

  47. EN = 0;

  48. delay();

  49. EN = 1;

  50. delay();

  51. }

  52. void L1602_init()

  53. {

  54. write_com(0x01); //清屏

  55.     write_com(0x38); //顯示模式

  56. write_com(0x0c); //顯示和光標

  57. write_com(0x06); //地址指針設置

  58. }

  59. void L1602_char(uchar hang,uchar lie,char sign)//顯示單個字符

  60. {

  61. uchar a;

  62. if(hang == 1) a = 0x80;

  63. if(hang == 2) a = 0x80+0x40;

  64. a = a + lie - 1;

  65. write_com(a);//寫地址

  66.     write_date(sign); //寫數據

  67. }

  68. void L1602_string(uchar hang,uchar lie,uchar *p)  //顯示字符串

  69. {

  70. uchar a;

  71. if(hang == 1) a = 0x80;

  72. if(hang == 2) a = 0x80+0x40;

  73. a = a + lie - 1;

  74. write_com(a);

  75. while(1)

  76. {

  77. if(*p == '\0') break;

  78. write_date(*p);

  79. p++;

  80. }

  81. }


  82. void L1602_int(uchar hang, uchar lie, int num)

  83. {

  84.    uint temp;

  85.    uint gewei,shiwei,baiwei,xiaoshu;



  86.    temp = num;

  87.    baiwei = temp / 1000;

  88.    shiwei = temp % 1000 / 100;

  89.    gewei = temp % 100 / 10;

  90.    xiaoshu = temp % 10;

  91.    if (num>=1000)

  92.    {

  93.       L1602_char(hang, lie+1, baiwei+48);  

  94. L1602_char(hang, lie+2, shiwei+48);  

  95. L1602_char(hang, lie+3, gewei+48);

  96.       L1602_char(hang, lie+4, '.');

  97. L1602_char(hang, lie+5, xiaoshu+48);  

  98.    }

  99.    else if (num>=100)

  100.    {

  101.       

  102. L1602_char(hang, lie+1, ' ');

  103. L1602_char(hang, lie+2, shiwei+48);  

  104.       L1602_char(hang, lie+3, gewei+48);

  105.       L1602_char(hang, lie+4, '.');

  106. L1602_char(hang, lie+5, xiaoshu+48);  

  107.    }

  108.    else

  109. {  

  110. L1602_char(hang, lie+1, ' ');     

  111. L1602_char(hang, lie+2, ' ');

  112.       L1602_char(hang, lie+3, gewei+48);

  113.       L1602_char(hang, lie+4, '.');

  114. L1602_char(hang, lie+5, xiaoshu+48);   

  115.    }

  116. }
復制代碼



第2個文件:
  1. #include"1602.h"

  2. #define uchar unsigned char

  3. #define uint unsigned int


  4. sbit tring = P1^3; //超聲波控制端

  5. sbit echo = P3^2; //回波必須接在外部中斷引腳上

  6. sbit ledwarn = P2^0; //報警燈,低電平亮

  7. sbit beep = P2^1; //報警蜂鳴器


  8. uint displayCount;//顯示計數

  9. uint time = 0;//時間

  10. unsigned long  distance ;//距離

  11. float distancef;//浮點型的數據

  12. uint flagSucceed = 0; //測量成功標志位

  13. uint flagDisplay = 0; //開顯示標志位


  14. void delay_20us()

  15. {  

  16.     uchar i ;

  17.     for(i=0;i<140;i++);

  18. }


  19. void init_shuju()

  20.    {

  21.      tring = 0;

  22.      distance = 0;

  23.      displayCount = 0;   

  24.    }

  25. void init_waibu0()

  26.    {

  27.         IT0 = 0;           //外部引腳為低時觸發中斷

  28.         EX0=0;            //關閉外部中斷

  29.    }

  30. void timer0_Init()

  31. {

  32. TMOD = 0x11;    //定時器0和1工作在16位方式

  33.     TH0 = (65535-45872)/256;

  34. TL0 = (65535-45872)%6;

  35. TR0 = 1;        //啟動定時器

  36. ET0 = 1;        //允許定時器0中斷

  37. }

  38. void timer1_Init()

  39. {

  40. TMOD = 0x11; //定時器0和1工作在16位方式

  41. TH1 = 0;

  42. TL1 = 0;

  43. ET1 = 1;  //定時器1中斷允許


  44. }

  45. void wbzd0() interrupt 0//下降沿觸發

  46. {

  47.      time =TH1*256+TL1;    //取出定時器的值

  48.      flagSucceed = 1;      //置成功測量的標志

  49.      EX0=0; //關閉外部中斷

  50.    //  TR1=0;           

  51. }

  52. void timer0() interrupt 1  // 定時器0

  53. {

  54. TH0 = (65535-45872)/256;

  55. TL0 = (65535-45872)%6;

  56. displayCount ++;

  57. if (displayCount >= 20)  //1秒鐘顯示一次

  58. {

  59.    flagDisplay = 1; //開顯示

  60. displayCount = 0;   

  61. }

  62. }

  63. void  start_csb() //啟動csb模塊

  64. {

  65.    tring = 1;

  66.    delay_20us();

  67.    tring = 0;

  68. }

  69. void main()

  70. {

  71.     EA=0;

  72.     init_shuju();

  73.     init_waibu0();

  74.     timer0_Init();

  75.     timer1_Init();


  76.     L1602_init();

  77.     L1602_string(1,1,"welcome   my    ");

  78.     L1602_string(2,1,"test  distance  ");

  79.     delay1(1);


  80.     while(1)

  81.      {

  82.      EA=0;//關閉總中斷

  83.        start_csb();

  84.        while(echo==0);//變高則進入下一步

  85.         flagSucceed = 0;

  86.         TR1=1;   //啟動定時器1開始計數

  87.         EA = 1;

  88. EX0=1;

  89. TH1= 0;

  90. TL1= 0;

  91. TF1= 0;   //定時器1溢出標志位


  92. while (TH1<90) ;    //盲區

  93. TR1 = 0;           //關閉定時器1

  94. EX0 = 0;            //關閉外部中斷



  95.     if(flagSucceed==1)  //一次測試成功,則計算距離,單位為厘米

  96.    {

  97.            distancef = time * 1.085;//微妙為單位  

  98.            distancef /=58;//單位為厘米

  99.            distance = distancef*10+0.5;


  100.   //如果距離小于20cm,則聲光報警

  101.   if ((flagSucceed == 1) && (distance <= 200))

  102.   {

  103.      ledwarn = 0;

  104. beep = 0;

  105.               delay1(1);

  106. beep = 1;

  107.               delay1(1);

  108.   }           

  109.   else

  110.   {

  111.      ledwarn = 1;

  112. beep = 1;

  113.   }            

  114.         }

  115.     if (flagDisplay == 1)    //1秒顯示時間到

  116. {

  117.   if(flagSucceed==0)//沒有測試成功

  118.   {   

  119.              L1602_string(1,1," can't distance ");     

  120.              L1602_string(2,1,"    ------      ");   

  121.            }

  122.            else

  123.           {

  124.            //LCD顯示數據

  125.              L1602_string(1,1,"distance result:");

  126.              L1602_string(2,1,"          cm    ");

  127.              L1602_int(2,5,distance);

  128.           }

  129.           flagDisplay = 0;

  130.         }

  131.     }

  132. }

復制代碼


回復

使用道具 舉報

ID:68477 發表于 2015-4-12 14:32 | 顯示全部樓層
學習了。謝謝。
回復

使用道具 舉報

ID:76929 發表于 2015-4-14 14:34 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:77078 發表于 2015-4-16 21:19 | 顯示全部樓層
來看看
回復

使用道具 舉報

ID:43559 發表于 2015-4-16 22:01 | 顯示全部樓層
你這個方式好。有簡介,有圖片,有直接可見代碼。好!
回復

使用道具 舉報

ID:75934 發表于 2015-4-17 01:10 | 顯示全部樓層
很好,有時間自己動手做一個
回復

使用道具 舉報

ID:75934 發表于 2015-4-17 08:26 | 顯示全部樓層
這個和另外一個有什么區別
回復

使用道具 舉報

ID:77023 發表于 2015-4-17 09:33 | 顯示全部樓層
回復

使用道具 舉報

ID:79703 發表于 2015-5-12 22:02 | 顯示全部樓層
沒有電路圖之類的嗎
回復

使用道具 舉報

ID:80034 發表于 2015-5-15 00:25 來自手機 | 顯示全部樓層
謝謝樓主
回復

使用道具 舉報

ID:86621 發表于 2015-8-7 19:14 | 顯示全部樓層
高手  就是不一樣 啊   
回復

使用道具 舉報

ID:87890 發表于 2015-8-7 22:25 來自手機 | 顯示全部樓層
兄弟。可以拍一個后面圖嗎或電路圖。謝謝。
回復

使用道具 舉報

ID:97758 發表于 2015-12-3 13:48 | 顯示全部樓層
可惜沒有原理圖
回復

使用道具 舉報

ID:112308 發表于 2016-4-5 12:46 | 顯示全部樓層
樓主右上角那個是溫度補償嗎
回復

使用道具 舉報

ID:118934 發表于 2016-5-16 14:30 | 顯示全部樓層
樓主,用hc-sr04的可以不
回復

使用道具 舉報

ID:123930 發表于 2016-6-17 07:13 | 顯示全部樓層
很好,有時間自己動手做一個
回復

使用道具 舉報

ID:128560 發表于 2016-7-1 14:01 | 顯示全部樓層
沒有電路圖嗎?
回復

使用道具 舉報

ID:74143 發表于 2016-7-7 16:49 | 顯示全部樓層
好資料。。。
回復

使用道具 舉報

ID:149771 發表于 2016-12-23 18:54 來自手機 | 顯示全部樓層
有接線圖嘛
回復

使用道具 舉報

ID:154271 發表于 2017-9-29 20:52 | 顯示全部樓層
實用   感謝分享
回復

使用道具 舉報

ID:238744 發表于 2017-11-18 20:50 | 顯示全部樓層
謝謝無私分享!
回復

使用道具 舉報

ID:318694 發表于 2018-4-28 23:20 來自手機 | 顯示全部樓層
樓主,請問你這個最遠能測多少米
回復

使用道具 舉報

ID:343931 發表于 2018-6-3 12:51 | 顯示全部樓層
感謝分享,最近剛好要做這個實訓
回復

使用道具 舉報

ID:343931 發表于 2018-6-3 13:05 | 顯示全部樓層
謝謝分享,剛好要做這個實訓,正愁代碼怎么弄呢
回復

使用道具 舉報

ID:53978 發表于 2018-6-5 08:58 | 顯示全部樓層
好制作 謝謝提供
回復

使用道具 舉報

ID:400039 發表于 2018-9-25 16:39 來自手機 | 顯示全部樓層
沒有原理圖嗎?
回復

使用道具 舉報

ID:400039 發表于 2018-9-25 16:39 來自手機 | 顯示全部樓層
我想看看原理圖,學習一下可以嗎
回復

使用道具 舉報

ID:407021 發表于 2018-10-9 15:22 | 顯示全部樓層

很有用,謝謝分享
回復

使用道具 舉報

ID:159857 發表于 2020-5-14 22:08 | 顯示全部樓層
我想看看原理圖,學習一下可以嗎?謝謝分享!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 婷婷桃色网 | 99精品免费视频 | 精品久久久久一区二区国产 | 国产精品久久免费观看 | 黄色在线免费观看视频 | 99综合网 | 日本午夜视频 | 在线免费观看成人 | 国产黄色在线观看 | 日韩理论电影在线观看 | 久久99蜜桃综合影院免费观看 | 精品久久精品 | 国产精品久久久亚洲 | 欧美激情精品久久久久久免费 | 91免费入口 | 亚洲国产精品一区二区三区 | 久久久天堂 | 精品国产视频 | av网站观看| 亚洲国产精品人人爽夜夜爽 | 天天射色综合 | 欧美精品欧美精品系列 | 亚洲精品一区国语对白 | 中文字幕在线不卡播放 | 久久看精品| 99精品视频一区二区三区 | 精品国产欧美一区二区三区成人 | 日本超碰 | 亚洲网站在线播放 | 国产精品精品久久久 | 特黄毛片| 中文字幕在线视频免费视频 | 美女在线一区二区 | 日韩视频在线一区 | 免费在线观看一区二区 | 日本中文字幕日韩精品免费 | 亚洲精品视频免费观看 | 四虎影院欧美 | 午夜精品一区 | 国产成人免费在线 | 久久男女视频 |