Πίνακας περιεχομένων:

Οθόνη θερμοκρασίας και επιπέδου φωτός με οθόνη στην οθόνη NOKIA 5110: 4 βήματα
Οθόνη θερμοκρασίας και επιπέδου φωτός με οθόνη στην οθόνη NOKIA 5110: 4 βήματα

Βίντεο: Οθόνη θερμοκρασίας και επιπέδου φωτός με οθόνη στην οθόνη NOKIA 5110: 4 βήματα

Βίντεο: Οθόνη θερμοκρασίας και επιπέδου φωτός με οθόνη στην οθόνη NOKIA 5110: 4 βήματα
Βίντεο: Nokia Lumia 630 Review 2024, Ιούλιος
Anonim
Image
Image

Γεια σε όλους!

Σε αυτήν την ενότητα κατασκευάζουμε απλή ηλεκτρονική συσκευή για την παρακολούθηση της θερμοκρασίας και του επιπέδου φωτός. Οι μετρήσεις αυτών των παραμέτρων εμφανίζονται στην οθόνη LCD NOKIA 5110. Η συσκευή βασίζεται στον μικροελεγκτή AVR ATMEGA328P. Η συσκευή παρακολούθησης διαθέτει ψηφιακό θερμόμετρο DS18B20 και φωτοαντίσταση για τη μέτρηση του επιπέδου φωτός.

Βήμα 1: Περιγραφή εξαρτημάτων

Περιγραφή Συστατικά
Περιγραφή Συστατικά
Περιγραφή Συστατικά
Περιγραφή Συστατικά

Βασικά στοιχεία της συσκευής παρακολούθησης:

  • Μικροελεγκτής AVR «ATMEGA328P»
  • Μονόχρωμη γραφική οθόνη LCD «NOKIA 5110»
  • Mηφιακό θερμόμετρο 1-Wire με δυνατότητα προγραμματισμού με ανάλυση «DS18B20»
  • Αντίσταση εξαρτώμενη από το φως
  • Καλώδια

Μικροελεγκτής AVR «ATMEGA328P»

Η συσκευή παρακολούθησης χρησιμοποιεί τις ακόλουθες περιφερειακές δυνατότητες του μικροελεγκτή:

  1. Χρονοδιακόπτης/διακοπή μετρητή 16-bit
  2. ADC 8 καναλιών 10-bit
  3. Σειριακή διεπαφή Master/slave SPI

Μονόχρωμη γραφική οθόνη LCD «NOKIA 5110»

Προδιαγραφές:

  1. Οθόνη LCD 48 x 84 Dot
  2. Serial Bus Interface με μέγιστη υψηλή ταχύτητα 4 Mbits/S
  3. Εσωτερικός ελεγκτής/πρόγραμμα οδήγησης «PCD8544»
  4. LED Back-Light
  5. Λειτουργεί σε τάση 2,7-5 Volt
  6. Χαμηλή κατανάλωση ενέργειας; είναι κατάλληλο για εφαρμογές μπαταρίας
  7. Εύρος θερμοκρασίας από -25˚C έως +70˚C
  8. Είσοδος CMOS σήματος υποστήριξης

Χειρισμός της διεύθυνσης LCD (Διεύθυνση):

Η διάταξη διευθύνσεων της μνήμης που εμφανίζεται στην οθόνη LCD (DDRAM) είναι Matrix που αποτελείται από 6 σειρές (Y Address) από Y-Address 0 έως Y-Address 5 και 84 στήλες (διεύθυνση X) από X-διεύθυνση 0 έως X- Διεύθυνση 83. Εάν ο χρήστης θέλει να έχει πρόσβαση στη θέση εμφάνισης του αποτελέσματος στην οθόνη LCD, πρέπει να αναφέρεται στη σχέση μεταξύ της Διεύθυνσης Χ και της Διεύθυνσης Υ.

Τα δεδομένα που θα σταλούν στην οθόνη είναι 8 bit (1 Byte) και θα είναι διατεταγμένα ως κάθετη γραμμή. Σε αυτήν την περίπτωση, το Bit MSB θα είναι χαμηλότερο και το Bit LSB θα είναι το πάνω όπως φαίνεται στην εικόνα.

