首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我有一张图18F4550如何读取超声波传感器的距离。

我有一张图18F4550如何读取超声波传感器的距离。
EN

Stack Overflow用户
提问于 2019-04-19 20:58:46
回答 1查看 307关注 0票数 0

我有PIC18f4550,需要用picBasic pro编写代码。

我正在连接直流电机,超声波传感器和红外传感器.等

我已经做了所有的事情,但仍然对如何连接超声波传感器感到困惑。

这里是PIC中的超声波引脚

代码语言:javascript
复制
trisb.3=0    'trigger ultrasound
trisb.4=1    ' Echo from Ultrasound

我需要一个示例代码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-22 07:25:52

编写程序的基本步骤:

1-为超声波模块提供触发器

2-听回声

3-接收回波高时启动定时器

4-当回声变低时停止计时器

5-读取计时器值

6-将其转换为距离

7-展示它

距离计算

  • 距离=速度*时间
  • 假设超声波传感器与目标之间的距离。
  • 超声波脉冲传播的总距离: 2d (向前和向后)
  • 空气中声速: 340米/秒= 34000厘米/秒
  • 因此,d= (34000* Time )/2,其中时间= (TMR1H:TMR1L)/(1000000)
  • 因此,d= (TMR1H:TMR1L)/58.82 cm
  • TMR1H:TMR1L = TMR1L x (TMR1H<<8)

MikroC码

代码语言:javascript
复制
// LCD module connections
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections

void main()
{
  int a;
  char txt[7];
  Lcd_Init();
  Lcd_Cmd(_LCD_CLEAR);          // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);     // Cursor off

  TRISB = 0b00010000;           //RB4 as Input PIN (ECHO)

  Lcd_Out(1,1,"Developed By");
  Lcd_Out(2,1,"Mina Karam");

  Delay_ms(3000);
  Lcd_Cmd(_LCD_CLEAR);

  T1CON = 0x10;                 //Initialize Timer Module

  while(1)
  {
    TMR1H = 0;                  //Sets the Initial Value of Timer
    TMR1L = 0;                  //Sets the Initial Value of Timer

    PORTB.F0 = 1;               //TRIGGER HIGH
    Delay_us(10);               //10uS Delay
    PORTB.F0 = 0;               //TRIGGER LOW

    while(!PORTB.F4);           //Waiting for Echo
    T1CON.F0 = 1;               //Timer Starts
    while(PORTB.F4);            //Waiting for Echo goes LOW
    T1CON.F0 = 0;               //Timer Stops

    a = (TMR1L | (TMR1H<<8));   //Reads Timer Value
    a = a/58.82;                //Converts Time to Distance
    a = a + 1;                  //Distance Calibration
    if(a>=2 && a<=400)          //Check whether the result is valid or not
    {
      IntToStr(a,txt);
      Ltrim(txt);
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Out(1,1,"Distance = ");
      Lcd_Out(1,12,txt);
      Lcd_Out(1,15,"cm");
    }
    else
    {
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Out(1,1,"Out of Range");
    }
    Delay_ms(400);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55767797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档