- Reikalingos medžiagos:
- Išankstinės sąlygos:
- Grandinės schema:
- Žadintuvo programavimas:
- Modeliavimas:
- Skaitmeninio žadintuvo naudojimas naudojant PIC16F877A:
1950 m. Prasidėjusi skaitmeninė revoliucija pakeičia visas esamas mechanines ir analogines elektronines struktūras į skaitmeninius kompiuterius. Kadangi skaitmeninės elektronikos augimas buvo eksponentiškas, šiandien žmogui beveik neįmanoma atsispirti naudojant bet kokią elektroninę įrangą. Pradedant jus pažadinančiu žadintuvu ir skrudintuvu, kuriame patiekiami pusryčiai, viskas yra skaitmeninės elektronikos indėlis. Galvojant apie visa tai, labai įdomu užprogramuoti savo turimus dalykus, kurie galėtų atlikti paprastas, tačiau naudingas užduotis, pvz., Žadintuvą, kurį ketiname pastatyti šiame projekte su PIC mikrovaldikliu. Anksčiau mes sukūrėme žadintuvą su kitais mikrovaldikliais:
- „Raspberry Pi“ žadintuvas naudojant RTC modulį DS1307
- „Arduino“ pagrindu sukurtas skaitmeninis laikrodis su žadintuvu
- Žadintuvas naudojant mikrovaldiklį „ATmega32“
Šiame žadintuve bus 16x2 LCD ekranas, kuriame bus rodomas dabartinis laikas ir nustatytas laikas. Kai reikės, nustatysime žadintuvo laiką naudodami keletą mygtukų. Dabartinis laikas bus stebimas naudojant DS3231 RTC modulį, o mes naudosime IIC ryšį, kad gautume šias vertes iš RTC modulio. Mes jau sužinojome apie RTC modulį ir kaip jį susieti su PIC. Taigi rekomenduojama perskaityti tą pamoką, mes praleisime didžiąją dalį tos pamokos informacijos.
Reikalingos medžiagos:
- Duonos lenta - 2Nos
- PIC16F877A
- 5 V maitinimo šaltinis - maitinimo modulis
- 20 MHz kristalas
- 33pf kondensatorius - 2Nos
- DS3231 RTC modulis
- 16 * 2 skystųjų kristalų ekrano modulis
- 10K POT
- 10k ir 1K rezistorius
- Mygtukai - 5Nos
- Buzeris
- Jungiamieji laidai
Išankstinės sąlygos:
Šis projektas reikalauja, kad jūs žinotumėte keletą pagrindų apie PIC mikrovaldiklį ir kaip jį programuoti. Šiam projektui naudosime GPIO, LCD ekraną ir RTC modulį. Taigi geriau iš anksto išmokti naudotis šiais moduliais. Šios nuorodos padės išmokti tą patį
- Pirmosios programos rašymas naudojant PIC mikrovaldiklį
- Sąsajos skystųjų kristalų ekranas su PIC
- I2C ryšys naudojant PIC
- DS3231 RTC sąsaja su PIC
Grandinės schema:
Šio PIC pagrįsto žadintuvo projekto schema parodyta žemiau, kuri buvo sukurta naudojant „proteus“ programinę įrangą. Šiame projekte taip pat bus naudojama imitacija.
Penki mygtukai veiks kaip įvestis nustatant žadintuvą reikiamam laikui. Taigi vienas visų mygtukų galas yra sujungtas su žeme, o kiti galai yra prijungti prie PORTB kaiščio. Šiuose kaiščiuose bus naudojamas vidinis prisitraukimo rezistorius, kad kaiščiai neplauktų. Buzzer veiks kaip išvestis ir duos mums pyptelėjimą, kai suveiks aliarmas ir bus prijungtas prie PORT S kaiščio. Dabartinį laiką visada seka DS3231 RTC modulis, iš kurio PIC gauna duomenis per I2C magistralę, todėl RTC modulio SCL ir SDA kaiščiai yra prijungti prie PIC valdiklio SCL ir SDA kaiščio. LCD ekranas pridedamas prie PIC porto, kuris naudojamas dabartiniam ir nustatytam laikui rodyti. Sužinokite daugiau apie DS3231 RTC modulio naudojimą su PIC čia.
Visą grandinę galima pastatyti ant duonos lentos. Kadangi prijungti yra pora dešimčių laidų, tiesiog turėkite kantrybės ir įsitikinkite, kad jungtys yra teisingos. Mano aparatinės įrangos sąranka atrodė maždaug taip žemiau, kai aš padariau ryšius
Moduliui maitinti naudojau duonos lentos modulį ir 12 V adapterį. Tai yra mano maitinimo įtampa + 5 V. Aš taip pat turiu naudoti dvi plokštes, kad grandinė būtų švari. Jei norite sukurti tvirtesnį projektą, taip pat galite prilituoti visą grandinę prie tobulos lentos.
Žadintuvo programavimas:
Visą šio žadintuvo projekto PIC programą rasite šio puslapio apačioje. Šiam projektui taip pat reikalingos trys bibliotekos, kad būtų galima naudoti LCD, I2C ir RTC su PIC. Visą kodą su antraštės failais galima atsisiųsti iš ZIP failo čia ir jį ištraukus galima atidaryti naudojant MPLABX. Toliau aš tik paaiškinu pagrindinį c failą kaip mažus fragmentus. Galite grįžti prie anksčiau paminėtų mokymo programų, jei norite sužinoti, kaip veikia antraštės failai.
Prieš patekdami į pagrindinę programą, turime apibrėžti kaiščius, kuriuos naudojome prasmingesniu pavadinimu. Tokiu būdu bus lengva juos naudoti programuojant. Žemiau parodyti mūsų programoje apibrėžti kaiščiai
// apibrėžti LCD smeigtukai # define RS RD2 // Reset PIN LCD #define LT RD3 // Enable PIN LCD #define D4 RD4 // Duomenys bito 0 LCD #define D5 RD5 // duomenų bitas 1 iš LCD #define D6 RD6 // 2 LCD duomenų bitas #define D7 RD7 // 3 duomenų bitas LCD // Define mygtukai #define MB RB1 // vidurinis mygtukas #define LB RB0 // kairysis mygtukas #define RB RB2 // dešinysis mygtukas # apibrėžti UB RB3 // Viršutinis mygtukas #define BB RB4 // Apatinis mygtukas // Define Buzz #define BUZZ RD1 // Buzzer yra prijungtas prie RD1
Pagrindinės funkcijos viduje mes pradedame deklaruodami įvesties ir išvesties kaiščius. Mūsų projekte PORTB yra naudojamas mygtukams, kurie yra įvesties įrenginys, todėl mes nustatėme jų kaiščius kaip įvestis, o PORTD naudojamas LCD ir garsiakalbiams, todėl mes nustatėme jų kaiščius kaip išvestį. Taip pat kaištis niekada neturėtų būti paliktas plaukiojančios reikšmės, įvesties / išvesties kaiščiai visada turi būti prijungti prie įžeminimo arba prie + 5 V įtampos. Mūsų atveju, kai spaudžiami mygtukai, kaiščiai nebus paspausti, kaiščiai nebus prie nieko prijungti, todėl mes naudojame vidinį traukimo rezistorių, kuris kaištį nenaudoja, kaištį nustato aukštą. Tai daroma naudojant valdymo registrus, kaip parodyta žemiau
TRISD = 0x00; // Padarykite D prievado kaiščius kaip sąsajas su LCD sąsaja TRISB = 0xFF; // Jungikliai deklaruojami kaip įvesties kaiščiai OPTION_REG = 0b00000000; // Įjungti jungiklių BU pull rezistorių B jungtis BUZZ = 0; // Zumerio pasukimas
Kadangi mes turime LCD ir I2C antraštės failą, susietą su pagrindine programa, galime pradėti LCD inicijavimą iškviesdami paprastą funkciją. Tą patį galima padaryti ir su „ I2C“ inicijavimu. Čia mes pradedame I2C ryšį 100 kHz dažniu, nes RTC modulis veikia su 100 kHz.
„Lcd_Start“ (); // Inicijuoti LCD modulį I2C_Initialize (100); // Inicializuokite „I2C Master“ su 100KHz laikrodžiu
Žemiau pateikta funkcija naudojama norint nustatyti laiką ir datą RTC modulyje, nustačius laiką ir datą, pašalinkite šią eilutę. Kiekvieną kartą paleidus programą laikas ir data bus nustatomi vėl ir vėl
// Pašalinti žemiau linijos vieną kartą laikas ir data yra nustatyta pirmą kartą. Set_Time_Date (); // RTC modulyje nustatykite laiką ir datą
Norėdami nurodyti, kad programa paleidžiama, rodome mažą įvadinį ekraną, kuriame rodomas projekto pavadinimas ir svetainės pavadinimas, kaip parodyta žemiau
// Pateikite įvadinį pranešimą LCD ekrane Lcd_Clear (); „Lcd_Set_Cursor“ (1,1); „Lcd_Print_String“ („Žadintuvas“); „Lcd_Set_Cursor“ (2,1); Lcd_Print_String ("-Circuit Digest"); __delay_ms (1500);
Kitas „ while“ ciklo viduje turime perskaityti dabartinį laiką ir datą iš RTC modulio. Tai galima padaryti tiesiog iškviečiant žemiau esančią funkciją.
„Update_Current_Date_Time“ (); // Perskaitykite dabartinę datą ir laiką iš RTC modulio
Iškvietus aukščiau nurodytą funkciją, kintamieji sec, min ir hour bus atnaujinti pagal dabartinę vertę. Norėdami juos parodyti skystųjų kristalų ekrane , turime juos suskirstyti į atskirus simbolius, naudodami žemiau esantį kodą.
// Padalinkite char į rodyti lcd char sec_0 = sec% 10; char sek_1 = (sek / 10); char min_0 = min% 10; char min_1 = min / 10; char hour_0 = valanda% 10; char hour_1 = valanda / 10;
Tada mes atnaujiname reikšmes per LCD ekraną. Dabartinis laikas bus rodomas pirmoje eilutėje, o nustatytas laikas, kada reikia suveikti aliarmą, bus rodomas antroje eilutėje. Tą patį darantis kodas parodytas žemiau.
// Parodyti dabartinį laiką LCD ekrane Lcd_Clear (); „Lcd_Set_Cursor“ (1, 1); Lcd_Print_String ("LAIKAS:"); Lcd_Print_Char (valanda_1 + '0'); Lcd_Print_Char (valanda_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'); // Rodyti datą LCD ekrane Lcd_Set_Cursor (2, 1); Lcd_Print_String ("Signalas:"); Lcd_Print_Char (aliarmo_val + + 0); Lcd_Print_Char (aliarmo_val + + 0); Lcd_Print_Char (':'); Lcd_Print_Char (aliarmo_val + "0 '); Lcd_Print_Char (aliarmo_val + + 0);
Dabar LCD ekrane rodėme laiką ir nustatytą laiką, kurį turime patikrinti, ar vartotojas bando nustatyti žadintuvo laiką. Norėdami tai padaryti, vartotojas turi paspausti vidurinį mygtuką, todėl mes patikrinsime, ar vidurinis mygtukas yra paspaustas, ir perjunkite kintamąjį, kad įjungtumėte žadintuvo nustatymo režimą. Tas pats mygtukas bus dar kartą paspaustas, kad patvirtintume, jog nustatytos reikšmės, ir tokiu atveju turime išeiti iš žadintuvo nustatymo režimo. Taigi mes naudojame žemiau esančią kodo eilutę, kad pakeistume kintamojo set_alarm būseną .
// Naudokite vidurinį mygtuką, jei norite patikrinti, ar reikia nustatyti žadintuvą , jei (MB == 0 && set_alarm == 0) {// Jei vidurinis mygtukas yra paspaustas ir žadintuvas neįjungtas, kol (! MB); // Palaukite, kol atleistas mygtukas set_alarm = 1; // pradėkite nustatyti žadintuvo vertę } if (MB == 0 && set_alarm == 1) {// Jei paspaudžiamas vidurinis mygtukas ir signalas neišjungiamas, kol (! MB); // Palaukite, kol atleistas mygtukas set_alarm = 0; // sustabdyti žadintuvo vertės nustatymą }
Jei vartotojas paspaudė vidurinį mygtuką, tai reiškia, kad jis bando nustatyti žadintuvo laiką. Tokiu atveju programa persijungia į aliarmo nustatymo režimą naudodama aukščiau esantį kodą. Žadintuvo nustatymo režime, jei vartotojas paspaudžia kairįjį arba dešinįjį mygtukus, tai reiškia, kad turime perkelti žymeklį į kairę arba į dešinę. Norėdami tai padaryti, mes tiesiog padidiname pozicijos, į kurią reikia įdėti žymeklį, vertę
if (LB == 0) {// Jei kairysis mygtukas paspaustas, kol (! LB); // Palaukite, kol mygtukas bus atleistas pos--; // Tada perkelkite žymeklį į kairę }, jei (RB == 0) {// Jei dešinįjį mygtuką paspaudžiate, kol (! RB); // Palaukite, kol atleidžiamas mygtukas pos ++; // Perkelti žymeklį į dešinę }
Naudojant mygtuką su mikrovaldikliu ar mikroprocesoriumi, yra viena bendra problema, kurią reikia išspręsti. Ši problema vadinama jungiklio atšokimu. Tai yra paspaudus mygtuką, jis gali sukelti triukšmingus impulsus MCU / MPU, kuris gali suklastoti MCU keliems įrašams. Šią problemą galima išspręsti per jungiklį pridedant kondensatorių arba naudojant uždelsimo funkciją, kai tik aptinkamas mygtukas. Šis sprendimas vadinamas atšokimu. Čia mes panaudojome tam tikrą laiką, kad išlaikytume programą, kol bus atleistas mygtukas. Tai nėra geriausias iššokantis sprendimas, bet mums jis puikiai tiks.
o (! RB);
Panašiai kaip kairysis ir dešinysis mygtukai, mes taip pat turime viršutinius ir apatinius mygtukus, kuriais galima padidinti arba sumažinti pavojaus signalo laiką. Tą patį darantis kodas parodytas žemiau. Atkreipkite dėmesį, kad kiekvienas nustatyto aliarmo laiko simbolis yra adresuojamas masyvo indekso verte. Tai mes galime lengvai pasiekti reikiamą simbolį, kurio reikšmes reikia pakeisti.
if (UB == 0) {// Jei paspaudus viršutinį mygtuką (! UB); // Palaukite, kol atleistas mygtukas alarm_val ++; // Padidinkite tą konkrečią char reikšmę }, jei (BB == 0) {// Jei nuspaudus apatinį mygtuką (! UB); // Palaukite, kol atleistas mygtukas alarm_val--; // Sumažinti konkrečią char reikšmę }
Kai bus nustatytas žadintuvo laikas, vartotojas vėl paspaus vidurinį mygtuką. Tada galime pradėti palyginti esamą laiką su nustatytu laiku. Palyginimas tikrinant, ar kiekvienas dabartinio laiko simbolis yra lygus nustatyto laiko simboliui. Jei reikšmės yra vienodos, suveikiame pavojaus signalą nustatydami kintamąjį „ trig_alarm“, dar palyginsime, kol jis bus lygus.
// IF aliarmas nustatytas Patikrinkite, ar nustatyta vertė yra lygi dabartinei vertei, jei (set_alarm == 0 && alarm_val == hour_1 && alarm_val == hour_0 && alarm_val == min_1 && alarm_val == min_0) trigger_alarm = 1; // Įjunkite aktyviklį, jei vertė atitinka
Jei žadintuvas nustatytas, mes turime pyptelėti signalą, kad įspėtume vartotoją apie aliarmą. Tai galima padaryti tiesiog reguliariai perjungiant „Buzzer“, kaip parodyta žemiau.
if (trigger_alarm) {// Jei suveikia pavojaus signalas // pyptelėti signalą BUZZ = 1; __delay_ms (500); BUZZ = 0; __delay_ms (500); }
Modeliavimas:
Šią programą taip pat galima imituoti naudojant „proteus“ programinę įrangą. Tiesiog iš naujo sukurkite aukščiau parodytą grandinę ir įkelkite šešiakampį failą į PIC. Šešiakampį šio projekto kodą galite rasti čia susietame ZIP faile. Simuliacijos metu padarytas ekrano vaizdas parodytas žemiau
Modeliavimas tampa labai naudingas, kai bandote pridėti naujų funkcijų prie projekto. Taip pat galite naudoti „I2C“ derintuvo modulį, kad patikrintumėte, kokie duomenys vyksta ir išeina per „I2C“ magistralę. Galite pabandyti paspausti mygtukus ir nustatyti žadintuvo laiką. Kai nustatytas laikas yra lygus dabartiniam laikui, garsinis signalas pakyla aukštai.
Skaitmeninio žadintuvo naudojimas naudojant PIC16F877A:
Sukurkite grandinę ant skydo, gaukite kodą iš atsisiuntimo nuorodos ir sukompiliuokite jį naudodami kompiliatorius „MplabX“ ir „XC8“. Jei atsisiuntėte kodą iš čia pateikto ZIP failo, jį sukompiliuoti neturėtumėte jokių problemų, nes antraštės failai jau pridėti.
Sukūrę programą, įkelkite į savo aparatinę įrangą naudodami „PicKit3“ programuotoją. Ryšys, skirtas prijungti „Pickit“ programuotoją prie PIC IC, taip pat parodytas grandinės schemoje. Įkėlę programą turėtumėte pamatyti įvadinį ekraną, tada rodomą laiką galite naudoti mygtukais norėdami nustatyti žadintuvo laiką. Mano aparatūros sąranka, kai maitinama, atrodo taip žemiau.
Kai žadintuvo laikas sutampa su dabartiniu laiku, garsinis signalas pradės pypsėti, kad sunerimtų vartotoją. Visą darbą galite rasti žemiau esančiame vaizdo įraše. Projektas turi daugybę variantų, kuriais galima remtis. RTC modulis gali sekti bet kurį laiką ir datą, todėl suplanuotą užduotį galite atlikti bet kuriuo reikalaujamu laiku / data. Taip pat galite prijungti kintamosios srovės prietaisą, pavyzdžiui, ventiliatorių ar žibintą, ir suplanuoti jį įjungti arba išjungti, kai reikia. Vis dar galite sukurti daug daugiau, remdamiesi šiuo projektu. Praneškite man, kokia mintis kyla jūsų mintyje kaip naujovinimą į šį projektą, ir aš mielai išgirsiu iš jūsų.
Tikiuosi, kad supratote projektą ir iš proceso sužinojote ką nors naudingo. Jei turite kokių nors abejonių dėl šio projekto, naudokite komentarų skiltį, norėdami juos paskelbti, arba naudokitės forumais, jei norite techninės pagalbos.
Visą PIC kodą su antraštės failais galite rasti čia