找回密码
 立即注册

QQ登录

只需一步,快速开始

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

动手制作超声波测距板,为避障小车作准备

[复制链接]
跳转到指定楼层
楼主
ID:76686 发表于 2015-4-11 19:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dzdiy 于 2015-4-11 20:33 编辑

    就是这个超声波测距,我有元件,只是不齐全,所以就买了一个测距模块,制作了一个超声波测距板。一切都用洞洞板焊,自己搭建电路,那样学得到更多东西,用套件的话,学到的只是编程,硬件原理就会有空缺。自己自学单片机也有一段时间了,看来还是要检测一下自己的能力才行,想来想去,觉得小车很不错,如果我可以一独立制作出自己的小车,哪是一件不错的事,所以从今天起,我开始制作和编写自己的小车,还是一步一步来哈。超声波测距只是第一步。下载超声波测距程序包



超声波测距源程序: 超声波测距模块程序包.zip (28.17 KB, 下载次数: 29)
  1. #include<reg52.h>

  2. #include <intrins.h>

  3. #define uint unsigned int

  4. #define uchar unsigned char


  5. sbit trig=P1^5;//超声波测距模块//

  6. sbit echo=P3^2;

  7. bit flag1;//触发信号标志位//


  8. sbit EN=P2^5;  //1602相关端口定义//

  9. sbit RS=P1^0;

  10. sbit RW=P1^1;

  11. sbit STA7=P0^7;


  12. uchar count;

  13. long int distance;//距离变量//


  14. //………………………………延时函数…………………………//

  15. void delayt(uint x)

  16. {

  17.     uchar j;

  18.     while(x-- > 0)

  19.     {

  20.      for(j = 0;j < 125;j++)

  21.         {

  22.             ;

  23.         }

  24.     }

  25. }


  26. //……………………LCD1602相关函数…………………………//

  27. void panmang()//1602判忙//

  28. {

  29. P0=0xff;

  30. do

  31. {

  32. RS=0;

  33. RW=1;

  34. EN=0;

  35. EN=1;

  36. }

  37. while(STA7==1);

  38. EN=0;

  39. }

  40. void w_data(uchar dat)//1602写数据//

  41. {

  42. panmang();

  43. EN=0;

  44. P0=dat;

  45. RS=1;

  46. RW=0;

  47. EN=1;

  48. EN=0;

  49. }

  50. void w_cmd(uchar cmd)//1602写指令//

  51. {

  52. panmang();

  53. EN=0;

  54. P0=cmd;

  55. RS=0;

  56. RW=0;

  57. EN=1;

  58. EN=0;

  59. }

  60. void init_1602()//1602初始化//

  61. {

  62. w_cmd(0x38);//设置16x2显示,5x7点阵,8位数据接口//

  63. w_cmd(0x0c);//设置开显示,光标不显示,光标不闪烁//

  64. w_cmd(0x06);//设置当读或写一个字符后地址指针加1,且光标加1,整屏不移动//

  65. w_cmd(0x01);//清屏//

  66. w_cmd(0x80+0x40);

  67. w_data('D');

  68. w_data('i');

  69. w_data('s');

  70. w_data('t');

  71. w_data('a');

  72. w_data('n');

  73. w_data('c');

  74. w_data('e');

  75. w_data(':');

  76. w_cmd(0x80+0x4c);

  77. w_data('.');

  78. w_cmd(0x80+0x4e);//单位是厘米//

  79. w_data('c');

  80. w_data('m');

  81. }

  82. //……………………………………………定时器1初始化,用于计算响应信号时间……………………………………………//

  83. void init_t0()

  84. {

  85. TMOD = 0x01;  

  86.   TL0 = 0x66;

  87. TH0 = 0xfc;      //1ms

  88.     ET0 = 1;     

  89. EA = 1;      

  90. }

  91. //………………………………………触发信号………………………………………//

  92. void trigger()

  93. {

  94. trig=1;

  95. delayt(1);

  96. trig=0;

  97. }

  98. //……………………………………………………初始化相应端口及变量…………………………………………………………//

  99. void init_measuring()

  100. {

  101. trig=0;

  102. echo=0;

  103. count=0;

  104. }

  105. //…………………………………………………………测距相关函数……………………………………………………………………//

  106. void measuring()

  107. {

  108. uchar l;

  109. uint h,y;

  110. TR0 = 1;

  111. while(echo)

  112.     {

  113.         ;

  114.     }

  115. TR0 = 0;

  116. l = TL0;

  117. h = TH0;

  118. y = (h << 8) + l;

  119. y = y - 0xfc66;//us部分

  120. distance = y + 1000 * count;//计算总时间,单位是微秒

  121. TL0 = 0x66;

  122. TH0 = 0xfc;

  123. delayt(30);

  124. distance = 3453* distance / 20000;//原始为:(0.34毫米/us)*时间/2//

  125. }

  126. //……………………………………………显示函数………………………………………………………//

  127. void display(uint x)

  128. {

  129. uchar qian,bai,shi,ge;

  130. qian=x/1000;

  131. bai=(x/100)%10;

  132. shi=(x/10)%10;

  133. ge=x%10;

  134. w_cmd(0x80+0x49);//单位是厘米//

  135. w_data(qian+0x30);

  136. w_data(bai+0x30);

  137. w_data(shi+0x30);

  138. w_cmd(0x80+0x4d);

  139. w_data(ge+0x30);

  140. }

  141. //……………………………………………………主函数……………………………………………………//

  142. void main()

  143. {

  144. init_1602();

  145. init_t0();

  146. init_measuring();

  147. while(1)

  148. {

  149. trigger();

  150. while(echo==0)          //等待回声

  151.          {

  152.              ;

  153.          }

  154. measuring();

  155. display(distance);

  156. init_measuring();

  157. delayt(600);//每次测量间隔60ms//

  158. }

  159. }

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

  161. void T_0()interrupt 1

  162. {

  163. TF0 = 0;

  164. TL0 = 0x66;

  165. TH0 = 0xfc;

  166. count++;

  167. if(count==18)

  168. {

  169. TR0 =0;

  170. TL0 = 0x66;

  171. TH0 = 0xfc;

  172. count = 0;

  173. }

  174. }
复制代码




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

使用道具 举报

沙发
ID:68477 发表于 2015-4-12 14:33 | 只看该作者
不错。
回复

使用道具 举报

板凳
ID:180024 发表于 2017-3-22 21:38 | 只看该作者
电路和焊接能发下吗,小白伤不起
回复

使用道具 举报

地板
ID:197204 发表于 2017-7-28 20:08 | 只看该作者
Orz123 发表于 2017-3-22 21:38
电路和焊接能发下吗,小白伤不起

同上
回复

使用道具 举报

5#
ID:329997 发表于 2018-5-16 22:27 | 只看该作者
可以发张接线的图片么?新手不是很懂
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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