Kazalo:

Nadzor temperature in ravni svetlobe s prikazom na LCD -prikazovalniku NOKIA 5110: 4 koraki
Nadzor temperature in ravni svetlobe s prikazom na LCD -prikazovalniku NOKIA 5110: 4 koraki

Video: Nadzor temperature in ravni svetlobe s prikazom na LCD -prikazovalniku NOKIA 5110: 4 koraki

Video: Nadzor temperature in ravni svetlobe s prikazom na LCD -prikazovalniku NOKIA 5110: 4 koraki
Video: Part 6 - Lord Jim Audiobook by Joseph Conrad (Chs 37-45) 2024, Julij
Anonim
Image
Image

Pozdravljeni vsi skupaj!

V tem razdelku izdelujemo preprosto elektronsko napravo za spremljanje temperature in ravni svetlobe. Meritve teh parametrov so prikazane na LCD -monitorju NOKIA 5110. Naprava temelji na mikrokrmilniku AVR ATMEGA328P. Nadzorna naprava je opremljena z digitalnim termometrom DS18B20 in fotorezistorjem za merjenje ravni svetlobe.

1. korak: Opis komponent

Opis Komponente
Opis Komponente
Opis Komponente
Opis Komponente

Osnovne komponente nadzorne naprave:

  • Mikrokrmilnik AVR «ATMEGA328P»
  • Enobarvni grafični LCD «NOKIA 5110»
  • 1-žični digitalni termometer za programiranje ločljivosti «DS18B20»
  • Svetlobno odvisen upor
  • Žice

Mikrokrmilnik AVR «ATMEGA328P»

Nadzorna naprava uporablja naslednje zunanje funkcije mikrokrmilnika:

  1. 16-bitni časovnik/prekinitev števca
  2. 8-kanalni 10-bitni ADC
  3. Glavni/podrejeni SPI serijski vmesnik

Enobarvni grafični LCD «NOKIA 5110»

Specifikacije:

  1. 48 x 84 točkovni LCD zaslon
  2. Vmesnik zaporednega vodila z največjo hitrostjo 4 Mbit/S
  3. Notranji krmilnik/gonilnik «PCD8544»
  4. LED osvetlitev ozadja
  5. Deluje pri napetosti 2,7-5 voltov
  6. Nizka poraba energije; primeren je za uporabo z baterijami
  7. Temperaturno območje od -25˚C do +70˚C
  8. Podporni signal CMOS vhod

Ravnanje z naslovom LCD (Naslavljanje):

Razporeditev naslovov pomnilnika, ki je prikazan na LCD zaslonu (DDRAM), je matrika, ki je sestavljena iz 6 vrstic (naslov Y) od naslova Y od 0 do naslova Y 5 in 84 stolpcev (naslov X) od naslova X od 0 do X- Naslov 83. Če želi uporabnik dostopati do položaja prikaza rezultata na LCD zaslonu, se mora sklicevati na razmerje med naslovom X in naslovom Y.

Podatki, ki bodo poslani na prikaz, so 8 -bitni (1 bajt) in bodo razporejeni kot navpična črta; v tem primeru bo Bit MSB nižji, Bit LSB pa zgornji, kot je prikazano na sliki.

1-žični digitalni termometer za programiranje ločljivosti DALLAS «DS18B20»

Lastnosti:

  1. Edinstven vmesnik 1-Wire® za komunikacijo potrebuje samo en vhod za vrata
  2. Zmanjšajte število komponent z vgrajenim temperaturnim senzorjem in EEPROM -om
  3. Meri temperature od -55 ° C do +125 ° C (-67 ° F do +257 ° F)
  4. ± 0,5 ° C Natančnost od -10 ° C do +85 ° C
  5. Programabilna ločljivost od 9 do 12 bitov
  6. Zunanje komponente niso potrebne
  7. Način parazitskega napajanja za delovanje potrebuje le 2 nožici (DQ in GND)
  8. Poenostavlja porazdeljene aplikacije za zaznavanje temperature z možnostjo večkratnega kapljanja
  9. Vsaka naprava ima edinstveno 64-bitno serijsko kodo, shranjeno v vgrajenem ROM-u
  10. Prilagodljive nastavljive nastavitve alarma, ki jih lahko določi uporabnik, s pomočjo ukaza za iskanje alarmov identificirajo naprave s temperaturami zunaj programiranih meja