Mηφιακό θερμόμετρο 1-Wire με δυνατότητα προγραμματισμού με ανάλυση DALLAS «DS18B20»

Χαρακτηριστικά:

  1. Η μοναδική διεπαφή 1-Wire® απαιτεί μόνο μία καρφίτσα θύρας για επικοινωνία
  2. Μειώστε τον αριθμό των εξαρτημάτων με ενσωματωμένο αισθητήρα θερμοκρασίας και EEPROM
  3. Μετράει θερμοκρασίες από -55 ° C έως +125 ° C (-67 ° F έως +257 ° F)
  4. ± 0,5 ° C Ακρίβεια από -10 ° C έως +85 ° C
  5. Προγραμματιζόμενη ανάλυση από 9 bit έως 12 bit
  6. Δεν απαιτούνται εξωτερικά εξαρτήματα
  7. Η λειτουργία παρασιτικής ισχύος απαιτεί μόνο 2 ακίδες για λειτουργία (DQ και GND)
  8. Απλοποιεί τις κατανεμημένες εφαρμογές ανίχνευσης θερμοκρασίας με δυνατότητα πολλαπλών σταγόνων
  9. Κάθε συσκευή διαθέτει έναν μοναδικό σειριακό κώδικα 64-bit αποθηκευμένο σε ενσωματωμένη ROM
  10. Ευέλικτες ρυθμίσεις συναγερμού (NV) που καθορίζονται από το χρήστη με εντολή αναζήτησης συναγερμού Προσδιορίζει συσκευές με θερμοκρασίες εκτός προγραμματισμένων ορίων

Εφαρμογές:

  1. Θερμοστατικοί έλεγχοι
  2. Βιομηχανικά Συστήματα
  3. Καταναλωτικά προιόντα
  4. Θερμόμετρα
  5. Θερμικά ευαίσθητα συστήματα

Αντίσταση εξαρτώμενη από το φως

Ο φωτοεξαρτώμενος αντιστάτης (LDR) είναι ένας μορφοτροπέας που αλλάζει την αντίστασή του όταν το φως πέφτει στην επιφάνεια του αλλάζει.

Συνήθως ένα LDR θα έχει από ένα megaOhms έως δύο megaOhms στο απόλυτο σκοτάδι, από δέκα έως είκοσι kiloOms στα δέκα LUX, από δύο έως πέντε kiloohms στα 100 LUX. Η αντίσταση μεταξύ των δύο επαφών του αισθητήρα μειώνεται με την ένταση του φωτός ή αυξάνεται η αγωγιμότητα μεταξύ δύο επαφών του αισθητήρα.

Χρησιμοποιήστε το κύκλωμα διαίρεσης τάσης για να μετατρέψετε την αλλαγή αντίστασης σε αλλαγή τάσης.

Βήμα 2: Κωδικός υλικολογισμικού μικροελεγκτή

#ifndef F_CPU #define F_CPU 16000000UL // ειδοποίηση κρυστάλλινης συχνότητας ελεγκτή (16 MHz AVR ATMega328P) #endif

// SPI INTERFACE DEFINES #define MOSI 3 // MOSI it PORT B, PIN 3 #define MISO 4 // MISO it PORT B, PIN 4 #define SCK 5 // SCK it PORT B, PIN 5 #define SS 2 // SS είναι PORT B, PIN 2

// ΕΠΑΝΑΦΟΡΑ Η ΟΘΟΝΗ #define RST 0 // RESET it PORT B, PIN 0

// ΕΠΙΛΟΓΗ ΛΕΙΤΟΥΡΓΙΑΣ ΟΘΟΝΗΣ - Εισαγωγή για να επιλέξετε είτε εντολή/διεύθυνση είτε εισαγωγή δεδομένων. #define DC 1 // DC είναι PORT B, PIN 1

// πίνακας κωδικών αρνητικών σημειακών σημείων const unsigned char neg [4] = {0x30, 0x30, 0x30, 0x30};

