AVR中的超声波传感器

时间:2016-12-16 22:42:03

标签: avr avr-gcc atmelstudio

我正致力于创造超声波测距仪。我目前正在测试传感器,以确保它正常运行。我已经将回声引脚和触发引脚分别连接到PC4和PC5。当我运行此代码时,理想情况下它会向我的显示器发送6。但是,它显示为0.这使我相信代码没有与传感器正确连接。请帮忙。

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

void DisplayIt(int i);

int main(void)
{

    while(1)
    {
        DDRC = 0xFF;
        int i = 0;
        PORTC = 0b00000000;
        _delay_us(2);
        PORTC = 0b00100000;
        _delay_us(10);
        PORTC = 0x00;

        DDRC = 0x00;
        if (PINC == 0b00010000)
        {
            i = 6;
        }
        DisplayIt(i);
    }

}

2 个答案:

答案 0 :(得分:1)

我不知道您使用的超声波传感器。但我认为这是因为你没有等到传感器收到回声信号。基于我曾经使用的超声波传感器SRF04,它有一个如下的时序图:

enter image description here

我修改了你的代码,因此它有能力打印&#34; 6&#34;当传感器检测到它前面的物体时(我们从回波信号的到来就知道它)。

以下是代码:

while(1) {
  DDRC = 0xFF;  // Configure all Port C pins as an output
  int i = 0;

  PORTC = 0b00100000;  // Write 1 (high) to PORTC.5 (trigger pin)
  _delay_us(10);  // Keep PORTC.5 to give high signal output for 10us
  PORTC = 0x00;  // Write 0 (low) to PORTC.5

  // The code above completes Trigger Input To Module (see Timing Diagram image)

  DDRC = 0x00;  // Configure all Port C pins as an input
  while (PINC.4 == 0);  // Wait until PINC.4 (echo pin) has 1 (high) value
  if(PINC.4 == 1) i = 6;  // Once PINC.4 is high, while loop will break and this line will be executed

  DisplayIt(i);

  _delay_ms(10);  // Allow 10ms from End of Echo to Next Trigger Pulse
}

答案 1 :(得分:0)

PINCPORTC是相同的注册。

PORTC = 0x00;在读取之前将该寄存器的内容设置为0.