Aplikacije:

  1. Termostatski krmilniki
  2. Industrijski sistemi
  3. Potrošniški izdelki
  4. Termometri
  5. Toplotno občutljivi sistemi

Svetlobno odvisen upor

Svetlobno odvisen upor (LDR) je pretvornik, ki spremeni svoj upor, ko svetloba pade na njegovo površino.

Običajno bo LDR imel od enega megaOhma do dveh megaOhmov pri popolni temi, od deset do dvajset kiloOhmov pri desetih LUX, od dva do pet kiloomov pri 100 LUX. Odpornost med dvema kontaktoma senzorja se zmanjšuje z intenzivnostjo svetlobe ali pa se prevodnost med dvema stikoma senzorja povečuje.

Uporabite vezje delilnika napetosti za pretvorbo spremembe upora v spremembo napetosti.

2. korak: Koda vdelane programske opreme mikrokrmilnika

#ifndef F_CPU #define F_CPU 16000000UL // sporoča frekvenco kristala krmilnika (16 MHz AVR ATMega328P) #endif

// SPI INTERFACE DEFINES #define MOSI 3 // MOSI je PORT B, PIN 3 #define MISO 4 // MISO je PORT B, PIN 4 #define SCK 5 // SCK je PORT B, PIN 5 #define SS 2 // SS je PORT B, PIN 2

// NASTAVITEV ZASLONA #define RST 0 // RESET je PORT B, PIN 0

// DISPLAY MODE SELECT - Vnos za izbiro ukaza/naslova ali vnosa podatkov. #define DC 1 // DC to je PORT B, PIN 1

// kodira niz negativnih znakovstatic const unsigned char neg [4] = {0x30, 0x30, 0x30, 0x30};

// kodira niz številk [0..9] statični const brez podpisanega znaka font 6x8 [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, 0x26, 0x76, 0xD,, 0x8C, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 3 {0x3C, 0x3E, 0x7C, 0x60, 0x60, 0xFC, 0xFE, 0xFC, 0x00, 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}, // 6 {0x04, 0x06, 0x06, 0x86, 0xE6, 0xFE, 0xEx, 0xEx, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00}, // 7 {0xCC, 0xFE, 0xFE, 0x36, 0x36, 0xFE, 0xFE, 0xCC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02 0x0 3, 0x01}, // 8 {0x3C, 0x7E, 0x7E, 0x66, 0x66, 0xFE, 0xFE, 0xFC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01} // 9};

// kodira niz besed "TEMP:" static 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, 0x7C, 0x3, 0x8 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, 0x00, 0x000 0x01, 0x03, 0x01, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0C, 0x1E, 0x33, 0x33, 0x1E, 0x0C, 0x00, 0xF8, 0x00C 0x9C, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01,};

// kodira niz besed "LUX:" const unsigned char TEMP_2 [60] = {0xFC, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE, 0xFC, 0x00, 0x00, 0xFC, 0xFE, 0xFC, 0x00, 0x04, 0x8E, 0xDE, 0xFC, 0xF8, 0xFC, 0xDE, 0x8E, 0x04, 0x00, 0x8C, 0x8C, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 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, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x01};

#vključi

#include #include