// σειρά κωδικών ψηφίων [0..9] static const unsigned char font6x8 [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}, // 1x 0x0C, 0x8E, 0xCE, 0xE6, 0xE6, 0xBE, 0x9E, 0x0C, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 2 {0x00, 0x04, 0x06, 0x26, 0x76, 0xFE, 0xDE, 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, 0x3 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00}, // 7 {0xCC, 0xFE, 0xFE, 0x36, 0x36, 0xFE, 0xFE, 0xCC, 0x01, 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}, // κώδικες συστοιχία λέξη "TEMP:" στατική 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, 0x01, 0x03, 0x01, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0C, 0x1E, 0x33, 0x33, 0x1E, 0x0C, 0x00, 0xF8, 0xFC, 0x0C, 0x9C, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01,};

// πίνακας κωδικών της λέξης "LUX:" const unsigned char 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}

#περιλαμβάνω

#συμπεριλάβω #συμπεριλάβω

// Port Initializationvoid Port_Init () {DDRB = (1 << MOSI) | (1 << SCK] | (1 << SS] | (1 << RST) | (1 << DC], // Set MOSI, SCK, SS, RST, DC ως έξοδος, όλες οι άλλες είσοδος PORTB | = (1 << RST]; // Ορίστε τον ακροδέκτη RST ως υψηλό PORTB | = (1 << SS]; // Ορίστε τον ακροδέκτη SS ως υψηλό - Η οθόνη είναι Απενεργοποίηση DDRC = 0xFFu; // Ορίστε όλες τις ακίδες του PORTC ως έξοδο. DDRC & = ~ (1 << 0); // Κάνει την πρώτη καρφίτσα του PORTC ως είσοδο PORTC = 0x00u; // Ρυθμίστε όλες τις ακίδες του PORTC χαμηλά, ώστε να απενεργοποιηθεί. }

// ADC Initialization void ADC_init () {// Enable ADC, sampling freq = osc_freq/128 set prescaler in max value, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2] | (1 << ADPS1] | (1 << ADPS0]; ADMUX = (1 << REFS0]; // Επιλέξτε την αναφορά τάσης για το ADC // Επιλέξτε μηδενικό κανάλι από προεπιλογή χρησιμοποιώντας τον καταχωρητή ADC Multiplexer Select (ADC0). }

// Λειτουργία ανάγνωσης του αποτελέσματος της αναλογικής σε ψηφιακή μετατροπή uint16_t get_LightLevel () {_delay_ms (10); // Περιμένετε για κάποιο χρονικό διάστημα για να πάρει το κανάλι επιλεγμένο ADCSRA | = (1 << ADSC); // Ξεκινήστε τη μετατροπή ADC ρυθμίζοντας bit ADSC. γράψτε 1 στο ADSC ενώ (ADCSRA & (1 << ADSC)); // περιμένετε να ολοκληρωθεί η μετατροπή // Το ADSC γίνεται 0 ξανά μέχρι τότε, εκτελέστε συνεχώς βρόχο _delay_ms (10). επιστροφή (ADC)? // Επιστροφή του αποτελέσματος 10-bit}

// SPI Initialization void SPI_Init () {SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0]; // Ενεργοποίηση SPI, Set as Master, Set Prescaler as Fosc/16 in SPI control κανω ΕΓΓΡΑΦΗ }

// αρχικοποίηση χρονοδιακόπτη 16 bit, διακοπή και μεταβλητή κενό TIMER1_init () {// ρύθμιση χρονοδιακόπτη με prescaler = 256 και λειτουργία CTC TCCR1B | = (1 << WGM12] | (1 << CS12); // αρχικοποίηση μετρητή TCNT1 = 0; // αρχικοποίηση σύγκρισης τιμής - 1 δευτερόλεπτο OCR1A = 62500; // ενεργοποίηση σύγκρισης διακοπής TIMSK1 | = (1 << OCIE1A); // ενεργοποίηση καθολικών διακοπών sei (); }

// Display Enable void SPI_SS_Enable () {PORTB & = ~ (1 << SS); // Ενεργοποιήστε την καρφίτσα SS στη λογική 0}

// Display Disable void SPI_SS_Disable () {PORTB | = (1 << SS); // Απενεργοποιήστε την καρφίτσα SS στη λογική 1}

