- Необхідні компоненти:
- Кругова діаграма:
- Використання таймера 8051 для вимірювання частоти:
- 555 Таймер як джерело частоти:
- Пояснення до роботи та коду:
Частота визначається як кількість циклів в секунду. Це також можна визначити як взаємне значення загального часу 'T'. У цьому проекті ми збираємося підрахувати кількість імпульсів, що надходять у порт 3.5 мікроконтролера 8051, і відобразити його на РК-дисплеї 16 * 2. Отже, в основному ми вимірюємо частоту сигналу в порту 3.5 8051. Тут ми використовували мікросхему AT89S52 8051, а 555 IC використовується в режимі Astable для генерації імпульсу для демонстрації. Раніше ми створювали лічильник частоти за допомогою Arduino.
Необхідні компоненти:
- 8051 мікроконтролер (AT89S52)
- 16 * 2 РК-дисплей
- Джерело частоти (таймер 555)
- Потенціометр
- Підключення проводів
Кругова діаграма:
Використання таймера 8051 для вимірювання частоти:
Мікроконтролер 8051 - це 8-бітний мікроконтролер, який має 128 байт мікросхеми оперативної пам'яті, 4K байт мікросхеми мікросхеми, два таймери, один послідовний порт і чотири 8-бітних порти. Мікроконтролер 8052 - це розширення мікроконтролера. Щоб налаштувати порт 3.5 як лічильник, значенням регістру TMOD встановлено значення 0x51. Нижче на малюнку показано регістр TMOD.
ВОРОТА | C / T | М1 | M0 | ВОРОТА | C / T | М1 | М2 |
ТАЙМЕР 1 | ТАЙМЕР 0 |
GATE - коли встановлено GATE, таймер або лічильник вмикаються лише тоді, коли штифт INTx ВИСОКИЙ і встановлений штифт управління TRx. Коли GATE очищений, таймер вмикається, коли встановлений біт керування TRx.
C / T - коли C / T = 0, він діє як таймер. Коли C / T = 1, він діє як лічильник.
M1 і M0 вказує на режим роботи.
Для TMOD = 0x51 таймер1 діє як лічильник і працює в режимі1 (16 біт).
РК-дисплей 16 * 2 використовується для відображення частоти сигналу в герцах (Гц). Якщо ви не знайомі з РК-дисплеєм 16x2, перевірте тут більше про шпильки РК-екранів 16x2 та його команди. Також перевірте, як підключити РК до 8051.
555 Таймер як джерело частоти:
Джерело частоти повинно виробляти квадратні хвилі, а максимальна амплітуда обмежена 5В, оскільки порти мікроконтролера 8051 не можуть обробляти напругу більше 5В. Максимальна частота він може вимірювати це 655,35 кГц з - за обмежень пам'яті TH1 і TL1 регістра (8bit кожен). За 100 мілісекунд TH1 і TL1 можуть зберігати до 65535 відліків. Отже, максимальна частота, яку можна виміряти, становить 65535 * 10 = 655,35 кГц.
У цьому проекті вимірювача частоти 8051 я використовую таймер 555 у нестабільному режимі для створення квадратних хвиль змінної частоти. Частоту сигналу, що генерується 555 IC, можна змінювати, регулюючи потенціометр, як показано у відео, поданому в кінці цього проекту.
У цьому проекті Timer1 (T1) підраховує кількість імпульсів, що надходять у порт 3.5 мікроконтролерів 8051 протягом 100 мілісекунд. Значення підрахунку зберігатимуться у регістрах TH1 та TL1 відповідно. Для поєднання значень регістрів TH1 та TL1 використовується нижченаведена формула.
Імпульси = TH1 * (0x100) + TL1
Тепер "імпульс" матиме кількість циклів за 100 мілісекунд. Але частота сигналу визначається як кількість циклів в секунду. Для перетворення його в частоту використовується нижченаведена формула.
Імпульси = Імпульси * 10
Пояснення до роботи та коду:
Повна програма C для цієї частоти метр дається в кінці цього проекту. Код розділений на невеликі значущі фрагменти і пояснено нижче.
Для 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; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
Далі ми повинні визначити деякі функції, які використовуються в програмі. Функція затримки використовується для створення заданої затримки часу. Функція Cmdwrt використовується для надсилання команд на рідкокристалічний дисплей 16 * 2. Функція datawrt використовується для передачі даних на рідкокристалічний дисплей 16 * 2.
затримка порожнечі (без підпису int); void cmdwrt (беззнаковий символ); void datawrt (беззнаковий символ);
У цій частині коду ми надсилаємо команди на 16 * 2 lcd. Такі команди, як чітке відображення, збільшення курсору, примушення курсора до початку 1- го рядка надсилаються на дисплей 16 * 2 рідкокристалічний дисплей по черзі через певну затримку часу.
для (i = 0; i <5; i ++) {cmdwrt (cmd); затримка (1); }
У цій частині коду таймер1 налаштований як лічильник, а режим роботи встановлений в режим 1.
Timer0 налаштований як таймер, а режим роботи встановлений в режим 1. Таймер 1 використовується для підрахунку кількості імпульсів, а таймер 0 - для генерації затримки часу. Значення TH1 і TL1 встановлюються на 0, щоб гарантувати, що підрахунок починається з 0.
TMOD = 0x51; TL1 = 0; TH1 = 0;
У цій частині коду таймер працює протягом 100 мілісекунд. За допомогою затримки генерується 100 мілісекунд затримки. TR1 = 1 призначений для запуску таймера, а TR1 = 0 - для зупинки таймера через 100 мілісекунд.
TR1 = 1; затримка (100); TR1 = 0;
У цій частині коду значення рахунку, наявні в регістрах TH1 і TL1, поєднуються, а потім його множать на 10, щоб отримати загальну кількість циклів за 1 секунду.
Імпульси = TH1 * (0x100) + TL1; Імпульси = імпульси * 10;
У цій частині коду значення частоти перетворюється в одиничні байти, щоб полегшити відображення на рідкокристалічному дисплеї 16 * 2.
d1 = імпульси% 10; s1 = імпульси% 100; s2 = імпульси% 1000; s3 = імпульси% 10000; s4 = імпульси% 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (імпульси-s4) / 100000;
У цій частині коду окремі цифри значення частоти перетворюються у формат ASCII і відображаються на 16 * 2 рідкокристалічному дисплеї.
Якщо (імпульси> = 100000) datawrt (0x30 + d6); якщо (імпульси> = 10000) datawrt (0x30 + d5); якщо (імпульси> = 1000) datawrt (0x30 + d4); якщо (імпульси> = 100) datawrt (0x30 + d3); якщо (імпульси> = 10) datawrt (0x30 + d2); datawrt (0x30 + d1);
У цій частині коду ми надсилаємо команди на рідкокристалічний дисплей 16 * 2. Команда копіюється в порт 0 мікроконтролера 8051. RS робиться низьким для запису команд. RW зменшено для операції запису. Імпульс від високого до низького значення застосовується на штифті Enable (E) для запуску операції запису команди.
void cmdwrt (знак без знака x) {P0 = x; rs = 0; rw = 0; en = 1; затримка (1); en = 0; }
У цій частині коду ми надсилаємо дані на рідкокристалічний дисплей 16 * 2. Дані копіюються в порт 0 мікроконтролера 8051. RS призначений високим для запису команд. RW є низьким для операції запису. Імпульс від високого до низького значення застосовується на штифті Enable (E) для запуску операції запису даних.
void datawrt (непідписаний символ y) {P0 = y; rs = 1; rw = 0; en = 1; затримка (1); en = 0; }
Ось як ми можемо виміряти частоту будь-якого сигналу за допомогою мікроконтролера 8051. Перевірте повний код та демонстраційне відео нижче.