Përmbajtje:

Monitorues i temperaturës dhe nivelit të dritës me shfaqje në LCD NOKIA 5110: 4 hapa
Monitorues i temperaturës dhe nivelit të dritës me shfaqje në LCD NOKIA 5110: 4 hapa

Video: Monitorues i temperaturës dhe nivelit të dritës me shfaqje në LCD NOKIA 5110: 4 hapa

Video: Monitorues i temperaturës dhe nivelit të dritës me shfaqje në LCD NOKIA 5110: 4 hapa
Video: Përse po digjen makinat? Mekanikët tregojnë gabimet që bëjnë shoferët në Shqipëri 2024, Korrik
Anonim
Image
Image

Pershendetje te gjitheve!

Në këtë pjesë ne bëjmë pajisje të thjeshta elektronike për të monitoruar temperaturën dhe nivelin e dritës. Matjet e këtyre parametrave shfaqen në LCD NOKIA 5110. Pajisja bazohet në mikrokontrolluesin AVR ATMEGA328P. Pajisja e monitorimit është e pajisur me termometër digjital DS18B20 dhe fotorezistues për të matur nivelin e dritës.

Hapi 1: Përshkrimi i përbërësve

Përshkrimi Komponentët
Përshkrimi Komponentët
Përshkrimi Komponentët
Përshkrimi Komponentët

Komponentët bazë të pajisjes së monitorimit:

  • Mikrokontrolluesi AVR «ATMEGA328P»
  • LCD grafik pikturë njëngjyrëshe «NOKIA 5110»
  • Termometër dixhital me rezolucion të programueshëm 1-tela «DS18B20»
  • Rezistencë e varur nga drita
  • Telat

Mikrokontrolluesi AVR «ATMEGA328P»

Pajisja e monitorimit përdor karakteristikat e mëposhtme periferike të mikrokontrolluesit:

  1. Kohëmatësi/ndërprerës i numëruesit 16-bit
  2. ADC me 8 kanale 10-bit
  3. Ndërfaqja serike Master/slave SPI

LCD grafik pikturë njëngjyrëshe «NOKIA 5110»

Specifikimet:

  1. 48 x 84 Ekran LCD me pika
  2. Ndërfaqja serike e autobusit me shpejtësi maksimale të lartë 4 Mbits/S
  3. Kontrolluesi/Shoferi i Brendshëm «PCD8544»
  4. Drita e pasme LED
  5. Drejtoni në Tensionin 2.7-5 Volt
  6. Konsumi i ulët i energjisë; është i përshtatshëm për aplikimet e baterisë
  7. Gama e temperaturës nga -25˚C në +70˚C
  8. Sinjali i mbështetjes CMOS Input

Trajtimi i adresës LCD (Adresimi):

Rregullimi i adresës së kujtesës që shfaqet në Ekranin LCD (DDRAM) është Matricë që përbëhet nga 6 rreshta (Adresa Y) nga Y-Adresa 0 në Y-Adresa 5 dhe 84 kolona (Adresa X) nga X-Adresa 0 në X- Adresa 83. Nëse përdoruesi dëshiron të ketë qasje në pozicionin e shfaqjes së rezultatit në ekranin LCD, duhet t'i referohet marrëdhënies midis Adresës X dhe Adresës Y.

Të dhënat që do të dërgohen për t'u shfaqur janë 8 bit (1 Byte) dhe do të sistemohen si vijë vertikale; në këtë rast, Bit MSB do të jetë më i ulët dhe Bit LSB do të jetë i lartë siç tregohet në figurë.

Rezolucion i programueshëm 1-Wire Termometër dixhital DALLAS «DS18B20»

Karakteristikat:

  1. Ndërfaqja unike 1-Wire® kërkon vetëm një Pin Port për komunikim
  2. Reduktoni numrin e komponentëve me sensorin e integruar të temperaturës dhe EEPROM
  3. Mat Temperaturat nga -55 ° C deri +125 ° C (-67 ° F deri +257 ° F)
  4. ± 0.5 ° C Saktësi nga -10 ° C në +85 ° C
  5. Rezolucion i programueshëm nga 9 bit në 12 bit
  6. Nuk kërkohen përbërës të jashtëm
  7. Mënyra Parazitare e Energjisë kërkon vetëm 2 kunja për operim (DQ dhe GND)
  8. Thjeshton Aplikacionet e Shpërndara të Ndjesisë së Temperaturës me Aftësi Multiprop
  9. Çdo pajisje ka një kod serik unik 64-bit të ruajtur në ROM në bord
  10. Cilësimet fleksibile të paqëndrueshme të përcaktueshme nga përdoruesi (NV) me komandën e kërkimit të alarmit Identifikon pajisjet me temperatura jashtë kufijve të programuar

