找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 20645|回复: 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. }

复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:68477 发表于 2015-4-12 14:32 | 只看该作者
学习了。谢谢。
回复

使用道具 举报

板凳
ID:76929 发表于 2015-4-14 14:34 | 只看该作者
感谢分享
回复

使用道具 举报

地板
ID:77078 发表于 2015-4-16 21:19 | 只看该作者
来看看
回复

使用道具 举报

5#
ID:43559 发表于 2015-4-16 22:01 | 只看该作者
你这个方式好。有简介,有图片,有直接可见代码。好!
回复

使用道具 举报

6#
ID:75934 发表于 2015-4-17 01:10 | 只看该作者
很好,有时间自己动手做一个
回复

使用道具 举报

7#
ID:75934 发表于 2015-4-17 08:26 | 只看该作者
这个和另外一个有什么区别
回复

使用道具 举报

8#
ID:77023 发表于 2015-4-17 09:33 | 只看该作者
回复

使用道具 举报

9#
ID:79703 发表于 2015-5-12 22:02 | 只看该作者
没有电路图之类的吗
回复

使用道具 举报

10#
ID:80034 发表于 2015-5-15 00:25 来自手机 | 只看该作者
谢谢楼主
回复

使用道具 举报

11#
ID:86621 发表于 2015-8-7 19:14 | 只看该作者
高手  就是不一样 啊   
回复

使用道具 举报

12#
ID:87890 发表于 2015-8-7 22:25 来自手机 | 只看该作者
兄弟。可以拍一个后面图吗或电路图。谢谢。
回复

使用道具 举报

13#
ID:97758 发表于 2015-12-3 13:48 | 只看该作者
可惜没有原理图
回复

使用道具 举报

14#
ID:112308 发表于 2016-4-5 12:46 | 只看该作者
楼主右上角那个是温度补偿吗
回复

使用道具 举报

15#
ID:118934 发表于 2016-5-16 14:30 | 只看该作者
楼主,用hc-sr04的可以不
回复

使用道具 举报

16#
ID:123930 发表于 2016-6-17 07:13 | 只看该作者
很好,有时间自己动手做一个
回复

使用道具 举报

17#
ID:128560 发表于 2016-7-1 14:01 | 只看该作者
没有电路图吗?
回复

使用道具 举报

18#
ID:74143 发表于 2016-7-7 16:49 | 只看该作者
好资料。。。
回复

使用道具 举报

19#
ID:149771 发表于 2016-12-23 18:54 来自手机 | 只看该作者
有接线图嘛
回复

使用道具 举报

20#
ID:154271 发表于 2017-9-29 20:52 | 只看该作者
实用   感谢分享
回复

使用道具 举报

21#
ID:238744 发表于 2017-11-18 20:50 | 只看该作者
谢谢无私分享!!
回复

使用道具 举报

22#
ID:318694 发表于 2018-4-28 23:20 来自手机 | 只看该作者
楼主,请问你这个最远能测多少米
回复

使用道具 举报

23#
ID:343931 发表于 2018-6-3 12:51 | 只看该作者
感谢分享,最近刚好要做这个实训
回复

使用道具 举报

24#
ID:343931 发表于 2018-6-3 13:05 | 只看该作者
谢谢分享,刚好要做这个实训,正愁代码怎么弄呢
回复

使用道具 举报

25#
ID:53978 发表于 2018-6-5 08:58 | 只看该作者
好制作 谢谢提供
回复

使用道具 举报

26#
ID:400039 发表于 2018-9-25 16:39 来自手机 | 只看该作者
没有原理图吗?
回复

使用道具 举报

27#
ID:400039 发表于 2018-9-25 16:39 来自手机 | 只看该作者
我想看看原理图,学习一下可以吗
回复

使用道具 举报

28#
ID:407021 发表于 2018-10-9 15:22 | 只看该作者

很有用,谢谢分享
回复

使用道具 举报

29#
ID:159857 发表于 2020-5-14 22:08 | 只看该作者
我想看看原理图,学习一下可以吗?谢谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表