// Λειτουργία αποστολής δεδομένων στο buffer οθόνης void SPI_Tranceiver (ανυπόγραφα δεδομένα char) {SPDR = data; // Φορτώστε δεδομένα στο buffer ενώ (! (SPSR & (1 << SPIF))); // Περιμένετε έως ότου ολοκληρωθεί η μετάδοση}

// Επαναφορά της οθόνης στην αρχή της αρχικοποίησης void Display_Reset () {PORTB & = ~ (1 << RST); _delay_ms (100); PORTB | = (1 << RST); }

// Εντολή εγγραφής συνάρτησης void Display_Cmnd (ανυπόγραφα δεδομένα char) {PORTB & = ~ (1 << DC); // κάντε DC pin στο λογικό 0 για τη λειτουργία εντολών SPI_Tranceiver (δεδομένα). // αποστολή δεδομένων για μητρώο δεδομένων PORTB | = (1 << DC); // κάνει το DC pin στο λογικό υψηλό για τη λειτουργία δεδομένων}

// Αρχικοποίηση του Display void Display_init () {Display_Reset (); // επαναφέρετε την οθόνη Display_Cmnd (0x21). // σύνολο εντολών σε λειτουργία προσθήκης Display_Cmnd (0xC0). // ρυθμίστε την τάση στέλνοντας C0 σημαίνει VOP = 5V Display_Cmnd (0x07). // ρυθμίστε τη θερμοκρασία. συντελεστής 3 Display_Cmnd (0x13); // καθορισμένη τιμή Voltage Bias System Display_Cmnd (0x20); // σύνολο εντολών σε βασική λειτουργία Display_Cmnd (0x0C); // εμφάνιση αποτελεσμάτων σε κανονική λειτουργία}

// Διαγράψτε το κενό οθόνης Display_Clear () {PORTB | = (1 << DC); // κάνει την ακίδα DC στη λογική υψηλή για τη λειτουργία δεδομένων για (int k = 0; k <= 503; k ++) {SPI_Tranceiver (0x00);} PORTB & = ~ (1 << DC); // κάντε DC pin στη λογική μηδέν για λειτουργία εντολών}

// ρυθμίστε τη στήλη και τη σειρά στη θέση εμφάνισης του αποτελέσματος στην οθόνη LCD void Display_SetXY (χωρίς υπογραφή char x, χωρίς υπογραφή char y) {Display_Cmnd (0x80 | x); // στήλη (0-83) Display_Cmnd (0x40 | y); // σειρά (0-5)}

// Λειτουργία για την εμφάνιση αρνητικού σημείου κενό Display_Neg (χωρίς υπογραφή char neg) {Display_SetXY (41, 0); // Ορίστε τη διεύθυνση της θέσης στην οθόνη για (int index = 0; index0) {SPDR = 0x30;} // Φορτώστε δεδομένα στο buffer της οθόνης (αρνητικό πρόσημο εμφάνισης) αλλιώς {SPDR = 0x00;} // Φορτώστε δεδομένα σε το buffer της οθόνης (καθαρό αρνητικό πρόσημο) ενώ (! (SPSR & (1 << SPIF)))); // Περιμένετε έως ότου ολοκληρωθεί η μετάδοση _delay_ms (100). }}

// Λειτουργία για την εκκαθάριση του ψηφιακού σημείου κενό Off_Dig (ανυπόγραφο char x, χωρίς υπογραφή char y) {Display_SetXY (x, y); // Ορίστε τη διεύθυνση της θέσης στην οθόνη (επάνω σειρά) για (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Φορτώστε δεδομένα στο buffer της οθόνης (διαγράψτε το επάνω μέρος του ψηφιακού σημείου) y ++; Display_SetXY (x, y); // Ορίστε τη διεύθυνση της θέσης στην οθόνη (κάτω σειρά) για (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Φορτώστε δεδομένα στο buffer της οθόνης (σαφές κάτω μέρος ψηφιακής πινακίδας)}

