Program a full rotation of a NXT motor in X seconds
The problem can be restated:
360 / 20 = 18 deg / sec = 1 deg / .056 sec

One degree is the smallest increment provided by the rotation sensors.

NXT-G has a timer sensor with 1/100th second resolution.

In pseudo-code:

Set a motorPower variable to 10
Start a timer
Loop until rotationDegrees &gt;= 360
    If timeElapsed * 18 &gt; rotationSensorDegrees
        motorPower = motorPower - 1
    Else
        motorPower = motorPower + 1
    End If
    MoveBlock (power = motorPower)
End Loop
MoveBlock (stop)


Of course, use of the 8 tooth and 40 tooth gears to give a 5 to 1 reduction would give even better results.  Even the best programming will have trouble offsetting bad mechanics.