- Tarvittavat materiaalit:
- Edellytykset:
- Piirikaavio:
- Herätyskellon ohjelmointi:
- Simulointi:
- Digitaalisen herätyskellon käyttö PIC16F877A: n avulla:
Vuonna 1950 alkanut digitaalinen vallankumous muuttaa kaikki olemassa olevat mekaaniset ja analogiset elektroniset rakenteet digitaalisiksi tietokoneiksi. Koska digitaalisen elektroniikan kasvu on ollut eksponentiaalista, on nykyään ihmisen melkein mahdotonta vastustaa minkään elektronisen laitteen käyttöä. Alkaen herätyskellosta, joka herättää sinut ja leivänpaahtimesta, joka tarjoilee sinulle aamiaista, kaikki on digitaalisen elektroniikan panos. Kaikista näistä on todella jännittävää ohjelmoida omat jutut, jotka voisivat tehdä yksinkertaisia mutta hyödyllisiä tehtäviä, kuten herätyskello, jonka aiomme rakentaa tässä projektissa PIC- mikrokontrollerilla. Olemme aiemmin rakentaneet herätyskellon muiden mikrokontrollerien kanssa:
- Vadelma Pi -herätyskello käyttämällä RTC-moduulia DS1307
- Arduino-pohjainen digitaalinen kello hälytyksellä
- Herätyskello ATmega32-mikrokontrollerilla
Tässä herätyskellossa on 16x2 LCD-näyttö, joka näyttää nykyisen ajan ja asetetun ajan. Käytämme muutamia painikkeita hälytysajan asettamiseen tarvittaessa. Nykyinen aika pidetään radalla DS3231 RTC -moduulin avulla ja käytämme IIC-tiedonsiirtoa saadaksesi nämä arvot RTC-moduulista. Olemme jo oppineet RTC-moduulista ja sen liittämisestä PIC: ään. Joten on suositeltavaa lukea tämä opetusohjelma, ohitamme suurimman osan opetusohjelman kattamista tiedoista.
Tarvittavat materiaalit:
- Leipälauta - 2
- PIC16F877A
- 5 V virtalähde - Syöttömoduuli
- 20 MHz: n kide
- 33pf kondensaattori - 2Nos
- DS3231 RTC-moduuli
- 16 * 2 LCD-näyttömoduuli
- 10K POT
- 10k ja 1K vastus
- Painikkeet - 5Nos
- Summeri
- Johtojen liittäminen
Edellytykset:
Tämä projekti edellyttää, että tiedät muutamia perusteita PIC-mikrokontrollerista ja kuinka ohjelmoida se. Käytämme tässä projektissa GPIO: ita, LCD-näyttöä ja RTC-moduulia. Joten on parempi oppia käyttämään näitä moduuleja etukäteen. Seuraavat linkit auttavat sinua oppimaan saman
- Ensimmäisen ohjelman kirjoittaminen PIC-mikrokontrollerilla
- Liitettävä LCD-näyttö PIC: n kanssa
- I2C-tiedonsiirto PIC: n avulla
- DS3231 RTC -rajapinta PIC: n kanssa
Piirikaavio:
Tämän PIC-pohjaisen herätyskelloprojektin kytkentäkaavio on esitetty alla, joka luotiin käyttämällä proteus-ohjelmistoa. Tätä käytetään myös simulointiin edelleen tässä projektissa.
Viisi painonappia toimivat tulona hälytyksen asettamiseksi vaadittavaksi ajaksi. Joten kaikkien painonappien toinen pää on kytketty maahan ja muut päät on kytketty PORTB-nastaa, näissä nastoissa käytetään sisäistä vetovastusta, jotta nastat eivät kellu. Summeri toimii ulostulona ja antaa meille äänimerkin, kun hälytys laukaisee ja on kytketty PORT S -nastaan. DS3231 RTC -moduuli, josta PIC vastaanottaa dataa I2C-väylän kautta, pitää nykyisen ajan aina seurattuna, joten RTC-moduulin SCL- ja SDA-nastat on kytketty PIC-ohjaimen SCL- ja SDA-nastoihin. PIC-porttiin on liitetty LCD-näyttö, jota käytetään näyttämään nykyinen aika ja asetettu aika. Täältä saat lisätietoja DS3231 RTC -moduulin käytöstä PIC: n kanssa.
Koko piiri voidaan rakentaa leivän yli. Koska liitettävissä on pari tusinaa johtoa, ole vain kärsivällinen ja varmista, että liitännät ovat oikein. Laitteistoni kokoonpano näytti jotain tältä alla, kun olin tehnyt yhteydet
Olen käyttänyt leipälevymoduulia ja 12 V: n sovitinta moduulin virtalähteeseen. Tämä on minun lähde + 5V syöttöjännitteestä. Minun on käytettävä kahta leipätaulua pitämään piiri puhtaana. Voit myös juottaa koko piirin täydelliselle levylle, jos haluat tehdä vankemman projektin.
Herätyskellon ohjelmointi:
Täydellinen PIC ohjelma tähän herätyskello hanke löytyy alareunassa tällä sivulla. Tämä projekti vaatii myös kolme kirjastoa, jotta LCD, I2C ja RTC voidaan käyttää PIC: n kanssa. Koko koodi otsikkotiedostoineen voidaan ladata ZIP-tiedostosta täältä ja se voidaan avata MPLABX: n avulla purkamisen jälkeen. Seuraavassa selitän vain c-päätiedostoa pieninä katkelmina. Voit palata yllä mainittuihin opetusohjelmiin, jos haluat tietää, miten otsikkotiedostot toimivat.
Ennen pääsyä pääohjelmaan, meidän on määriteltävä nastat, joita olemme käyttäneet merkityksellisemmällä nimellä. Tällä tavalla niitä on helppo käyttää ohjelmoinnin aikana. Ohjelmassamme määritellyt nastat on esitetty alla
// Määritä LCD-nastat #define RS RD2 // Nollaa LCD-nasta #define EN RD3 // Ota LCD-nasta käyttöön #define D4 RD4 // LCD: n databitti 0 #define D5 RD5 // LCD- bittidata 1 #define D6 RD6 // LCD-näytön bitti 2 #define D7 RD7 // Databitti 3 LCD- näytössä // Määritä painikkeet #define MB RB1 // Keskimmäinen painike #define LB RB0 // Vasen painike #define RB RB2 // Oikea painike # määritä UB RB3 // Yläpainike #define BB RB4 // Pohjapainike // Define Buzz #määrittele BUZZ RD1 // Summeri on kytketty RD1: een
Päätoiminnon sisällä aloitetaan ilmoittamalla tulo- ja lähtönastat. Projektissamme PORTBia käytetään painikkeisiin, jotka ovat syöttölaite, joten asetamme niiden nastat tuloiksi ja PORTDia käytetään LCD-näyttöön ja summeriin, joten asetamme heidän nastansa lähtöön. Myöskään nastaa ei saa koskaan jättää kelluvaan merkitykseen, I / O-nastat tulisi aina liittää joko maahan tai + 5 V: n jännitteeseen. Painopainikkeita varten tapit eivät ole yhteydessä mihinkään, kun painiketta ei paineta, joten käytämme sisäistä vetovastusta, joka asettaa tapin korkeaksi, kun sitä ei käytetä. Tämä tapahtuu käyttämällä ohjausrekistereitä alla esitetyllä tavalla
TRISD = 0x00; // Tee Port D -nastat käytönaikaisiksi LCD-liitännöille TRISB = 0xFF; // Kytkimet ilmoitetaan tuloliittiminä OPTION_REG = 0b00000000; // Ota vedon vastus käyttöön portissa B kytkimille BUZZ = 0; // Summerin kääntäminen
Koska LCD- ja I2C-otsikkotiedostot on linkitetty pääohjelmaan, voimme aloittaa LCD-alustuksen kutsumalla yksinkertaisen toiminnon. Sama voidaan tehdä myös I2C-alustuksessa. Tässä aloitamme I2C-viestinnän taajuudella 100 kHz, koska RTC-moduuli toimii 100 kHz: n taajuudella.
Lcd_Start (); // Alusta LCD-moduuli I2C_Initialize (100); // Alusta I2C Master 100 KHz: n kellolla
Alla olevaa toimintoa käytetään asettamaan aika ja päivämäärä RTC-moduulissa, kun aika ja päivämäärä on asetettu, poista tämä rivi. Joka kerta, kun käynnistät ohjelman, aika ja päivämäärä asetetaan uudestaan ja uudestaan
// Poista alla oleva rivi, kun aika ja päivämäärä on asetettu ensimmäisen kerran. Set_Time_Date (); // aseta aika ja päivämäärä RTC-moduulille
Osoittaaksemme ohjelman käynnistyvän, näytämme pienen esittelynäytön, joka näyttää projektin nimen ja verkkosivuston nimen alla esitetyllä tavalla
// Anna intro-viesti LCD-näytöllä Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Herätyskello"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-piirin yhteenveto"); _ viive_ms (1500);
Seuraavaksi while- silmukan sisällä meidän on luettava nykyinen aika ja päivämäärä RTC-moduulista, tämä voidaan tehdä vain kutsumalla alla olevaa toimintoa.
Update_Current_Date_Time (); // Lue nykyinen päivämäärä ja aika RTC-moduulista
Yllä olevan toiminnon kutsuminen päivittää muuttujat sek, min ja tunti nykyisellä arvolla. Jotta ne voidaan näyttää nestekidenäytöllä, meidän on jaettava ne yksittäisiin merkkeihin alla olevan koodin avulla.
// Jaa jaettu merkki näytettäväksi lcd: llä char sec_0 = sec% 10; char sek_1 = (sek / 10); char min_0 = min% 10; char min_1 = min / 10; char hour_0 = tunti% 10; char tunti_1 = tunti / 10;
Seuraavaksi päivitämme arvot LCD-näytöllä. Nykyinen aika näytetään ensimmäisellä rivillä ja asetettu aika, jolloin hälytys on käynnistettävä, näkyy toisella rivillä. Koodi, joka tekee saman, näkyy alla.
// Näytä nykyinen aika LCD-näytöllä Lcd_Clear (); Lcd_Set_Cursor (1, 1); Lcd_Print_String ("AIKA:"); Lcd_Print_Char (tunti_1 + '0'); Lcd_Print_Char (tunti_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (min_1 + '0'); Lcd_Print_Char (min_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (sek_1 + '0'); Lcd_Print_Char (sek_0 + '0'); // Näytä päivämäärä nestekidenäytössä Lcd_Set_Cursor (2, 1); Lcd_Print_String ("Hälytys:"); Lcd_Print_Char (hälytysarvo + '0'); Lcd_Print_Char (hälytysarvo + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (hälytys_val + '0 '); Lcd_Print_Char (hälytysarvo + '0');
Nyt olemme näyttäneet kellonajan ja asettaneet ajan nestekidenäytössä. Meidän on tarkistettava, yrittääkö käyttäjä asettaa hälytysajan. Tätä varten käyttäjän on painettava keskipainiketta, joten tarkistamme, onko keskipainiketta painettu, ja vaihdamme muuttujan päästäkseen hälytysasetustilaan. Samaa painiketta painetaan uudelleen vahvistaaksemme, että arvot on asetettu, ja siinä tapauksessa meidän on poistuttava hälytysasetustilasta. Joten käytämme alla olevaa koodiriviä muuttamaan muuttujan set_alarm tilaa .
// Tarkista keskipainikkeella, onko hälytys asetettava, jos (MB == 0 && set_alarm == 0) {// Jos keskipainiketta painetaan eikä hälytystä ole kytketty päälle (! MB); // Odota, kunnes painike vapautetaan set_alarm = 1; // aloita hälytysarvon asettaminen } jos (MB == 0 && set_alarm == 1) {// Jos keskipainiketta painetaan eikä hälytystä sammuteta, kun (! MB); // Odota, kunnes painike vapautetaan set_alarm = 0; // lopeta hälytysarvon asettaminen }
Jos käyttäjä on painanut keskimmäistä painiketta, se tarkoittaa, että hän yrittää asettaa hälytysajan. Tällöin ohjelma siirtyy hälytysasetustilaan yllä olevan koodin avulla. Hälytysasetustilan sisällä, jos käyttäjä painaa vasenta tai oikeaa painiketta, se tarkoittaa, että meidän on siirrettävä kohdistinta vasemmalle tai oikealle. Tätä varten yksinkertaisesti vähennetään sen sijainnin arvoa, johon kohdistin on sijoitettava
if (LB == 0) {// Jos vasenta painiketta painetaan, kun (! LB); // Odota, kunnes painike vapautetaan pos--; // Siirrä sitten kohdistin vasemmalle } jos (RB == 0) {// Jos oikeaa painiketta painetaan samalla, kun (! RB); // Odota, kunnes painike vapautetaan pos ++; // Siirrä kohdistin oikealle }
Käytettäessä painonappia mikrokontrollerin tai mikroprosessorin kanssa on yksi yleinen ongelma, johon on puututtava. Tätä ongelmaa kutsutaan kytkimen palautumiseksi. Silloin kun painiketta painetaan, se voi antaa meluisia pulsseja MCU: lle / MPU: lle, mikä saattaa väärentää MCU: n useille syötteille. Tämä ongelma voidaan ratkaista lisäämällä kondensaattori kytkimen yli tai käyttämällä viivästystoimintoa heti, kun painikkeen painallus havaitaan. Tämän tyyppistä ratkaisua kutsutaan pomppimiseksi. Tässä olemme käyttäneet jonkin aikaa silmukkaa pitämään ohjelmaa paikallaan, kunnes painike vapautetaan. Tämä ei ole paras poistumisratkaisu, mutta meille se toimii hienosti.
kun (! RB);
Vasemman ja oikean painikkeen tapaan meillä on myös ylempi ja alempi painike, joita voidaan käyttää herätysajan arvon nostamiseen tai vähentämiseen. Sama tekevä koodi näkyy alla. Huomaa, että asetetun hälytysajan jokaiselle merkille osoitetaan taulukon indeksiarvo. Näin pääsemme helposti tarvittavaan merkkiin, jonka arvoja on muutettava.
if (UB == 0) {// Jos ylempää painiketta painetaan samalla kun (! UB); // Odota, kunnes painike vapautetaan alarm_val ++; // Lisää kyseistä merkkiarvoa }, jos (BB == 0) {// Jos alempaa painiketta painetaan samalla, kun (! UB); // Odota, kunnes painike vapautetaan alarm_val--; // Pienennä kyseistä merkkiarvoa }
Kun herätysaika on asetettu, käyttäjä painaa keskimmäistä painiketta uudelleen. Sitten voimme alkaa verrata nykyistä aikaa asetettuun aikaan. Vertailu tarkistamalla, vastaavatko kaikki nykyisen ajan merkit asetetun ajan merkkiä. Jos arvot ovat samat, laukaistaan hälytys asettamalla trigger_alarm- muuttuja, muuten verrataan, kunnes se on yhtä suuri.
// JOS hälytys on asetettu Tarkista, onko asetettu arvo yhtä suuri kuin nykyinen arvo, jos (set_alarm == 0 && alarm_val == hour_1 && alarm_val == hour_0 && alarm_val == min_1 && alarm_val == min_0) trigger_alarm = 1; // Kytke liipaisin päälle, jos arvo täsmää
Jos hälytys on asetettu, meidän on annettava äänimerkki varoittaaksesi käyttäjää hälytyksestä. Tämä voidaan tehdä yksinkertaisesti vaihtamalla summeri säännöllisin väliajoin, kuten alla on esitetty.
if (trigger_alarm) {// Jos hälytys laukeaa // Piippaa summeri BUZZ = 1; __viive_ms (500); BUZZ = 0; __viive_ms (500); }
Simulointi:
Tämä ohjelma voidaan myös simuloida proteus-ohjelmistolla. Luo vain yllä esitetty piiri uudelleen ja lataa heksatiedosto PIC: ään. Tämän projektin heksakoodi löytyy täältä linkitetystä ZIP-tiedostosta. Simulaation aikana otettu kuvakaappaus näkyy alla
Simulaatiosta tulee erittäin hyödyllinen, kun yrität lisätä uusia ominaisuuksia projektiin. Voit myös käyttää I2C-virheenkorjausmoduulia tarkistaaksesi, mitä tietoja I2C-väylän kautta tapahtuu ja tulee ulos. Voit yrittää painaa painikkeita ja asettaa myös hälytysajan. Kun asetettu aika on yhtä suuri kuin nykyinen aika, summeri nousee korkealle.
Digitaalisen herätyskellon käyttö PIC16F877A: n avulla:
Rakenna piiri leipätaululle, hae koodi latauslinkistä ja koota se MplabX- ja XC8-kääntäjillä. Jos olet ladannut koodin täällä olevasta ZIP-tiedostosta, sinun ei pitäisi olla ongelma sen kääntämisessä, koska otsikkotiedostot on jo liitetty.
Lataamisen jälkeen lataa ohjelma laitteistoon PicKit3-ohjelmoijan avulla. Yhteys pickit-ohjelmoijan liittämiseen PIC IC: hen näkyy myös piirikaaviossa. Kun ohjelma on ladattu, sinun pitäisi nähdä esittelynäyttö ja sitten näytettävä aika. Voit sitten asettaa hälytysajan painikkeilla. Laitteistoni kokoonpano virtana näyttää tältä alla.
Kun hälytysaika vastaa nykyistä aikaa, summeri alkaa piipata hälyttääkseen käyttäjää. Koko työ löytyy alla olevasta videosta. Projektilla on lukuisia vaihtoehtoja, joihin voi rakentaa. RTC-moduuli voi seurata mitä tahansa aikaa ja päivämäärää, joten voit suorittaa ajoitetun tehtävän milloin tahansa vaadittuna kellonaikana. Voit myös kytkeä verkkolaitteen, kuten tuulettimen tai lampun, ja ajoittaa sen käynnistymään tai sammuttamaan tarvittaessa. Tähän projektiin voi vielä rakentaa paljon enemmän, kerro minulle mikä idea tulee mieleesi päivityksenä tähän projektiin, ja kuulen mielelläni sinusta.
Toivottavasti ymmärrät projektin ja opit jotain hyödyllistä prosessista. Jos sinulla on epäilyksiä tässä projektissa, käytä kommenttiosaa niiden lähettämiseen tai käytä foorumeita tekniseen apuun.
Täydellinen PIC-koodi otsikkotiedostoineen löytyy täältä