Показать сообщение отдельно
Старый 03.04.2009, 12:08   #48   
Форумец
 
Сообщений: 1,532
Регистрация: 19.02.2009
Возраст: 54
Записей в дневнике: 1

petrd вне форума Не в сети
А вот и термометр. В качестве датчика использован цифровой датчик температуры DS18B20, выдающий данные по шине 1-Wire. Температура измеряется с шагом 0,0625 градуса, точность измерения составляет +0,5 градуса. В программе использована встроенная в MikroC библиотека для работы с устройствами по шине 1-Wire. Вывод на отображение температуры два раза в секунду.
Код:
const unsigned short TEMP_RESOLUTION = 12;
char *text = "000.0000";
unsigned temp;
void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;
// преобразование отрицательной температуры
if (temp2write & 0x8000) {
text[0] = '-';
temp2write = ~temp2write + 1;
}
// извлечение целой части
temp_whole = temp2write >> RES_SHIFT ;
// преобразование целой части температуры в символы
text[0] = temp_whole/100  + 48;
text[1] = (temp_whole/10)%10 + 48;             // извлечение десятков
text[2] =  temp_whole%10     + 48;             // извлечение единиц
// извлечение и преобразование дробной части
temp_fraction  = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;
// преобразование дробной части в символы
text[4] =  temp_fraction/1000    + 48;
text[5] = (temp_fraction/100)%10 + 48;
text[6] = (temp_fraction/10)%10  + 48;
text[7] =  temp_fraction%10      + 48;
// вывод температуры на ЖКИ
Lcd_Out(2, 5, text);
}//~
void main() {
CMCON = 7;                              // Все входы цифровые
TRISA=0xff;
Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // назначение выводов ЖКИ - PIC
Lcd_Cmd(LCD_CURSOR_OFF);
Lcd_Out(1, 1, " Temperature:   ");
// вывод символа точки и "С" как единицы измерения
Lcd_Chr(2,13,223);
Lcd_Chr(2,14,'C');
//--- главный цикл
do {
//--- чтение температуры из DS18B20
Ow_Reset(&PORTA,2);            // сигнал сброса
Ow_Write(&PORTA,2,0xCC);       // команда SKIP_ROM
Ow_Write(&PORTA,2,0x44);       // команда CONVERT_T
Delay_us(120);
Ow_Reset(&PORTA,2);
Ow_Write(&PORTA,2,0xCC);       // команда SKIP_ROM
Ow_Write(&PORTA,2,0xBE);       // команда READ_SCRATCHPAD
temp =  Ow_Read(&PORTA,2);
temp = (Ow_Read(&PORTA,2) << 8) + temp;
//--- форматирование и вывод температуры
Display_Temperature(temp);
Delay_ms(500);
} while (1);
}
В железе проверено. Мин нет.
Миниатюры
Нажмите на изображение для увеличения
Название: temp_DS18B20.JPG
Просмотров: 398
Размер:	109.5 Кб
ID:	423935  

Последний раз редактировалось petrd; 28.04.2009 в 15:45.
  Ответить с цитированием