Среда разработки: microC PRO for PIC
Микроконтроллер: PIC16F887
Программатор: PICkit 3
Изучаем однопроводной интерфейс передачи данных. Учимся использовать знакосинтезирующий ЖКИ дисплей и датчики температуры DS18B20
Код программы:
sbit LCD_RS at RE0_bit; sbit LCD_RS_Direction at TRISE0_bit; sbit LCD_EN at RE1_bit; sbit LCD_EN_Direction at TRISE1_bit; sbit LCD_D4 at RC3_bit; sbit LCD_D4_Direction at TRISC3_bit; sbit LCD_D5 at RC0_bit; sbit LCD_D5_Direction at TRISC0_bit; sbit LCD_D6 at RC2_bit; sbit LCD_D6_Direction at TRISC2_bit; sbit LCD_D7 at RC1_bit; sbit LCD_D7_Direction at TRISC1_bit; const unsigned short TEMP_Resolution=12; // Разрешение датчика темпера туры char *text="000.0000"; // Указатель переменной unsigned temp; // Переменная для результата void Display_Temperature(unsigned int temp2write, int pos) { // Функция; получения;, обработки и вывода температуры 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; // Извлекаем данные if (temp_whole/100) // Перевалим результат в градусы text[0]=temp_whole/100 +48; else text[0]='0'; 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; if (pos==1) {Lcd_out(1, 1, text);} // Отображаем результат на экране } void main() { // Основная программа TRISD = 0; PORTD = 0b11111111; ANSEL =0b00000000; // Аналоговые выводы как цифровые ANSELH = 0x00; TRISA = 0b11001111; // Выводы RA5 и RA4 на выход PORTA = 0x00; // остальные на вход Lcd_Init(); // Инициализируем дисплей Lcd_Cmd(_LCD_CURSOR_OFF); // Скрыть курсор Lcd_Cmd(_LCD_CLEAR); // Очистить do { Lcd_Chr(1,13,223); // Выводим значек градусов Lcd_Chr(1,14,'C'); // и значек целсия Ow_Reset(&PORTA, 2); // Сигнал сброса Ow_Write(&PORTA, 2, 0xCC); // Команда пропустить адрес Ow_Write(&PORTA, 2, 0x44); // команда выполнить преобразование Delay_ms(120); Ow_Reset(&PORTA, 2); // Сигнал сброса Ow_Write(&PORTA, 2, 0xCC); // команда - пропустить адрес Ow_Write(&PORTA, 2, 0xBE); // команда - выдать результата temp= Ow_Read(&PORTA, 2); // Читаем 1-е часть результата temp= (Ow_Read(&PORTA, 2)<<8)+temp; // Читаем 2-е часть результата Display_Temperature(temp,1); // Обрабатываем и выводим результат delay_ms(300); } while(1); }