В този проект ще демонстрираме изработването на RTC часовник с помощта на микроконтролер 8051. Ако искате да направите този проект с Arduino, проверете този цифров часовник с помощта на Arduino. Основният компонент на този проект е DS1307, който е цифров часовник в реално време. Да разберем подробно за този IC.
RTC DS1307:
Серийният часовник в реално време DS1307 (RTC) е часовник / календар с пълна двоично кодирана десетична (BCD) с ниска мощност плюс 56 байта NV SRAM. Този чип работи по I²C протокол. Часовникът / календарът предоставя информация за секунди, минути, часове, ден, дата, месец и година. Краят на месеца се коригира автоматично за месеци с по-малко от 31 дни, включително корекции за високосна година. Часовникът работи във 24-часов или 12-часов формат с индикатор AM / PM. DS1307 има вградена схема за смисъл на мощност, която открива прекъсвания на захранването и автоматично превключва на резервно захранване. Операцията за отчитане на времето продължава, докато частта работи от резервното захранване. DS1307 чипът може да работи непрекъснато до 10 години.
Базираният на 8051 часовник в реално време е цифров часовник за показване на реално време с помощта на RTC DS1307, който работи по протокол I2C. Часовникът в реално време означава, че работи дори след прекъсване на захранването. Когато захранването се свърже отново, то показва реалното време, независимо от времето и продължителността, в които е било в изключено състояние. В този проект ние използвахме 16x2 LCD модул за показване на времето във - (час, минута, секунди, дата, месец и година) формат. Часовниците в реално време се използват често в нашите компютри, къщи, офиси и електроника, за да ги поддържат актуализирани в реално време.
I2C протоколът е метод за свързване на две или повече устройства, използващи два проводника, към една система и така този протокол се нарича още двупроводен протокол. Може да се използва за комуникация на 127 устройства с едно устройство или процесор. Повечето устройства I2C работят на честота 100Khz.
Стъпки за главен запис на данни към подчинен (режим на приемане на подчинен)
- Изпраща условието START на роб.
- Изпраща подчинен адрес на подчинен.
- Изпратете бит за запис (0) към slave.
- Получен ACK бит от подчинен
- Изпраща думи на адрес на роб.
- Получен ACK бит от подчинен
- Изпраща данни на роб.
- Получен ACK бит от подчинен.
- И последно изпраща условие СТОП на роб.
Стъпки за четене на данни от slave към master (режим на предаване на slave)
- Изпраща условието START на роб.
- Изпраща подчинен адрес на подчинен.
- Изпратете бит за четене (1) към slave.
- Получен ACK бит от подчинен
- Получени данни от slave
- Получен ACK бит от подчинен.
- Изпраща условие STOP на роб.
Електрическа схема и описание
Във веригата сме използвали 3 повечето компоненти DS1307, AT89S52 и LCD. Тук AT89S52 се използва за отчитане на време от DS1307 и го показва на 16x2 LCD екран. DS1307 изпраща час / дата, използвайки 2 реда до микроконтролера.
Верижните връзки са лесни за разбиране и са показани в горната схема. DS1307 чип SDA и SCL са свързани към P2.1 и P2.0 щифтове на микроконтролера 89S52 с издърпващ резистор, който държи стойността по подразбиране HIGH на данните и тактовите линии. И 32,768KHz кристален осцилатор е свързан с DS1307chip за генериране на точно 1 секунда закъснение. И 3-волтова батерия също е свързана към щифт 3 -ти (BAT) на DS1307, който поддържа времето да работи след прекъсване на електричеството. 16x2 LCD е свързан с 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 фамилна библиотека и стандартна входна изходна библиотека. И дефинирахме щифтове, които използвахме, и взехме някаква променлива за изчисления.
#include
И дадената функция се използва за управление на LCD.
void daten () {rs = 1; en = 1; забавяне (1); en = 0; } невалидни lcddata (неподписан char 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)); ден1 = BCDToDecimal (I2CRead (1)); дата = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); година = BCDToDecimal (I2CRead (1)); I2CStop (); време за шоу(); // показва време / дата / ден закъснение (1);
Тези функции се използват за преобразуване на десетични в BCD и BCD в десетични.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; връщане дек; } char DecimalToBCD (int decimalByte) {char a, 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 неподписан char I2CSend (неподписан char данни) // изпращане на данни на ds1307 {char i; char ack_bit; за (i = 0; i <8; i ++) {if (Данни & 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; за (i = 0; i <8; i ++) {Данни << = 1; направете {SCL = 1;} докато (SCL == 0); ако (SDA) Данни- = 1; SCL = 0; } ако (ack) SDA = 0; иначе SDA = 1; SCL = 1; SCL = 0; SDA = 1; връщане на данни; }
Функцията set_time се използва за задаване на часа в часовник, а функцията show_time по-долу се използва за показване на времето на LCD.
void show_time () // функция за показване на час / дата / ден на LCD {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 (""); }