- Nepieciešamie materiāli:
- Priekšnosacījumi:
- Ķēdes shēma:
- Modinātāja programmēšana:
- Modelēšana:
- Digitālā modinātāja darbība, izmantojot PIC16F877A:
1950. gadā sāktā digitālā revolūcija pārveido visas esošās mehāniskās un analogās elektroniskās struktūras par digitāliem datoriem. Tā kā digitālās elektronikas izaugsme ir bijusi eksponenciāla, šodien cilvēkam ir gandrīz neiespējami pretoties jebkura elektroniska aprīkojuma izmantošanai. Sākot ar modinātāju, kas jūs pamodina, un tosteri, kas pasniedz jums brokastis, viss ir digitālās elektronikas ieguldījums. Domājot par visiem šiem, ir ļoti aizraujoši ieprogrammēt savus materiālus, kas varētu paveikt vienkāršus, tomēr noderīgus uzdevumus, piemēram, modinātāju, kuru mēs šajā projektā veidosim ar PIC mikrokontrolleru. Iepriekš ar citiem mikrokontrolleriem esam izveidojuši modinātāju:
- Aveņu Pi modinātājs, izmantojot RTC moduli DS1307
- Arduino bāzes digitālais pulkstenis ar modinātāju
- Modinātājs, izmantojot mikrokontrolleru ATmega32
Šim modinātājam būs 16x2 LCD displejs, kas parādīs pašreizējo laiku un iestatīto laiku. Mēs vienmēr izmantosim dažas spiedpogas, lai iestatītu trauksmes laiku. Pašreizējais laiks tiks saglabāts, izmantojot DS3231 RTC moduli, un mēs izmantosim IIC sakarus, lai iegūtu šīs vērtības no RTC moduļa. Mēs jau esam iemācījušies par RTC moduli un kā to sasaistīt ar PIC. Tāpēc ieteicams izlasīt šo apmācību, mēs izlaižam lielāko daļu šajā apmācībā ietvertās informācijas.
Nepieciešamie materiāli:
- Maizes dēlis - 2Nos
- PIC16F877A
- 5V barošanas avots - barošanas modulis
- 20 MHz kristāls
- 33pf kondensators - 2Nos
- DS3231 RTC modulis
- 16 * 2 LCD displeja modulis
- 10K POT
- 10k un 1K rezistors
- Spiedpogas - 5Nos
- Buzzer
- Savienojošie vadi
Priekšnosacījumi:
Šis projekts prasa, lai jūs zinātu dažus pamatus par PIC mikrokontrolleru un kā to ieprogrammēt. Šajā projektā mēs izmantosim GPIO, LCD displeju un RTC moduli. Tāpēc labāk ir iemācīties iepriekš izmantot šos moduļus. Šīs saites palīdzēs jums uzzināt to pašu
- Pirmās programmas rakstīšana ar PIC mikrokontrolleru
- Mijiedarbojas LCD ar PIC
- I2C komunikācija, izmantojot PIC
- DS3231 RTC saskarne ar PIC
Ķēdes shēma:
Šī PIC balstītā modinātāja projekta shēma ir parādīta zemāk, kas tika izveidota, izmantojot programmatūru proteus. Šajā projektā tiks izmantota arī turpmākajai simulācijai.
Piecas spiedpogas darbosies kā ievade trauksmes iestatīšanai uz vajadzīgo laiku. Tātad visu spiedpogu viens gals ir savienots ar zemi, bet pārējie gali ir savienoti ar PORTB tapu. Šajos tapās tiks izmantots iekšējais pievilkšanas rezistors, lai izvairītos no tapu peldēšanas. Buzzer darbosies kā izeja un pīkstēs, kad trauksme tiks aktivizēta un pievienota PORT S tapai. Pašreizējais laiks vienmēr tiek izsekots ar modeli DS3231 RTC, no kura PIC saņem datus caur I2C kopni, tāpēc RTC moduļa SCL un SDA tapas ir savienotas ar PIC kontroliera SCL un SDA tapu. PIC PORTD ir pievienots LCD displejs, ko izmanto, lai parādītu pašreizējo laiku un iestatīto laiku. Uzziniet vairāk par DS3231 RTC moduļa izmantošanu ar PIC šeit.
Visu ķēdi var izveidot virs maizes dēļa. Tā kā savienošanai ir pāris desmiti vadu, vienkārši pacietieties un pārliecinieties, vai savienojumi ir pareizi. Mana aparatūras iestatīšana izskatījās kaut kas līdzīgs šim, kad es biju paveicis savienojumus
Moduļa darbināšanai esmu izmantojis paneļa moduli un 12V adapteri. Tas ir mans avots + 5V barošanas spriegumam. Arī man ir jāizmanto divi paneļi, lai ķēde būtu tīra. Jūs varat arī pielodēt visu ķēdi perf panelim, ja vēlaties izveidot stingrāku projektu.
Modinātāja programmēšana:
Pilnīga PIC programmu Šis modinātājs projektā var atrast pie šīs lapas apakšā. Šim projektam ir nepieciešamas arī trīs bibliotēkas, lai LCD, I2C un RTC izmantotu kopā ar PIC. Pilnu kodu ar galvenes failiem var lejupielādēt no ZIP faila šeit, un pēc izvilkšanas to var atvērt, izmantojot MPLABX. Tālāk es tikai izskaidroju galveno c failu kā mazus fragmentus. Varat atgriezties pie iepriekš minētajām apmācībām, ja vēlaties uzzināt, kā darbojas galvenes faili.
Pirms iekļūšanas galvenajā programmā mums ir jādefinē tapas, kuras esam izmantojuši ar jēgpilnāku nosaukumu. Tādā veidā tos būs viegli izmantot programmēšanas laikā. Mūsu programmā definētās tapas ir parādītas zemāk
// Definējiet LCD tapas #define RS RD2 // Atiestatiet LCD tapu #define EN RD3 // Iespējojiet LCD tapu #define D4 RD4 // LCD diska 0 bits #define D5 RD5 // LCD 1.datums #define D6 RD6 // LCD 2. datu bits #define D7 RD7 // LCD 3. datu bits // Definēt pogas #define MB RB1 // vidējā poga #define LB RB0 // Kreisā poga #define RB RB2 // Labā poga # definēt UB RB3 // Augšējā poga #define BB RB4 // Apakšējā poga // Definēt Buzz #define BUZZ RD1 // Buzzer ir savienots ar RD1
Galvenās funkcijas iekšpusē mēs sākam , deklarējot ievades un izvades tapas. Mūsu projektā PORTB tiek izmantots spiedpogām, kas ir ievades ierīce, tāpēc mēs iestatām to tapas kā ieejas, un PORTD tiek izmantots LCD un skaņas signālam, tāpēc mēs iestatām viņu tapas kā izvadi. Arī tapai nekad nevajadzētu atstāt peldošu nozīmi, I / O tapām vienmēr jābūt savienotām ar zemi vai ar + 5V spriegumu. Mūsu gadījumā spiedpogām tapas netiks pieslēgtas nekam, ja poga netiek nospiesta, tāpēc mēs izmantojam iekšējo pievilkšanas rezistoru, kas piesprauž tapu uz augstu, kad to neizmanto. Tas tiek darīts, izmantojot vadības reģistrus, kā parādīts zemāk
TRISD = 0x00; // Izveidojiet D porta tapas kā izeju LCD saskarnēm TRISB = 0xFF; // Slēdži tiek deklarēti kā ievades tapas OPTION_REG = 0b00000000; // Iespējot pievilkšanas rezistoru B pieslēgvietā slēdžiem BUZZ = 0; // Zumera pagrieziens
Tā kā mums ir LCD un I2C galvenes fails, kas saistīts ar galveno programmu, mēs varam sākt LCD inicializāciju, izsaucot vienkāršu funkciju. To pašu var izdarīt arī ar I2C inicializēšanu. Šeit mēs sākam I2C sakarus ar ātrumu 100 kHz, jo RTC modulis darbojas ar 100 kHz.
Lcd_Start (); // Inicializēt LCD moduli I2C_Initialize (100); // Inicializējiet I2C Master ar 100KHz pulksteni
Zemāk esošo funkciju izmanto, lai iestatītu laiku un datumu RTC modulī, kad laiks un datums ir iestatīts, noņemiet šo rindu. Katru reizi, kad sākat programmu, laiks un datums tiks iestatīti atkal un atkal
// Noņemiet zemāk esošo rindu, kad laiks un datums ir iestatīts pirmo reizi. Set_Time_Date (); // iestatiet laiku un datumu RTC modulī
Lai norādītu, ka programma sāk darboties, mēs parādām nelielu ievada ekrānu, kurā parādīts projekta nosaukums un vietnes nosaukums, kā parādīts zemāk
// Dodiet ievada ziņojumu LCD Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Modinātājs"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Circuit Digest"); __kavēšanās_ms (1500);
Tālāk, kamēr cilpa mums ir jāizlasa pašreizējais laiks un datums no RTC moduļa, to var izdarīt, vienkārši izsaucot zemāk esošo funkciju.
Update_Current_Date_Time (); // Izlasiet pašreizējo datumu un laiku no RTC moduļa
Izsaucot iepriekš minēto funkciju, mainīgie sec, min un hour tiks atjaunināti ar pašreizējo vērtību. Lai tos parādītu LCD ekrānā, mums tie jāsadala atsevišķās rakstzīmēs, izmantojot zemāk esošo kodu.
// Sadaliet uz char, lai parādītu uz lcd char sec_0 = sec% 10; char sec_1 = (sec / 10); char min_0 = min% 10; char min_1 = min / 10; char stunda_0 = stunda% 10; char stunda_1 = stunda / 10;
Pēc tam mēs LCD ekrānā atjauninām vērtības. Pašreizējais laiks tiks parādīts pirmajā rindā, un iestatītais laiks, kad jāiedarbina trauksme, tiek parādīts otrajā rindā. Kods, kas dara to pašu, ir parādīts zemāk.
// Parādīt pašreizējo laiku LCD ekrānā Lcd_Clear (); Lcd_Set_Cursor (1, 1); Lcd_Print_String ("LAIKS:"); Lcd_Print_Char (stunda_1 + '0'); Lcd_Print_Char (stunda_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'); // Parādīt datumu LCD ekrānā Lcd_Set_Cursor (2, 1); Lcd_Print_String ("Trauksme:"); Lcd_Print_Char (trauksmes_vals + '0'); Lcd_Print_Char (trauksmes_vals + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (trauksmes_vals + '0 '); Lcd_Print_Char (trauksmes_vals + '0');
Tagad mēs esam parādījuši laiku un iestatītu laiku LCD, mums jāpārbauda, vai lietotājs mēģina iestatīt trauksmes laiku. Lai to izdarītu, lietotājam ir jānospiež vidējā poga, tāpēc mēs pārbaudīsim, vai vidējā poga ir nospiesta, un pārslēdziet mainīgo, lai pārietu uz trauksmes iestatīšanas režīmu. Tā pati poga tiks nospiesta vēlreiz, lai apstiprinātu, ka vērtības ir iestatītas, un tādā gadījumā mums ir jāiziet no trauksmes iestatīšanas režīma. Tāpēc mēs izmantojam zemāk esošo koda rindu, lai mainītu mainīgā set_alarm statusu.
// Izmantojiet vidējo pogu, lai pārbaudītu, vai trauksme ir jāiestata, ja (MB == 0 && set_alarm == 0) {// Ja tiek nospiesta vidējā poga un trauksme nav ieslēgta (! MB); // Pagaidiet, līdz tiek atbrīvota poga set_alarm = 1; // sākt iestatīt trauksmes vērtību } ja (MB == 0 && set_alarm == 1) {// Ja tiek nospiesta vidējā poga un trauksme netiek izslēgta, kamēr (! MB); // Pagaidiet, līdz tiek atbrīvota poga set_alarm = 0; // pārtraukt trauksmes vērtības iestatīšanu }
Ja lietotājs ir nospiedis vidējo pogu, tas nozīmē, ka viņš mēģina iestatīt trauksmes laiku. Šajā gadījumā programma pāriet trauksmes iestatīšanas režīmā, izmantojot iepriekš minēto kodu. Trauksmes iestatīšanas režīmā, ja lietotājs nospiež kreiso vai labo pogu, tas nozīmē, ka mums ir jāpārvieto kursors pa kreisi vai pa labi. Lai to izdarītu, mēs vienkārši palielinām samazinājumu tās pozīcijas vērtībai, kurā jānovieto kursors
if (LB == 0) {// Ja tiek nospiesta kreisā poga, kamēr (! LB); // Pagaidiet, kamēr poga tiek atlaista, poz--; // Tad pārvietojiet kursoru pa kreisi }, ja (RB == 0) {// Ja tiek nospiesta labā poga, kamēr (! RB); // Pagaidiet, līdz tiek atbrīvota poga poz ++; // Pārvietot kursoru pa labi }
Izmantojot spiedpogu ar mikrokontrolleru vai mikroprocesoru, ir jārisina viena izplatīta problēma. Šo problēmu sauc par slēdža atlēcienu. Tas ir tad, kad tiek nospiesta poga, tas var radīt trokšņainus impulsus MCU / MPU, kas var viltot MCU vairākiem ierakstiem. Šo problēmu var atrisināt, pievienojot kondensatoru pāri slēdžam vai izmantojot aizkaves funkciju, tiklīdz tiek konstatēta pogas nospiešana. Šāda veida risinājumu sauc par atlēcienu. Šeit mēs esam izmantojuši kādu laiku, lai programmu noturētu, līdz tiek atbrīvota poga. Tas nav labākais atlecošais risinājums, bet mums tas darbosies lieliski.
kamēr (! RB);
Līdzīgi kā kreisajā un labajā pogā, mums ir arī augšējā un apakšējā poga, kuras var izmantot, lai palielinātu vai samazinātu trauksmes laika vērtību. Kods, lai izdarītu to pašu, ir parādīts zemāk. Ievērojiet, ka katru iestatītā trauksmes laika rakstzīmi risina masīva indekss. Tas bija tas, ka mēs varam viegli piekļūt vajadzīgajam rakstzīmei, kura vērtības ir jāmaina.
if (UB == 0) {// Ja augšējā poga tiek nospiesta, kamēr (! UB); // Pagaidiet, līdz tiek atbrīvota poga alarm_val ++; // Palieliniet konkrēto char vērtību }, ja (BB == 0) {// Ja tiek nospiesta apakšējā poga, kamēr (! UB); // Pagaidiet, līdz tiek atbrīvota poga alarm_val--; // Samazināt konkrēto char vērtību }
Kad trauksmes laiks ir iestatīts, lietotājs vēlreiz nospiež vidējo pogu. Tad mēs varam sākt salīdzināt pašreizējo laiku ar iestatīto laiku. Salīdzinājums, pārbaudot, vai katrs pašreizējā laika raksturs ir vienāds ar noteiktā laika rakstzīmi. Ja vērtības ir vienādas, mēs aktivizējam trauksmi, iestatot mainīgo trig_alarm, citādi mēs vienkārši salīdzinām, līdz tas kļūst vienāds.
// JA trauksme ir iestatīta Pārbaudiet, vai iestatītā vērtība ir vienāda ar pašreizējo vērtību, ja (set_alarm == 0 && alarm_val == hour_1 && alarm_val == hour_0 && alarm_val == min_1 && alarm_val == min_0) trigger_alarm = 1; // Ieslēdziet aktivizētāju, ja vērtība sakrīt
Ja trauksme ir iestatīta, mums jāpīkstina skaņas signāls, lai brīdinātu lietotāju par trauksmi. To var izdarīt, vienkārši regulāri pārslēdzot skaņas signālu, kā parādīts zemāk.
if (trigera trauksme) {// Ja trauksme ir aktivizēta // Pīkstiniet signālu BUZZ = 1; __kavēšanās_ms (500); BUZZ = 0; __kavēšanās_ms (500); }
Modelēšana:
Šo programmu var arī simulēt, izmantojot proteus programmatūru. Vienkārši izveidojiet iepriekš parādīto ķēdi un ielādējiet sešstūra failu PIC. Šī projekta sešstūra kods ir atrodams ZIP failā, kas ir šeit saistīts. Simulācijas laikā uzņemtais ekrānuzņēmums ir parādīts zemāk
Simulācija kļūst ļoti noderīga, kad mēģināt pievienot projektam jaunas funkcijas. Varat arī izmantot I2C atkļūdotāju moduli, lai pārbaudītu, kādi dati tiek ievadīti un izejoši caur I2C kopni. Jūs varat mēģināt nospiest pogas un iestatīt arī modinātāja laiku. Kad iestatītais laiks ir vienāds ar pašreizējo laiku, skaņas signāls iet uz augšu.
Digitālā modinātāja darbība, izmantojot PIC16F877A:
Veidojiet ķēdi uz paneļa, iegūstiet kodu no lejupielādes saites un apkopojiet to, izmantojot MplabX un XC8 kompilatoru. Ja esat lejupielādējis kodu no šeit norādītā ZIP faila, tā sastādīšanai nevajadzētu būt problēmām, jo galvenes faili jau ir pievienoti.
Pēc programmas apkopošanas augšupielādējiet programmu savā aparatūrā, izmantojot PicKit3 programmētāju. Savienojums, lai savienotu pikita programmētāju ar PIC IC, ir parādīts arī shēmas shēmā. Kad programma ir augšupielādēta, jums vajadzētu redzēt ievadu ekrānu un pēc tam parādīto laiku pēc tam varat izmantot spiedpogas, lai iestatītu trauksmes laiku. Mana aparatūras iestatīšana, kad tā darbojas, izskatās šādi.
Kad trauksmes laiks sakrīt ar pašreizējo laiku, skaņas signāls sāks pīkstēt, lai modinātu lietotāju. Pilnīgu darbu var atrast zemāk esošajā video. Projektam ir daudz iespēju, uz kurām balstīties. RTC modulis var sekot līdzi jebkuram laikam un datumam, tāpēc jūs varat veikt ieplānoto uzdevumu jebkurā nepieciešamajā laikā / datumā. Varat arī pievienot maiņstrāvas ierīci, piemēram, ventilatoru vai lampu, un ieplānot, lai tā ieslēgtos vai izslēgtos, kad nepieciešams. Jūs joprojām varat izmantot daudz vairāk, izmantojot šo projektu, dariet man zināmu, kāda ideja jums ienāk prātā kā šī projekta jauninājums, un es priecāšos dzirdēt no jums.
Ceru, ka sapratāt projektu un no procesa uzzinājāt kaut ko noderīgu. Ja jums ir šaubas par šo projektu, izmantojiet komentāru sadaļu, lai tos ievietotu, vai izmantojiet forumus jebkurai tehniskai palīdzībai.
Pilnīgu PIC kodu ar galvenes failiem var atrast šeit