There are hardware options such as a DTMF decoder chip or ne567 pll chips.
Considering software;
I suspect your uC dosn't have enough memory for an FFT but it might be possible
to squeeze something like a Goertzel DFT into it.
Here is a circuit cellar project doing tone detection in a micro.
**broken link removed**
There are various ways of doing tone detection. There is lots of signal processing
literature if you care to wade through the horrible maths.
It will help if your transmitter is crystal controlled so you can rely on the
tone frequency being very close to what you expect.
You can measure the period between transitions, take an average over a period
and look it it to be 1/f for several periods. You could do correlation by looking
for some edges to get in phase then correlating having a value starting at zero,
using a timer to work out if you expect the tone to be above zero or below zero at
that moment in time, if the input matches what you expect add one to the count,
if it dosn't subtract one. After a suitable period of time a high value indicates
a high correlation.
>Also, how much can ambient light affect the signal outputted by the photodiode?
You probably want a filter in front of the receiver.