У овом пројекту ћемо демонстрирати израду РТЦ сата помоћу 8051 микроконтролера. Ако желите да направите овај пројекат са Ардуином, проверите овај дигитални сат користећи Ардуино. Главна компонента овог пројекта је ДС1307 који је ИЦ са дигиталним сатом у реалном времену. Обавештавамо о овој ИЦ детаљно.
РТЦ ДС1307:
ДС1307 серијски сат у реалном времену (РТЦ) је сат / календар мале бинарно кодиране децималне (БЦД) мале снаге, плус 56 бајтова НВ СРАМ-а. Овај чип ради на И²Ц протоколу. Сат / календар пружа секунде, минуте, сате, дан, датум, месец и годину. Датум краја месеца аутоматски се прилагођава за месеце са мање од 31 дана, укључујући исправке за преступну годину. Сат ради у 24-часовном или 12-часовном формату са индикатором АМ / ПМ. ДС1307 има уграђено коло за препознавање напајања које открива нестанке напајања и аутоматски се пребацује на резервно напајање. Мерење времена се наставља док део ради из резервног напајања. Чип ДС1307 може континуирано радити до 10 година.
Сат реалног времена заснован на 8051 је дигитални сат који приказује реално време помоћу РТЦ ДС1307, који ради на И2Ц протоколу. Сат реалног времена значи да ради и након нестанка струје. Када се напајање поново повеже, приказује реално време, без обзира на време и трајање када је било искључено. У овом пројекту смо користили ЛЦД модул 16к2 за приказ времена у - (сат, минут, секунде, датум, месец и година) формату. Сатови у реалном времену обично се користе у нашим рачунарима, кућама, канцеларијама и електроничким уређајима како би их ажурирали у реалном времену.
И2Ц протокол је метода повезивања два или више уређаја који користе две жице на један систем, па се овај протокол назива и двожичним протоколом. Може се користити за комуникацију 127 уређаја са једним уређајем или процесором. Већина И2Ц уређаја ради на фреквенцији од 100 кХз.
Кораци за мастер записивање података у славе (начин пријема славе)
- Шаље услов СТАРТ у славе.
- Пошаље адресу роба славе.
- Пошаљите бит за писање (0) славе.
- Примио је АЦК бит од славе
- Шаље речи адресу робову.
- Примио је АЦК бит од славе
- Шаље податке подређеном.
- Примио је АЦК бит од славе.
- И последње шаље СТОП услов славе.
Кораци за читање података са подређеног на главни (начин преноса славе-а)
- Шаље услов СТАРТ у славе.
- Пошаље адресу роба славе.
- Пошаљите прочитани бит (1) славе.
- Примио је АЦК бит од славе
- Примљени подаци од славе
- Примио је АЦК бит од славе.
- Шаље услов СТОП славе.
Кружни дијаграм и опис
У кругу смо користили 3 већине компонената ДС1307, АТ89С52 и ЛЦД. Овде се АТ89С52 користи за очитавање времена са ДС1307 и приказивање на ЛЦД екрану 16к2. ДС1307 шаље време / датум помоћу две линије на микроконтролер.
Везе кругова су једноставне за разумевање и приказане су на горњем дијаграму. Прибадаче СДА и СЦЛ чипа ДС1307 повезане су на п2.1 и П2.0 пинове микроконтролера 89С52 са отпорником на извлачење који држи подразумевану вредност ВИСОКО на подацима и линијама сата. А кристални осцилатор од 32,768 кХз повезан је са чипом ДС1307 за генерисање тачног кашњења од 1 секунде. И батерија 3 Волт је такође повезан са пин 3 рд (БАТ) од ДС1307 која води пут покренут након неуспеха електричне енергије. ЛЦД 16к2 је повезан са 8051 у 4-битном режиму. Контролни пин РС, РВ и Ен су директно повезани са 89С52 пином П1.0, ГНД и П1.1. А пин за пренос података Д0-Д7 повезан је са П1.4-П1.7 од 89С52.
Три тастера, тачније СЕТ, ИНЦ / ЦХАНГЕ и Нект, користе се за подешавање времена сата за причвршћивање П2.4, П2.3 и П2.2 од 89С52 (активно ниско). Када притиснемо СЕТ, активира се режим подешавања времена и сада треба да подесимо време помоћу дугмета ИНЦ / ЦХАНГЕ, а дугме Нект служи за прелазак на цифру. Након подешавања времена сат непрекидно ради.
Опис програма
У код смо укључили 8051 породичну библиотеку и стандардну улазну излазну библиотеку. И дефинисали пинове које смо користили и узели неку променљиву за прорачун.
#инцлуде
А дата функција се користи за вожњу ЛЦД-а.
воид датен () {рс = 1; ен = 1; кашњење (1); ен = 0; } воид лцддата (непотписани цхар цх) {лцдпорт = цх & 0кф0; датен (); лцдпорт = (цх << 4) & 0кф0; датен (); } воид цмден (воид) {рс = 0; ен = 1; кашњење (1); ен = 0; } воид лцдцмд (непотписани знак)
Ова функција се користи за иницирање РТЦ-а и читање времена и датума из обрасца РТЦ ИЦ.
И2ЦСтарт (); И2ЦСенд (0кД0); И2ЦСенд (0к00); И2ЦСтарт (); И2ЦСенд (0кД1); сец = БЦДТоДецимал (И2ЦРеад (1)); мин = БЦДТоДецимал (И2ЦРеад (1)); сат = БЦДТоДецимал (И2ЦРеад (1)); даи1 = БЦДТоДецимал (И2ЦРеад (1)); датум = БЦДТоДецимал (И2ЦРеад (1)); мон = БЦДТоДецимал (И2ЦРеад (1)); година = БЦДТоДецимал (И2ЦРеад (1)); И2ЦСтоп (); схов_тиме (); // приказ времена / датума / дана кашњења (1);
Ове функције се користе за претварање децималног у БЦД и БЦД у децимални.
инт БЦДТоДецимал (цхар бцдБите) {цхар а, б, дец; а = (((бцдБите & 0кФ0) >> 4) * 10); б = (бцдБите & 0к0Ф); дец = а + б; ретурн дец; } цхар ДецималТоБЦД (инт децималБите) {цхар а, б, бцд; а = ((децималБите / 10) << 4); б = (децималБите% 10); бцд = аб; ретурн бцд; }
Следеће функције се користе за И2Ц комуникацију.
воид И2ЦСтарт () {СДА = 1; СЦЛ = 1, СДА = 0, СЦЛ = 0;} // "старт" функција за комуникацију са дс1307 РТЦ воид И2ЦСтоп () {СДА = 0, СЦЛ = 1, СДА = 1; } // функција „заустављања“ за комуникацију са дс1307 РТЦ непотписани цхар И2ЦСенд (непотписани цхар подаци) // слање података на дс1307 {цхар и; цхар ацк_бит; за (и = 0; и <8; и ++) {ако (Подаци & 0к80) СДА = 1; иначе СДА = 0; СЦЛ = 1; Подаци << = 1; СЦЛ = 0; } СДА = 1, СЦЛ = 1; ацк_бит = СДА; СЦЛ = 0; ретурн ацк_бит; } унсигнед цхар И2ЦРеад (цхар ацк) // примање података од дс1307 {унсигнед цхар и, Дата = 0; СДА = 1; за (и = 0; и <8; и ++) {Подаци << = 1; уради {СЦЛ = 1;} вхиле (СЦЛ == 0); ако је (СДА) Подаци- = 1; СЦЛ = 0; } иф (ацк) СДА = 0; иначе СДА = 1; СЦЛ = 1; СЦЛ = 0; СДА = 1; ретурн Дата; }
Функција сет_тиме користи се за подешавање времена у сату, а функција схов_тиме доле се користи за приказ времена на ЛЦД-у.
воид схов_тиме () // функција за приказ времена / датума / дана на ЛЦД-у {цхар вар; лцдцмд (0к80); лцдпринт ("Датум:"); спринтф (вар, "% д", датум); лцдпринт (вар); спринтф (вар, "/% д", пон); лцдпринт (вар); спринтф (вар, "/% д", година + 2000); лцдпринт (вар); лцдпринт (""); лцдцмд (0кц0); лцдпринт ("Време:"); спринтф (вар, "% д", сат); лцдпринт (вар); спринтф (вар, ":% д", мин); лцдпринт (вар); спринтф (вар, ":% д", сек); лцдпринт (вар); лцдпринт (""); // дан (дан1); лцдпринт (""); }