// Vrata Initializationvoid Port_Init () {DDRB = (1 << MOSI) | (1 << SCK) | (1 << SS) | (1 << RST) | (1 << DC); // Nastavi MOSI, SCK, SS, RST, DC kot izhod, vsi drugi vhod PORTB | = (1 << RST); // Nastavite pin RST kot visoko PORTB | = (1 << SS); // Nastavite pin pin kot visoko - zaslon je Onemogoči DDRC = 0xFFu; // Vse izhode PORTC nastavimo kot izhodne. DDRC & = ~ (1 << 0); // naredi prvi pin PORTC kot vhod PORTC = 0x00u; // Nastavite vse zatiče PORTC na nizko, kar izklopi. }

// ADC Initialization void ADC_init () {// Omogočite ADC, vzorčenje freq = osc_freq/128 nastavite predkaler na največjo vrednost, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); ADMUX = (1 << REFS0); // Izberemo referenco napetosti za ADC // Privzeto izberemo ničelni kanal z registrom za izbiro multipleksorja ADC (ADC0). }

// Funkcija za branje rezultata analogno -digitalne pretvorbe uint16_t get_LightLevel () {_delay_ms (10); // Počakajte nekaj časa, da kanal izbere ADCSRA | = (1 << ADSC); // Zagon pretvorbe ADC z nastavitvijo bit ADSC. napišite 1 v ADSC medtem ko (ADCSRA & (1 << ADSC)); // počakajte, da se pretvorba konča // ADSC do takrat spet postane 0, neprekinjeno izvajajte zanko _delay_ms (10); vračilo (ADC); // Vrni 10-bitni rezultat}

// SPI Initialization void SPI_Init () {SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0); // Omogoči SPI, Nastavi kot glavnega, Nastavi predkaler kot Fosc/16 v nadzoru SPI registriraj}

// inicializiramo 16 -bitni Timer1, prekinitev in spremenljivo void TIMER1_init () {// nastavimo časovnik s predkalerjem = 256 in načinom CTC TCCR1B | = (1 << WGM12) | (1 << CS12); // inicializiramo števec TCNT1 = 0; // inicializiraj primerjalno vrednost - 1 sekunda OCR1A = 62500; // omogoči primerjavo prekinitve TIMSK1 | = (1 << OCIE1A); // omogočimo globalne prekinitve sei (); }

// Display Enable void SPI_SS_Enable () {PORTB & = ~ (1 << SS); // Omogoči pin SS za logiko 0}

// Display Disable void SPI_SS_Disable () {PORTB | = (1 << SS); // Onemogoči pin SS za logiko 1}

// Funkcija pošiljanja podatkov v vmesni pomnilnik zaslona SPI_Tranceiver (nepodpisani podatki char) {SPDR = podatki; // Nalaganje podatkov v medpomnilnik while (! (SPSR & (1 << SPIF))); // Počakajte, da se prenos konča}

// Ponastavi prikaz na začetku inicializacije void Display_Reset () {PORTB & = ~ (1 << RST); _dey_ms (100); PORTB | = (1 << RST); }

// funkcija za pisanje ukazov void Display_Cmnd (nepodpisani podatki char) {PORTB & = ~ (1 << DC); // naredimo enosmerni pin na logiko 0 za ukazno operacijo SPI_Tranceiver (podatki); // pošiljanje podatkov v podatkovni register PORTB | = (1 << DC); // nastavite DC pin na logiko visoko za delovanje podatkov}

// Inicializacija Display void Display_init () {Display_Reset (); // ponastavite zaslon Display_Cmnd (0x21); // ukaz nastavljen v dodatnem načinu Display_Cmnd (0xC0); // nastavimo napetost s pošiljanjem C0 pomeni VOP = 5V Display_Cmnd (0x07); // nastavimo temp. koeficient do 3 Display_Cmnd (0x13); // nastavljena vrednost napetostnega pristranskega sistema Display_Cmnd (0x20); // ukaz nastavljen v osnovnem načinu Display_Cmnd (0x0C); // prikaz rezultata v običajnem načinu}

