学习目标

  1. 了解超声波测距原理
  2. 掌握逻辑分析仪使用
  3. 掌握驱动编写

    学习内容

    原理图

    170.png

    传感器

    171.png
    178.png

    驱动编写

    ```c

    ifndef ULTRASONIC_H

    define ULTRASONIC_H

include “config.h”

define ULTRASONIC_ECHO P40

define ULTRASONIC_TRIG P13

define ULTRASONIC_PIN_INIT() {P1M1 &= ~0x08, P1M0 |= ~0x08, P4M1 &= ~0x01, P4M0 &= ~0x01;}

void Ultrasonic_init();

u8 Ultrasonic_get_distance(float *distance);

endif

  1. ```c
  2. #include "Ultrasonic.h"
  3. static void Delay10us() //@24.000MHz
  4. {
  5. unsigned char i;
  6. i = 78;
  7. while (--i);
  8. }
  9. void Ultrasonic_init() {
  10. ULTRASONIC_PIN_INIT();
  11. }
  12. u8 Ultrasonic_get_distance(float *distance) {
  13. u8 flag = 0;
  14. u16 cnt = 20;
  15. //////////////// 触发测距 /////////////////
  16. ULTRASONIC_TRIG = 1;
  17. Delay10us();
  18. ULTRASONIC_TRIG = 0;
  19. do {
  20. Delay10us();
  21. } while(--cnt);
  22. do {
  23. if(ULTRASONIC_ECHO == 1) {
  24. if(flag == 0) {
  25. cnt = 0;
  26. flag = 1;
  27. }
  28. cnt++;
  29. } else {
  30. break;
  31. }
  32. Delay10us();
  33. } while(cnt < 2360);
  34. if(cnt <= 12 || cnt >= 2360) {
  35. // 距离小或者超出
  36. return 0;
  37. }
  38. // 340 m/s
  39. // 340 m/ 1000 000us
  40. // 10us = 340m/100000
  41. // 10us == 1cnt
  42. // m
  43. *distance = cnt * 34.0 / 10000.0 / 2;
  44. }

练习题

  1. 实现超声波测距驱动