找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超声波模块的一点收获

[复制链接]
跳转到指定楼层
楼主
ID:137999 发表于 2017-8-3 23:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
其实超声波贼简单,只是难者不会,会者不难而已。

核心就是先让Trig产生10+us的高电平,然后等待echo的出现高电平,开启定时器进行计数,完了关闭计数。计数对应的时间就是往返的时间。
乘以声速除以2就是距离。

不多说了,看代码一切理解。
  1. #include <stdio.h>
  2. #include <reg51.h>
  3. #include <intrins.h>

  4. sbit echo = P2 ^ 1;//超声波测距的数据返回端口
  5. sbit trig = P2 ^ 0;//起始控制端口

  6. unsigned char flag = 0;
  7. unsigned int time=0;//计数
  8. float length;//返回距离
  9. unsigned char str[12];

  10. extern void InitLcd1602();
  11. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  12. void LcdFullClear();

  13. void FloatToStr(unsigned char *str, float dat)
  14. {
  15.     unsigned int H, L;
  16.     signed char i = 0;
  17.     unsigned char buf[12] = {0};
  18.     H = (unsigned int)dat;
  19.     L = dat*100-H*100;

  20.     do {          //先转换为低位在前的十进制数组
  21.         buf[i++] = H % 10;
  22.         H /= 10;
  23.     } while (H > 0);

  24.     while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上
  25.     {
  26.         *str++ = buf[i] + '0';
  27.     }
  28.     *str++ = '.';
  29.     *str++ = L/10 + '0';
  30.     *str++ = L%10 + '0';
  31.     *str = '\0';
  32. }

  33. void Init()//用于初始化设置定时器和串口波特率
  34. {
  35.     SCON = 0x50;
  36.     TH1 = 0xFD;
  37.     TL1 = 0xFD;//串口设置
  38.     TI = 1;
  39.         TR1 = 1; //开启定时器
  40.     TMOD = 0x21; //设T0为方式1
  41.     TH0 = 0;
  42.     TL0 = 0;
  43.     TR0 = 0;//定时器初始关闭
  44.     ET0 = 1; //允许T0中断
  45.    
  46.     EA = 1; //开启总中断
  47.        
  48. }
  49. void start_10() //10us+的起始信号
  50. {
  51.         int i;
  52.     trig = 1;
  53.     for (i = 0; i <= 13; i++)
  54.     {
  55.         _nop_();
  56.     }

  57.     trig = 0; //重新拉回低电平
  58. }

  59. void Count(void)//用于将时间换算成长度
  60. {
  61.         unsigned char str[12];
  62.        
  63.     time = TH0 * 256 + TL0;
  64.     TH0 = 0;
  65.     TL0 = 0;
  66.     length = (time * 1.87)/100;     //算出来是CM
  67.         if(!flag)
  68.         {
  69.                 //printf("%f\n",length);
  70.                 FloatToStr(str, length);
  71.                 LcdShowStr(2,0, str);
  72.         }
  73.         else
  74.         {
  75.                 flag = 0;
  76.                 //printf("error\n");
  77.                 LcdShowStr(2,0, "error");
  78.         }
  79. }
  80. void Delay500ms()                //@11.0592MHz
  81. {
  82.         unsigned char i, j, k;

  83.         i = 22;
  84.         j = 3;
  85.         k = 227;
  86.         do
  87.         {
  88.                 do
  89.                 {
  90.                         while (--k);
  91.                 } while (--j);
  92.         } while (--i);
  93. }

  94. void Scan()
  95. {
  96.     start_10();
  97.     while (!echo);    //当RX为零时等待
  98.     TR0 = 1; //开启计数
  99.     while (echo);    //当RX为1计数并等待
  100.     TR0 = 0; //关闭计数
  101.     Count();//计算出距离
  102.         Delay500ms();
  103.         LcdFullClear();
  104. }

  105. void main()
  106. {
  107.     Init();//定时器初始化
  108.         InitLcd1602();
  109.     while(1)
  110.     {
  111.                 Scan();       
  112.         }
  113. }

  114. void Timer0() interrupt 1
  115. {
  116.         flag = 1;
  117. }
复制代码



评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:219686 发表于 2017-8-4 09:34 | 只看该作者
哈哈,正好可以做参考
回复

使用道具 举报

板凳
ID:158375 发表于 2017-8-4 09:41 | 只看该作者
难者不会,会者不难
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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