- Potrebni materijali:
- Preduvjeti:
- Kružni dijagram:
- Programiranje za budilicu:
- Simulacija:
- Rad digitalnog budilnika pomoću PIC16F877A:
Digitalna revolucija započeta 1950. mijenja sve postojeće mehaničke i analogne elektroničke strukture u digitalna računala. Budući da je rast digitalne elektronike bio eksponencijalan, danas je čovjeku gotovo nemoguće oduprijeti se bilo kojoj elektroničkoj opremi. Počevši od budilice koja vas probudi i tostera koji vam poslužuje doručak, sve je doprinos digitalne elektronike. Razmišljajući o svemu ovome, zaista je uzbudljivo programirati vlastite stvari koje bi mogle obavljati jednostavne, ali korisne zadatke, poput budilice koju ćemo u ovom projektu izgraditi s PIC mikrokontrolerom. Prethodno smo izgradili budilicu s drugim mikrokontrolerima:
- Budilnik Raspberry Pi pomoću RTC modula DS1307
- Digitalni sat zasnovan na Arduinu s alarmom
- Budilnik pomoću mikrokontrolera ATmega32
Ova budilica će imati LCD zaslon 16x2 koji prikazuje trenutno vrijeme i postavljeno vrijeme. Upotrijebit ćemo nekoliko tipki za postavljanje vremena alarma kad god je to potrebno. Trenutno vrijeme će se pratiti putem DS3231 RTC modula, a mi ćemo koristiti IIC komunikaciju za dobivanje tih vrijednosti iz RTC modula. Već smo naučili o RTC modulu i načinu povezivanja s PIC-om. Stoga je preporučljivo pročitati taj vodič, preskočit ćemo većinu podataka obuhvaćenih tim tutorijalom.
Potrebni materijali:
- Daska za kruh - 2Br
- PIC16F877A
- 5V izvor napajanja - opskrbni modul
- Kristal od 20 MHz
- 33pf kondenzator - 2Nos
- DS3231 RTC modul
- Modul LCD zaslona od 16 * 2
- 10K LONAC
- Otpornik 10k i 1K
- Tipke - 5Nos
- Zujalica
- Spajanje žica
Preduvjeti:
Ovaj projekt zahtijeva da znate nekoliko osnova o PIC mikrokontroleru i kako ga programirati. Za ovaj ćemo projekt koristiti GPIO, LCD zaslon i RTC modul. Stoga je bolje unaprijed naučiti kako koristiti ove module. Sljedeće poveznice pomoći će vam da naučite isto
- Pisanje vašeg prvog programa s PIC mikrokontrolerom
- Povezivanje LCD-a s PIC-om
- I2C komunikacija pomoću PIC-a
- DS3231 RTC povezivanje s PIC-om
Kružni dijagram:
Dijagram spojeva za ovaj projekt budilnika zasnovan na PIC-u prikazan je u nastavku, a izrađen je pomoću softvera proteus. Također će se koristiti za simulaciju dalje u ovom projektu.

Pet tipki poslužit će kao ulaz za podešavanje alarma na određeno vrijeme. Dakle, jedan kraj svih tipki spojen je na masu, a drugi krajevi spojeni su na PORTB pin, na tim će se iglama koristiti unutarnji povlačni otpornik kako bi se izbjeglo plutanje pinova. Zujalica će djelovati kao izlaz i oglasit će se zvučnim signalom kad se alarm aktivira i spoji na pin PORT S. Trenutno vrijeme uvijek prati DS3231 RTC modul od kojeg PIC prima podatke putem I2C sabirnice, tako da su SCL i SDA pinovi RTC modula povezani na SCL i SDA pin PIC kontrolera. LCD zaslon priključen je na PORTD PIC-a koji se koristi za prikaz trenutnog vremena i postavljenog vremena. Ovdje saznajte više o korištenju DS3231 RTC modula s PIC-om.
Kompletni sklop može se graditi preko ploče. Budući da postoji nekoliko desetaka žica za povezivanje, samo imajte strpljenja i provjerite jesu li veze ispravne. Moja hardverska postavka izgledala je otprilike ovako u nastavku kad sam završio s vezama