// Λειτουργία για την εμφάνιση ψηφιακού σημείου void Display_Dig (int dig, unsigned char x, unsigned char y) {Display_SetXY (x, y); // Set the address of position on display (top row) for (int index = 0; index <16; index ++) {if (index == 8) {y ++; Display_SetXY (x, y);} // Ορίστε τη διεύθυνση της θέσης στην οθόνη (κάτω σειρά) SPI_Tranceiver (font6x8 [dig] [index]); // Φόρτωση σειράς κωδικών δεδομένων ψηφίων στο buffer της οθόνης _delay_ms (10). }}

// Αρχικοποίηση DS18B20 ανυπόγραφου χαρακτήρα DS18B20_init () {DDRD | = (1 << 2]; // Ορίστε το PD2 pin του PORTD ως έξοδο PORTD & = ~ (1 << 2); // Ορίστε τον ακροδέκτη PD2 ως χαμηλό _delay_us (490); // Χρόνος έναρξης DDRD & = ~ (1 << 2); // Ορίστε το PD2 pin του PORTD ως είσοδο _delay_us (68). // Χρονισμός OK_Flag = (PIND & (1 << 2)); // Λήψη παλμού αισθητήρα _delay_us (422); επιστροφή OK_Flag. // ο αισθητήρας επιστροφής 0-ok είναι βύσμα, ο αισθητήρας 1 σφάλματος αποσυνδέεται}

// Λειτουργία ανάγνωσης byte από DS18B20 unsigned char read_18b20 () {unsigned char i, data = 0; για (i = 0; i <8; i ++) {DDRD | = (1 << 2]; // Ορίστε το PD2 pin του PORTD ως έξοδο _delay_us (2). // Χρονισμός DDRD & = ~ (1 1; // Επόμενο bit αν (PIND & (1 << 2)) δεδομένα | = 0x80; // βάλτε bit σε byte _delay_us (62);} επιστροφή δεδομένων;}

// Λειτουργία εγγραφής byte στο DS18B20 void write_18b20 (ανυπόγραφα δεδομένα char) {unsigned char i; για (i = 0; i <8; i ++) {DDRD | = (1 << 2]; // Ορίστε το PD2 pin του PORTD ως έξοδο _delay_us (2). // Χρονισμός εάν (δεδομένα & 0x01) DDRD & = ~ (1 << 2); // αν θέλουμε να γράψουμε 1, απελευθερώστε τη γραμμή αλλιώς DDRD | = (1 1; // Επόμενο bit _delay_us (62); // Timing DDRD & = ~ (1 << 2); // Ρύθμιση PD2 pin του PORTD ως είσοδος _delay_us (2);}}

// Λειτουργία για την εμφάνιση επιπέδου φωτός void Read_Lux () {uint16_t buffer; χωρίς υπογραφή int temp_int_1, temp_int_2, temp_int_3, temp_int_0; // μονοψήφια, διψήφια, τριψήφια, τετραψήφια buffer = get_LightLevel (); // διαβάστε το αποτέλεσμα του αναλογικού σε ψηφιακό επίπεδο μετατροπής φωτός temp_int_0 = buffer % 10000 /1000; // τετραψήφιο temp_int_1 = buffer % 1000 /100; // τριψήφιο temp_int_2 = buffer % 100 /10; // διψήφιο temp_int_3 = buffer % 10; // μονοψήφιο if (temp_int_0> 0) // αν το αποτέλεσμα είναι τετραψήφιος αριθμός {Display_Dig (temp_int_0, 32, 2); // εμφάνιση 1 ψηφίου επιπέδου φωτός Display_Dig (temp_int_1, 41, 2). // εμφάνιση 2 ψηφίων επιπέδου φωτός Display_Dig (temp_int_2, 50, 2). // εμφάνιση 3 ψηφίων επιπέδου φωτός Display_Dig (temp_int_3, 59, 2). // εμφάνιση 4 ψηφίων φωτεινής στάθμης} else {if (temp_int_1> 0) // εάν το αποτέλεσμα είναι τριψήφιος αριθμός {Off_Dig (32, 2). // διαγραφή 1 σημείου αριθμού Display_Dig (temp_int_1, 41, 2). // εμφάνιση 1 ψηφίου επιπέδου φωτός Display_Dig (temp_int_2, 50, 2). // εμφάνιση 2 ψηφίων επιπέδου φωτός Display_Dig (temp_int_3, 59, 2). // εμφάνιση 3 ψηφίων φωτεινής στάθμης} else {if (temp_int_2> 0) // εάν το αποτέλεσμα είναι διψήφιος αριθμός {Off_Dig (32, 2). // διαγραφή 1 σημείου αριθμού Off_Dig (41, 2). // διαγραφή 2 του αριθμού Display_Dig (temp_int_2, 50, 2). // εμφάνιση 1 ψηφίου επιπέδου φωτός Display_Dig (temp_int_3, 59, 2). // εμφάνιση 2 ψηφίων επιπέδου φωτός} else // εάν το αποτέλεσμα είναι μονοψήφιος αριθμός {Off_Dig (32, 2). // διαγραφή 1 σημείου αριθμού Off_Dig (41, 2). // διαγραφή 2 σημείου αριθμού Off_Dig (50, 2). // διαγραφή 3 του αριθμού Display_Dig (temp_int_3, 59, 2). // εμφάνιση 1 ψηφίου επιπέδου φωτός}}}}

