добрый день, у меня такая проблемка: не знаю как вывести температуру с десятичным знаком.
код такой
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 индикторе. но оч хочется вывод с десятичным знаком градуса.
буду очень рад помощи.
ds18b20 и atmega8 вывод температуры с десятичным знаком
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
Так поставьте точку в нужном месте и всё 
Не вижу проблемы....
Не вижу проблемы....
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
я получаю число например 24 его и вывожу. дело в том что функция опроса датчика выдаёт на выходе тип float, а я ставлю int. и вот вопрос как сделать чтобы вывести целую часть и потом знать дробную.
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
123
Последний раз редактировалось O-LED Пн май 23, 2011 18:21:26, всего редактировалось 2 раза.
KIT
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
ок объявил как Float и в переменной будет значение температуры, дальше надо дробную часть отделить (1 знак достаточно) как??
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
вот так
int temper
temper=ds18b20_temperature(0)*10
теперь
temper /10 - целая часть
temper%10 - дробная часть
int temper
temper=ds18b20_temperature(0)*10
теперь
temper /10 - целая часть
temper%10 - дробная часть
KIT
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
Датчик выдает 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-м разрядом индикатора
Чтобы расчитать реальную минусовую температуру необходимо от максимального значения отнять значение которое принял МК
тоесть 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-м разрядом индикатора
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
из которого значащими в являются только 12 бит максимум. Поэтому ИМХО для уменьшения расчетов проще хранить целую и дробную часть раздельно (как два байта). Дробную часть легче и быстрее выводить с помощью табличной подстановки.Rhime писал(а):Датчик выдает 16 битный код...