Это же где-то недавно обсуждалось. Плавучка тут и даром не нужна, все делается в целых числах. Берем число, полученное из 18b20 (типа int), отделяем от него знак и превращаем в положительное. Затем умножаем его на 10, прибавляем 8 и делим на 16 (две последних операции - это округление). Полученное число градусов переводим в десятичное и приписываем перед ним знак. Все.
Да, учитывая, что температура может быть от -55 до 125, необязательно использовать полноценную программу перевода 2-10. Вполне достаточно разделить температуру на 1000, частное будет первой цифрой. Остаток делим на 100, частное будет второй цифрой. Остаток делим на 10, частное будет третьей цифрой, остаток - четвертой (десятые доли). И весь хрен до копейки. Если эти коды предназначены на вывод через что-то семисегментное, то полученные три частных и один остаток можно использовать непосредственно (тогда и знак в переменной sgn надо будет отмечать другими кодами, например, ноль - плюс, единица - минус), если же надо в ASCII, то к каждому из кодов частных и остатку надо будет логически прибавить 0x30 ('0'), ну и вставить точку между третьей и четвертой цифрами.
Последний раз редактировалось afz Вс авг 12, 2018 15:00:15, всего редактировалось 1 раз.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Незначащие нули пока не гасил.
Переменная tt у меня типа int (AtmelStudio 6.2) но почему то код работает, она не 32 битная что ли?
Точно ли нужно прибавлять восмёрку а не семёрку (в Протеусе происходит завышение на 0.1 °С)?
Первая колонка - код, якобы от 1820, от 1.0000 градусов до 1.9375 (1.F hex). Вторая - точное значение, третья - округленное значение (простой вывод числа из 2-й колонки по шаблону %6.1f, четвертая - результат предложенного мной алгоритма. Ну и где больше на 0.1 ?
Добавлено after 43 minutes: Re: Как обрабатывать переменную с DS18B20 для десятых долей °С ?
Да, преобразование в десятичное и выдачу я не проверял, может там косяк? Я бы, кстати, делал это немного не так. Что-то, вроде