Η διασύνδεση με LED είναι το πρώτο πράγμα που θα προσπαθούσε κανείς να ξεκινήσει με κάθε μικροελεγκτή. Εδώ λοιπόν σε αυτό το σεμινάριο πρόκειται να συνδέσουμε ένα LED με 8051 μικροελεγκτή και θα γράψουμε ένα πρόγραμμα C για να αναβοσβήνει το LED. Χρησιμοποιήσαμε έναν πολύ δημοφιλή μικροελεγκτή AT89S52, της οικογένειας 8051, από την ATMEL.
Πριν προχωρήσουμε σε λεπτομέρειες, θα πρέπει να έχουμε μια σύντομη ιδέα για τον μικροελεγκτή AT89S52. Είναι μικροελεγκτής 40 ακίδων και έχει 4 θύρες (P0, P1, P2, P3), κάθε θύρα έχει 8 ακίδες. Μπορούμε να θεωρήσουμε κάθε θύρα ως καταχωρητή 8 bit, από την άποψη του λογισμικού. Κάθε ακίδα που έχει μία γραμμή εισόδου / εξόδου, σημαίνει ότι κάθε ακίδα μπορεί να χρησιμοποιηθεί τόσο για είσοδο όσο και για έξοδο, δηλαδή για ανάγνωση δεδομένων από κάποια συσκευή όπως αισθητήρα ή για την παροχή της εξόδου σε κάποια συσκευή εξόδου. Ορισμένες ακίδες έχουν τη Διπλή λειτουργικότητα, η οποία έχει αναφερθεί στην αγκύλη στο Διάγραμμα Pin παρακάτω. Διπλό λειτουργικά όπως για διακοπή, μετρητές, χρονόμετρα κ.λπ.
Το AT89S52 έχει δύο τύπους μνήμης, το πρώτο είναι η μνήμη RAM που έχει 256 Bytes μνήμης και το δεύτερο είναι το EEPROM (Ηλεκτρονικά σβήσιμο και προγραμματιζόμενη μνήμη μόνο ανάγνωσης) που έχει 8k byte μνήμης. Η μνήμη RAM χρησιμοποιείται για την αποθήκευση των δεδομένων κατά την εκτέλεση ενός προγράμματος και το EEPROM χρησιμοποιείται για την αποθήκευση του ίδιου του προγράμματος. Το EEPROM είναι η μνήμη flash στην οποία χρησιμοποιήσαμε το πρόγραμμα.
Διάγραμμα κυκλώματος και επεξήγηση
Χρησιμοποιούμε τον ακροδέκτη 1 της θύρας 1 για να συνδέσουμε το LED. Στον ενσωματωμένο προγραμματισμό C μπορούμε να έχουμε πρόσβαση στο PIN 1 της θύρας 1 χρησιμοποιώντας το P1_0. Έχουμε συνδέσει έναν κρυσταλλικό ταλαντωτή συχνότητας 11.0592MHz με τους PIN 19 και 18, δηλαδή XTAL1 και XTAL2. Ο κρυσταλλικός ταλαντωτής χρησιμοποιείται για τη δημιουργία παλμών ρολογιού και ο παλμός ρολογιού χρησιμοποιείται για να παρέχει τον μέσο όρο για τον υπολογισμό χρονισμού, ο οποίος είναι υποχρεωτικός για το συγχρονισμό όλων των συμβάντων. Αυτοί οι τύποι κρυστάλλων που χρησιμοποιούνται σε σχεδόν κάθε σύγχρονο ψηφιακό εξοπλισμό, όπως σε υπολογιστές, ρολόγια κ.λπ. Το πιο συχνά χρησιμοποιούμενο Crystal είναι χαλαζία. Είναι ένα συντονιστικό κύκλωμα ταλαντωτών και οι πυκνωτές χρησιμοποιούνται για την ταλάντωση του κρυστάλλου, οπότε έχουμε συνδέσει εδώ πυκνωτές 22pf. Μπορείτε να διαβάσετε σχετικά με "κυκλώματα συντονισμού" για να μάθετε περισσότερα.
Το διάγραμμα κυκλώματος για διασύνδεση LED με 8051 μικροελεγκτή 89S52 φαίνεται στην παραπάνω εικόνα. Ο ακροδέκτης 31 (EA) συνδέεται με Vcc, το οποίο είναι ένα ενεργό χαμηλό πείρο. Αυτό πρέπει να συνδεθεί με Vcc όταν δεν χρησιμοποιούμε καμία εξωτερική μνήμη. Ο ακροδέκτης 30 (ALE) και ο πείρος 29 (PSEN) χρησιμοποιούνται για τη σύνδεση του μικροελεγκτή στην εξωτερική μνήμη και ο ακροδέκτης 31 λέει στον μικροελεγκτή να χρησιμοποιεί εξωτερική μνήμη, όταν είναι συνδεδεμένος στο έδαφος. Δεν χρησιμοποιούμε εξωτερική μνήμη, επομένως συνδέσαμε το Pin31 με το Vcc.
Το Pin 9 (RST) είναι το PIN επαναφοράς, που χρησιμοποιείται για την επαναφορά του μικροελεγκτή και το πρόγραμμα ξεκινά ξανά από την αρχή. Επαναφέρει τον μικροελεγκτή όταν είναι συνδεδεμένος στο HIGH. Χρησιμοποιήσαμε τυπικά κυκλώματα επαναφοράς, αντίσταση 10k ohm και πυκνωτή 1uF για τη σύνδεση του πείρου RST.
Τώρα το ενδιαφέρον σημείο εδώ είναι ότι συνδέουμε το LED αντίστροφα, σημαίνει αρνητικό πόδι με PIN μικροελεγκτή, επειδή ο μικροελεγκτής δεν παρέχει αρκετή ισχύ για να ανάψει μια LED, οπότε εδώ το LED λειτουργεί με την αρνητική λογική όπως όταν, ο πείρος P1_0 είναι 1 τότε το LED θα συντονιστεί και όταν η έξοδος του πείρου είναι 0 τότε το LED θα ανάψει. Όταν η έξοδος PIN είναι 0, συμπεριφέρεται σαν γείωση και ανάβει LED.
Επεξήγηση κώδικα
Η κεφαλίδα REGX52.h έχει συμπεριληφθεί για να συμπεριλάβει τους βασικούς ορισμούς του μητρώου. Υπάρχουν πολλοί τύποι μεταβλητών και σταθερών στο ενσωματωμένο C όπως int, char, unsigned int, float κ.λπ., μπορείτε να τις μάθετε εύκολα. Εδώ χρησιμοποιούμε μη υπογεγραμμένο int του οποίου το εύρος κυμαίνεται από 0 έως 65535. Χρησιμοποιούμε το «για βρόχο» για τη δημιουργία καθυστέρησης, έτσι ώστε το LED να είναι αναμμένο για κάποιο χρονικό διάστημα (P1_0 = 0, αρνητική λογική LED) και και OFF (P1_0 = 1, αρνητική λογική LED) για καθυστερημένο χρόνο. Γενικά όταν το "for loop" τρέχει για 1275 φορές, δίνει καθυστέρηση 1ms, οπότε έχουμε δημιουργήσει τη λειτουργία 'delay' για τη δημιουργία DELAY και το ονομάσαμε από το κύριο πρόγραμμα (main ()) Μπορούμε να περάσουμε τον χρόνο καθυστέρησης (σε ms) ενώ καλούμε τη λειτουργία «καθυστέρηση» από την κύρια λειτουργία. Στο πρόγραμμα, "While (1)" σημαίνει ότι το πρόγραμμα θα εκτελείται απεριόριστα.
Εξηγώ εν συντομία, πώς 1275 φορές η εκτέλεση του βρόχου “for” δίνει καθυστέρηση 1ms:
Το 8051, 1 κύκλος μηχανών απαιτεί 12 παλμούς κρυστάλλου για εκτέλεση και έχουμε χρησιμοποιήσει κρύσταλλο 11.0592Mhz.
Έτσι απαιτείται χρόνος για 1 κύκλο μηχανής: 12 / 11.0592 = 1.085us
Έτσι 1275 * 1,085 = 1,3 ms, 1275 φορές το βρόχο "for" δίνει καθυστέρηση σχεδόν 1 ms.
Η ακριβής χρονική καθυστέρηση που παράγεται από το πρόγραμμα "C" είναι πολύ δύσκολο να υπολογιστεί, κατά τη μέτρηση από παλμογράφο (CRO), για το (j = 0; j <1275; j ++) δίνει καθυστέρηση σχεδόν 1ms.
Μπορούμε λοιπόν να καταλάβουμε απλώς διασυνδέοντας το LED με 8051 μικροελεγκτή, ότι με μια απλή κωδικοποίηση, μπορούμε να αλληλεπιδράσουμε και να ελέγξουμε το υλικό μέσω λογισμικού (προγραμματισμός) χρησιμοποιώντας μικροελεγκτή. Επίσης, μπορούμε να χειριστούμε κάθε θύρα και πείρο μικροελεγκτή μέσω προγραμματισμού.