Σε αυτό το έργο, θα δείξουμε την κατασκευή ενός ρολογιού RTC χρησιμοποιώντας 8051 μικροελεγκτή. Εάν θέλετε να κάνετε αυτό το έργο με το Arduino, ελέγξτε αυτό το ψηφιακό ρολόι χρησιμοποιώντας το Arduino. Το κύριο συστατικό αυτού του έργου είναι το DS1307, το οποίο είναι ένα ψηφιακό ρολόι σε πραγματικό χρόνο. Ενημερωθείτε για αυτό το IC λεπτομερώς.
RTC DS1307:
Το σειριακό ρολόι σε πραγματικό χρόνο (RTC) DS1307 είναι ένα ρολόι / ημερολόγιο χαμηλής ισχύος, πλήρες δεκαδικό δεκαδικό (BCD) συν 56 bytes NV SRAM. Αυτό το τσιπ λειτουργεί σε πρωτόκολλο I²C. Το ρολόι / ημερολόγιο παρέχει πληροφορίες για δευτερόλεπτα, λεπτά, ώρες, ημέρα, ημερομηνία, μήνα και έτος. Το τέλος της ημερομηνίας του μήνα προσαρμόζεται αυτόματα για μήνες με λιγότερες από 31 ημέρες, συμπεριλαμβανομένων των διορθώσεων για το έτος άλματος. Το ρολόι λειτουργεί είτε σε 24ωρη είτε σε 12ωρη μορφή με ένδειξη AM / PM. Το DS1307 διαθέτει ενσωματωμένο κύκλωμα αίσθησης ισχύος που ανιχνεύει βλάβες ρεύματος και μεταβαίνει αυτόματα στην εφεδρική τροφοδοσία. Η λειτουργία χρονομέτρησης συνεχίζεται ενώ το τμήμα λειτουργεί από την εφεδρική τροφοδοσία. Το τσιπ DS1307 μπορεί να λειτουργεί συνεχώς έως και 10 χρόνια.
Το ρολόι πραγματικού χρόνου που βασίζεται σε 8051 είναι ένα ψηφιακό ρολόι για εμφάνιση σε πραγματικό χρόνο χρησιμοποιώντας ένα RTC DS1307, το οποίο λειτουργεί σε πρωτόκολλο I2C. Το ρολόι σε πραγματικό χρόνο σημαίνει ότι λειτουργεί ακόμη και μετά από διακοπή ρεύματος. Όταν επανασυνδεθεί η τροφοδοσία, εμφανίζει τον πραγματικό χρόνο ανεξάρτητα από το χρόνο και τη διάρκεια που ήταν σε κατάσταση απενεργοποίησης. Σε αυτό το έργο χρησιμοποιήσαμε μια μονάδα LCD 16x2 για να εμφανίσουμε τη μορφή - (ώρα, λεπτό, δευτερόλεπτα, ημερομηνία, μήνα και έτος). Τα ρολόγια σε πραγματικό χρόνο χρησιμοποιούνται συνήθως στους υπολογιστές, τα σπίτια, τα γραφεία και την ηλεκτρονική μας συσκευή για να τα ενημερώνουμε σε πραγματικό χρόνο.
Το πρωτόκολλο I2C είναι μια μέθοδος σύνδεσης δύο ή περισσότερων συσκευών που χρησιμοποιούν δύο καλώδια σε ένα μόνο σύστημα, και έτσι αυτό το πρωτόκολλο ονομάζεται επίσης ως πρωτόκολλο δύο καλωδίων. Μπορεί να χρησιμοποιηθεί για την επικοινωνία 127 συσκευών σε μία μόνο συσκευή ή επεξεργαστή. Οι περισσότερες συσκευές I2C λειτουργούν με συχνότητα 100Khz.
Βήματα για δεδομένα εγγραφής master σε slave (λειτουργία λήψης σκλάβων)
- Στέλνει την κατάσταση START στο slave.
- Στέλνει διεύθυνση σκλάβου σε σκλάβο.
- Αποστολή bit εγγραφής (0) στο slave.
- Λάβαμε bit ACK από το slave
- Στέλνει διευθύνσεις λέξεων σε σκλάβους.
- Λάβαμε bit ACK από το slave
- Στέλνει δεδομένα σε σκλάβους.
- Λάβαμε bit ACK από το slave.
- Και τελευταία στέλνει την κατάσταση STOP στον σκλάβος.
Βήματα για ανάγνωση δεδομένων από slave σε master (λειτουργία μετάδοσης slave)
- Στέλνει την κατάσταση START στο slave.
- Στέλνει διεύθυνση σκλάβου σε σκλάβο.
- Στείλτε το bit ανάγνωσης (1) στο slave.
- Λάβαμε bit ACK από το slave
- Λάβαμε δεδομένα από σκλάβος
- Λάβαμε bit ACK από το slave.
- Στέλνει συνθήκη STOP σε σκλάβος.
Διάγραμμα κυκλώματος και περιγραφή
Στο κύκλωμα χρησιμοποιήσαμε 3 περισσότερα εξαρτήματα DS1307, AT89S52 και LCD. Εδώ το AT89S52 χρησιμοποιείται για χρόνο ανάγνωσης από το DS1307 και το εμφανίζει σε οθόνη LCD 16x2 Το DS1307 στέλνει ώρα / ημερομηνία χρησιμοποιώντας 2 γραμμές στον μικροελεγκτή.
Οι συνδέσεις κυκλωμάτων είναι απλές στην κατανόηση και φαίνονται στο παραπάνω διάγραμμα. Οι ακροδέκτες DS1307 SDA και SCL συνδέονται σε ακροδέκτες P2.1 και P2.0 μικροελεγκτή 89S52 με αντίσταση έλξης που κρατά την προεπιλεγμένη τιμή ΥΨΗΛΗ σε γραμμές δεδομένων και ρολογιού. Και ένας ταλαντωτής κρυστάλλου 32.768KHz συνδέεται με το τσιπ DS1307 για παραγωγή καθυστέρησης 1 δευτερολέπτου. Και μια μπαταρία 3 volt συνδέεται επίσης με τον ακροδέκτη 3 rd (BAT) του DS1307 που διατηρεί το χρόνο λειτουργίας μετά από διακοπή ρεύματος Η οθόνη LCD 16x2 συνδέεται με 8051 σε λειτουργία 4-bit. Οι πείροι ελέγχου RS, RW και En συνδέονται απευθείας με τον πείρο 89S52 P1.0, GND και P1.1. Και ο ακροδέκτης δεδομένων D0-D7 συνδέεται με το P1.4-P1.7 του 89S52.
Τρία κουμπιά, δηλαδή SET, INC / CHANGE και Next, χρησιμοποιούνται για τη ρύθμιση του χρόνου ρολογιού στις καρφίτσες P2.4, P2.3 και P2.2 του 89S52 (ενεργό χαμηλό). Όταν πατάμε SET, ενεργοποιείται η λειτουργία καθορισμένης ώρας και τώρα πρέπει να ορίσουμε χρόνο χρησιμοποιώντας το κουμπί INC / CHANGE και το κουμπί Next χρησιμοποιείται για τη μετάβαση σε ψηφία. Μετά τη ρύθμιση, το ρολόι τρέχει συνεχώς.
Περιγραφή προγράμματος
Στον κώδικα έχουμε συμπεριλάβει 8051 οικογενειακή βιβλιοθήκη και μια τυπική βιβλιοθήκη εξόδου εισόδου. Και ορίσαμε καρφίτσες που έχουμε χρησιμοποιήσει και έχουμε λάβει κάποια μεταβλητή για υπολογισμούς.
#περιλαμβάνω
Και η δεδομένη λειτουργία χρησιμοποιείται για την οδήγηση LCD.
άκυρο daten () {rs = 1; en = 1; καθυστέρηση (1) en = 0; } άκυρο lcddata (χωρίς υπογραφή char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } άκυρο cmden (άκυρο) {rs = 0; en = 1; καθυστέρηση (1) en = 0; } άκυρο lcdcmd (χωρίς υπογραφή char ch)
Αυτή η λειτουργία χρησιμοποιείται για την προετοιμασία του RTC και για ανάγνωση της ώρας και της ημερομηνίας από τη φόρμα RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); ώρα = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); ημερομηνία = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); έτος = BCDToDecimal (I2CRead (1)); I2CStop (); show_time (); // εμφάνιση χρόνου / ημερομηνία / ημέρα καθυστέρηση
Αυτές οι λειτουργίες χρησιμοποιούνται για τη μετατροπή δεκαδικών σε BCD και BCD σε δεκαδικά.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; επιστροφή Δεκ; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((δεκαδικό byte / 10) << 4); b = (δεκαδικόByte% 10); bcd = αβ; επιστροφή bcd; }
Οι παρακάτω λειτουργίες χρησιμοποιούνται για την επικοινωνία I2C.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" για επικοινωνία με ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // Λειτουργία "διακοπής" για επικοινωνία με ds1307 RTC χωρίς υπογραφή char I2CSend (unsigned char Data) // αποστολή δεδομένων σε ds1307 {char i; char ack_bit; για (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; αλλιώς SDA = 0; SCL = 1; Δεδομένα << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; επιστροφή ack_bit; } χωρίς υπογραφή char I2CRead (char ack) // λήψη δεδομένων από ds1307 {unsigned char i, Data = 0; SDA = 1; για (i = 0; i <8; i ++) {Δεδομένα << = 1; κάνετε {SCL = 1;} ενώ (SCL == 0); εάν (SDA) Δεδομένα- = 1; SCL = 0; } εάν (ack) SDA = 0; αλλιώς SDA = 1; SCL = 1; SCL = 0; SDA = 1; Επιστροφή δεδομένων; }
Η συνάρτηση set_time χρησιμοποιείται για να ρυθμίσει την ώρα σε ρολόι και η λειτουργία show_time παρακάτω χρησιμοποιείται για την εμφάνιση χρόνου σε LCD
void show_time () // λειτουργία για εμφάνιση ώρας / ημερομηνίας / ημέρας στην οθόνη LCD {char var; lcdcmd (0x80); lcdprint ("Ημερομηνία:"); sprintf (var, "% d", ημερομηνία); lcdprint (var); sprintf (var, "/% d", μον); lcdprint (var); sprintf (var, "/% d", έτος + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Ώρα:"); sprintf (var, "% d", ώρα); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", δευτ.); lcdprint (var); lcdprint (""); // ημέρα (ημέρα 1); lcdprint (""); }