// Počisti prikaz void Display_Clear () {PORTB | = (1 << DC); // nastavimo DC pin na logiko visoko za delovanje podatkov za (int k = 0; k <= 503; k ++) {SPI_Tranceiver (0x00);} PORTB & = ~ (1 << DC); // DC pin pri logiki nič za ukazno operacijo}

// stolpec in vrstico nastavimo na položaj prikaza rezultata na LCD zaslonu void Display_SetXY (brez znaka x, brez znaka y) {Display_Cmnd (0x80 | x); // stolpec (0-83) Display_Cmnd (0x40 | y); // vrstica (0-5)}

// Funkcija za prikaz negativnega znaka void Display_Neg (nepodpisani znak) {Display_SetXY (41, 0); // Nastavimo naslov prikazane pozicije za (int index = 0; index0) {SPDR = 0x30;} // Naložimo podatke v medpomnilnik zaslona (negativni znak prikaza) else {SPDR = 0x00;} // Naložimo podatke v medpomnilnik prikaza (čist negativen znak) while (! (SPSR & (1 << SPIF))); // Počakajte, da se prenos konča _delay_ms (100); }}

// Funkcija za brisanje digitalnega znaka void Off_Dig (nepodpisani znak x, brez podpisanega znaka y) {Display_SetXY (x, y); // Nastavite naslov položaja na zaslonu (zgornja vrstica) za (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Naložite podatke v medpomnilnik zaslona (počistite zgornji del digitalnega znaka) y ++; Display_SetXY (x, y); // Nastavite naslov položaja na zaslonu (spodnja vrstica) za (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Naložite podatke v medpomnilnik zaslona (počisti spodnji del digitalnega znaka)}

// Funkcija prikaza digitalnega znaka void Display_Dig (int dig, unsigned char x, unsigned char y) {Display_SetXY (x, y); // Nastavite naslov položaja na zaslonu (zgornja vrstica) za (int index = 0; index <16; index ++) {if (index == 8) {y ++; Display_SetXY (x, y);} // Nastavite naslov položaja na zaslonu (spodnja vrstica) SPI_Tranceiver (font6x8 [dig] [index]); // Naloži kode matričnih podatkov v pomnilnik zaslona _delay_ms (10); }}

// Inicializacija DS18B20 brez podpisanega znaka DS18B20_init () {DDRD | = (1 << 2); // Nastavite pin PD2 PORTD kot izhod PORTD & = ~ (1 << 2); // Nastavite pin PD2 kot nizek _delay_us (490); // Čas inicializacije DDRD & = ~ (1 << 2); // Nastavite pin PD2 PORTD kot vhod _delay_us (68); // Časovna omejitev OK_Flag = (PIND & (1 << 2)); // dobimo impulz senzorja _delay_us (422); vrniti OK_Flag; // povratni senzor 0-ok je priključen, senzor z 1 napako je odklopljen}

// Funkcija branja bajtov iz DS18B20 unsigned char read_18b20 () {unsigned char i, data = 0; za (i = 0; i <8; i ++) {DDRD | = (1 << 2); // Nastavite pin PD2 PORTD kot izhod _delay_us (2); // Timing DDRD & = ~ (1 1; // Naslednji bit if (PIND & (1 << 2)) data | = 0x80; // vstavi bit v bajt _delay_us (62);} vrni podatke;}

// Funkcija zapisovanja bajta v DS18B20 void write_18b20 (podatki brez znaka) {unsigned char i; za (i = 0; i <8; i ++) {DDRD | = (1 << 2); // Nastavite pin PD2 PORTD kot izhod _delay_us (2); // Časovna razporeditev if (podatki & 0x01) DDRD & = ~ (1 << 2); // če želimo napisati 1, spustimo vrstico else DDRD | = (1 1; // Naslednji bit _delay_us (62); // Časovna razporeditev DDRD & = ~ (1 << 2); // Nastavimo zatič PD2 PORTD kot vnos _delay_us (2);}}