// Λειτουργία για εμφάνιση θερμοκρασίας void Read_Temp () {unsigned int buffer; χωρίς υπογραφή int temp_int_1, temp_int_2, temp_int_3; // μονοψήφια, διψήφια, τριψήφια, τέταρτα ψηφία χωρίς υπογραφή char Temp_H, Temp_L, OK_Flag, temp_flag; DS18B20_init (); // Αρχικοποίηση του DS18B20 write_18b20 (0xCC); // Έλεγχος κωδικού αισθητήρα write_18b20 (0x44); // Έναρξη μετατροπής θερμοκρασίας _delay_ms (1000); // Καθυστέρηση ψηφοφορίας αισθητήρα DS18B20_init (); // Αρχικοποίηση του DS18B20 write_18b20 (0xCC); // Έλεγχος κωδικού αισθητήρα write_18b20 (0xBE); // Εντολή ανάγνωσης των περιεχομένων του αισθητήρα RAM Temp_L = read_18b20 (); // Διαβάστε τα πρώτα δύο byte Temp_H = read_18b20 (); temp_flag = 1; // 1-θετική θερμοκρασία, 0-αρνητική θερμοκρασία // Λάβετε αρνητική θερμοκρασία εάν (Temp_H & (1 << 3)) // Sign Bit Check (εάν το bit έχει οριστεί-αρνητική θερμοκρασία) {sign int temp; temp_flag = 0; // η σημαία έχει οριστεί 0 - αρνητική θερμοκρασία temp = (Temp_H << 8) | Temp_L; temp = -temp; // Μετατροπή του πρόσθετου κώδικα σε άμεσο Temp_L = temp; Temp_H = temp >> 8; } buffer = ((Temp_H 4); temp_int_1 = buffer % 1000 /100; // τριψήφιο temp_int_2 = buffer % 100 /10; // διψήφιο temp_int_3 = buffer % 10; // μονοψήφιο

// Εάν η θερμοκρασία είναι αρνητική ένδειξη ένδειξης θερμοκρασίας, αλλιώς διαυγής

εάν (temp_flag == 0) {Display_Neg (1);} else {Display_Neg (0);} if (temp_int_1> 0) // αν το αποτέλεσμα είναι τριψήφιος αριθμός {Display_Dig (temp_int_1, 45, 0)? // εμφάνιση 1 ψηφίου θερμοκρασίας Display_Dig (temp_int_2, 54, 0). // εμφάνιση 2 ψηφίων θερμοκρασίας Display_Dig (temp_int_3, 63, 0). // εμφάνιση 3 ψηφίων θερμοκρασίας} else {if (temp_int_2> 0) // εάν το αποτέλεσμα είναι διψήφιος αριθμός {Off_Dig (45, 0). // διαγραφή 1 σημείου αριθμού Display_Dig (temp_int_2, 54, 0). // εμφάνιση 1 ψηφίου θερμοκρασίας Display_Dig (temp_int_3, 63, 0). // εμφάνιση 2 ψηφίων θερμοκρασίας} else // εάν το αποτέλεσμα είναι μονοψήφιος αριθμός {Off_Dig (45, 0). // διαγραφή 1 σημείου αριθμού Off_Dig (54, 0). // διαγραφή 2 του αριθμού Display_Dig (temp_int_3, 63, 0). // εμφάνιση 1 ψηφίου θερμοκρασίας}}}

