Serg | Дата: Вторник, 28.05.2013, 18:53 | Сообщение # 1 |
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Давно хотел опробовать Модуль Kit - PIC16F877A. Начал с самого простого - термометра. Нам понадобится: Модуль Kit - PIC16F877A
Темодатчик DS18S20 LCD дисплей 1602
Для программирования микроконтроллера вот такой программатор PIC K150
Программу для работы с этим прорамматором можно скачать по этой ссылке
|
|
| |
Serg | Дата: Вторник, 28.05.2013, 19:14 | Сообщение # 2 |
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Программа написана в компиляторе MikroC for PIC
Код //Термометр с датчиком на DS18S20, МК PIC16F877A, F = 20 Мгц //Предел измерения от - 55 до + 100
int main (void) { unsigned char byte0,byte1,z; //байты приёма 0,1 z - счётчик unsigned int tm, byte6, byte7; //tm - градусы, биты приёма 6,7
ADCON1 = 0xFF; PORTA = 0x00; TRISA = 0x02; //RA1 - вход, все остальные выходы PORTC = TRISC = 0x00; OPTION_REG = 0x7F; PORTB = 0xFF; TRISB = 0xD8; // выходы для ЖК Lcd_Custom_Config ( &PORTB, 5, 2, 1, 0, &PORTC, 0, 1, 5);//Иниц.ЖКИ Lcd_Custom_Cmd ( Lcd_CURSOR_OFF ); // Выключить курсор Ow_Reset ( &PORTA,1); //Сброс DS18S20, начало команд Ow_Write ( &PORTA,1,0x33 ); // Чтение сигнатуры датчика if ( (z = Ow_Read ( &PORTA,1 )) == 0x10 ) Lcd_Custom_Out ( 2,5, "DS18S20" ); else // если в устройстве не обнаружен нужный датчик { if ( z == 0x28 ) Lcd_Custom_Out ( 2,5,"DS18B20"); else Lcd_Custom_Out ( 2,5,"ERROR !!!"); while(1); } Lcd_Custom_Out ( 1,3,"t = +20,0 C" ); //Начальная надпись
while ( 1 ) { Ow_Reset ( &PORTA,1 ); //Сброс, начало команд Ow_Write ( &PORTA,1,0xCC ); //Пуск Ow_Write ( &PORTA,1,0x44 ); //Пуск Delay_ms ( 750 ); //Задержка по даташиту для замера тем-ры Ow_Reset ( &PORTA,1 ); //Сброс, начало новой команды Ow_Write ( &PORTA,1,0xCC ); //Чтение тем-ры Ow_Write ( &PORTA,1,0xBE ); //Чтение тем-ры byte0 = Ow_Read ( &PORTA,1 ); //Младший байт тем-ры byte1 = ( Ow_Read ( &PORTA,1)) ? '-':'+'; //Опр-ем + или - Ow_Read ( &PORTA,1 ); Ow_Read ( &PORTA,1 );// пропуск байтов 2,3 Ow_Read ( &PORTA,1 ); Ow_Read ( &PORTA,1 );// пропуск байтов 4,5 byte6 = Ow_Read ( &PORTA,1 ); //Чтение 6 байта byte7 = Ow_Read ( &PORTA,1 ); //Чтение 7 байта if ( byte1 == '-' ) byte0 = ( 0xFF - byte0 ) + 2; //Преобр. в отр.тем-ру tm = ( byte0 >> 1 ) * 100 + 75 - (( byte6 * 100 ) / byte7 );//Тем-ра Lcd_Custom_Chr ( 1, 7, byte1 ); //Выводим знак Lcd_Custom_Chr_CP ((( tm / 1000 ) % 10 ) + 0x30 );//Десятки Lcd_Custom_Chr_CP ((( tm / 100 ) % 10 ) + 0x30 ); //Еденицы Lcd_Custom_Chr_CP ( ',' ); //Разделитель Lcd_Custom_Chr_CP (( tm / 10 ) % 10 + 0x30 ); //Десятые доли } }
|
|
| |
Serg | Дата: Вторник, 28.05.2013, 19:39 | Сообщение # 3 |
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Схема вот такая:
Файл прошивки в формате HEX выложен ниже.
|
|
| |
Serg | Дата: Вторник, 28.05.2013, 19:49 | Сообщение # 4 |
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Первые впечатления- PIC-контроллер даже поинтереснее, чем Arduino. Среда для разработки mikroC PRO for PIC очень удобна, много дополнительных иструментов, очень много примеров и библиотек. Минус лишь один- на форуме поддержки нет информации на русском языке.
|
|
| |
Ivan-771 | Дата: Среда, 29.05.2013, 06:13 | Сообщение # 5 |
 5 Вольт
Группа: Пользователи
Сообщений: 39
Репутация: 0
Статус: Offline
| Цитата (Serg) Первые впечатления- PIC-контроллер даже поинтереснее Залёт. Вот пример на ATmege8. Программа написана в компиляторе CodeVisionAVR.
Код #include <mega8.h> // RC генератор на 4 MHZ #include <delay.h> #include <alcd.h> #include <ds18b20.h> #include <1wire.h> #include <stdio.h> char lcd_buffer[33]; //массив с данными для экрана void main(void) { unsigned char devices; //переменная в которой количество присоединённых датчиков int temp; //переменная для хранения температуры lcd_init(16); //инициализация LCD lcd_gotoxy(1,0); // позиция lcd_putsf("аaїАёє DS18B20"); //Надпись "Датчик DS18B20" devices=w1_init(); // датчики while(devices>0) //бесконечный цикл, если датчик подключён { temp=ds18b20_temperature(0); //читаем температуру if (temp>1000)//если датчик выдаёт больше 1000 { temp=4096-temp; //отнимаем от данных 4096 temp=-temp; //и ставим знак "минус" } sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //записываем массив для экрана lcd_gotoxy(0,1); lcd_putsf(" "); lcd_gotoxy(4,1); lcd_puts(lcd_buffer); //выводим массив на LCD delay_ms(500); //ждём 500мс } } Схема.
Сообщение отредактировал Ivan-771 - Среда, 29.05.2013, 06:17 |
|
| |