- Необхідні компоненти:
- Кругова діаграма:
- Вимірювання температури за допомогою LM35 за допомогою 8051:
- РК-дисплей 16x2:
- ADC0804 IC:
- Датчик температури LM35:
- Пояснення коду:
Іноді людям важко зчитувати температуру з аналогового термометра через коливання. Отже, ми збираємося створити простий цифровий термометр із використанням мікроконтролера 8051, в якому для вимірювання температури використовується датчик LM35. Ми також використовували LM35 для побудови цифрового термометра з використанням Arduino, NodeMCU, PIC, Raspberry Pi та інших мікроконтролерів.
Цей проект також буде слугувати належним з'єднанням ADC0804 з 8051 та 16 * 2 РК-дисплеєм з мікроконтролером 8051.
Необхідні компоненти:
- Дошка розвитку 8051
- Дошка ADC0804
- 16 * 2 РК-дисплей
- Датчик LM35
- Потенціометр
- Провід перемички
Кругова діаграма:
Схема електричного кола цифрового термометра з використанням LM35 наведена нижче:
Вимірювання температури за допомогою LM35 за допомогою 8051:
Мікроконтролер 8051 - це 8-бітний мікроконтролер, який має 128 байт мікросхеми оперативної пам'яті, 4 байти мікросхеми мікросхеми, два таймери, один послідовний порт і чотири 8-бітних порти. Мікроконтролер 8052 - це розширення мікроконтролера. У таблиці нижче показано порівняння 8051 членів сім'ї.
Особливість |
8051 |
8052 |
ПЗУ (у байтах) |
4K |
8 тис |
Оперативна пам'ять (байти) |
128 |
256 |
Таймери |
2 |
3 |
Штифти вводу / виводу |
32 |
32 |
Послідовний порт |
1 |
1 |
Джерела переривання |
6 |
8 |
РК-дисплей 16x2:
16 * 2 РК - широко використовуваний дисплей для вбудованих програм. Ось коротке пояснення щодо контактів та роботи РК-дисплея 16 * 2. Усередині РК є два дуже важливі регістри. Це регістр даних та регістр команд. Реєстр команд використовується для надсилання таких команд, як чітке відображення, курсор вдома тощо, регістр даних використовується для надсилання даних, які мають відображатися на РК-дисплеї 16 * 2. Нижче в таблиці наведено опис контактів 16 * 2 рідкокристалічних дисплеїв.
PIN-код |
Символ |
I / O |
Опис |
1 |
Vss |
- |
Земля |
2 |
Vdd |
- |
+ 5В живлення |
3 |
Ві |
- |
Блок живлення для контролю контрасту |
4 |
RS |
Я |
RS = 0 для реєстру команд, RS = 1 для реєстру даних |
5 |
RW |
Я |
R / W = 0 для запису, R / W = 1 для читання |
6 |
Е |
I / O |
Увімкнути |
7 |
D0 |
I / O |
8-бітна шина даних (LSB) |
8 |
D1 |
I / O |
8-бітна шина даних |
9 |
D2 |
I / O |
8-бітна шина даних |
10 |
D3 |
I / O |
8-бітна шина даних |
11 |
D4 |
I / O |
8-бітна шина даних |
12 |
D5 |
I / O |
8-бітна шина даних |
13 |
D6 |
I / O |
8-бітна шина даних |
14 |
D7 |
I / O |
8-бітна шина даних (MSB) |
15 |
A |
- |
+ 5 В для підсвічування |
16 |
К |
- |
Земля |
У таблиці нижче наведені часто використовувані коди РК-команд.
Код (шістнадцятковий) |
Опис |
01 |
Чіткий екран дисплея |
06 |
Курсор збільшення (зсув вправо) |
0А |
Дисплей вимкнено, курсор увімкнено |
0С |
Дисплей увімкнено, курсор вимкнено |
0F |
Дисплей увімкнено, курсор блимає |
80 |
Перемістіть курсор на початок 1- го рядка |
C0 |
Перемістіть курсор на початок 2- го рядка |
38 |
2 рядки та матриця 5 * 7 |
ADC0804 IC:
Схема ADC0804 - це 8-бітний паралельний АЦП у сімействі серії ADC0800 від National Semiconductor. Він працює при +5 вольт і має роздільну здатність 8 біт. Розмір кроку та діапазон Vin змінюються для різних значень Vref / 2. У таблиці нижче показано зв’язок між Vref / 2 та діапазоном Vin.
Vref / 2 (V) |
Vin (V) |
Розмір кроку (мВ) |
відчинено |
Від 0 до 5 |
19.53 |
2.0 |
Від 0 до 4 |
15,62 |
1.5 |
Від 0 до 3 |
11.71 |
1.28 |
Від 0 до 2,56 |
10 |
У нашому випадку Vref / 2 підключений до 1,28 вольт, тому розмір кроку становить 10 мВ. Для ADC0804 розмір кроку розраховується як (2 * Vref / 2) / 256.
Для розрахунку вихідної напруги використовується наступна формула:
Dout = Vin / розмір кроку
Де Dout - це вихід цифрових даних у десяткових цифрах, Vin = аналогова вхідна напруга та розмір кроку (роздільна здатність) - це найменша зміна. Дізнайтеся більше про ADC0804 тут, а також перевірте взаємозв'язок ADC0808 з 8051.
Датчик температури LM35:
LM35 - це датчик температури, вихідна напруга якого лінійно пропорційна температурі за Цельсієм. LM35 поставляється вже відкаліброваним, отже, не вимагає зовнішнього калібрування. Він видає 10 мВ на кожен градус Цельсія.
Датчик LM35 виробляє напругу, що відповідає температурі. Ця напруга перетворюється ADC0804 в цифрову (від 0 до 256) і подається на мікроконтролер 8051. Мікроконтролер 8051 перетворює це цифрове значення у температуру в градусах Цельсія. Потім ця температура перетворюється у форму ascii, яка підходить для відображення. Ці значення ascii подаються на 16 * 2 рідкокристалічних дисплеїв, що відображає температуру на своєму екрані. Цей процес повторюється через заданий інтервал.
Нижче наведено налаштування цифрового термометра LM35 із використанням 8051:
Всі цифрові термометри на базі LM35 ви можете знайти тут.
Пояснення коду:
Повна програма C для цього цифрового термометра з використанням LM35 подана в кінці цього проекту. Код розділений на невеликі значущі фрагменти і пояснено нижче.
Для 16 * 2 РК-взаємодії з мікроконтролером 8051 ми повинні визначити штифти, на яких 16 * 2 рідкокристалічний дисплей підключений до мікроконтролера 8051. RS-контакт 16 * 2 рідкокристалічний під'єднаний до P2.7, RW-контакт 16 * 2 рідкокристалічний - до P2.6, а E-контактний 16 * 2 рідкокристалічний - до P2.5. Виводи даних підключені до порту 0 мікроконтролера 8051.
sbit rs = P2 ^ 7; // Вибір реєстру (RS) штифт 16 * 2 lcd sbit rw = P2 ^ 6; // Зчитування / запис (RW) штифт 16 * 2 lcd sbit en = P2 ^ 5; // Увімкнути (E) штифт 16 * 2 рідкокристалічного дисплея
Подібним чином, для взаємодії ADC0804 з мікроконтролером 8051 ми повинні визначити висновки, на яких ADC0804 підключений до мікроконтролера 8051. RD-штифт ADC0804 підключений до P3.0, WR-штифт ADC0804 підключений до P3.1, а INTR-штифт ADC0804 підключений до P3.2. Виводи даних підключені до порту 1 мікроконтролера 8051.
sbit rd_adc = P3 ^ 0; // Зчитування (RD) штифта ADC0804 sbit wr_adc = P3 ^ 1; // Запис (WR) шпильки ADC0804 sbit intr_adc = P3 ^ 2; // Штифт переривання (INTR) ADC0804
Далі ми повинні визначити деякі функції, які використовуються в програмі. Функція затримки використовується для створення заданої затримки, функція c mdwrt використовується для надсилання команд на дисплей 16 * 2 lcd, функція datawrt використовується для передачі даних на дисплей 16 * 2 lcd, а функція convert_display використовується для перетворення даних АЦП у температуру і вивести його на 16 * 2 рідкокристалічний дисплей.
затримка порожнечі (без підпису int); // функція для створення затримки void cmdwrt (беззнаковий символ); // функція для надсилання команд на 16 * 2 рідкокристалічний дисплей void datawrt data (unsigned char); // функція для відправки даних на 16 * 2 рідкокристалічний дисплей void convert_display (беззнаковий знак); // функція для перетворення значення АЦП в температуру та відображення її на 16 * 2 рідкокристалічному дисплеї
У нижченаведеній частині коду ми надсилаємо команди на 16 * 2 lcd. Такі команди, як чітке відображення, збільшення курсору, примушення курсора до початку 1- го рядка надсилаються на дисплей 16 * 2 рідкокристалічний дисплей по черзі через певну затримку часу.
for (i = 0; i <5; i ++) // надсилати команди на 16 * 2 рідкокристалічний дисплей відображати по одній команді за раз {cmdwrt (cmd); // виклик функції для надсилання команд із затримкою дисплея 16 * 2 (1); }
У цій частині коду ми надсилаємо дані на рідкокристалічний екран 16 * 2. Дані для відображення на рідкокристалічному дисплеї 16 * 2 надсилаються для відображення по черзі через певну затримку часу.
for (i = 0; i <12; i ++) // надсилаємо дані на 16 * 2 рідкокристалічний дисплей, що відображає по одному символу {datawrt (data1); // виклик функції для передачі даних на затримку відображення 16 * 2 рідкокристалічного дисплея (1); } У цій частині коду ми перетворюємо аналогову напругу, вироблену датчиком LM35, у цифрові дані, а потім перетворюємо її на температуру та відображаємо на 16 * 2 рідкокристалічному дисплеї. Щоб ADC0804 розпочав перетворення, нам потрібно надіслати імпульс від низького до високого на штифт WR ADC0804, тоді нам доведеться почекати закінчення перетворення. INTR стає низьким в кінці конверсії. Як тільки INTR стає низьким, RD стає низьким для копіювання цифрових даних на порт 0 мікроконтролера 8051. Після вказаної затримки часу починається наступний цикл. Цей процес повторюється назавжди.
while (1) // повторюємо назавжди {wr_adc = 0; // надсилаємо НИЗЬКИЙ на ВИСОКИЙ імпульс при затримці виводу WR (1); wr_adc = 1; while (intr_adc == 1); // чекаємо кінця перетворення rd_adc = 0; // робимо RD = 0 для зчитування даних з ADC0804 value = P1; // копіюємо дані АЦП convert_display (значення); // виклик функції для перетворення даних АЦП у температуру та відображення їх із затримкою відображення 16 * 2 рідкокристалічного дисплея (1000); // інтервал між циклами rd_adc = 1; // робимо RD = 1 для наступного циклу}
У нижченаведеній частині коду ми надсилаємо команди на рідкокристалічний дисплей 16 * 2. Команда копіюється в порт 0 мікроконтролера 8051. RS робиться низьким для запису команд. RW зменшено для операції запису. Імпульс від високого до низького значення застосовується на штифті Enable (E) для запуску операції запису команди.
void cmdwrt (знак без знака x) {P0 = x; // надіслати команду в порт 0, на який підключено 16 * 2 рідкокристалічних дисплеїв rs = 0; // робимо RS = 0 для команди rw = 0; // робимо RW = 0 для операції запису en = 1; // надсилаємо імпульс HIGH to LOW на штифт Enable (E) для запуску затримки роботи командизапису (1); en = 0; }
У цій частині коду ми надсилаємо дані на рідкокристалічний дисплей 16 * 2. Дані копіюються в порт 0 мікроконтролера 8051. RS призначений високим для запису команд. RW зменшено для операції запису. Імпульс від високого до низького значення застосовується на штифті Enable (E) для запуску операції запису даних.
void datawrt (непідписаний символ y) {P0 = y; // відправляємо дані в порт 0, на який підключено 16 * 2 рідкокристалічних дисплеїв rs = 1; // робимо RS = 1 для команди rw = 0; // робимо RW = 0 для операції запису en = 1; // надсилаємо імпульс HIGH to LOW на штифт Enable (E), щоб почати затримку операції запису даних (1); en = 0; }
У цій частині коду ми перетворюємо цифрові дані у температуру та відображаємо їх на 16 * 2 рідкокристалічному дисплеї.
void convert_display (значення без підпису char) {unsigned char x1, x2, x3; cmdwrt (0xc6); // команда для встановлення курсору на 6 позицію 2-го рядка на 16 * 2 lcd x1 = (value / 10); // ділимо значення на 10 і зберігаємо фактор у змінній x1 x1 = x1 + (0x30); // перетворюємо змінну x1 в ascii, додаючи 0x30 x2 = значення% 10; // ділимо значення на 10 і зберігаємо залишок у змінній x2 x2 = x2 + (0x30); // перетворюємо змінну x2 в ascii, додаючи 0x30 x3 = 0xDF; // значення ascii ступеня (°) символу datawrt (x1); // відображення температури на 16 * 2 рідкокристалічного дисплея datawrt (x2); datawrt (x3); datawrt ('C'); }
Також перевірте інші термометри за допомогою LM35 з різними мікроконтролерами:
- Цифровий термометр з використанням Arduino та LM35
- Вимірювання температури за допомогою мікроконтролера LM35 та AVR
- Вимірювання кімнатної температури за допомогою Raspberry Pi