А вот и термометр. В качестве датчика использован цифровой датчик температуры 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);
}
В железе проверено. Мин нет.