Za napajanje modula koristio sam modul za ploču i adapter od 12 V. Ovo je moj izvor napajanja od + 5V. Također moram koristiti dvije ploče kako bih održavao krug čistim. Također možete lemiti čitav krug na perf board ako želite napraviti robusniji projekt.
Programiranje za budilicu:
Kompletan PIC program za ovaj Alarm projekt sat može se naći na dnu ove stranice. Ovaj projekt također zahtijeva tri knjižnice za upotrebu LCD-a, I2C-a i RTC-a s PIC-om. Kompletni kod s datotekama zaglavlja možete ovdje preuzeti iz ZIP datoteke, a možete ga otvoriti pomoću MPLABX-a nakon izdvajanja. Dalje u nastavku samo objašnjavam glavnu c datoteku kao male isječke. Možete se vratiti na gore spomenute vodiče ako želite znati kako funkcioniraju datoteke zaglavlja.
Prije ulaska u glavni program, moramo definirati pribadače koje smo koristili sa smislenijim nazivom. Na taj će ih način biti lako koristiti tijekom programiranja. Igle definirane u našem programu prikazane su u nastavku
// Definiraj LCD pinove #define RS RD2 // Resetiraj pin LCD-a #define EN RD3 // Omogući pin LCD-a #define D4 RD4 // Bit podataka 0 LCD-a #define D5 RD5 // Podaci bit 1 LCD-a #define D6 RD6 // Data bit 2 LCD-a #define D7 RD7 // Data bit 3 LCD-a // Definiranje tipki #define MB RB1 // Srednji gumb #define LB RB0 // Lijevi gumb #define RB RB2 // Desni gumb # definiraj UB RB3 // Gornji gumb #define BB RB4 // Dno tipke // Definiraj buzz #define BUZZ RD1 // Zujalica je povezana na RD1
Unutar glavne funkcije započinjemo deklariranjem ulaznih i izlaznih pinova. U našem projektu PORTB se koristi za tipke koji je ulazni uređaj pa smo postavili njihove pinove kao ulaze, a PORTD se koristi za LCD i zujalo pa smo njihove pinove postavili kao izlaz. Također pin ne smije nikada ostati plutajući u značenju, U / I pinovi uvijek trebaju biti povezani na masu ili na + 5V napon. U našem slučaju za tipke igle neće biti povezane ni s čim kad se tipka ne pritisne, pa koristimo unutarnji otpor koji podiže pin koji postavlja High na visoko kad se ne koristi. To se radi pomoću kontrolnih registara kako je prikazano u nastavku
TRISD = 0x00; // Izradite igle za port D kao izlazne za povezivanje LCD-a TRISB = 0xFF; // Prekidači su deklarirani kao ulazni pinovi OPTION_REG = 0b00000000; // Omogući povlačenje otpornika na priključku B za prekidače BUZZ = 0; // Okretanje zujalice
Budući da smo datoteku zaglavlja LCD i I2C povezani s glavnim programom, inicijalizaciju LCD-a možemo započeti pozivanjem jednostavne funkcije. Isto se može učiniti i za inicijalizaciju I2C. Ovdje započinjemo I2C komunikaciju na 100kHz jer RTC modul radi sa 100kHz.
Lcd_Start (); // Inicijalizacija LCD modula I2C_Initialize (100); // Inicijalizirajte I2C Master sa taktom od 100 KHz
Sljedeća funkcija koristi se za postavljanje vremena i datuma na RTC modulu, nakon što se postave vrijeme i datum uklonite ovaj redak. Inače svaki put kad pokrenete program, vrijeme i datum postavljat će se uvijek iznova
// Uklonite ispod crte jednom vrijeme i datum je postavljen za prvi put. Set_Time_Date (); // postavljanje vremena i datuma na RTC modulu
Da bismo naznačili da se program pokreće, prikazujemo mali uvodni zaslon koji prikazuje naziv projekta i naziv web mjesta kao što je prikazano u nastavku
// Dajte uvodnu poruku na LCD-u Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Budilica"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Svrha kruga"); __zakašnjenje_ms (1500);
Sljedeće unutar while petlje trebamo očitati trenutno vrijeme i datum iz RTC modula, to se može učiniti samo pozivanjem donje funkcije.
Update_Current_Date_Time (); // Očitavanje trenutnog datuma i vremena iz RTC modula
Pozivanjem gornje funkcije ažurirat će se varijable sek, min i sat trenutnom vrijednošću. Da bismo ih prikazali na LCD zaslonu, moramo ih podijeliti na pojedinačne znakove pomoću donjeg koda.
// Podijelite znak u char za prikaz na lcd char sec_0 = sec% 10; char sec_1 = (sec / 10); char min_0 = min% 10; char min_1 = min / 10; char sat_0 = sat% 10; char sat_1 = sat / 10;
Dalje, vrijednosti ažuriramo na LCD zaslonu. Trenutno vrijeme prikazat će se u prvom retku, a postavljeno vrijeme u kojem se alarm mora aktivirati u drugom retku. Kôd koji čini isto prikazan je u nastavku.
// Prikaz trenutnog vremena na LCD zaslonu Lcd_Clear (); Lcd_Set_Cursor (1, 1); Lcd_Print_String ("VRIJEME:"); Lcd_Print_Char (sat_1 + '0'); Lcd_Print_Char (sat_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (min_1 + '0'); Lcd_Print_Char (min_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (sec_1 + '0'); Lcd_Print_Char (sec_0 + '0'); // Prikaz datuma na LCD zaslonu Lcd_Set_Cursor (2, 1); Lcd_Print_String ("Alarm:"); Lcd_Print_Char (alarm_val + '0'); Lcd_Print_Char (alarm_val + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (alarm_val + '0 '); Lcd_Print_Char (alarm_val + '0');
Sada smo prikazali vrijeme i postavili vrijeme na LCD-u. Moramo provjeriti pokušava li korisnik postaviti vrijeme alarma. Da bi to učinio, korisnik mora pritisnuti srednju tipku, pa ćemo provjeriti je li pritisnuta srednja tipka i prebaciti varijablu za ulazak u način postavljanja alarma. Ponovno će se pritisnuti isti gumb kako bi se potvrdilo da su vrijednosti postavljene i u tom slučaju moramo izaći iz načina postavljanja alarma. Dakle, koristimo donji redak koda za promjenu statusa varijable set_alarm .
// Upotrijebite srednji gumb za provjeru mora li alarm biti postavljen ako (MB == 0 && set_alarm == 0) {// Ako se pritisne srednji gumb i alarm nije uključen dok (! MB); // Pričekajte dok se gumb ne pusti set_alarm = 1; // započnite postavljati vrijednost alarma } if (MB == 0 && set_alarm == 1) {// Ako se pritisne srednji gumb i alarm nije isključen dok (! MB); // Pričekajte dok se gumb ne pusti set_alarm = 0; // zaustavljanje postavljanja vrijednosti alarma }
Ako je korisnik pritisnuo srednju tipku, to znači da pokušava postaviti vrijeme alarma. U ovom slučaju program ulazi u način postavljanja alarma pomoću gornjeg koda. Ako korisnik pritisne lijevu ili desnu tipku unutar načina podešavanja alarma, znači da moramo pomaknuti kursor ulijevo ili udesno. Da bismo to učinili, jednostavno povećavamo za smanjenje vrijednosti položaja na kojem se mora postaviti pokazivač
if (LB == 0) {// Ako se pritisne lijeva tipka dok (! LB); // Pričekajte dok se tipka ne pusti pos--; // Zatim pomaknite kursor ulijevo } if (RB == 0) {// Ako se pritisne desni gumb dok (! RB); // Pričekajte dok se gumb ne pusti pos ++; // Pomicanje kursora udesno }
Dok koristite tipku s mikrokontrolerom ili mikroprocesorom, jedan je uobičajeni problem za rješavanje. Ovaj se problem naziva odbijanjem prekidača. Tada bi tipka mogla stvoriti glasne impulse MCU / MPU-u, što bi moglo lažirati MCU za višestruke unose. Ovaj se problem može riješiti dodavanjem kondenzatora preko prekidača ili upotrebom funkcije odgode čim se otkrije pritisak gumba. Ova vrsta rješenja naziva se odskakanje. Ovdje smo koristili while petlju kako bismo program držali na mjestu dok se gumb ne otpusti. Ovo nije najbolje rješenje za odskakanje, ali za nas će to sasvim dobro funkcionirati.
dok (! RB);
Slično lijevom i desnom gumbu, imamo i gornji i donji gumb koji se mogu koristiti za povećanje ili smanjenje vrijednosti vremena alarma. Kôd za isto je prikazan u nastavku. Primijetite da se svakom znaku postavljenog vremena alarma obraća vrijednost indeksa niza. To je bilo tako da lako možemo pristupiti potrebnom znaku čije se vrijednosti moraju mijenjati.
if (UB == 0) {// Ako se pritisne gornja tipka dok (! UB); // Čekaj dok se ne pusti gumb alarm_val ++; // Povećajte tu posebnu vrijednost znaka } if (BB == 0) {// Ako se pritisne donja tipka dok (! UB); // Pričekajte dok se gumb ne pusti alarm_val--; // Smanjivanje određene vrijednosti char }
Nakon što se postavi vrijeme alarma, korisnik će ponovno pritisnuti srednju tipku. Tada možemo početi uspoređivati trenutno vrijeme s postavljenim vremenom. Usporedba provjerom je li svaki pojedini znak trenutnog vremena jednak karakteru postavljenog vremena. Ako su vrijednosti jednake, tada aktiviramo alarm postavljanjem varijable trigger_alarm, a drugo uspoređujemo dok ne postane jednako.
// AKO je alarm postavljen Provjerite je li postavljena vrijednost jednaka trenutnoj vrijednosti if (set_alarm == 0 && alarm_val == hour_1 && alarm_val == hour_0 && alarm_val == min_1 && alarm_val == min_0) trigger_alarm = 1; // Uključi okidač ako se vrijednost podudara
Ako je alarm postavljen, moramo oglasiti zvučni signal kako bismo upozorili korisnika na alarm. To se može učiniti jednostavnim uključivanjem zujalice u redovitim intervalima, kao što je prikazano u nastavku.
if (trigger_alarm) {// Ako se alarm aktivira // Zvučni signal BUZZ = 1; __zakasniti_ms (500); BUZZ = 0; __zakasniti_ms (500); }
Simulacija:
Ovaj program također se može simulirati pomoću softvera proteus. Samo ponovno stvorite gornji krug prikazan gore i učitajte hex datoteku u PIC. Hex kod za ovaj projekt može se naći u ZIP datoteci koja je ovdje povezana. Snimak zaslona snimljen tijekom simulacije prikazan je u nastavku

Simulacija postaje vrlo korisna kada projektu pokušavate dodati nove značajke. Također možete koristiti I2C modul za ispravljanje pogrešaka da provjerite koji podaci ulaze i izlaze kroz I2C sabirnicu. Možete pokušati pritisnuti tipke i također postaviti vrijeme alarma. Kada je postavljeno vrijeme jednako trenutnom vremenu, zujalica će se preusmjeriti.
Rad digitalnog budilnika pomoću PIC16F877A:
Izgradite sklop na ploči, preuzmite kod s veze za preuzimanje i kompajlirajte ga pomoću MplabX i XC8 kompajlera. Ako ste preuzeli kod iz ZIP datoteke koja je ovdje navedena, ne biste trebali imati problema sa sastavljanjem jer su datoteke zaglavlja već priložene.
Nakon prevođenja prenesite program na hardver pomoću programera PicKit3. Veza za spajanje programera za odabir na PIC IC također je prikazana na shemi spojeva. Nakon učitavanja programa trebali biste vidjeti uvodni zaslon, a zatim prikazano vrijeme možete pomoću tipki podesiti vrijeme alarma. Moja hardverska postavka kada se napaja izgleda ovako u nastavku.

Kad se vrijeme alarma podudara s trenutnim vremenom, zujalica će započeti zvučni signal da alarmira korisnika. Kompletni rad možete pronaći na video ispod. Projekt ima mnoštvo mogućnosti za nadogradnju. RTC modul može pratiti bilo koje vrijeme i datum, tako da možete izvršiti planirani zadatak u bilo koje vrijeme / datum koji je potreban. Također možete spojiti AC uređaj poput ventilatora ili lampice i rasporediti ga da se UKLJUČI ili ISKLJUČUJE po potrebi. Još uvijek možete mnogo toga nadograditi na ovom projektu, javite mi koja vam ideja padne na pamet kao nadogradnja ovog projekta i bit će mi drago.
Nadam se da ste razumjeli projekt i naučili nešto korisno iz procesa. Ako sumnjate u ovaj projekt, upotrijebite odjeljak za komentare da biste ih objavili ili koristite forume za tehničku pomoć.
Kompletni PIC kod sa datotekama zaglavlja možete pronaći ovdje
