标题: 程序资料齐全的51单片机的液晶显示超声波测距仪 [打印本页]

作者: dzdiy    时间: 2015-4-11 19:24
标题: 程序资料齐全的51单片机的液晶显示超声波测距仪
     这款基于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. }

复制代码



作者: 6ningning    时间: 2015-4-12 14:32
学习了。谢谢。
作者: 小坤--    时间: 2015-4-14 14:34
感谢分享
作者: 51单片机丶    时间: 2015-4-16 21:19
来看看
作者: mybigapple    时间: 2015-4-16 22:01
你这个方式好。有简介,有图片,有直接可见代码。好!
作者: rthua    时间: 2015-4-17 01:10
很好,有时间自己动手做一个
作者: rthua    时间: 2015-4-17 08:26
这个和另外一个有什么区别
作者: sppcb    时间: 2015-4-17 09:33

作者: y6711    时间: 2015-5-12 22:02
没有电路图之类的吗
作者: msyfhdlhs    时间: 2015-5-15 00:25
谢谢楼主
作者: 1678    时间: 2015-8-7 19:14
高手  就是不一样 啊   
作者: 麒-麟    时间: 2015-8-7 22:25
兄弟。可以拍一个后面图吗或电路图。谢谢。
作者: Karry的晴川    时间: 2015-12-3 13:48
可惜没有原理图
作者: 残梦忆殇    时间: 2016-4-5 12:46
楼主右上角那个是温度补偿吗
作者: 3350775227    时间: 2016-5-16 14:30
楼主,用hc-sr04的可以不

作者: FANGWEI    时间: 2016-6-17 07:13
很好,有时间自己动手做一个
作者: qiyezao    时间: 2016-7-1 14:01
没有电路图吗?
作者: lb688    时间: 2016-7-7 16:49
好资料。。。
作者: 走狗    时间: 2016-12-23 18:54
有接线图嘛
作者: chp    时间: 2017-9-29 20:52
实用   感谢分享
作者: mmbo321000    时间: 2017-11-18 20:50
谢谢无私分享!!
作者: journey@    时间: 2018-4-28 23:20
楼主,请问你这个最远能测多少米
作者: ufot    时间: 2018-6-3 12:51
感谢分享,最近刚好要做这个实训
作者: ufot    时间: 2018-6-3 13:05
谢谢分享,刚好要做这个实训,正愁代码怎么弄呢
作者: smartphone    时间: 2018-6-5 08:58
好制作 谢谢提供
作者: Away88    时间: 2018-9-25 16:39
没有原理图吗?
作者: Away88    时间: 2018-9-25 16:39
我想看看原理图,学习一下可以吗
作者: 油炸小4562    时间: 2018-10-9 15:22

很有用,谢谢分享
作者: 195470880    时间: 2020-5-14 22:08
我想看看原理图,学习一下可以吗?谢谢分享!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1