// Αυτό το ISR ενεργοποιείται κάθε φορά που εμφανίζεται αντιστοιχία χρονομέτρου με τιμή σύγκρισης (κάθε 1 δευτερόλεπτο) ISR (TIMER1_COMPA_vect) {// Ανάγνωση, εμφάνιση θερμοκρασίας και επιπέδου φωτός Read_Temp (). Read_Lux (); }

// Λειτουργία για την εμφάνιση λέξεων "TEMP" και "LUX" void Display_label () {// Word "TEMP" Display_SetXY (0, 0); // Ορίστε τη διεύθυνση της θέσης στην οθόνη (επάνω σειρά) για (int index = 0; index <105; index ++) {if (index == 40) {Display_SetXY (0, 1);} // Ορίστε τη διεύθυνση της θέσης στην οθόνη (κάτω σειρά) εάν (index == 80) {Display_SetXY (72, 0);} // Ορίστε τη διεύθυνση της θέσης στην οθόνη (επάνω σειρά) εάν (index == 92) {Display_SetXY (72, 1); } // Ορίστε τη διεύθυνση της θέσης στην οθόνη (κάτω σειρά) SPDR = TEMP_1 [index]; // Φόρτωση κωδικών δεδομένων πίνακα στο buffer της οθόνης ενώ (! (SPSR & (1 << SPIF)))); // Περιμένετε έως ότου ολοκληρωθεί η μετάδοση _delay_ms (10). } // Λέξη "LUX" Display_SetXY (0, 2); // Ορίστε τη διεύθυνση της θέσης στην οθόνη (επάνω σειρά) για (int index = 0; index <60; index ++) {if (index == 30) {Display_SetXY (0, 3);} // Ορίστε τη διεύθυνση της θέσης στην οθόνη (κάτω σειρά) SPDR = TEMP_2 [index]; // Φόρτωση κωδικών δεδομένων πίνακα στο buffer της οθόνης ενώ (! (SPSR & (1 << SPIF)))); // Περιμένετε έως ότου ολοκληρωθεί η μετάδοση _delay_ms (10). }}

int main (άκυρο)

{Port_Init (); // Port Initialization ADC_init (); // ADC Initialization SPI_Init (); // SPI Initialization SPI_SS_Enable (); // Display Enable DS18B20_init (); // Αρχικοποίηση του DS18B20 Display_init (); // Αρχικοποίηση οθόνης Display_Clear (); // Εμφάνιση σαφής Display_label (); // Εμφάνιση λέξεων "TEMP" και "LUX" TIMER1_init (); // Χρονοδιακόπτης 1 Αρχικοποίηση. Ξεκινήστε την παρακολούθηση. Λήψη παραμέτρων κάθε ένα δευτερόλεπτο. // Βρόχος άπειρου ενώ (1) {}}

Βήμα 3: Αναβοσβήνει το υλικολογισμικό στον μικροελεγκτή

Μεταφόρτωση αρχείου HEX στη μνήμη flash του μικροελεγκτή. Δείτε το βίντεο με μια λεπτομερή περιγραφή της καύσης μνήμης flash του μικροελεγκτή: Κάψιμο μνήμης flash μικροελεγκτή…

Βήμα 4: Παρακολούθηση συναρμολόγησης κυκλώματος συσκευής

Συνέλευση κυκλώματος συσκευής παρακολούθησης
Συνέλευση κυκλώματος συσκευής παρακολούθησης
Συνέλευση κυκλώματος συσκευής παρακολούθησης
Συνέλευση κυκλώματος συσκευής παρακολούθησης

Συνδέστε εξαρτήματα σύμφωνα με το σχηματικό διάγραμμα.

Συνδέστε το ρεύμα και λειτουργεί!

Συνιστάται: