找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7423|回复: 25
打印 上一主题 下一主题
收起左侧

SR-04超声波测距1602显示,已经调试成功

  [复制链接]
跳转到指定楼层
楼主
本人亲自调试成功,显示稳定,准确,欢迎大家一起学习!

超声波测距1602显示.rar (992.77 KB, 下载次数: 204)

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

  5. sbit rs=P2^4;            //1602的数据/指令选择控制线
  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;         //触发信号标志位//

  11. uchar count;           //中断累加变量
  12. long int distance;    //测量所得距离

  13. unsigned char code table[ ]={"0123456789"}; //定义字符数组显示数字

  14. /*------------------------------------------------
  15.                   延时函数
  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.                   延时函数
  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写命令函数
  39. ------------------------------------------------*/
  40. void lcd_wcom(uchar com)            
  41. {
  42.     rs=0;                //选择指令寄存器
  43.     rw=0;               //选择写
  44.     P0=com;            //把命令字送入P0
  45.     delay(5);         //延时一小会儿,让1602准备接收数据
  46.     en=1;            //使能线电平变化,命令送入1602的8位数据口,这点非常重要
  47.     en=0;
  48. }


  49. /*------------------------------------------------
  50.                1602写数据函数   
  51. ------------------------------------------------*/
  52. void lcd_wdat(uchar dat)        
  53. {
  54.     rs=1;             //选择数据寄存器
  55.     rw=0;            //选择写
  56.     P0=dat;         //把要显示的数据送入P0
  57.     delay(5);      //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。
  58.     en=1;         //使能线电平变化,数据送入1602的8位数据口
  59.     en=0;
  60.   }


  61. /*------------------------------------------------
  62.                 1602初始化函数      
  63. ------------------------------------------------*/
  64. void lcd_init()              
  65. {
  66.     lcd_wcom(0x38);       //8位数据,双列,5*7字形  ,用到功能设定指令     
  67.     lcd_wcom(0x0c);      //开启显示屏,关光标,光标不闪烁,用到显示开关控制指令
  68.     lcd_wcom(0x06);     //显示地址递增,即写一个数据后,显示位置右移一位,用到了写入模式设置指令
  69.     lcd_wcom(0x01);    //清屏,用到了清屏指令
  70. }


  71. /*------------------------------------------------
  72.               1602显示固定字符函数      
  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初始化,用于计算响应信号时间
  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.     超声波模块触发信号
  105. ------------------------------------------------*/
  106. void trigger()
  107. {
  108.     trig=1;
  109.         delayt(1);
  110.         trig=0;       
  111. }


  112. /*------------------------------------------------
  113.    超声波模块相应端口初始化函数
  114. ------------------------------------------------*/
  115. void init_measuring()
  116. {
  117.         trig=0;
  118.         echo=0;
  119.         count=0;
  120. }


  121. /*------------------------------------------------
  122.      超声波模块距离测试函数
  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.    超声波模块测量结果显示函数
  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.               主函数
  163. ------------------------------------------------*/
  164. void main()            
  165. {   lcd_init();          //液晶初始化        
  166.     init_t0();          //定时器0初始化   
  167.         init_measuring();  //超声波相应端口初始化


  168.         while(1)
  169.         {
  170.         lcd_xianshi();   //液晶显示特定字符
  171.         trigger();      //触发超声波启动

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

  176.                  measuring();           //进行距离测量
  177.                  display(distance);    //对测量结果进行显示
  178.                  init_measuring();    //超声波相应端口初始化
  179.                  delayt(600);        //每次测量间隔60ms
  180.         }
  181. }


  182. //……………………………………………中断服务函数…………………………………………………//

  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. }

复制代码


评分

参与人数 1黑币 +5 收起 理由
201511106109 + 5 代码相当清晰

查看全部评分

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

使用道具 举报

沙发
ID:101262 发表于 2015-12-30 19:44 | 只看该作者
鞋鞋!!!
回复

使用道具 举报

板凳
ID:107593 发表于 2016-3-12 01:17 | 只看该作者
这么好是程序竟然没人赞!!!!!找了很多超声波测距然后1602显示的程序,这个最好,结构清晰,大师级水平
回复

