ds18b20 и atmega8 вывод температуры с десятичным знаком

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Открыл глаза
Сообщения: 78
Зарегистрирован: Пн май 23, 2011 11:23:39

Сообщение yuta_86 »

добрый день, у меня такая проблемка: не знаю как вывести температуру с десятичным знаком.

код такой

devices=w1_init(); //ищем датчики
while(devices>0) //бесконечный цикл, если датчик подключен
{
temper=ds18b20_temperature(0);
if(temper != -9999) // нет ошибок
{
//Анализ на отрицательную температуру
if( temper>1000 ) { temper=4096-temper; temper=-temper; show_digital(temper, 0,4);}
real_digital(temper,0);
} else real_digital(666,0); // если датчиков нет
delay_ms(500);
}
}
real_digital(666,0); // если датчиков нет
delay_ms(500);
}

буду очень рад помощи.
всё работает и отображается на 7seg индикторе. но оч хочется вывод с десятичным знаком градуса.
буду очень рад помощи.
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Так поставьте точку в нужном месте и всё :)
Не вижу проблемы....
Реклама
Открыл глаза
Сообщения: 78
Зарегистрирован: Пн май 23, 2011 11:23:39

Сообщение yuta_86 »

я получаю число например 24 его и вывожу. дело в том что функция опроса датчика выдаёт на выходе тип float, а я ставлю int. и вот вопрос как сделать чтобы вывести целую часть и потом знать дробную.
Мудрый кот
Аватара пользователя
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57

Сообщение O-LED »

123
Последний раз редактировалось O-LED Пн май 23, 2011 18:21:26, всего редактировалось 2 раза.
KIT
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 78
Зарегистрирован: Пн май 23, 2011 11:23:39

Сообщение yuta_86 »

ок объявил как Float и в переменной будет значение температуры, дальше надо дробную часть отделить (1 знак достаточно) как??
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57

Сообщение O-LED »

вот так
int temper

temper=ds18b20_temperature(0)*10

теперь
temper /10 - целая часть
temper%10 - дробная часть
KIT
Контактная информация:
Реклама
Родился
Сообщения: 9
Зарегистрирован: Пн фев 15, 2010 21:54:49

Сообщение Rhime »

Датчик выдает 16 битный код тоесть максимальное значение равно 65536 по этому температурная переменная будет иметь значение int
Чтобы расчитать реальную минусовую температуру необходимо от максимального значения отнять значение которое принял МК
тоесть temperature=65536-temperature;

далее создаем две переменных int temp, Temp;

вычислим целое число temp=temperature>>4; сдвигаем temperature на 4 бита вправо
узнаем десятки Temp=temperature&0x000F переменной Temp присваивается только 4 младших бита которые сдвинали в предыдущем вычислении
вычисляем десятки unsigned char temp_min = ((Temp * 10) / 16);

Остается только преобразовать tem в DEC и поставить точку перед младшим - 4-м разрядом индикатора
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Rhime писал(а):Датчик выдает 16 битный код...
из которого значащими в являются только 12 бит максимум. Поэтому ИМХО для уменьшения расчетов проще хранить целую и дробную часть раздельно (как два байта). Дробную часть легче и быстрее выводить с помощью табличной подстановки.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»