τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Οι αναρτήσεις ιστολογίου που γράφτηκαν από άλλους bloggers του CSDN είναι αρκετά καλές Αν θέλετε να μάθετε για τη σειριακή θύρα UART μικροελεγκτή 51, μπορείτε να κάνετε κλικ και να ρίξετε μια ματιά:
Ασύγχρονη επικοινωνίαΣημαίνει ότι το χρονικό διάστημα μεταξύ δύο χαρακτήρων (8 bit) στην επικοινωνία δεν είναι σταθερό, αλλά το χρονικό διάστημα μεταξύ bit εντός ενός χαρακτήρα είναισταθερός。
Η σειριακή επικοινωνία UART είναι η πιο συχνά χρησιμοποιούμενη τεχνολογία επικοινωνίας για μικροελεγκτές Χρησιμοποιείται συνήθως για επικοινωνία μεταξύ μικροελεγκτών και υπολογιστών και μεταξύ μικροελεγκτών.
Η επικοινωνία μπορεί να χωριστεί σε βασικούς τύπουςΠαράλληλη επικοινωνίακαισειριακή επικοινωνία, Στην παράλληλη επικοινωνία, κάθε bit δεδομένων μεταδίδεται ταυτόχρονα και η επικοινωνία μπορεί να πραγματοποιηθεί σε byte, ωστόσο, πολλές γραμμές επικοινωνίας καταλαμβάνουν πολλούς πόρους και είναι δαπανηρές. Για παράδειγμα, P0 = 0xFF που χρησιμοποιήθηκε πριν, εκχωρήστε τιμές στις 8 θύρες IO του P0 ταυτόχρονα και σήματα εξόδου ταυτόχρονα, παρόμοια με 8 λωρίδες που μπορούν να περάσουν 8 αυτοκίνητα ταυτόχρονα. Αυτή η φόρμα είναι παράλληλη Συνηθίζεται να καλούμε P0, P1, P2 και P3 τα τέσσερα σετ παράλληλων διαύλων του μικροελεγκτή 51.
Η σειριακή επικοινωνία είναι σαν μια λωρίδα, μόνο ένα αυτοκίνητο μπορεί να περάσει τη φορά.Εάν πρόκειται να μεταδοθεί ένα byte δεδομένων όπως το 0xFF, υποθέτοντας ότι ένα αυτοκίνητο τραβάει δεδομένα 1 bit, τότε θα απαιτηθούν περισσότερα από 8 αυτοκίνητα.ίδιο χρονικό διάστημαΔιασχίστε την ίδια λωρίδα με τη σειρά σας.
Η διαφορά μεταξύ της σύγχρονης επικοινωνίας και της ασύγχρονης επικοινωνίας:
1. Η σύγχρονη επικοινωνία απαιτεί η συχνότητα ρολογιού του τέλους λήψης να είναι συνεπής με τη συχνότητα ρολογιού του άκρου αποστολής και το άκρο αποστολής στέλνει μια συνεχή ροή bit. Η ασύγχρονη επικοινωνία δεν απαιτεί συγχρονισμό του ρολογιού τέλους λήψης και του ρολογιού τέλους αποστολής Αφού το τέλος αποστολής στείλει ένα byte, μπορεί να περάσει από οποιοδήποτε μεγάλο χρονικό διάστημα πριν από την αποστολή του επόμενου byte.
2. Η σύγχρονη επικοινωνία έχει υψηλή απόδοση, ενώ η ασύγχρονη έχει χαμηλή απόδοση.
3. Η σύγχρονη επικοινωνία είναι πιο περίπλοκη και το επιτρεπόμενο σφάλμα των ρολογιών και των δύο μερών είναι μικρό, η ασύγχρονη επικοινωνία είναι απλή και τα ρολόγια και των δύο μερών μπορούν να επιτρέψουν ένα συγκεκριμένο σφάλμα.
4. Η σύγχρονη επικοινωνία είναι κατάλληλη μόνο για σημείο σε πολλαπλό σημείο και η ασύγχρονη επικοινωνία μπορεί να χρησιμοποιηθεί για σημείο σε σημείο.
Ο μικροελεγκτής STC89C52 έχει δύο ακροδέκτες που χρησιμοποιούνται ειδικά για σειριακή επικοινωνία, ο ένας είναι P3^0 και ο άλλος είναι P3^1. Έχουν επίσης άλλα ονόματα που ονομάζονται RXD (Λήψη δεδομένων) και TXD (Δεδομένα μετάδοσης) αντίστοιχα ονομάζονται σειριακή διεπαφή. Όπως φαίνεται στην εικόνα:
Επικοινωνία μεταξύ μικροελεγκτή και μικροελεγκτή:
Στο σχήμα, το GND αντιπροσωπεύει τη γείωση αναφοράς του τροφοδοτικού του συστήματος μικροελεγκτή. Το TXD ονομάζεται ακροδέκτης σειριακής μετάδοσης και το RXD είναι ο ακροδέκτης σειριακής λήψης.
Για την επικοινωνία μεταξύ δύο μικροελεγκτών, πρώτα από όλα, η αναφορά τροφοδοσίας πρέπει να είναι η ίδια, επομένως τα GND των δύο μικροελεγκτών πρέπει να συνδέονται μεταξύ τους.Στη συνέχεια, ο ακροδέκτης TXD του MCU 1 συνδέεται με τον ακροδέκτη RXD του MCU 2. Η λειτουργία είναι ότι το MCU 1 στέλνει πληροφορίες στο MCU 2. (Αυτή η διαδικασία χωρίζεται σε δύο μέρη. MCU 1'sαποστολή σήματοςΔιαδικασία με μικροελεγκτή 2λήψη σήματοςΔιαδικασία) Με τον ίδιο τρόπο, η ακίδα TXD του μικροελεγκτή 2 συνδέεται με την ακίδα RXD του μικροελεγκτή 1.
Αυτό το σχηματικό διάγραμμα αντικατοπτρίζει τη διαδικασία δύο μικροελεγκτών που στέλνουν και λαμβάνουν πληροφορίες ο ένας στον άλλο.
Όταν ο μικροελεγκτής 1 θέλει να στείλει δεδομένα στον μικροελεγκτή 2, για παράδειγμα, στέλνοντας 1 δεδομένα 0xE4, εκφρασμένα σε δυαδική μορφή:
0b1110 0100, ο μικροελεγκτής 1 αντιμετωπίζει αρκετά προβλήματα πριν ξεκινήσει η μετάδοση:
Ας υποθέσουμε ότι εκπέμπω πρώτα το χαμηλότερο bit του 0 και μετά πρέπει να ρυθμίσω τη θύρα TXD του μικροελεγκτή 1 σε χαμηλό επίπεδο.
Οι μικροελεγκτές είναι γενικά επίπεδο TTL ή CMOS Για πρότυπα επιπέδου TTL/CMOS:
Οτιδήποτε μεγαλύτερο από 2,0 βολτ είναι υψηλό επίπεδο, κάτι μικρότερο από 0,0 βολτ είναι χαμηλό επίπεδο και οτιδήποτε ενδιάμεσα δεν είναι ούτε υψηλό επίπεδο ούτε χαμηλό επίπεδο υψηλό επίπεδο, μπορεί επίσης να κριθεί ως χαμηλό επίπεδο. Επομένως, προσπαθήστε να μην λειτουργήσετε το κύκλωμα σε αυτήν την περιοχή. Το να βρίσκεστε σε αυτή τη ζώνη μπορεί να κάνει το προϊόν σας να χτυπήσει ή να χάσει. Επομένως, κατά την ανάπτυξη προϊόντων, πρέπει να ελέγξετε το φύλλο δεδομένων της συσκευής και την τάση κατά τη λειτουργία του κυκλώματος για να βεβαιωθείτε ότι βρίσκεται σε κατάλληλη τάση.
1. Επίπεδο TTL:
Υψηλό επίπεδο εξόδου >2,4V, χαμηλό επίπεδο εξόδου <0,4V. Σε θερμοκρασία δωματίου, το γενικό υψηλό επίπεδο εξόδου είναι 3,5 V και το χαμηλό επίπεδο εξόδου είναι 0,2 V. Ελάχιστη στάθμη εισόδου υψηλής και χαμηλής στάθμης: υψηλή στάθμη εισόδου >=2,0V, χαμηλή στάθμη εισόδου <=0,8V, περιθώριο θορύβου είναι 0,4V.
2. Επίπεδο CMOS:
1επίπεδο λογικής Η τάση είναι κοντά στην τάση τροφοδοσίας και το λογικό επίπεδο 0 είναι κοντά στο 0V. Και έχει μεγάλη ανοχή θορύβου.
Ιδού λοιπόν το ερώτημα:
Όταν οι πληροφορίες δεν μεταδίδονται ή λαμβάνονται, η θύρα μετάδοσης (TXD) του μικροελεγκτή 1 θα βρίσκεται σε υψηλό ή χαμηλό επίπεδο ή η τάση της θύρας βρίσκεται μεταξύ αυτών. Η τάση θύρας λήψης (RXD) του MCU 2 ακολουθεί την τάση της θύρας μετάδοσης του MCU 1. Πώς να ρυθμίσετε το σήμα ότι το MCU 1 πρόκειται να αρχίσει να μεταδίδει πληροφορίες, δηλαδή πώς το MCU 2 γνωρίζει ότι το MCU 1 έχει μεταδώσει πληροφορίες σε αυτό; Επομένως, υπάρχει ανάγκη τυποποίησης των προτύπων επικοινωνίας.
Βήμα 1: Προβλέπεται ότι όταν δεν υπάρχει επικοινωνία, η τάση των θυρών TXD και RXD του μικροελεγκτή παραμένει υψηλή.
Βήμα 2: Τυποποιήστε τη μέθοδο μετάδοσης δεδομένων όπως φαίνεται παρακάτω
Μπορείτε να δείτε ότι ορίζει 1 bit έναρξης, 1 bit διακοπής, συν 1 byte δεδομένων προς μετάδοση, που είναι συνολικά 8 bit.Δεκαψήφια δεδομένα。
Η προαναφερθείσα μετάδοση δεδομένων 0xE4 μεταδίδει στην πραγματικότητα 0 1110 0100 1. Η μετάδοση 1 byte δεδομένων από το MCU 1 στο MCU 2 μεταδίδει πραγματικά δεδομένα 10 bit.
Με το bit έναρξης και το bit διακοπής, η θύρα RXD του μικροελεγκτή 2 αρχίζει να προετοιμάζεται για λήψη δεδομένων όταν ανιχνεύσει χαμηλό επίπεδο. Με τον ίδιο τρόπο, εάν ο μικροελεγκτής 1 θέλει να στείλει 1 byte δεδομένων, πρέπει πρώτα να στείλει ένα bit έναρξης 0 (πείτε στον μικροελεγκτή 2 να τον προετοιμάσει για λήψη) και μετά να στείλει ένα bit διακοπής 1 (πείτε στον μικροελεγκτή 2 a Byte of ολοκληρώθηκε η μεταφορά δεδομένων).Και κατά τη μετάδοση δεδομένων, είναιΠρώτα χαμηλά, μετά ψηλάΣειρά
Βήμα 3: Πρέπει να ρυθμίσετε ομοιόμορφα τον χρόνο που απαιτείται για τη μετάδοση 1 bit δεδομένων Η ταχύτητα αυτού του χρόνου εκφράζεται από τον ρυθμό baud (baud). Ένας ρυθμός baud 1 σημαίνει μετάδοση 1 bit δεδομένων σε 1 δευτερόλεπτο και ένας ρυθμός baud 9600 σημαίνει μετάδοση 9600 bit δεδομένων σε 1 δευτερόλεπτο.
Τότε παίρνουμε το αποτέλεσμα της μετάδοσης 1 bitδιάρκεια=1/baud., τότε μπορεί να βρεθεί ο χρόνος μετάδοσης 1 πλήρους πλαισίου δεδομένων10/baud,Το χρονικό διάστημα μεταξύ των πλαισίων δεδομένων είναι αυθαίρετο.
Όταν τα MCU 1 και MCU 2 εκπέμπουν σήματα, οι ρυθμοί baud τους πρέπει να ρυθμιστούν ώστε να είναι συνεπείς για να επιτευχθεί σωστή επικοινωνία.
Στα πρώτα χρόνια των επιτραπέζιων υπολογιστών, υπήρχε συνήθως μια σειριακή διεπαφή 9 ακίδων. Έτσι, η επικοινωνία με μικροελεγκτές τείνει όλο και περισσότερο να χρησιμοποιεί εικονικές σειριακές θύρες USB.
Η λογική επιπέδου που χρησιμοποιείται από το RS232 είναι αρνητική λογική, η οποία είναι διαφορετική από τα λογικά επίπεδα TTL/CMOS.
Επομένως, η σειριακή θύρα RS232 9 ακίδων του υπολογιστή δεν μπορεί να συνδεθεί απευθείας στον μικροελεγκτή Απαιτείται τσιπ μετατροπής επιπέδου MAX232 για να συμπληρωθεί το ακόλουθο σχήμα:
Περιγραφή pin RS232:
1. Ανίχνευση φορέα DCD (Data Carrier detection) 2. Λήψη δεδομένων RXD 3. Αποστολή δεδομένων TXD
4. Το τερματικό δεδομένων είναι έτοιμο για DTR (Έτοιμο το τερματικό δεδομένων) 5. Γείωση σήματος 6. Έτοιμο δεδομένων DSR(Το σύνολο δεδομένων είναι έτοιμο)
7. Αίτημα αποστολής RTS (Αίτημα αποστολής) 8. Εκκαθάριση και αποστολή CTS(Εκκαθάριση για αποστολή) 9. Κουδούνισμα προτροπής RI (Κουδούνισμα)
Όπως φαίνεται στο παραπάνω σχήμα, στην καλωδίωση σειριακής θύρας του RS232, η επικοινωνία μπορεί να ολοκληρωθεί εφόσον οι ακίδες 2, 3 και 5 είναι συνδεδεμένες στις αντίστοιχες ακίδες MAX232.
Με την ανάπτυξη της τεχνολογίας, η επικοινωνία σειριακής θύρας RS-232 χρησιμοποιείται ευρέως στη βιομηχανία, ωστόσο, στην εφαρμογή της εμπορικής τεχνολογίας, η τεχνολογία USB σε UART έχει αντικαταστήσει σιγά σιγά τη σειριακή θύρα RS232.
Πώς να πραγματοποιήσετε λοιπόν την επικοινωνία μεταξύ του μικροελεγκτή και του υπολογιστή όπως φαίνεται στο σχήμα
Αυτή είναι η πλακέτα ανάπτυξης σε αυτήν την περίπτωση που χρησιμοποιεί το τσιπ USB σε σειριακή θύρα CH340T για να επιτύχει αυτή τη λειτουργία.
Η θύρα μικροελεγκτή TXD χρησιμοποιεί ένα κάλυμμα βραχυκυκλωτήρα για σύνδεση στο USB-TX και συνδέεται ταυτόχρονα με τη θύρα CH340 pin 4 RXD
Η θύρα μικροελεγκτή RXD χρησιμοποιεί ένα κάλυμμα βραχυκυκλωτήρα για σύνδεση στο USB-RX και συνδέεται με την 3η ακίδα TXD του CH340.
Μπορείτε να δείτε ότι υπάρχει μια δίοδος 4148 σε σειρά μεταξύ του USB-RX και της τρίτης ακίδας TXD του CH340, επειδή ο μικροελεγκτής STC89C52 χρειάζεται ψυχρή εκκίνηση κατά τη λήψη του προγράμματος. Απλώς κάντε κλικ πρώτα στη λήψη και μετά ενεργοποιήστε.
τα λεγόμεναΨυχρό ξεκίνημα Αναφέρεται στη διαδικασία εκκίνησης του μικροελεγκτή από την απενεργοποίηση έως την ενεργοποίηση, ενώ η ενεργή εκκίνηση σημαίνει ότι ο μικροελεγκτής είναι πάντα ενεργοποιημένος. Η διαφορά μεταξύ ψυχρής εκκίνησης και θερμής εκκίνησης είναι: κατά την ψυχρή εκκίνηση, οι τιμές στην εσωτερική μνήμη RAM του μικροελεγκτή είναι τυχαίες ποσότητες, ενώ κατά τη διάρκεια της θερμής εκκίνησης, οι τιμές στην εσωτερική μνήμη RAM του μικροελεγκτή δεν θα αλλάξουν και παραμένουν ίδια όπως πριν από την εκκίνηση.
Τη στιγμή της ενεργοποίησης, ο μικροελεγκτής θα εντοπίσει πρώτα εάν είναι απαραίτητο να κατεβάσετε το πρόγραμμα Αν και το VCC του μικροελεγκτή ελέγχεται από το διακόπτη, επειδή η ακίδα 3 του CH340T είναι μια ακίδα εξόδου, εάν δεν υπάρχει τέτοιος. Η δίοδος, ο μετέπειτα μικροελεγκτής του διακόπτη θα αποτύχει όταν η τροφοδοσία είναι απενεργοποιημένη, ο ακροδέκτης 3 του CH340T συνδέεται με τον ακροδέκτη P3.0 (RXD) του μικροελεγκτή το επόμενο στάδιο, με αποτέλεσμα μια ορισμένη τάση στο επόμενο στάδιο. Μετά την προσθήκη διόδου, αφενός δεν επηρεάζει την επικοινωνία, αφετέρου μπορεί να εξαλείψει αυτό το δυσμενές αποτέλεσμα.
Έμαθα από το εγχειρίδιο του μικροελεγκτή ότι το P3.0 είναι μια σχεδόν αμφίδρομη θύρα IO.
Το μέρος του κόκκινου πλαισίου είναι η σχεδόν αμφίδρομη θύρα IO , όταν το εσωτερικό bit εξόδου είναι χαμηλό επίπεδο, μέσω της πύλης NOT, η βάση του τρανζίστορ είναι σε υψηλό επίπεδο, το τρανζίστορ είναι ενεργοποιημένο (η τάση και στα δύο άκρα του CE είναι σχεδόν ίδια σε κορεσμένη αγωγιμότητα) και το IO Η θύρα του μικροελεγκτή εξάγει χαμηλή στάθμη, ανεξάρτητα από την εξωτερική Είτε πατηθεί ή αναδυθεί ο διακόπτης κλειδιού, η θύρα IO παραμένει χαμηλή. Δηλαδή δεν ελέγχεται από εξωτερικά σήματα.
Όταν η εσωτερική έξοδος είναι υψηλό επίπεδο, αφού περάσει από την πύλη NOT, η βάση του τρανζίστορ είναι εξαιρετικά χαμηλή και το τρανζίστορ δεν αγώγει (η αντίσταση και στα δύο άκρα του CE είναι πολύ μεγάλη και η αντίσταση R είναι αμελητέα σε σύγκριση με Αυτή τη στιγμή, η έξοδος της θύρας IO είναι υψηλή. Όταν πατηθεί το κουμπί, η θύρα IO γειώνεται και η θύρα IO εξάγει χαμηλό επίπεδο.
Από αυτό φαίνεται ότι μόνο ότανΗ έξοδος της θύρας IO είναι υψηλού επιπέδουπότε,Η έξοδος της θύρας IO ελέγχεται από το εξωτερικό κύκλωμα。
Επομένως, γνωρίζουμε ότι η εσωτερική έξοδος του P3.0 είναι πάντα υψηλή όταν χρησιμοποιείται ως θύρα RXD.Η θύρα P3.1TXD χρησιμεύει ως πομπός και τηςΕσωτερικό επίπεδο εξόδουΜπορεί να αλλάξει προς τα πάνω ή προς τα κάτω ανάλογα με τις ανάγκες.
Και: για επίπεδα TTL
Τερματικό εξόδου: υψηλό επίπεδο >=2,4V, χαμηλό επίπεδο <=0,4V;
Τέλος λήψης: υψηλό επίπεδο >=2,0V, χαμηλό επίπεδο <=0,8V.
Για επίπεδο COMS
Ακροδέκτης εξόδου: υψηλό επίπεδο = Vcc, χαμηλό επίπεδο = GND (Vcc είναι η τάση τροφοδοσίας).
Τέλος λήψης: υψηλό επίπεδο >=0,7Vcc, χαμηλό επίπεδο <=0,2Vcc.
Υπάρχει ακόμα κάποια διαφορά τάσης μεταξύ της λογικής στάθμης του άκρου λήψης και της λογικής στάθμης του άκρου εξόδου. Η μεταδιδόμενη τάση βρίσκεται σε μια μπερδεμένη λογική περιοχή.
Χρησιμοποιήστε τη θύρα IO για να προσομοιώσετε τη σειριακή επικοινωνία UART
Ανώτερο πρόγραμμα:
- # include<reg52.h>
-
- sbit PIN_RXD = P3^0; //接受引脚定义
- sbit PIN_TXD = P3^1; //发送引脚定义
-
- bit RxdorTxd = 0; //指示当前状态为接受还是发送
- bit RxdEnd = 0; //接受结束标志
- bit TxdEnd = 0; //发送结束标志
- unsigned char RxdBuf = 0; //接收缓冲区
- unsigned char TxdBuf = 0; //发送缓冲器
-
- void ConfigUART(unsigned int baud);
- void StartTXD(unsigned char dat);
- void StartRXD();
-
-
- void main()
- {
- EA = 1; //打开总中断
- ConfigUART(9600); //配置波特率为9600
-
- while(1)
- {
- while(PIN_RXD); //等待接收引脚出现低电平,即起始位
- StartRXD(); //启动接收
- while(!RxdEnd); //等待接受完成
- StartTXD(RxdBuf +1);//接受到的整数+1后,发送回去
- while(!TxdEnd); //等待发送结束
- }
- }
-
- /* 串口配置函数,baud-通信波特率 */
- void ConfigUART(unsigned int baud)
- {
- TMOD &= 0xF0; //清零T0的控制位
- TMOD |= 0x02; //配置T0为模式2
- TH0 = 256 - (11059200/12)/baud; //计数T0的重载值
- }
-
- /* 启动串行接受 */
- void StartRXD()
- {
- TL0 = 256 - ((256-TH0) >> 1);//接受启动时T0定时为半个波特率周期
- ET0 = 1; //使能T0中断
- TR0 = 1; //启动T0
- RxdEnd = 0; //清零接受结束标志
- RxdorTxd = 0; //设置当前状态为接受 1位发送
-
- }
-
- /* 启动串行发送,dat-待发送字节数据 */
- void StartTXD(unsigned char dat)
- {
- TxdBuf = dat; //待发送数据保存到发送缓冲器
- TL0 = TH0; //T0计算初值为重载值
- ET0 = 1; //使能T0中断
- TR0 = 1; //启动T0
- PIN_TXD = 0; //发送起始位
- TxdEnd = 0; //清零发送结束标志
- RxdorTxd = 1; //设置当前状态为发送
- }
-
- /*T0中断服务函数,处理串行发送和接收 */
- void interruptTimer0() interrupt 1
- {
- static unsigned char cnt = 0;
-
- if(RxdorTxd)
- {
- cnt++;
- if(cnt <= 8) //低位在先一次发送8bit数据位
- {
- PIN_TXD = TxdBuf & 0x01;
- TxdBuf >>= 1;
- }
- else if(cnt == 9) //发送停止位
- {
- PIN_TXD = 1;
- }
- else //发送结束
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- TxdEnd = 1; //置发送结束标志
- }
- }
-
- else //串行接收处理
- {
- if(cnt == 0) // 处理起始位
- {
- if(!PIN_RXD) //起始位为0时,清零接收缓冲器,准备接受数据位
- {
- RxdBuf = 0;
- cnt++;
- }
- else //起始位为1(不为0)时,中止接收
- {
- TR0 = 0; //关闭T0
- }
- }
- else if(cnt <= 8) //处理8位数据位
- {
- RxdBuf >>= 1; //低位在先,所以将之前接收的位向右移
- if(PIN_RXD) //接收脚为1时,缓冲器最高位置1
- { //而为0时不处理即仍保持位移后的0
- RxdBuf |= 0x80;
- }
- cnt++;
- }
- else //停止位处理
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- if(PIN_RXD) //停止位为1时,方认为数据有效
- {
- RxdEnd = 1; //置接收结束标志
- }
- }
- }
-
- }
Χάρτης λογικής εργασίας
Αυτό το πρόγραμμα χρησιμοποιεί χρονοδιακόπτη 0 για την προσομοίωση σειριακής επικοινωνίας UART Σημειώστε ότι αυτό είναι απλώς έναΠρόγραμμα προσομοίωσης. Αυτό το πρόγραμμα υλοποιεί την επικοινωνία μεταξύ του υπολογιστή και του μικροελεγκτή. Το αποτέλεσμα επικοινωνίας του είναι να μεταδίδει τα δεδομένα που μεταδίδονται από τον υπολογιστή στον μικροελεγκτή και ο μικροελεγκτής προσθέτει 1 στα δεδομένα και τα στέλνει πίσω στον υπολογιστή. Χρησιμοποιήστε τον βοηθό εντοπισμού σφαλμάτων σειριακής θύρας που συνοδεύει το STC-ISP για να επιδείξετε αυτό το αποτέλεσμα.
Πρώτα, βεβαιωθείτε ότι οι θύρες είναι ίδιες Οι παραπάνω εικόνες είναι όλες COM3, ο ρυθμός baud είναι 9600, το bit ελέγχου είναι ΟΧΙ, το bit δεδομένων είναι 8 και το bit διακοπής είναι 1. (Αυτό που ορίζεται εδώ είναι το bit του υπολογιστή. παράμετροι σειριακής θύρας)
Ρίξτε μια ματιά στο αποτέλεσμα: η κανονική επικοινωνία είναι δυνατήΤο χρονόμετρο 0 προσομοιώνει τη σειριακή επικοινωνία_bilibili_bilibili
Εξηγήστε συνοπτικά τη λογική λειτουργίας αυτού του προγράμματος: γιαΑποστολή ενότηταςΓια παράδειγμα, στείλτε 0xAA =1010 1010 ξεκινώντας από το χαμηλότερο bit
Δηλαδή TxdBuf = 1010 1010 Δείτε το πρόγραμμα
- if(RxdorTxd)
- {
- cnt++;
- if(cnt <= 8) //低位在先一次发送8bit数据位
- {
- PIN_TXD = TxdBuf & 0x01;
- TxdBuf >>= 1;
- }
- else if(cnt == 9) //发送停止位
- {
- PIN_TXD = 1;
- }
- else //发送结束
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- TxdEnd = 1; //置发送结束标志
- }
- }
πρώταΕισαγάγετε διακοπή cnt = 1
PIN_TXD = TxdBuf & 0x01, δηλαδή, το αποτέλεσμα του AND του 1010 1010 0000 0001 είναι να εκχωρηθεί το χαμηλότερο bit 0xAA στη θύρα αποστολής για να ενεργοποιηθεί το αντίστοιχο επίπεδο. Μπορεί να φανεί ότι η τάση που εισέρχεται στη θύρα διακοπής TXD για πρώτη φορά είναι χαμηλό επίπεδο και αυτή η διαδικασία θα συνεχιστεί μέχρι να συμβεί η δεύτερη διακοπή.
Στη συνέχεια, το TxdBuff μετατοπίζεται ένα bit προς τα δεξιά, δηλαδή, TxdBuf = 0101 0101
Επειτατη δεύτερη φοράδιακοπή
cnt = 2
PIN_TXD = 1 Αυτή τη φορά το επίπεδο της θύρας αποστολής είναι υψηλό επίπεδο
TxdBuf = 0010 1010
Στη συνέχεια την τρίτη και τέταρτη φορά μέχρι8η φορά
cnt = 8
Το επίπεδο που ορίζεται από το PIN_TXD = 1 είναι υψηλό επίπεδο, το οποίο είναι το υψηλότερο bit 1 των μεταδιδόμενων δεδομένων.
Αυτή τη στιγμή TxdBuf = 0x00
Μετά από αυτό9η φοράΕισαγωγή της διακοπής Η 9η εισαγωγή της διακοπής σημαίνει ότι τα bit δεδομένων μόλις στάλθηκαν και είναι ώρα να προετοιμαστείτε για την αποστολή του bit.
Επομένως, PIN_TXD = 1, η θύρα αποστολής εκχωρείται απευθείας σε υψηλό επίπεδο.
Η τελευταία δέκατη διακοπή αντιπροσωπεύει ότι το bit διακοπής έχει επίσης σταλεί.Επομένως, στο cnt reset εκχωρείται τιμή 0, στο TR0 εκχωρείται τιμή 0, ο χρονοδιακόπτης 0 είναι απενεργοποιημένος, το TXDEnd = 1, η σημαία τέλους μετάδοσης ορίζεται σε 1 και η μετάδοση ενός πλήρους πλαισίου δεδομένων έχει ολοκληρωθεί.
Μετά από αυτόμονάδα λήψης: Στείλαμε νωρίτερα 0xAA Για αυτή τη συνάρτηση, η τιμή της είναι το αποτέλεσμα της προσθήκης 1 στα ληφθέντα δεδομένα, επομένως τα δεδομένα που ελήφθησαν είναι: 0xA9 =1010 1001.
- void StartRXD()
- {
- TL0 = 256 - ((256-TH0) >> 1);//接受启动时T0定时为半个波特率周期
- ET0 = 1; //使能T0中断
- TR0 = 1; //启动T0
- RxdEnd = 0; //清零接受结束标志
- RxdorTxd = 0; //设置当前状态为0接收 1为发送
-
- }
- else //串行接收处理
- {
- if(cnt == 0) // 处理起始位
- {
- if(!PIN_RXD) //起始位为0时,清零接收缓冲器,准备接受数据位
- {
- RxdBuf = 0;
- cnt++;
- }
- else //起始位为1(不为0)时,中止接收
- {
- TR0 = 0; //关闭T0
- }
- }
- else if(cnt <= 8) //处理8位数据位
- {
- RxdBuf >>= 1; //低位在先,所以将之前接收的位向右移
- if(PIN_RXD) //接收脚为1时,缓冲器最高位置1
- { //而为0时不处理即仍保持位移后的0
- RxdBuf |= 0x80;
- }
- cnt++;
- }
- else //停止位处理
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- if(PIN_RXD) //停止位为1时,方认为数据有效
- {
- RxdEnd = 1; //置接收结束标志
- }
- }
- }
Μπορεί να φανεί ότι οι διαδικασίες αποστολής και λήψης είναι στην πραγματικότητα παρόμοιες.
Όπως φαίνεται στο σχήμα, μπορείτε να δείτε ότι ο χρόνος που χρειάζεται για να εισαγάγετε τη διακοπή για την 0η φορά είναι ο μισός του προκαθορισμένου χρόνου διακοπής Μπορεί να προκύψει χρόνος δειγματοληψίας Σφάλμα ή παρεμβολή, επομένως το σημείο δειγματοληψίας ρυθμίζεται γενικά στο μέσο του χρόνου μετάδοσης του σήματος και το σήμα στάθμης εκεί θεωρείται ως το σήμα που εκπέμπεται σε αυτήν τη χρονική περίοδο. Επομένως, η μονάδα λήψης χρειάζεται μόνο να ρυθμίσει το χρόνο διακοπής της στο μισό του πρωτοτύπου όταν λαμβάνει το bit έναρξης για πρώτη φορά, έτσι ώστε να διασφαλίζεται ότι όλα τα επόμενα σημεία συλλογής σήματος βρίσκονται στο κεντρικό σημείο.
Ας δούμε πώς ρυθμίζεται το πρόγραμμα: TL0 = 256 - ((256-TH0) >> 1 //Αποδοχή ο χρονισμός T0 είναι η μισή περίοδος ρυθμού baud κατά την εκκίνηση).
256-TH0 είναι ο προκαθορισμένος χρόνος διακοπής Όπως αναφέραμε προηγουμένως, ελπίζουμε ότι ο χρόνος διακοπής θα είναι ο μισός από τον προηγούμενο. Ας πάρουμε ένα παράδειγμα δυαδικού 0000 του 8. Η μετατόπισή του προς τα δεξιά κατά 1 είναι 0000 0100 = 4. Μπορεί να φανεί ότι η λειτουργία της μετατόπισης προς τα δεξιά κατά 1 bit είναι η αλλαγή του αριθμού στο μισό της αρχικής τιμής. Με τον ίδιο τρόπο, το αποτέλεσμα της μετατόπισης αριστερά κατά 1 bit είναι 0001 0000 = 16, που σημαίνει πολλαπλασιασμός του αρχικού αριθμού επί 2
Έναρξη ανάλυσης διαδικασίας προγράμματος
Όταν το RxdorTxd είναι 0, εισάγετε τη συνάρτηση else, δηλαδή0η φορά Εισάγοντας τη διακοπή, το σημείο εκκίνησης της μονάδας λήψης στον τομέα χρόνου είναι το μέσο του bit έναρξης. Προσδιορίστε πρώτα εάν η τάση της θύρας είναι πραγματικά χαμηλή και εάν όχι, απενεργοποιήστε τη διακοπή. Γιατί να το κάνεις αυτό;
Επειδή πρόκειται για μονάδα λήψης, η τάση του RXD δεν ελέγχεται από τον μικροελεγκτή, σε αυτήν την περίπτωση, ελέγχεται από τον υπολογιστή που ελέγχει την τάση του ακροδέκτη TXD του CH340T. Η τάση του RXD του μικροελεγκτή ακολουθεί το άκρο CH340TXD.
Αν ναι, cnt++, τότε cnt=1. RxdBuf = 0, διαγράψτε το buffer λήψης στο 0
Μετά από αυτό1ος(για την ακρίβεια τη δεύτερη φορά)Δεύτερης διαλογής Εισαγάγετε τη διακοπή cnt = 1 και εισάγετε τη συνάρτηση else if() για να μεταφέρετε δεδομένα στο buffer βήμα προς βήμα. Η επακόλουθη διαδικασία δεν θα περιγραφεί λεπτομερώς, εάν οι ενδιαφερόμενοι αναγνώστες μπορούν να την περάσουν μόνοι τους σύμφωνα με τη λογική του προγράμματος. Δείτε εάν τα δεδομένα μπορούν πραγματικά να αποθηκευτούν στη μεταβλητή προσωρινής αποθήκευσης πρώτα με χαμηλό bit και μετά με τρόπο υψηλό. Επειδή στην προηγούμενη ανάρτηση ιστολογίου, η συνάρτηση χρησιμοποιεί τη μέθοδο μετατόπισης προς τα αριστερά για να αποθηκεύσει πρώτα τα high bits των δεδομένων. Αυτή η προσέγγιση συμπληρώνει αρκετά έναν άλλο τρόπο εργασίας.
Σε αυτό το σημείο, το πρόγραμμα χρησιμοποιεί χρονοδιακόπτη 0 για την προσομοίωση σειριακής επικοινωνίας UART.
Τρεις βασικοί τύποι επικοινωνίας
Απλή επικοινωνία: Μόνο ένα μέρος επιτρέπεται να μεταδίδει πληροφορίες στο άλλο μέρος και το άλλο μέρος δεν μπορεί να στείλει πληροφορίες πίσω, όπως τηλεχειριστήρια τηλεόρασης, ραδιοφωνικές εκπομπές κ.λπ.
Ημιαμφίδρομη επικοινωνία: Τα δεδομένα μπορούν να μεταδοθούν μεταξύ δύο μερών και μόνο το ένα μέρος μπορεί να τα στείλει στο άλλο μέρος ταυτόχρονα. Το παραπάνω πρόγραμμα προσομοίωσης σειριακής θύρας μπορεί επίσης να γίνει κατανοητό ως ημιαμφίδρομη επικοινωνία
Πλήρης αμφίδρομη επικοινωνία: τα δεδομένα μπορούν να αποσταλούν ενώ λαμβάνουν επίσης δεδομένα, και τα δύο εκτελούνται ταυτόχρονα, όπως η τηλεφωνική μας επικοινωνία.
Η σειριακή επικοινωνία προσομοίωσης θύρας IO δείχνει βασικά την ουσία της σειριακής επικοινωνίας, αλλά το πρόγραμμα μικροελεγκτή πρέπει να ανιχνεύει και να σαρώνει συνεχώς τα δεδομένα που λαμβάνονται από τη θύρα IO του μικροελεγκτή, η οποία καταλαμβάνει πολύ χρόνο λειτουργίας του μικροελεγκτή. Επομένως, υπάρχει μια μονάδα UART μέσα στον μικροελεγκτή 51, η οποία μπορεί να λαμβάνει αυτόματα δεδομένα μετά τη λήψη τους.
Μητρώο σειριακού ελέγχου SCON
Αυτή η περίπτωση εισάγει μόνο τη λειτουργία 1, δηλαδή τη ρύθμιση SM1 = 1 και SM0 = 0 είναι η λειτουργία 1. Αυτή η λειτουργία είναι η μορφή πλαισίου δεδομένων που χρησιμοποιήθηκε στην προηγούμενη προσομοιωμένη σειριακή επικοινωνία: 1 bit έναρξης, 8 bit δεδομένων και 1 bit διακοπής.
Η αναλογική σειριακή επικοινωνία χρησιμοποιεί χρονοδιακόπτη 0 για να εκφράσει το ρυθμό μετάδοσης κίνησης Ο πομπός ρυθμού baud της μονάδας STC89C52 μπορεί να δημιουργηθεί μόνο από το χρονόμετρο T1, αλλά όχι με το χρονόμετρο T0.
Κατά τη χρήση του χρονοδιακόπτη T2, απαιτούνται πρόσθετοι καταχωρητές διαμόρφωσης Από προεπιλογή, χρησιμοποιείται χρονόμετρο T1.
Κωδικός προγράμματος:
- # include<reg52.h>
-
- void ConfigUART(unsigned int baud);
-
- void main()
- {
- EA = 1;
- ConfigUART(9600); //配置波特率为9600
- while(1);
-
- }
- /* 串口配置函数,baud-通信波特率 */
- void ConfigUART(unsigned int baud)
- {
- SCON = 0x50; //0x50= 0101 0000 配置串口为模式1
- TMOD &= 0x0F; //清零T1的控制位
- TMOD |= 0x20; //0x20 = 0010 0000 配置T1的为模式2自动重载模式
- TH1 = 256 - (11059200/12/32)/baud; //计算T1的重载值
- TL1 = TH1; //设置初值
- ET1 = 0; //禁止T1中断
- ES = 1; //启动串口中断
- TR1 = 1; //启动T1定时器
- }
-
- /*UART中断服务函数 */
- void interruptUART() interrupt 4
- {
- if(RI) //接收到字节
- {
- RI = 0; //软件清0接收中断标志
- SBUF = SBUF+1;//接收的数据+1,左边是发送SBUF,右边是接收SBUF
-
- }
- if(TI)
- {
- TI = 0; //软件清0发送中断标志位
- }
-
- }
Δείτε το βίντεο με τα αποτελέσματα:Συνοδεύεται από την ενότητα σειριακή επικοινωνία_bilibili_bilibili
Μπορεί να φανεί ότι η κανονική επικοινωνία μπορεί να επιτευχθεί χωρίς κανένα πρόβλημα και στη συνέχεια δίνεται μια σύντομη εξήγηση του σχετικού περιεχομένου του προγράμματος:
Ο τύπος υπολογισμού για την τιμή επαναφόρτωσης του χρονοδιακόπτη T1 είναι:
TH1 = TL1 = 256 - τιμή ταλαντωτή κρυστάλλου/12/2/16/ρυθμός baud τότε
Χρόνος διακοπής = τιμή ταλαντωτή κρυστάλλου/12/2/16/ρυθμός baud = τιμή ταλαντωτή κρυστάλλου/12*(1/ρυθμός baud)*(1/32)
Η τιμή του ταλαντωτή κρυστάλλου/12 σημαίνει τον αριθμό των κύκλων μηχανής σε 1 δευτερόλεπτο, (1/ρυθμός baud) σημαίνει τον χρόνο που απαιτείται για τη μετάδοση 1 bit δεδομένων
Τιμή ταλαντωτή κρυστάλλου/12* (1/ρυθμός baud) σημαίνει πόσοι επεξεργαστές μηχανής χρειάζονται για τη μετάδοση 1 bit δεδομένων
Με τον ίδιο τρόπο, η τιμή του ταλαντωτή κρυστάλλου/12*(1/ρυθμός baud)*(1/32) ο χρόνος αυτής της διακοπής = 1/32 του χρόνου για τη μετάδοση 1 bit δεδομένων
Δηλαδή, η μεταφορά 1 bit δεδομένων χωρίζεται σε 32 χρονικά διαστήματα.
Το υπολογισμένο αποτέλεσμα είναι 3, δηλαδή το διάστημα διακοπής = 3 κύκλοι μηχανής Αυτός ο χρόνος είναι πολύ μικρός.
Επειδή η μέθοδος δειγματοληψίας σήματος της μονάδας σειριακής θύρας είναι να συλλέγει ένα μόνο σήμα 16 φορές και να αφαιρεί τα επίπεδα σήματος της 7ης, 8ης και 9ης φοράς Εάν δύο από τις τρεις φορές είναι υψηλά επίπεδα, τα δεδομένα θεωρούνται είναι 1 . Εάν το επίπεδο είναι 0 δύο φορές, αυτό το bit θεωρείται ότι είναι 0. Με αυτόν τον τρόπο, εάν τα δεδομένα διαβάζονται λανθασμένα λόγω απροσδόκητης παρεμβολής, η ορθότητα των τελικών δεδομένων μπορεί να εξασφαλιστεί.
Η παρακάτω εικόνα είναι από την προτεινόμενη ανάρτηση ιστολογίου κυρίως για διευκόλυνση της εξήγησης.: Τύπος υπολογισμού του ρυθμού baud
Το SMOD ελέγχεται από τον καταχωρητή ισχύος PCON Από προεπιλογή, το SMOD είναι 0. Η αντικατάστασή του στον παραπάνω τύπο είναι ο προηγούμενος τύπος λύσης αρχικής τιμής.
TH1 = TL1 = 256 - τιμή ταλαντωτή κρυστάλλου/12/2/16/ρυθμός baud
Όταν η υψηλότερη τιμή του καταχωρητή έχει οριστεί σε 1 PCON |= 0x80, δηλαδή, το SMOD έχει οριστεί σε 1, ο ρυθμός baud μπορεί να διπλασιαστεί, όπως φαίνεται στον παραπάνω τύπο.
Αυτή τη στιγμή, η αρχική τιμή του T1 γίνεται: TH1 = TL1 = 256 - τιμή ταλαντωτή κρυστάλλου/12/16/ρυθμός baud
Ένα πράγμα που πρέπει να σημειωθεί εδώ είναι ότι: Εάν θέλετε να χρησιμοποιήσετε τον καταχωρητή PCON για να ελέγξετε τον ρυθμό κύματος για να διπλασιαστεί, ο τύπος της αρχικής τιμής του πρέπει να γραφτεί ως
TH1 = TL1 = 256 - η τιμή του ταλαντωτή κρυστάλλου/12/2/16/ο ρυθμός baud είναι μόλις
Η τρέχουσα τιμή επαναφόρτωσης είναι TH1=256 - (11059200/12/32)/baud =256-(11059200/12/16)/(2*buad) baud*2=4800*2=9600, 9600 είναι η τιμή του ρυθμός baud του τρέχοντος προγράμματος
Εάν η εταιρεία επαναφόρτωσης αρχικής τιμής σας γράφει TH1 = TL1 = 256 - τιμή ταλαντωτή κρυστάλλου/12/16/ρυθμός baud, τότε ο τρέχων ρυθμός baud εξακολουθεί να είναι 4800, όχι 9600.Χρησιμοποιείτε το λογισμικό σειριακής επικοινωνίας για να ρυθμίσετε τον ρυθμό μετάδοσης της επικοινωνίας στο 9600 και εκπέμπειΤο αποτέλεσμα είναι λάθος。
Δες το βίντεο:Baud rate related_bilibili_bilibili
Μπορούμε να δούμε ότι το χρονικό διάστημα για τον ρυθμό baud των 9600 είναι μόνο 3 κύκλοι μηχανής και το χρονικό διάστημα 14400 είναι 2 κύκλοι μηχανής. Μπορεί να φανεί ότι εάν ο ρυθμός baud του είναι υψηλότερος, το χρονικό του διάστημα μπορεί να είναι μικρότερο από 1 κύκλο μηχανής. Επομένως, υπάρχει ένας άλλος τρόπος λειτουργίας, δηλαδή το ConfigUART(9600) αφού το υψηλότερο bit του PCON είναι 19200, αλλά το χρονικό διάστημα του είναι το χρονικό διάστημα του αρχικού ρυθμού baud 9600. 3 κύκλοι μηχανής.
Πρέπει να υπενθυμίσουμε ότι υπάρχουν ακόμα πολλές διαφορές στην εργασία της προσομοιωμένης σειριακής επικοινωνίας με χρονοδιακόπτη 0 και της μονάδας σειριακής επικοινωνίας Η μονάδα σειριακής επικοινωνίας ολοκληρώνει μία είσοδο και έξοδο και εισάγει μόνο δύο σειριακές διακοπές. Μία φορά ως απόκριση στο RI που έχει οριστεί στο 1, μία φορά ως απόκριση στο TI που έχει οριστεί σε 1 και στη συνέχεια διαγράφεται από το λογισμικό. Μην δίνετε πλέον προσοχή στη διαδικασία μετάδοσης, εστιάστε μόνο στο εάν η μετάδοση έχει ολοκληρωθεί και στείλτε ένα σήμα όταν ολοκληρωθεί η μετάδοση.
Το κύκλωμα αποστολής και λήψης της σειριακής επικοινωνίας έχει φυσικά δύο πανομοιότυπους καταχωρητές SBUF και οι διευθύνσεις τους είναι επίσης 0x99, αλλά ο ένας χρησιμοποιείται για την αποστολή buffer και ο άλλος για τη λήψη buffer. Αυτό σημαίνει ότι υπάρχουν δύο δωμάτια και οι αριθμοί του σπιτιού των δύο δωματίων είναι οι ίδιοι. Με αυτόν τον τρόπο, η πλήρης αμφίδρομη επικοινωνία του UART μπορεί να επιτευχθεί χωρίς παρεμβολές μεταξύ τους. Αλλά λογικά, μόνο το SBUF λειτουργεί κάθε φορά και ο μικροελεγκτής επιλέγει αυτόματα αν θα λάβει SBUF ή θα στείλει SBUF με βάση το αν θα εκτελεί μια λειτουργία "ανάγνωσης" ή "εγγραφής" σε αυτό.
Βασικά βήματα του προγράμματος σειριακής επικοινωνίας:
1. Διαμορφώστε τη σειριακή θύρα στη λειτουργία 1.
2. Ρυθμίστε το χρονόμετρο T1 στη λειτουργία 2, που είναι η λειτουργία αυτόματης επανεγκατάστασης.
3. Υπολογίστε τις αρχικές τιμές των TH1 και TL1 με βάση τον ρυθμό baud, εάν είναι απαραίτητο, μπορείτε να χρησιμοποιήσετε το PCON για να διπλασιάσετε τον ρυθμό baud.
4. Ανοίξτε τον καταχωρητή ελέγχου χρονοδιακόπτη TR1 και αφήστε το χρονόμετρο να λειτουργήσει.Σημείωση: Όταν χρησιμοποιείτε τη διακοπή σειριακής θύρας, η διακοπή του χρονοδιακόπτη 1 δεν μπορεί πλέον να ενεργοποιηθεί, εκτός εάν χρησιμοποιείτε τη διακοπή της σειριακής θύρας του χρονοδιακόπτη 2.