Aplikimet:

  1. Kontrollet termostatike
  2. Sistemet Industriale
  3. Produktet e Konsumit
  4. Termometra
  5. Sisteme termikisht të ndjeshme

Rezistencë e varur nga drita

Rezistori i varur nga drita (LDR) është një dhënës që ndryshon rezistencën e tij kur drita bie në sipërfaqen e tij ndryshon.

Zakonisht një LDR do të ketë nga një megaOhms në dy megaOhms në errësirë totale, nga dhjetë në njëzet kiloOhms në dhjetë LUX, nga dy në pesë kiloohms në 100 LUX. Rezistenca midis dy kontakteve të sensorit zvogëlohet me intensitetin e dritës ose përçueshmëria midis dy kontakteve të sensorit rritet.

Përdorni qarkun e ndarjes së tensionit për të shndërruar ndryshimin e rezistencës në ndryshimin e tensionit.

Hapi 2: Kodi i firmuerit të mikrokontrolluesit

#ifndef F_CPU #përcakto F_CPU 16000000UL // tregues i frekuencës kristalore të kontrolluesit (16 MHz AVR ATMega328P) #endif

// SPI INTERFACE DEFINES #define MOSI 3 // MOSI është PORT B, PIN 3 #përcakto MISO 4 // MISO është PORTI B, PIN 4 #përcakto SCK 5 // SCK është PORT B, PIN 5 #define SS 2 // SS është PORTI B, PIN 2

// Rivendos ekranin #përcakto RST 0 // RISHTO PORTIN B, PIN 0

// DISPLAY MODE SELECT - Hyrje për të zgjedhur komandën/adresën ose futjen e të dhënave. #përcaktoni DC 1 // DC është PORTI B, PIN 1

// array kodesh të shenjave negative negative të nënshkruara char neg [4] = {0x30, 0x30, 0x30, 0x30};

// koleksioni i kodeve të shifrave [0..9] font statik pa shenjë char6x8 [10] [16] = {{0xFC, 0xFE, 0xFE, 0x06, 0x06, 0xFE, 0xFE, 0xFC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 0 {0x00, 0x00, 0x18, 0x1C, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00} // 1 0x0C, 0x8E, 0xCE, 0xE6, 0xE6, 0xBE, 0x9E, 0x0C, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 2 {0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x8C, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 3 {0x3C, 0x3E, 0x7C, 0x60, 0x60, 0xFC, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00 0x01, 0x03, 0x01} // 4 {0x1C, 0x3E, 0x3E, 0x36, 0x36, 0xF6, 0xF6, 0xE4, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01} // 5 {0xFC, 0xFE, 0xFE, 0x36, 0x36, 0xF6, 0xF6, 0xE4, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, /, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00}, // 7 {0xCC, 0xFE, 0xFE, 0x36, 0x36, 0xFE, 0xFE, 0xCC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0 3, 0x01}, // 8 {0x3C, 0x7E, 0x7E, 0x66, 0x66, 0xFE, 0xFE, 0xFC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01} // 9};

// Kodet grup i fjalës "TEMP:" statike const unsigned char TEMP_1 [165] = {0x02, 0x06, 0x06, 0xFE, 0xFE, 0xFE, 0x06, 0x06, 0x02, 0x00, 0xFC, 0xFE, 0xFE, 0x26, 0x26, 0x24, 0x00, 0xFC, 0xFE, 0xFE, 0x1C, 0x38, 0x70, 0x38, 0x1C, 0xFE, 0xFE, 0xFC, 0x00, 0xFC, 0xFE, 0xFE, 0x66, 0x66, 0x7E, 0x7E, 0x3C, 0x00, 0x8C, 0x8C, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1 0x9C, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01,};

// grup kodesh të fjalës "LUX:" const char unsigned TEMP_2 [60] = {0xFC, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE, 0xFC, 0x00, 0x00, 0xFC, 0xFE 0xFC, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x01};

#përfshi

#përfshi #përfshi

// Fillimi i Portit i pavlefshëm Port_Init () {DDRB = (1 << MOSI) | (1 << SCK] | (1 << SS] | (1 << RST) | (1 << DC]; // Set MOSI, SCK, SS, RST, DC si dalje, të gjithë të tjerët hyrje PORTB | = (1 << RST); // Vendosni pinin RST si të lartë PORTB | = (1 << SS]; // Vendosni pinin SS si të lartë - Ekrani është Çaktivizo DDRC = 0xFFu; // Vendosni të gjitha kunjat e PORTC si dalje. DDRC & = ~ (1 << 0); // Bën pinin e parë të PORTC si Hyrje PORTC = 0x00u; // Vendosni të gjitha kunjat e PORTC të ulëta që e fikin atë. }

// ADC Initialization void ADC_init () {// Aktivizo ADC, frekuenca e marrjes së mostrave = osc_freq/128 vendos prescaler në vlerën maksimale, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2] | (1 << ADPS1] | (1 << ADPS0]; ADMUX = (1 << REFS0); // Zgjidhni referencën e tensionit për ADC // Zgjidhni kanalin zero si parazgjedhje duke përdorur regjistrin ADC Multiplexer Select (ADC0). }

// Funksioni për të lexuar rezultatin e konvertimit analog në dixhital uint16_t get_LightLevel () {_delay_ms (10); // Prisni për ca kohë që kanali të marrë ADCSRA të zgjedhur | = (1 << ADSC); // Filloni konvertimin ADC duke vendosur bitin ADSC. shkruani 1 në ADSC ndërsa (ADCSRA & (1 << ADSC)); // prisni që konvertimi të përfundojë // ADSC bëhet 0 përsëri deri atëherë, drejtoni vazhdimisht ciklin _delay_ms (10); kthimi (ADC); // Ktheni rezultatin 10-bit}

// SPI Fillimi i pavlefshëm SPI_Init () {SPCR = (1 << SPE] | (1 << MSTR] | (1 << SPR0); // Aktivizo SPI, Cakto si Master, Vendos Prescaler si Fosc/16 në kontrollin SPI regjistrohu}

// inicializoni Kohëmatësin 16 -bit1, ndërprerjen dhe ndryshoren e zbrazëtisë TIMER1_init () {// vendosni kohëmatësin me prescaler = 256 dhe modalitetin CTC TCCR1B | = (1 << WGM12] | (1 << CS12); // inicoj numëruesin TCNT1 = 0; // filloni vlerën e krahasimit - 1 sek. OCR1A = 62500; // aktivizoni krahasimin e ndërprerjes TIMSK1 | = (1 << OCIE1A); // mundëson ndërprerjet globale sei (); }

// Display Enable void SPI_SS_Enable () {PORTB & = ~ (1 << SS]; // Aktivizo kunjin SS në logjikën 0}

// Shfaq Disable Disable void SPI_SS_Disable () {PORTB | = (1 << SS]; // Çaktivizoni kunjin SS në logjikë 1}

// Funksioni për të dërguar të dhëna në tamponin e ekranit të pavlefshëm SPI_Tranceiver (të dhëna të padënshkruara të kartës) {SPDR = të dhëna; // Ngarkoni të dhënat në tampon ndërsa (! (SPSR & (1 << SPIF))); // Prisni derisa transmetimi të përfundojë}

// Rivendosni ekranin në fillim të fillimit void Display_Reset () {PORTB & = ~ (1 << RST); _vonesa_ms (100); PORTB | = (1 << RST); }

// Funksioni i shkrimit të komandës i pavlefshëm Display_Cmnd (të dhëna të pa shenjuara të char) {PORTB & = ~ (1 << DC); // bëj pinin DC në logjikën 0 për operacionin e komandës SPI_Tranceiver (të dhëna); // dërgoni të dhëna mbi regjistrin e të dhënave PORTB | = (1 << DC); // bëjeni pikën DC në logjikë të lartë për funksionimin e të dhënave}

// Fillimi i Display void Display_init () {Display_Reset (); // rivendosni ekranin Display_Cmnd (0x21); // komanda e vendosur në modalitetin shtesë Display_Cmnd (0xC0); // vendosni tensionin duke dërguar mjete C0 VOP = 5V Display_Cmnd (0x07); // vendosni temp. koeficienti në 3 Display_Cmnd (0x13); // vlera e vendosur e Sistemit të Paragjykimit të Tensionit Display_Cmnd (0x20); // komanda e vendosur në modalitetin bazë Display_Cmnd (0x0C); // shfaq rezultatin në mënyrë normale}

// Pastroni zbrazëtinë e ekranit Display_Clear () {PORTB | = (1 << DC]; // bëj pinin DC në logjikë të lartë për funksionimin e të dhënave për (int k = 0; k <= 503; k ++) {SPI_Tranceiver (0x00);} PORTB & = ~ (1 << DC]; // bëj DC pin logjikës zero për funksionimin e komandës}

// vendosni kolonën dhe rreshtin në pozicionin e shfaqjes së rezultatit në LCD Display void Display_SetXY (char char unsigned, char unsigned char) {Display_Cmnd (0x80 | x); // kolona (0-83) Display_Cmnd (0x40 | y); // rreshti (0-5)}

// Funksioni për të shfaqur shenjën negative të pavlefshme Display_Neg (shenjë e pa shenjë) {Display_SetXY (41, 0); // Vendosni adresën e pozicionit në ekran për (int index = 0; index0) {SPDR = 0x30;} // Ngarkoni të dhënat në tamponin e ekranit (shfaqni shenjën negative) përndryshe {SPDR = 0x00;} // Ngarkoni të dhënat në tampon i ekranit (shenjë e qartë negative) ndërsa (! (SPSR & (1 << SPIF)))); // Prisni derisa transmetimi të përfundojë _vonesë_ms (100); }}

// Funksioni për të pastruar shenjën dixhitale të pavlefshme Off_Dig (shenja pa shenjë x, shenja pa shenjë y) {Display_SetXY (x, y); // Vendosni adresën e pozicionit në ekran (rreshti i lartë) për (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Ngarkoni të dhënat në tamponin e ekranit (pastroni pjesën e sipërme të shenjës dixhitale) y ++; Display_SetXY (x, y); // Vendosni adresën e pozicionit në ekran (rreshti i poshtëm) për (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Ngarkoni të dhënat në tamponin e ekranit (pjesa e poshtme e qartë e shenjës dixhitale)}

// Funksioni për të shfaqur shenjën dixhitale të pavlefshme Display_Dig (int dig, char pa shenjë x, char y pa shenjë) {Display_SetXY (x, y); // Vendosni adresën e pozicionit në ekran (rreshti i lartë) për (int index = 0; index <16; index ++) {if (index == 8) {y ++; Display_SetXY (x, y);} // Vendosni adresën e pozicionit në ekran (rreshti i poshtëm) SPI_Tranceiver (font6x8 [dig] [index]); // Ngarkoni grupin e të dhënave të shifrave në tamponin e ekranit _delay_ms (10); }}

// Fillimi i karikaturës pa shenjë DS18B20 DS18B20_init () {DDRD | = (1 << 2); // Vendosni kunjin PD2 të PORTD si dalje PORTD & = ~ (1 << 2); // Vendosni kunjin PD2 si të ulët _delay_us (490); // Koha e fillimit DDRD & = ~ (1 << 2); // Vendosni kunjin PD2 të PORTD si hyrje _delay_us (68); // Koha OK_Flag = (PIND & (1 << 2)); // merrni pulsin e sensorit _vonesa_us (422); kthehu OK_Flag; // sensori i kthimit 0-ok është prizë, sensori i 1 gabimit është i shkyçur}

// Funksioni për të lexuar bajt nga DS18B20 pa shenjë char read_18b20 () {char pa shenjë i, të dhëna = 0; për (i = 0; i <8; i ++) {DDRD | = (1 << 2); // Vendosni kunjin PD2 të PORTD si dalje _delay_us (2); // Koha DDRD & = ~ (1 1; // Bit tjetër nëse (PIND & (1 << 2)) të dhëna | = 0x80; // vendos bit në byte _delay_us (62);} ktheni të dhënat;}

// Funksioni për të shkruar byte në DS18B20 void write_18b20 (të dhëna pa shenjë të karrikut) {shenjë e pashkruar i; për (i = 0; i <8; i ++) {DDRD | = (1 << 2); // Vendosni kunjin PD2 të PORTD si dalje _delay_us (2); // Koha nëse (të dhëna & 0x01) DDRD & = ~ (1 << 2); // nëse duam të shkruajmë 1, lëshojmë rreshtin tjetër DDRD | = (1 1; // Biti tjetër _delay_us (62); // Koha DDRD & = ~ (1 << 2); // Vendosni kunjin PD2 të PORTD si input _delay_us (2);}}

// Funksioni për të shfaqur nivelin e dritës void Read_Lux () {uint16_t tampon; pa shenjë int temp_int_1, temp_int_2, temp_int_3, temp_int_0; // shifra të vetme, dyshifrore, tre shifra, çerek shifra tampon = get_LightLevel (); // lexoni rezultatin e konvertimit analog në dixhital të nivelit të dritës temp_int_0 = tampon % 10000 /1000; // katërshifror temp_int_1 = tampon % 1000 /100; // tre-shifror temp_int_2 = tampon % 100 /10; // dyshifror temp_int_3 = tampon % 10; // një shifror nëse (temp_int_0> 0) // nëse rezultati është numër çerekësh {Display_Dig (temp_int_0, 32, 2); // shfaq 1 shifër të nivelit të dritës Display_Dig (temp_int_1, 41, 2); // shfaq 2 shifra të nivelit të dritës Display_Dig (temp_int_2, 50, 2); // shfaq 3 shifra të nivelit të dritës Display_Dig (temp_int_3, 59, 2); // shfaq 4 shifra të nivelit të dritës} tjetër {if (temp_int_1> 0) // nëse rezultati është numër tre shifror {Off_Dig (32, 2); // pastro 1 shenjë të numrit Display_Dig (temp_int_1, 41, 2); // shfaq 1 shifër të nivelit të dritës Display_Dig (temp_int_2, 50, 2); // shfaq 2 shifra të nivelit të dritës Display_Dig (temp_int_3, 59, 2); // shfaq 3 shifra të nivelit të dritës} tjetër {if (temp_int_2> 0) // nëse rezultati është numër dyshifror {Off_Dig (32, 2); // pastroni 1 shenjë të numrit Off_Dig (41, 2); // pastro 2 shenjën e numrit Display_Dig (temp_int_2, 50, 2); // shfaq 1 shifër të nivelit të dritës Display_Dig (temp_int_3, 59, 2); // shfaq 2 shifra të nivelit të dritës} tjetër // nëse rezultati është numër një shifror {Off_Dig (32, 2); // pastroni 1 shenjë të numrit Off_Dig (41, 2); // pastro 2 shenjën e numrit Off_Dig (50, 2); // pastro 3 shenjën e numrit Display_Dig (temp_int_3, 59, 2); // shfaq 1 shifër të nivelit të dritës}}}}

// Funksioni për të shfaqur zbrazëtirën e temperaturës Read_Temp () {unsigned int buffer; int pa shenjë int temp_int_1, temp_int_2, temp_int_3; // shifra të vetme, dyshifrore, tre shifra, çerek shifra pa shenjë char Temp_H, Temp_L, OK_Flag, temp_flag; DS18B20_init (); // Fillimi i DS18B20 write_18b20 (0xCC); // Kontrolloni kodin e sensorit write_18b20 (0x44); // Fillimi i konvertimit të temperaturës _vonesë_ms (1000); // Vonesa e sondazhit të sensorit DS18B20_init (); // Fillimi i DS18B20 write_18b20 (0xCC); // Kontrolloni kodin e sensorit write_18b20 (0xBE); // Komanda për të lexuar përmbajtjen e Sensorit RAM Temp_L = read_18b20 (); // Lexoni dy bajtët e parë Temp_H = read_18b20 (); temp_flag = 1; // Temperatura 1-pozitive, temperatura 0-negative // Merrni temperaturën negative nëse (Temp_H & (1 << 3)) // Shenja e Kontrollit të Bitit (nëse biti është vendosur-temperatura negative) {nënshkruar int temp; temp_flag = 0; // flamuri është vendosur 0 - temperatura negative e temperaturës = (Temp_H << 8) | Temp_L; temp = -temp; // Shndërroni kodin shtesë në Temp_L = temp të drejtpërdrejtë; Temp_H = temp >> 8; } tampon = ((Temp_H 4); temp_int_1 = tampon % 1000 /100; // treshifror temp_int_2 = tampon % 100 /10; // temp dyshifror temp_int_3 = tampon % 10; // një shifror

// Nëse temperatura është shenjë negative e shfaqjes së temperaturës, përndryshe e qartë

nëse (temp_flag == 0) {Display_Neg (1);} tjetër {Display_Neg (0);} nëse (temp_int_1> 0) // nëse rezultati është numër tre shifror {Display_Dig (temp_int_1, 45, 0); // shfaq 1 shifër të temperaturës Display_Dig (temp_int_2, 54, 0); // shfaq 2 shifra të temperaturës Display_Dig (temp_int_3, 63, 0); // shfaq 3 shifra të temperaturës} tjetër {if (temp_int_2> 0) // nëse rezultati është numër dyshifror {Off_Dig (45, 0); // pastro 1 shenjë të numrit Display_Dig (temp_int_2, 54, 0); // shfaq 1 shifër të temperaturës Display_Dig (temp_int_3, 63, 0); // shfaq 2 shifra të temperaturës} tjetër // nëse rezultati është numër një shifror {Off_Dig (45, 0); // pastroni 1 shenjë të numrit Off_Dig (54, 0); // pastro 2 shenjën e numrit Display_Dig (temp_int_3, 63, 0); // shfaq 1 shifër të temperaturës}}}

// Ky ISR lëshohet sa herë që përputhet me numërimin e kohëmatësit me vlerën e krahasimit (çdo 1 sekondë) ISR (TIMER1_COMPA_vect) {// Lexim, shfaqje e temperaturës dhe nivelit të dritës Read_Temp (); Read_Lux (); }

// Funksioni për të shfaqur fjalët "TEMP" dhe "LUX" void Display_label () {// Fjala "TEMP" Display_SetXY (0, 0); // Vendosni adresën e pozicionit në ekran (rreshti lart) për (int index = 0; index <105; index ++) {if (index == 40) {Display_SetXY (0, 1);} // Vendosni adresën e pozicionit në ekran (rreshti i poshtëm) nëse (indeksi == 80) {Display_SetXY (72, 0);} // Vendosni adresën e pozicionit në ekran (rreshti lart) nëse (indeksi == 92) {Display_SetXY (72, 1); } // Vendosni adresën e pozicionit në ekran (rreshti i poshtëm) SPDR = TEMP_1 [indeksi]; // Ngarkoni të dhënat e grupit të kodeve në tamponin e ekranit ndërsa (! (SPSR & (1 << SPIF))); // Prisni derisa transmetimi të përfundojë _vonesë_ms (10); } // Fjala "LUX" Display_SetXY (0, 2); // Vendosni adresën e pozicionit në ekran (rreshti lart) për (int index = 0; index <60; index ++) {if (index == 30) {Display_SetXY (0, 3);} // Vendosni adresën e pozicionit në ekran (rreshti i poshtëm) SPDR = TEMP_2 [indeksi]; // Ngarkoni të dhënat e grupit të kodeve në tamponin e ekranit ndërsa (! (SPSR & (1 << SPIF))); // Prisni derisa transmetimi të përfundojë _vonesë_ms (10); }}

int kryesore (e pavlefshme)

{Port_Init (); // Fillimi i Portit ADC_init (); // ADC Initialization SPI_Init (); // SPI Fillimi SPI_SS_Enable (); // Display Enable DS18B20_init (); // Fillimi i DS18B20 Display_init (); // Fillimi i ekranit Display_Clear (); // Shfaqni qartë Display_label (); // Shfaq fjalët "TEMP" dhe "LUX" TIMER1_init (); // Kohëmatësi1 Fillimi. Filloni monitorimin. Marrja e parametrave çdo sekondë. // lak pafundësie (1) {}}

Hapi 3: Ndezja e firmuerit te mikrokontrolluesi

Ngarkimi i skedarit HEX në flash kujtesën e mikrokontrolluesit. Shikoni videon me një përshkrim të hollësishëm të djegies së kujtesës flash të mikrokontrolluesit: Memoria flash e mikrokontrolluesit po digjet…

Hapi 4: Monitorimi i Asamblesë së Qarkut të Pajisjes

Asambleja e Qarkut të Pajisjes së Monitorimit
Asambleja e Qarkut të Pajisjes së Monitorimit
Asambleja e Qarkut të Pajisjes së Monitorimit
Asambleja e Qarkut të Pajisjes së Monitorimit

Lidhni komponentët në përputhje me diagramin skematik.

Plotësoni fuqinë dhe po funksionon!

Recommended: