У цьому проекті ми продемонструємо виготовлення годинника RTC за допомогою мікроконтролера 8051. Якщо ви хочете зробити цей проект з Arduino, перевірте цей цифровий годинник за допомогою Arduino. Основною складовою цього проекту є DS1307, який є цифровим годинником у реальному часі. Давайте детально дізнаємося про цю ІС.
RTC DS1307:
Серійний годинник реального часу (RTC) DS1307 - це годинник / календар із двома кодованими десятковими кодами (BCD) із низьким енергоспоживанням, плюс 56 байт NV SRAM. Цей чіп працює за протоколом I²C. Годинник / календар надає секунди, хвилини, години, день, дату, місяць та рік. Дата кінця місяця автоматично коригується на місяці, що мають менше 31 дня, включаючи виправлення для високосного року. Годинник працює в 24-годинному або 12-годинному форматі з індикатором AM / PM. DS1307 має вбудовану схему вимірювання потужності, яка виявляє збої в живленні та автоматично перемикається на резервне живлення. Операція хронометражу триває, поки частина працює від резервного джерела живлення. Мікросхема DS1307 може працювати безперервно до 10 років.
Годинник реального часу на базі 8051 - це цифровий годинник для відображення реального часу за допомогою RTC DS1307, який працює за протоколом I2C. Годинник реального часу означає, що він працює навіть після збою живлення. При повторному підключенні живлення відображається реальний час незалежно від часу та тривалості, коли він був у вимкненому стані. У цьому проекті ми використали РК-модуль 16x2 для відображення часу у форматі - (година, хвилина, секунди, дата, місяць та рік). Годинники реального часу зазвичай використовуються в наших комп’ютерах, будинках, офісах та електроніці, щоб постійно оновлювати їх у реальному часі.
Протокол I2C - це спосіб підключення двох або більше пристроїв за допомогою двох проводів до однієї системи, тому цей протокол також називають двопровідним протоколом. Він може використовуватися для зв'язку 127 пристроїв з одним пристроєм або процесором. Більшість пристроїв I2C працюють на частоті 100 кГц.
Кроки для запису ведучого даних у ведений (режим прийому веденого пристрою)
- Надсилає умову START на ведений.
- Надсилає адресу підлеглого рабу.
- Надіслати біт запису (0) у ведений.
- Отримано біт ACK від веденого пристрою
- Надсилає слова, адресовані рабу.
- Отримано біт ACK від веденого пристрою
- Надсилає дані на підлеглий.
- Отримано біт ACK від веденого пристрою.
- І останній надсилає умову STOP веденому.
Кроки для зчитування даних від веденого до ведучого (режим передачі веденого)
- Надсилає умову START на ведений.
- Надсилає адресу підлеглого рабу.
- Надіслати зчитуваний біт (1) підлеглому.
- Отримано біт ACK від веденого пристрою
- Отримані дані від підлеглого
- Отримано біт ACK від веденого пристрою.
- Надсилає умову STOP веденому.
Принципова схема та опис
У схемі ми використали 3 більшості компонентів DS1307, AT89S52 та LCD. Тут AT89S52 використовується для зчитування часу з DS1307 та відображення його на РК-екрані 16x2. DS1307 надсилає час / дату за допомогою 2 рядків на мікроконтролер.
З'єднання ланцюгів легко зрозуміти і показано на наведеній вище схемі. Висновки SDA та SCL мікросхеми DS1307 підключені до висновків P2.1 та P2.0 мікроконтролера 89S52 з висувним резистором, який утримує значення за замовчуванням HIGH на лініях даних та тактових частотах. А кристалічний генератор 32,768 кГц підключений до чіпа DS1307 для генерування точної затримки в 1 секунду. А 3-вольтовий акумулятор також підключений до 3- го контакту (BAT) DS1307, що забезпечує постійний час роботи після відмови електрики. РК-дисплей 16x2 підключається до 8051 у 4-бітному режимі. Керуючий штифт RS, RW та En безпосередньо підключені до 89S52 штифтів P1.0, GND та P1.1. А контакт даних D0-D7 підключений до P1.4-P1.7 з 89S52.
Три кнопки, а саме SET, INC / CHANGE і Next, використовуються для встановлення часу годинника для закріплення P2.4, P2.3 і P2.2 89S52 (активний низький рівень). Коли ми натискаємо SET, активується режим встановлення часу, і тепер нам потрібно встановити час за допомогою кнопки INC / CHANGE, а кнопка Next використовується для переходу до цифри. Після встановлення часу годинник працює безперервно.
Опис програми
У код ми включили сімейну бібліотеку 8051 та стандартну вихідну бібліотеку введення. І визначив шпильки, які ми використовували, і взяв якусь змінну для розрахунків.
#включати
І дана функція використовується для керування РК-дисплеєм.
void daten () {rs = 1; en = 1; затримка (1); en = 0; } недійсні lcddata (беззнаковий знак ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; затримка (1); en = 0; } void lcdcmd (беззнаковий символ)
Ця функція використовується для ініціалізації RTC, а також зчитування часу та дати з ІЦ RTC IC
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); година = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); дата = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); рік = BCDToDecimal (I2CRead (1)); I2CStop (); show_time (); // відображення часу / дати / затримки дня (1);
Ці функції використовуються для перетворення десяткової в BCD та BCD в десяткову.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; повернути dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (десятковийБайт% 10); bcd = ab; повернути bcd; }
Наведені нижче функції використовуються для зв'язку I2C.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // функція "запуск" для зв'язку з ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // функція "зупинки" для зв'язку з ds1307 RTC unsigned char I2CSend (unsigned char Data) // надіслати дані на ds1307 {char i; char ack_bit; для (i = 0; i <8; i ++) {якщо (Дані & 0x80) SDA = 1; інакше SDA = 0; SCL = 1; Дані << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; повернути ack_bit; } unsigned char I2CRead (char ack) // отримуємо дані з ds1307 {unsigned char i, Data = 0; ПДР = 1; для (i = 0; i <8; i ++) {Дані << = 1; виконайте {SCL = 1;} while (SCL == 0); якщо (SDA) Дані- = 1; SCL = 0; } if (ack) SDA = 0; ще SDA = 1; SCL = 1; SCL = 0; ПДР = 1; повернути Дані; }
Функція set_time використовується для встановлення часу в годиннику, а функція show_time нижче - для відображення часу на РК-дисплеї.
void show_time () // функція відображення часу / дати / дня на РК-дисплеї {char var; lcdcmd (0x80); lcdprint ("Дата:"); sprintf (var, "% d", дата); lcdprint (var); sprintf (var, "/% d", пн); lcdprint (var); sprintf (var, "/% d", рік + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Час:"); sprintf (var, "% d", година); lcdprint (var); sprintf (var, ":% d", хв); lcdprint (var); sprintf (var, ":% d", сек); lcdprint (var); lcdprint (""); // день (день1); lcdprint (""); }