使用道具 举报

地板
ID:113575 发表于 2016-4-11 21:55 | 只看该作者
求接线方法
回复

使用道具 举报

5#
ID:107657 发表于 2016-4-12 18:12 | 只看该作者
感觉不行呀 用你的程序 利用超声波来测距,物体移动后,超声波传感器测到的距离不会产生相应的变化!  这是什么原因呀???
回复

使用道具 举报

6#
ID:125970 发表于 2016-6-9 14:52 | 只看该作者
多谢楼主
回复

使用道具 举报

7#
ID:153678 发表于 2016-12-10 14:20 | 只看该作者
很强!!楼主程序思路非常清晰!!谢谢!
回复

使用道具 举报

8#
ID:184892 发表于 2017-4-4 13:24 | 只看该作者
谢谢,中国好老师!
回复

使用道具 举报

9#
ID:184892 发表于 2017-4-4 13:26 | 只看该作者

接线你改下程序里的echo trig的端口号,还有你要改你的1602的,我的是成功了
回复

使用道具 举报

10#
ID:89286 发表于 2017-4-4 15:11 | 只看该作者
thanks for sharing
回复

使用道具 举报

11#
ID:47286 发表于 2017-4-4 16:52 | 只看该作者
很棒

请教楼主 这个模块距离最大可以到多少
回复

使用道具 举报

12#
ID:185854 发表于 2017-4-4 22:57 | 只看该作者
程序很详细
回复

使用道具 举报

13#
ID:185854 发表于 2017-4-4 22:58 | 只看该作者
程序很详细
回复

使用道具 举报

14#
ID:185008 发表于 2017-4-5 11:11 来自手机 | 只看该作者
超声波测距能测多远啊
回复

使用道具 举报

15#
ID:183197 发表于 2017-4-8 11:33 | 只看该作者
可以用
回复

使用道具 举报

16#
ID:87420 发表于 2017-4-9 23:20 | 只看该作者
15936059539 发表于 2017-4-5 11:11
超声波测距能测多远啊

首先可能的最大距离(由超声波模块自身决定),实际最大距离(小于可能的最大距离)由程序决定,接受返回的超声波的定时器最多计数18次,大概能知道收到最远的超声波花费时间,然后就能知道距离,这里面大概是309.xcm,达不到310cm,也就是三米多点
回复

使用道具 举报

17#
ID:223807 发表于 2017-8-10 09:38 | 只看该作者
201511106109 发表于 2017-4-4 13:26
接线你改下程序里的echo trig的端口号,还有你要改你的1602的,我的是成功了

echo trig的借口有特定要求吗?  主程序到接受回声信号那里卡死了,没有接收到回声信号
回复

使用道具 举报

18#
ID:200379 发表于 2017-8-10 19:56 | 只看该作者
有没有控制2个超声波的程序
回复

使用道具 举报

19#
ID:323446 发表于 2018-5-6 14:41 | 只看该作者
好帖子,谢谢楼主
回复

使用道具 举报

20#
ID:335410 发表于 2018-5-22 09:00 | 只看该作者
谢谢分享,对毕业设计很有帮助
回复

使用道具 举报

21#
ID:287703 发表于 2018-5-22 14:49 | 只看该作者
谢谢分享
回复

使用道具 举报

22#
ID:428069 发表于 2018-11-17 10:43 | 只看该作者
谢谢楼主,已经用上
回复

使用道具 举报

23#
ID:442412 发表于 2018-12-8 21:52 | 只看该作者
感谢楼主,课程设计需要这个。
回复

使用道具 举报

24#
ID:442451 发表于 2018-12-8 23:07 | 只看该作者
我有一个是毕业时的设计。可以以此比较学习一下。
回复

使用道具 举报

25#
ID:897091 发表于 2021-4-19 21:48 | 只看该作者
想知道用的是多少M的晶振,可惜不知道。。。
回复

使用道具 举报

26#
ID:852397 发表于 2021-4-22 20:30 | 只看该作者
超声波模块是US-015能用吗,求告知 谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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