- Потребни материјали:
- Предуслови:
- Кружни дијаграм:
- Програмирање за будилник:
- Симулација:
- Рад дигиталног будилника помоћу ПИЦ16Ф877А:
Дигитална револуција започета 1950. године мења све постојеће механичке и аналогне електронске структуре у дигиталне рачунаре. Будући да је раст дигиталне електронике био експоненцијалан, данас је готово немогуће да се човек одуприје употреби било које електронске опреме. Почевши од будилице која вас буди и тостера који вам служи доручак, све је допринос дигиталне електронике. Размишљајући о свему овоме заиста је узбудљиво програмирати сопствене ствари које би могле обављати једноставне, а корисне задатке, попут будилице коју ћемо у овом пројекту изградити са ПИЦ микроконтролером. Раније смо изградили будилицу са другим микроконтролерима:
- Будилник Распберри Пи помоћу РТЦ модула ДС1307
- Дигитални сат заснован на Ардуину са алармом
- Будилник помоћу АТмега32 микроконтролера
Ова будилица ће имати ЛЦД екран од 16к2 који приказује тренутно време и подешено време. Помоћу неколико тастера подесићемо време аларма кад год је то потребно. Тренутно време ће бити евидентирано помоћу ДС3231 РТЦ модула и користићемо ИИЦ комуникацију за добијање ових вредности из РТЦ модула. Већ смо научили о РТЦ модулу и начину повезивања са ПИЦ-ом. Стога је препоручљиво прочитати тај водич, прескочит ћемо већину информација обухваћених тим упутством.
Потребни материјали:
- Даска за хлеб - 2бр
- ПИЦ16Ф877А
- 5В извор напајања - модул напајања
- Кристал од 20 МХз
- 33пф кондензатор - 2Нос
- ДС3231 РТЦ модул
- Модул ЛЦД екрана од 16 * 2
- 10К ПОТ
- Отпорник 10к и 1К
- Тастери - 5Бр
- Зујалица
- Повезивање жица
Предуслови:
Овај пројекат захтева да знате неколико основа о ПИЦ микроконтролеру и како га програмирати. За овај пројекат ћемо користити ГПИО, ЛЦД екран и РТЦ модул. Зато је боље унапред научити како се користе ови модули. Следећи линкови ће вам помоћи да научите исто
- Писање вашег првог програма помоћу ПИЦ микроконтролера
- Повезивање ЛЦД-а са ПИЦ-ом
- И2Ц комуникација помоћу ПИЦ-а
- ДС3231 РТЦ повезивање са ПИЦ-ом
Кружни дијаграм:
Дијаграм кола за овај пројекат будилника заснован на ПИЦ-у приказан је испод, а који је створен помоћу софтвера протеус. Такође ће се користити за симулацију даље у овом пројекту.
Пет тастера ће служити као улаз за подешавање аларма на одређено време. Дакле, један крај свих тастера је повезан са масом, а други крајеви су повезани са ПОРТБ пином, на овим пиновима ће се користити унутрашњи повлачни отпорник како би се избегло да пинови плутају. Зујалица ће деловати као излаз и огласиће се звучним сигналом када се аларм активира и буде повезан на пин ПОРТ С. Тренутно време увек прати ДС3231 РТЦ модул од којег ПИЦ прима податке преко И2Ц магистрале, тако да су СЦЛ и СДА пинови РТЦ модула повезани са СЦЛ и СДА пином ПИЦ контролера. На ПОРТД ПИЦ-а прикључен је ЛЦД екран који се користи за приказ тренутног и подешеног времена. Овде сазнајте више о употреби ДС3231 РТЦ модула са ПИЦ-ом.
Комплетан круг се може изградити преко плоче. Будући да постоји неколико десетина жица за повезивање, зато само имајте стрпљења и уверите се да су везе исправне. Моја хардверска поставка је изгледала отприлике овако у наставку, када сам завршио са везама
За напајање модула користио сам модул за плочу и адаптер од 12В. Ово је мој извор напајања од + 5В. Такође морам да користим две плоче да одржавам струјни круг чистим. Такође можете залемити читав круг на перф плочу ако желите да направите робуснији пројекат.
Програмирање за будилник:
Комплетан програм за имплементацију мира за овај Аларм Цлоцк пројекат могу се наћи на дну ове странице. Овај пројекат такође захтева три библиотеке за коришћење ЛЦД-а, И2Ц-а и РТЦ-а са ПИЦ-ом. Комплетни код са датотекама заглавља може се овде преузети из ЗИП датотеке и може се отворити помоћу МПЛАБКС након издвајања. Даље у наставку само објашњавам главну ц датотеку као мале исечке. Можете се вратити на горе поменуте водиче ако желите знати како функционишу датотеке заглавља.
Пре него што уђемо у главни програм, морамо да дефинишемо игле које смо користили са смисленијим именом. На овај начин ће их бити лако користити током програмирања. Игле дефинисане у нашем програму приказане су доле
// Дефинишите ЛЦД пинове #дефине РС РД2 // Ресетујте пин ЛЦД-а #дефине ЕН РД3 // Омогућите пин ЛЦД-а #дефине Д4 РД4 // Бит података 0 ЛЦД-а #дефине Д5 РД5 // Бит података 1 ЛЦД-а #дефине Д6 РД6 // Бит података 2 ЛЦД-а #дефине Д7 РД7 // Дата бит 3 ЛЦД-а // Дефиниши дугмад #дефине МБ РБ1 // Средње дугме #дефине ЛБ РБ0 // Лево дугме #дефине РБ РБ2 // Десно дугме # дефинишите УБ РБ3 // Горње дугме #дефине ББ РБ4 // Доње дугме // Дефинишите бузз #дефине БУЗЗ РД1 // Зујалица је повезана на РД1
Унутар главне функције започињемо декларисањем улазних и излазних пинова. У нашем пројекту ПОРТБ се користи за тастере који је улазни уређај па смо поставили њихове пинове као улазе, а ПОРТД се користи за ЛЦД и зујалицу па смо поставили њихове пинове као излаз. Такође пин не сме никада да остане плутајући у значењу, И / О пинови увек треба да буду повезани на масу или на + 5В напон. У нашем случају за тастере клинови неће бити повезани ни са чим када се дугме не притисне, па користимо унутрашњи отпорник на извлачење који поставља пин на Хигх када се не користи. То се ради помоћу контролних регистара као што је приказано доле
ТРИСД = 0к00; // Направите пинове за порт Д као излазне за повезивање ЛЦД-а ТРИСБ = 0кФФ; // Свичеви су декларисани као улазни пинови ОПТИОН_РЕГ = 0б00000000; // Омогући повлачење отпорника на порту Б за прекидаче БУЗЗ = 0; // Окрените зујалицу
Будући да смо датотеку заглавља ЛЦД и И2Ц повезали са главним програмом, иницијализацију ЛЦД-а можемо започети позивањем једноставне функције. Исто се може урадити и за иницијализацију И2Ц. Овде започињемо И2Ц комуникацију на 100кХз јер РТЦ модул ради са 100кХз.
Лцд_Старт (); // Иницијализација ЛЦД модула И2Ц_Инитиализе (100); // Иницирајте И2Ц Мастер са тактом од 100КХз
Функција у наставку се користи за подешавање времена и датума на РТЦ модулу, након што се поставе време и датум, уклоните овај ред. Иначе сваки пут када покренете програм, време и датум ће се постављати изнова и изнова
// Уклоните испод линије једном датум и време је постављен први пут. Сет_Тиме_Дате (); // подесимо време и датум на РТЦ модулу
Да бисмо назначили да се програм покреће, приказујемо мали уводни екран који приказује назив пројекта и назив веб странице као што је приказано доле
// Дајте уводну поруку на ЛЦД-у Лцд_Цлеар (); Лцд_Сет_Цурсор (1,1); Лцд_Принт_Стринг ("Будилник"); Лцд_Сет_Цурсор (2,1); Лцд_Принт_Стринг ("-Скупљање кругова"); __делаи_мс (1500);
Следеће унутар вхиле петље треба да очитамо тренутно време и датум из РТЦ модула, то се може учинити само позивањем доње функције.
Упдате_Цуррент_Дате_Тиме (); // Очитавање тренутног датума и времена из РТЦ модула
Позивање горње функције ажурираће променљиве сек, мин и сат тренутном вредношћу. Да бисмо их приказали на ЛЦД екрану, морамо их поделити на појединачне знакове помоћу доњег кода.
// Поделимо на цхар за приказ на лцд цхар сец_0 = сец% 10; цхар сец_1 = (сец / 10); цхар мин_0 = мин% 10; цхар мин_1 = мин / 10; цхар сат_0 = сат% 10; цхар хоур_1 = сат / 10;
Даље, вредности ажурирамо преко ЛЦД екрана. Тренутно време ће бити приказано у првом реду, а подешено време у којем се аларм мора активирати у другом реду. Код који чини исто приказан је у наставку.
// Приказ тренутног времена на ЛЦД екрану Лцд_Цлеар (); Лцд_Сет_Цурсор (1, 1); Лцд_Принт_Стринг ("ТИМЕ:"); Лцд_Принт_Цхар (хоур_1 + '0'); Лцд_Принт_Цхар (хоур_0 + '0'); Лцд_Принт_Цхар (':'); Лцд_Принт_Цхар (мин_1 + '0'); Лцд_Принт_Цхар (мин_0 + '0'); Лцд_Принт_Цхар (':'); Лцд_Принт_Цхар (сец_1 + '0'); Лцд_Принт_Цхар (сец_0 + '0'); // Прикажите датум на ЛЦД екрану Лцд_Сет_Цурсор (2, 1); Лцд_Принт_Стринг ("Аларм:"); Лцд_Принт_Цхар (аларм_вал + '0'); Лцд_Принт_Цхар (аларм_вал + '0'); Лцд_Принт_Цхар (':'); Лцд_Принт_Цхар (аларм_вал + '0 '); Лцд_Принт_Цхар (аларм_вал + '0');
Сада смо приказали време и поставили време на ЛЦД-у. Морамо да проверимо да ли корисник покушава да подеси време аларма. Да би то урадио, корисник мора притиснути средње дугме, па ћемо проверити да ли је притиснуто средње дугме и пребацити променљиву за улазак у режим подешавања аларма. Поново ће се притиснути исто дугме да би се потврдило да су вредности постављене и у том случају морамо изаћи из режима подешавања аларма. Дакле, користимо доњи ред кода за промену статуса променљиве сет_аларм .
// Користите средње дугме да бисте проверили да ли аларм треба поставити ако (МБ == 0 && сет_аларм == 0) {// Ако се притисне средње дугме и аларм није укључен док (! МБ); // Сачекајте док се дугме не пусти сет_аларм = 1; // започињемо са подешавањем вредности аларма } иф (МБ == 0 && сет_аларм == 1) {// Ако се притисне средње дугме и аларм се не искључи док (! МБ); // Сачекајте док се дугме не пусти сет_аларм = 0; // заустављање подешавања вредности аларма }
Ако је корисник притиснуо средње дугме, то значи да покушава да подеси време аларма. У овом случају програм улази у режим подешавања аларма помоћу горњег кода. Ако корисник притисне лево или десно дугме у режиму подешавања аларма, то значи да морамо померити курсор лево или десно. Да бисмо то урадили, једноставно увећавамо за декремент вредност позиције на коју се мора поставити курсор
иф (ЛБ == 0) {// Ако се притисне лево дугме док (! ЛБ); // Сачекајте док се дугме не пусти пос--; // Затим померите курсор улево } иф (РБ == 0) {// Ако се притисне десно дугме док (! РБ); // Сачекајте док се дугме не пусти пос ++; // Померите курсор удесно }
Док користите тастер са микроконтролером или микропроцесором, постоји један уобичајени проблем за решавање. Овај проблем се назива одбијањем прекидача. Тада притиском на дугме може доћи до бучних импулса на МЦУ / МПУ који могу лажирати МЦУ за више уноса. Овај проблем се може решити додавањем кондензатора преко прекидача или употребом функције одлагања чим се детектује притискање тастера. Ова врста решења назива се одскакање. Овде смо користили вхиле петљу да држимо програм на месту док се дугме не отпусти. Ово није најбоље решење за одбијање, али за нас ће то сасвим добро функционисати.
док (! РБ);
Слично левом и десном тастеру, имамо и горњи и доњи тастер који се могу користити за повећање или смањење вредности времена аларма. Код за исто је приказан испод. Приметите да се сваком знаку подешеног времена аларма обраћа вредност индекса низа. Ово је био случај да лако можемо приступити потребном знаку чије вредности треба променити.
иф (УБ == 0) {// Ако се притисне горње дугме док (! УБ); // Сачекајте док се дугме не пусти аларм_вал ++; // Повећајте ту посебну вредност знака } иф (ББ == 0) {// Ако се притисне доње дугме док (! УБ); // Сачекајте док се дугме не пусти аларм_вал--; // Смањивање те посебне вредности знака }
Када се постави време аларма, корисник ће поново притиснути средње дугме. Тада можемо почети да упоређујемо тренутно време са постављеним временом. Поређење провером да ли је сваки појединачни знак тренутног времена једнак карактеру постављеног времена. Ако су вредности једнаке, тада активирамо аларм постављањем променљиве триггер_аларм, у супротном само упоређујемо док не постане једнако.
// АКО је аларм постављен Проверите да ли је постављена вредност једнака тренутној вредности иф (сет_аларм == 0 && аларм_вал == хоур_1 && аларм_вал == хоур_0 && аларм_вал == мин_1 && аларм_вал == мин_0) триггер_аларм = 1; // Укључи окидач ако се вредност подудара
Ако је аларм постављен, морамо огласити звучни сигнал да упозоримо корисника на аларм. То се може постићи једноставним укључивањем зујалице у редовном интервалу, као што је приказано доле.
иф (триггер_аларм) {// Ако се аларм активира // Звучни сигнал БУЗЗ = 1; __делаи_мс (500); БУЗЗ = 0; __делаи_мс (500); }
Симулација:
Овај програм се такође може симулирати помоћу софтвера протеус. Само поново креирајте коло приказано горе и учитајте хек датотеку у ПИЦ. Хексадецимални код за овај пројекат може се наћи у ЗИП датотеци која је овде повезана. Снимак екрана снимљен током симулације приказан је испод
Симулација постаје веома корисна када покушавате да додате нове функције у пројекат. Такође можете да користите И2Ц модул за отклањање грешака да бисте проверили који подаци улазе и излазе кроз И2Ц магистралу. Можете покушати да притиснете тастере и такође подесити време аларма. Када је подешено време једнако тренутном времену, зујалица ће се повисити.
Рад дигиталног будилника помоћу ПИЦ16Ф877А:
Направите склоп на плочи, узмите код са везе за преузимање и компајлирајте га помоћу МплабКс и КСЦ8 компајлера. Ако сте преузели код из ЗИП датотеке која је овде дата, онда не бисте требали имати проблема са састављањем јер су датотеке заглавља већ приложене.
Након компајлирања отпремите програм на свој хардвер помоћу програмера ПицКит3. Веза за повезивање пицкит програмера са ПИЦ ИЦ такође је приказана на дијаграму кола. Након отпремања програма, требало би да видите уводни екран, а затим приказано време можете помоћу тастера подесити време аларма. Моја поставка хардвера када се напаја изгледа овако доле.
Када се време аларма поклапа са тренутним временом, зујалица ће почети оглашавати звучни сигнал да алармира корисника. Комплетни рад можете пронаћи на видео снимку испод. Пројекат има мноштво могућности за надоградњу. РТЦ модул може пратити било које време и датум, тако да можете извршити планирани задатак у било које време / датум који је потребан. Такође можете повезати АЦ уређај попут вентилатора или лампе и заказати га да се УКЉУЧИ или ИСКЉУЧУЈЕ када је то потребно. Још увек можете много тога да надоградите на овом пројекту, обавестите ме која вам идеја падне на памет као надоградња овог пројекта и биће ми драго да вас чујем.
Надам се да сте разумели пројекат и научили нешто корисно из процеса. Ако сумњате у овај пројекат, користите одељак са коментарима да бисте их објавили или користите форуме за техничку помоћ.
Комплетни ПИЦ код са датотекама заглавља можете пронаћи овде