// Funkcija za prikaz ravni svetlobe void Read_Lux () {uint16_t pufra; brez podpisa int temp_int_1, temp_int_2, temp_int_3, temp_int_0; // enomestne, dvomestne, tromestne, četrtmestne medpomnilnik = get_LightLevel (); // preberemo rezultat analogno -digitalne pretvorbe svetlobne ravni temp_int_0 = medpomnilnik % 10000 /1000; // četrtmestno temp_int_1 = medpomnilnik % 1000 /100; // trimestna temp_int_2 = medpomnilnik % 100 /10; // dvomestna temp_int_3 = medpomnilnik % 10; // enomestno if (temp_int_0> 0) // če je rezultat četrtmestno število {Display_Dig (temp_int_0, 32, 2); // prikaz 1 števke ravni svetlobe Display_Dig (temp_int_1, 41, 2); // prikaže 2 -mestno raven svetlobe Display_Dig (temp_int_2, 50, 2); // prikaže 3 -mestno raven svetlobe Display_Dig (temp_int_3, 59, 2); // prikaže 4-mestno raven svetlobe} else {if (temp_int_1> 0) // če je rezultat tromestno število {Off_Dig (32, 2); // počisti 1 znak številke Display_Dig (temp_int_1, 41, 2); // prikaz 1 števke svetlobne ravni Display_Dig (temp_int_2, 50, 2); // prikaže 2 -mestno raven svetlobe Display_Dig (temp_int_3, 59, 2); // prikaže 3-mestno raven svetlobe} else {if (temp_int_2> 0) // če je rezultat dvomestno število {Off_Dig (32, 2); // počisti 1 znak številke Off_Dig (41, 2); // počisti 2 znaka številke Display_Dig (temp_int_2, 50, 2); // prikaz 1 števke svetlobne ravni Display_Dig (temp_int_3, 59, 2); // prikaže 2-mestno raven svetlobe} else // če je rezultat enomestno število {Off_Dig (32, 2); // počisti 1 znak številke Off_Dig (41, 2); // počisti 2 znak številke Off_Dig (50, 2); // počisti 3 znak številke Display_Dig (temp_int_3, 59, 2); // prikaz 1 števke stopnje svetlobe}}}}

// Funkcija za prikaz temperature void Read_Temp () {nepodpisan int pufer; brez podpisa int temp_int_1, temp_int_2, temp_int_3; // enomestne, dvomestne, tromestne, četrtinske števke nepodpisani znak Temp_H, Temp_L, OK_Flag, temp_flag; DS18B20_init (); // Inicializacija DS18B20 write_18b20 (0xCC); // Preverjanje kode senzorja write_18b20 (0x44); // Pretvorba začetne temperature _delay_ms (1000); // Zakasnitev pozivanja senzorja DS18B20_init (); // Inicializacija DS18B20 write_18b20 (0xCC); // Preverjanje kode senzorja write_18b20 (0xBE); // Ukaz za branje vsebine senzorja RAM Temp_L = read_18b20 (); // branje prvih dveh bajtov Temp_H = read_18b20 (); temp_flag = 1; // 1-pozitivna temperatura, 0-negativna temperatura // Pridobite negativno temperaturo, če (Temp_H & (1 << 3)) // Prijavite bit preverjanje (če je nastavljen bit-negativna temperatura) {podpisana int temp; temp_flag = 0; // zastava je nastavljena 0 - negativna temperatura temp = (Temp_H << 8) | Temp_L; temp = -temp; // Pretvorimo dodatno kodo v neposredno Temp_L = temp; Temp_H = temp >> 8; } medpomnilnik = ((Temp_H 4); temp_int_1 = medpomnilnik % 1000 /100; // trimestni temp_int_2 = medpomnilnik % 100 /10; // dvomestni temp_int_3 = medpomnilnik % 10; // enomestni

// Če je temperatura negativna, prikažite znak temperature, drugače jasno

