τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Τα χρονόμετρα και οι μετρητές είναι μονάδες υλικού που χρησιμοποιούνται για τη μέτρηση χρονικών διαστημάτων ή την καταμέτρηση συμβάντων. Μπορούν να χρησιμοποιηθούν σε πολλές εφαρμογές, όπως η δημιουργία ακριβών χρονικών καθυστερήσεων, η μέτρηση συχνοτήτων, η καταμέτρηση εξωτερικών συμβάντων κ.λπ. Ο χρονοδιακόπτης του μικροελεγκτή 51 ανήκει στους εσωτερικούς πόρους του μικροελεγκτή και η σύνδεση και η λειτουργία του κυκλώματος του ολοκληρώνονται εντός του μικροελεγκτή. Αυτό το άρθρο θα εισαγάγει λεπτομερώς την αρχή λειτουργίας, τη μέθοδο διαμόρφωσης και την εφαρμογή χρονόμετρων και μετρητών στον μικροελεγκτή 51.
Αυτό το κεφάλαιο θα καλύψει τις γνώσεις που σχετίζονται με διακοπές Για συγκεκριμένο περιεχόμενο, ανατρέξτε στο:Επεξήγηση συστήματος διακοπής
Σημείωση: Οι πόροι του χρονοδιακόπτη σχετίζονται με το μοντέλο του μικροελεγκτή.
Το χρονόμετρο είναι σαν ένα μικρό ξυπνητήρι μέσα στον μικροελεγκτή Σύμφωνα με το σήμα εξόδου του ρολογιού, η τιμή της μονάδας μέτρησης αυξάνεται κατά ένα κάθε «ένα δευτερόλεπτο». Όταν η τιμή της μονάδας μέτρησης αυξηθεί στην "ρυθμισμένη ώρα υπενθύμισης συναγερμού", η μονάδα μέτρησης θα εκδώσει ένα αίτημα διακοπής στο σύστημα διακοπής, θα δημιουργήσει μια "υπενθύμιση δακτυλίου" και θα αναγκάσει το πρόγραμμα να μεταβεί στη λειτουργία υπηρεσίας διακοπής για εκτέλεση .
Η αρχή λειτουργίας του χρονοδιακόπτη/μετρητή βασίζεται σε παλμούς ρολογιού. Στη λειτουργία χρονοδιακόπτη, χρησιμοποιούν μια εσωτερική πηγή ρολογιού για να μετρήσουν σε λειτουργία μετρητή, χρησιμοποιούν μια εξωτερική πηγή παλμών για μέτρηση. Κάθε χρονόμετρο/μετρητής έχει έναν καταχωρητή που αποθηκεύει την τρέχουσα τιμή μέτρησης.
Οι συναρτήσεις χρονισμού και μέτρησης ελέγχονται από τα bit ελέγχου του καταχωρητή ειδικής λειτουργίας TMOD. CT Csqrt{T}ντοΤ Για να κάνετε μια επιλογή, οι πληροφορίες του καταχωρητή TMOD παρατίθενται στον παρακάτω πίνακα. Φαίνεται ότι τα 2 χρονόμετρα/μετρητές έχουν τέσσερις τρόπους λειτουργίας, που επιλέγονται μέσω των M1 και M0 του TMOD. Οι λειτουργίες 0, 1 και 2 από τα δύο χρονόμετρα/μετρητές είναι οι ίδιες, αλλά η λειτουργία 3 είναι διαφορετική.
Ρυθμίζοντας τα M1 και M0 στον καταχωρητή TMOD του καταχωρητή, ο χρονοδιακόπτης/μετρητής 0 και 1 έχουν τέσσερις διαφορετικούς τρόπους λειτουργίας.
Το διάγραμμα λειτουργίας λειτουργίας έχει ως εξής:
Η λειτουργία 1 είναι ακριβώς η ίδια με τη λειτουργία 0 με τη διαφορά ότι χρησιμοποιούνται και τα 16 bit του TH0 και του TL0. Σε αυτήν τη λειτουργία, η υπερχείλιση 8-bit του TL0 μεταφέρεται στο TH0 και η υπερχείλιση του TH0 ορίζει τη σημαία υπερχείλισης TF0 σε TCON.
Όταν GATE=0(TMOD.3), εάν TR0=1, ο χρονοδιακόπτης μετράει. Όταν GATE=1, η εξωτερική είσοδος INTO επιτρέπεται να ελέγχει το χρονόμετρο 0, έτσι ώστε να μπορεί να επιτευχθεί η μέτρηση του πλάτους παλμού. Το TRO είναι το bit ελέγχου στον καταχωρητή TCON Για την περιγραφή της συγκεκριμένης λειτουργίας κάθε bit του καταχωρητή TCON, δείτε την εισαγωγή του καταχωρητή TCON στην προηγούμενη ενότητα.
Σημείωση: Ο χρονοδιακόπτης του μικροελεγκτή της σειράς STC89C51RC/RD+ έχει δύο ρυθμούς μέτρησης: ο ένας είναι σε λειτουργία 12T, προσθέτοντας 1 κάθε 12 ρολόγια, το ίδιο με τον παραδοσιακό μικροελεγκτή 8051, προσθέτοντας 1 κάθε 6 ρολόγια, την ταχύτητα The Ο ρυθμός T0, ο οποίος είναι 2πλάσιος από τον παραδοσιακό μικροελεγκτή 8051, ορίζεται στον προγραμματιστή STC-ISP κατά την εγγραφή του προγράμματος χρήστη.
Σε αυτή τη λειτουργία, ο χρονοδιακόπτης/μετρητής μπορεί να επαναφορτώσει αυτόματα τον μετρητή 8-bit. (Το TH0 μπορεί να ρυθμιστεί πρώτα και το περιεχόμενο του TH0 θα παραμείνει αμετάβλητο κατά την επανεγκατάσταση)
Για το Χρονόμετρο 0, σε αυτήν τη λειτουργία, ο Χρονοδιακόπτης 1 σταματά να μετράει και το αποτέλεσμα είναι το ίδιο με τη ρύθμιση του TR1 στο 0.
Για το χρονόμετρο 0, σε αυτήν τη λειτουργία, τα TL0 και TH0 του χρονοδιακόπτη 0 λειτουργούν ως δύο ανεξάρτητοι μετρητές 8-bit. Το παρακάτω σχήμα δείχνει το λογικό διάγραμμα του χρονοδιακόπτη 0 στη λειτουργία 3. Το TL0 καταλαμβάνει το bit ελέγχου του χρονοδιακόπτη 0: CT Csqrt{T}ντοΤ , GATE, TRO, INTO και TFO. Το THO περιορίζεται στη λειτουργία χρονοδιακόπτη (μετρητή περίοδος) και καταλαμβάνει τα TR1 και TF1 του χρονοδιακόπτη 1. Αυτή τη στιγμή, το TH0 ελέγχει τη διακοπή του χρονοδιακόπτη 1.
Η λειτουργία 3 παρέχεται για την προσθήκη ενός επιπλέον χρονοδιακόπτη/μετρητή 8 bit, δίνοντας στον μικροελεγκτή τρεις χρονοδιακόπτες/μετρητές. Η λειτουργία 3 ισχύει μόνο για το χρονόμετρο/μετρητή 0. Όταν ο χρονοδιακόπτης T1 είναι στη λειτουργία 3, ισοδυναμεί με TR1-0 και σταματά να μετράει και το T0 μπορεί να χρησιμοποιηθεί ως δύο χρονόμετρα.
Σημείωση: Το εργαλείο προγραμματισμού STC-ISP συνοδεύεται από την αρχική τιμή του χρόνου που θα υπολογιστεί. Μπορείτε να αντιγράψετε τον κωδικό σύμφωνα με τη λειτουργία που θα επιλέξετε.
Η ενδεικτική λυχνία LED1 ελέγχεται για να αναβοσβήνει σε διαστήματα 1 δευτερολέπτου μέσω της διακοπής του χρονοδιακόπτη 0. Το φυσικό διάγραμμα είναι συνδεδεμένο με τον ακροδέκτη P2_0 Το ρολόι των 12.000 MHz ενεργοποιείται σε διάστημα ενός χιλιοστού του δευτερολέπτου Κάθε φορά η συνάρτηση ενεργοποίησης διακοπής χρησιμοποιείται για μέτρηση όταν είναι 1000, είναι ένα δευτερόλεπτο.
#include <REGX52.H>
sbit LED1 = P2^0;
void External0_ISR(void) interrupt 1
{
static unsigned int count = 0;
TL0 = 0x18; //需要手动复原
TH0 = 0xFC; //需要手动复原
// 中断处理代码
if(count == 1000)
{
count = 0;
LED1 = !LED1;
}
count++;
}
void Timer0_Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
ET0 = 1;//打开T0中断
EA = 1;//打开总中断
TR0 = 1; //定时器0开始计时
}
void main()
{
Timer0_Init();
while(1)
{
}
}
Σε αυτήν την επίδειξη, χρησιμοποιούνται οι λειτουργίες _crol_left shift και _cror_right shift στη βιβλιοθήκη INTRINS.H Όταν πατηθεί το κουμπί KEY1, η λυχνία LED θα αλλάξει την κατάσταση κατεύθυνσης και θα αναβοσβήνει. Σύνδεση φυσικής εικόνας: Το K1 συνδέεται με τον ακροδέκτη P0_0 και οι οκτώ λυχνίες LED εισάγονται στον ακροδέκτη P2.
#include <REGX52.H>
#include <INTRINS.H>
sbit KEY1 = P0^0;
sbit KEY2 = P0^1;
unsigned char LEDMode;
void DelayXms(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void Timer0_Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
ET0 = 1;//打开T0中断
EA = 1;//打开总中断
TR0 = 1; //定时器0开始计时
}
void External0_ISR(void) interrupt 1
{
static unsigned int count = 0;
TL0 = 0x18; //需要手动复原
TH0 = 0xFC; //需要手动复原
// 中断处理代码
if(count == 1000)
{
count = 0;
if(LEDMode == 0)
P2 = _crol_(P2,1);
if(LEDMode == 1)
P2 = _cror_(P2,1);
}
count++;
}
unsigned char Getkey()
{
unsigned char keyNumber = 0;
if(KEY1 == 0)
{
DelayXms(5);
while(KEY1 == 0);
DelayXms(5);
keyNumber = 1;
}
if(KEY2 == 0)
{
DelayXms(5);
while(KEY2 == 0);
DelayXms(5);
keyNumber = 2;
}
return keyNumber;
}
void main()
{
unsigned char keyNum = 0;
P2 = 0xfe;
Timer0_Init();
while(1)
{
keyNum = Getkey();
if(keyNum)
{
if(keyNum == 1)
{
LEDMode++;
if(LEDMode>=2)
{
LEDMode = 0;
}
}
}
}
}
Αυτός ο κωδικός επίδειξης χρησιμοποιεί τη μονάδα LCD1602 ως οθόνη Η μονάδα LCD1602 δεν θα επεξηγηθεί λεπτομερώς και θα δοθούν ειδικές οδηγίες κεφαλαίου αργότερα. Εάν χρειάζεστε τη βιβλιοθήκη LCD1602, μπορείτε να μου στείλετε ιδιωτικό μήνυμα. Σύνδεση φυσικής εικόνας: Απλώς συνδέστε τη μονάδα LCD1602 στην πλακέτα.
#include <REGX52.H>
#include "LCD1602.h"
unsigned char Sec=55,Min=59,Hour;//秒分时
void DelayXms(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void Timer0_Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
ET0 = 1;//打开T0中断
EA = 1;//打开总中断
TR0 = 1; //定时器0开始计时
}
void External0_ISR(void) interrupt 1
{
static unsigned int count = 0;
TL0 = 0x18; //需要手动复原
TH0 = 0xFC; //需要手动复原
// 中断处理代码
if(count == 1000)
{
count = 0;
Sec++;
if(Sec == 60)
{
Sec = 0;
Min++;
if(Min == 60)
{
Min = 0;
Hour++;
if(Hour == 24)
{
Hour = 0;
}
}
}
}
count++;
}
void main()
{
Timer0_Init();
LCD_Init();
LCD_ShowString(1,1,"Time:");
LCD_ShowString(2,1,"00:00:00");
while(1)
{
LCD_ShowNum(2,1,Hour,2);
LCD_ShowNum(2,4,Min,2);
LCD_ShowNum(2,7,Sec,2);
}
}