You don't need an external timer, the CPU chip has one. Here is my code that times a ball running down a ramp:
const byte LED = 12;
const float DISTANCE = 0.9; // m
unsigned long startTime;
volatile unsigned long elapsedTime;
volatile boolean done;
boolean started;
void ballPassesGate1 ()
{
startTime = micros ();
started = true;
digitalWrite (LED, HIGH);
} // end of ballPassesGate1
void ballPassesGate2 ()
{
if (!started)
return;
elapsedTime = micros () - startTime;
done = true;
started = false;
digitalWrite (LED, LOW);
} // end of ballPassesGate2
void setup ()
{
Serial.begin (115200);
Serial.println ("Timer sketch started.");
pinMode (LED, OUTPUT);
attachInterrupt (0, ballPassesGate1, FALLING);
attachInterrupt (1, ballPassesGate2, FALLING);
} // end of setup
void loop ()
{
if (!done)
return;
Serial.print ("Time taken = ");
Serial.print (elapsedTime);
Serial.println (" uS");
float secs = float (elapsedTime) / 1.0e6;
float velocity = DISTANCE / secs;
Serial.print ("Time taken = ");
Serial.print (secs);
Serial.println (" seconds.");
Serial.print ("Average velocity = ");
Serial.print (velocity);
Serial.println (" m/s.");
Serial.println ();
done = false;
} // end of loop
You don't want delays, you want to measure the start and end point. micros() has a 4 µS resolution. To get better than that you need to use Timer 1 or Timer 2 with no prescaler.
That code doesn't display with LEDs, that's a separate issue, but it shows how to time things.