if (temp_flag == 0) {Display_Neg (1);} else {Display_Neg (0);} if (temp_int_1> 0) // če je rezultat trimestno število {Display_Dig (temp_int_1, 45, 0); // prikaz 1 števke temperature Display_Dig (temp_int_2, 54, 0); // prikaže 2 -mestno temperaturo Display_Dig (temp_int_3, 63, 0); // prikaže 3-mestno temperaturo} else {if (temp_int_2> 0) // če je rezultat dvomestno število {Off_Dig (45, 0); // počisti 1 znak številke Display_Dig (temp_int_2, 54, 0); // prikaz 1 števke temperature Display_Dig (temp_int_3, 63, 0); // prikaže 2-mestno temperaturo} else // če je rezultat enomestno število {Off_Dig (45, 0); // počisti 1 znak številke Off_Dig (54, 0); // počisti 2 znaka številke Display_Dig (temp_int_3, 63, 0); // prikaz 1 števke temperature}}}

// Ta ISR se sproži vsakič, ko pride do ujemanja števca časovnika s primerjalno vrednostjo (vsaka 1 sekunda) ISR (TIMER1_COMPA_vect) {// Branje, prikaz temperature in ravni svetlobe Read_Temp (); Read_Lux (); }

// Funkcija za prikaz besed "TEMP" in "LUX" void Display_label () {// Beseda "TEMP" Display_SetXY (0, 0); // Nastavimo naslov položaja na zaslonu (gornja vrstica) za (int index = 0; index <105; index ++) {if (index == 40) {Display_SetXY (0, 1);} // Nastavimo naslov položaja na zaslonu (spodnja vrstica) if (index == 80) {Display_SetXY (72, 0);} // Nastavite naslov položaja na zaslonu (zgornja vrstica) if (index == 92) {Display_SetXY (72, 1); } // Nastavite naslov položaja na zaslonu (spodnja vrstica) SPDR = TEMP_1 [indeks]; // Naloži podatke matrike kod v vmesni pomnilnik zaslona while (! (SPSR & (1 << SPIF))); // Počakajte, da se prenos konča _delay_ms (10); } // Beseda "LUX" Display_SetXY (0, 2); // Nastavimo naslov položaja na zaslonu (gornja vrstica) za (int index = 0; index <60; index ++) {if (index == 30) {Display_SetXY (0, 3);} // Nastavimo naslov položaja na zaslonu (spodnja vrstica) SPDR = TEMP_2 [indeks]; // Naloži podatke matrike kod v vmesni pomnilnik zaslona while (! (SPSR & (1 << SPIF))); // Počakajte, da se prenos konča _delay_ms (10); }}

int main (void)

{Port_Init (); // Inicializacija vrat ADC_init (); // ADC Initialization SPI_Init (); // Inicializacija SPI SPI_SS_Enable (); // Omogoči prikaz DS18B20_init (); // Inicializacija DS18B20 Display_init (); // Inicializacija zaslona Display_Clear (); // Prikaz jasnega Display_label (); // Prikaz besed "TEMP" in "LUX" TIMER1_init (); // Timer1 Inicializacija. Začnite spremljati. Dobivanje parametrov vsako sekundo. // Neskončna zanka while (1) {}}

3. korak: utripanje vdelane programske opreme na mikrokrmilnik

Nalaganje datoteke HEX v pomnilnik mikrokrmilnika. Oglejte si video s podrobnim opisom zapisovanja bliskovnega pomnilnika mikrokrmilnika: zapisovanje bliskovnega pomnilnika mikrokrmilnika …

4. korak: Nadzor sklopa vezja naprave

Sklop tokokroga nadzorne naprave
Sklop tokokroga nadzorne naprave
Sklop tokokroga nadzorne naprave
Sklop tokokroga nadzorne naprave

Priključite komponente v skladu s shematskim diagramom.

Priključite napajanje in deluje!

Priporočena: