В этом проекте мы собираемся продемонстрировать создание часов 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 на линиях данных и часов. К микросхеме DS1307 подключен кварцевый генератор 32,768 кГц для генерации задержки с точностью до 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 и стандартную библиотеку ввода-вывода. И определили контакты, которые мы использовали, и взяли некоторую переменную для расчетов.
#включают
И данная функция используется для управления LCD.
void daten () {rs = 1; en = 1; задержка (1); en = 0; } void lcddata (unsigned char ch) {lcdport = ch & 0xf0; daten (); lcdport = (канал << 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); сек = BCDToDecimal (I2CRead (1)); мин = BCDToDecimal (I2CRead (1)); час = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); дата = BCDToDecimal (I2CRead (1)); мон = BCDToDecimal (I2CRead (1)); год = BCDToDecimal (I2CRead (1)); I2CStop (); время для шоу(); // отображение времени / даты / дневной задержки (1);
Эти функции используются для преобразования десятичного числа в двоично-десятичный и двоично-десятичный в десятичный.
int BCDToDecimal (char bcdByte) {char a, b, dec; а = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; return dec; } char DecimalToBCD (int decimalByte) {char, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 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; for (i = 0; i <8; i ++) {if (Data & 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; SDA = 1; for (i = 0; i <8; i ++) {Data << = 1; делать {SCL = 1;} пока (SCL == 0); если (SDA) Data- = 1; SCL = 0; } if (ack) SDA = 0; иначе SDA = 1; SCL = 1; SCL = 0; SDA = 1; вернуть данные; }
Функция set_time используется для установки времени в часах, а функция show_time ниже используется для отображения времени на ЖК-дисплее.
void show_time () // функция для отображения времени / даты / дня на ЖК-дисплее {char var; lcdcmd (0x80); lcdprint ("Дата:"); sprintf (var, "% d", date); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", год + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Время:"); sprintf (var, "% d", час); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", сек); lcdprint (var); lcdprint (""); // день (день1); lcdprint (""); }