Поскольку времени мало, я сделаю пару предположений о том, что не отражено в условии, и на этом основании предложу один из возможных способов.
Итак, предположим, что процедура не д.б. универсальной, но д.б. как можно проще и занимать как можно меньше места в коде, предположим также, что измеряемое напряжение не будет превышать указанной величины, то есть, что завтра не придется мерять до 7 вольт. Отмечу также, что точность в три знака после запятой с этим АЦПом не получится, значит - только 2 знака, ОК?
Вариант с максимальным упрощением такой:
1. использовать внутренний ИОН с напругой 2.56V, а измеряемое напряжение делить ровно пополам. В этом случае цена деления равна 2.56/1024 = 0.0025 (или 0,005 до входного делителя).
2. Измеренное значение ( ( ADCH << 8 ) | ADCL ) сдвигать на 1 бит вправо - теперь цена одного бита равна точнехонько одной сотой вольта (с учетом того, что напруга на входе в два раза меньше измеряемой - делили же пополам!).
3. Полученное после сдвига 16-битное целое (правда, полезных там только 9 бит) преобразовать в ASCII процедурой itoa, взятой с электроникса или еще откуда-то, и передавать её по USART,
на ходу вставляя символ десятичной запятой перед последними двумя символами, ведь мы же подогнали цену младшего бита к одной сотой!
Можно еще взять ИОН на 5,12V, тогда не придется делить измеряемое напряжение пополам перед подачей на АЦП.
Это решение не универсальное, но простое и скорострельное, как в реализации, так и в работе.
Если-таки захочется универсальности - библиотеки для фиксированной/плавающей точки есть в сети, надо только погуглить. В частности, поищи на электрониксе, там эта математика много и смачно обсуждалась.
P.S. Я, кстати, всегда полагал, что неспроста у внутреннего атмеловского ИОНа напруга такая "круглая" - 2,56... 0x100, однако!
