As far I remember from the datasheet, the AT89x51 in the counter mode samples the counter input pin once every 12 clock cycles. Since there should be a transition between alternate samples, as far I remember, this gives out a theoritical maximum frequency measurement of 500KHz.
However, considering the possibilities of missing a transition, a safe bet would be to half that further and aiming for the best, make it a quarter of 500KHz, leaving us at around 125KHz.
Refer to the AT89C51 datasheet for a better understanding. The AT89S51 datasheet points to the AT89C51 datasheet for timer/counter details
For sending float values across, you have two choices:
* Use a standard method of floating point representation and interpretation on both sides, such as ANSI or ISO - google around for better details.
* Alternatively, send the data in your own format. E.g. send the integer part first and then the fraction part. You may need to pad the integer or fraction (such as 2 bytes integer + 2 bytes fraction) to get it across easy.
In some occasions, such as a single digit precision and acceptable range, e.g. 27.4°C, just multiply the data with 10 and send it across in an unsigned short (2 bytes). It might suite in a case of just displaying, where the LED representing the decimal dot can always be on and you just update the display. However, if you need to do any math after receiving, this could be a crude idea.