Κοινή χρήση τεχνολογίας

Μικροελεγκτής Puzhong 51: λεπτομερής επεξήγηση και εφαρμογή χρονόμετρων και μετρητών (7)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Εισαγάγετε την περιγραφή της εικόνας εδώ

εισαγωγή

Τα χρονόμετρα και οι μετρητές είναι μονάδες υλικού που χρησιμοποιούνται για τη μέτρηση χρονικών διαστημάτων ή την καταμέτρηση συμβάντων. Μπορούν να χρησιμοποιηθούν σε πολλές εφαρμογές, όπως η δημιουργία ακριβών χρονικών καθυστερήσεων, η μέτρηση συχνοτήτων, η καταμέτρηση εξωτερικών συμβάντων κ.λπ. Ο χρονοδιακόπτης του μικροελεγκτή 51 ανήκει στους εσωτερικούς πόρους του μικροελεγκτή και η σύνδεση και η λειτουργία του κυκλώματος του ολοκληρώνονται εντός του μικροελεγκτή. Αυτό το άρθρο θα εισαγάγει λεπτομερώς την αρχή λειτουργίας, τη μέθοδο διαμόρφωσης και την εφαρμογή χρονόμετρων και μετρητών στον μικροελεγκτή 51.

Αυτό το κεφάλαιο θα καλύψει τις γνώσεις που σχετίζονται με διακοπές Για συγκεκριμένο περιεχόμενο, ανατρέξτε στο:Επεξήγηση συστήματος διακοπής

Σημείωση: Οι πόροι του χρονοδιακόπτη σχετίζονται με το μοντέλο του μικροελεγκτή.

Πώς λειτουργεί το χρονόμετρο

Το χρονόμετρο είναι σαν ένα μικρό ξυπνητήρι μέσα στον μικροελεγκτή Σύμφωνα με το σήμα εξόδου του ρολογιού, η τιμή της μονάδας μέτρησης αυξάνεται κατά ένα κάθε «ένα δευτερόλεπτο». Όταν η τιμή της μονάδας μέτρησης αυξηθεί στην "ρυθμισμένη ώρα υπενθύμισης συναγερμού", η μονάδα μέτρησης θα εκδώσει ένα αίτημα διακοπής στο σύστημα διακοπής, θα δημιουργήσει μια "υπενθύμιση δακτυλίου" και θα αναγκάσει το πρόγραμμα να μεταβεί στη λειτουργία υπηρεσίας διακοπής για εκτέλεση .

Η αρχή λειτουργίας του χρονοδιακόπτη/μετρητή βασίζεται σε παλμούς ρολογιού. Στη λειτουργία χρονοδιακόπτη, χρησιμοποιούν μια εσωτερική πηγή ρολογιού για να μετρήσουν σε λειτουργία μετρητή, χρησιμοποιούν μια εξωτερική πηγή παλμών για μέτρηση. Κάθε χρονόμετρο/μετρητής έχει έναν καταχωρητή που αποθηκεύει την τρέχουσα τιμή μέτρησης.

Καταχωρητής τρόπου λειτουργίας χρονοδιακόπτη/μετρητή TMOD

Οι συναρτήσεις χρονισμού και μέτρησης ελέγχονται από τα bit ελέγχου του καταχωρητή ειδικής λειτουργίας TMOD. CT Csqrt{T}ντοΤ Για να κάνετε μια επιλογή, οι πληροφορίες του καταχωρητή TMOD παρατίθενται στον παρακάτω πίνακα. Φαίνεται ότι τα 2 χρονόμετρα/μετρητές έχουν τέσσερις τρόπους λειτουργίας, που επιλέγονται μέσω των M1 και M0 του TMOD. Οι λειτουργίες 0, 1 και 2 από τα δύο χρονόμετρα/μετρητές είναι οι ίδιες, αλλά η λειτουργία 3 είναι διαφορετική.
Εισαγάγετε την περιγραφή της εικόνας εδώ

Λειτουργία χρονοδιακόπτη

Ρυθμίζοντας τα M1 και M0 στον καταχωρητή TMOD του καταχωρητή, ο χρονοδιακόπτης/μετρητής 0 και 1 έχουν τέσσερις διαφορετικούς τρόπους λειτουργίας.

Λειτουργία 0 (χρονομετρητής/μετρητής 13 bit)

Εισαγάγετε την περιγραφή της εικόνας εδώ
Το διάγραμμα λειτουργίας λειτουργίας έχει ως εξής:
Εισαγάγετε την περιγραφή της εικόνας εδώ

Λειτουργία 1 (χρονομετρητής/μετρητής 16 bit)

Η λειτουργία 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 κατά την εγγραφή του προγράμματος χρήστη.

Λειτουργία 2 (λειτουργία αυτόματης επαναφόρτωσης 8 bit)

Σε αυτή τη λειτουργία, ο χρονοδιακόπτης/μετρητής μπορεί να επαναφορτώσει αυτόματα τον μετρητή 8-bit. (Το TH0 μπορεί να ρυθμιστεί πρώτα και το περιεχόμενο του TH0 θα παραμείνει αμετάβλητο κατά την επανεγκατάσταση)
Εισαγάγετε την περιγραφή της εικόνας εδώ

Λειτουργία 3 (δύο μετρητές 8-bit)

Για το Χρονόμετρο 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 μπορεί να χρησιμοποιηθεί ως δύο χρονόμετρα.
Εισαγάγετε την περιγραφή της εικόνας εδώ

Διαδικασία διαμόρφωσης χρονοδιακόπτη

  1. Εκχωρήστε τιμές στο TMOD για να προσδιορίσετε πώς λειτουργούν τα T0 και T1.
  2. Υπολογίστε την αρχική τιμή σύμφωνα με τον χρόνο που θα μετρηθεί και γράψτε την σε TH0, TL0 ή TH1, TL1.
  3. Εάν χρησιμοποιούνται διακοπές, αντιστοιχίστε μια τιμή στο EA και ανοίξτε τη συνολική διακοπή του χρονοδιακόπτη.
  4. Ρυθμίστε το TR0 ή το TR1 για να ξεκινήσει ο χρονισμός ή η καταμέτρηση του χρονοδιακόπτη/μετρητή.

Σημείωση: Το εργαλείο προγραμματισμού STC-ISP συνοδεύεται από την αρχική τιμή του χρόνου που θα υπολογιστεί. Μπορείτε να αντιγράψετε τον κωδικό σύμφωνα με τη λειτουργία που θα επιλέξετε.
Εισαγάγετε την περιγραφή της εικόνας εδώ

Επίδειξη κωδικού - Η λυχνία LED1 αναβοσβήνει σε διάστημα 1 δευτερολέπτου

Η ενδεικτική λυχνία 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)
	{
		
	}	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

Επίδειξη κωδικού - το κουμπί 1 ελέγχει την κατάσταση του φώτα πορείας LED

Σε αυτήν την επίδειξη, χρησιμοποιούνται οι λειτουργίες _crol_left shift και _cror_right shift στη βιβλιοθήκη INTRINS.H Όταν πατηθεί το κουμπί KEY1, η λυχνία LED θα αλλάξει την κατάσταση κατεύθυνσης και θα αναβοσβήνει. Σύνδεση φυσικής εικόνας: Το K1 συνδέεται με τον ακροδέκτη P0_0 και οι οκτώ λυχνίες LED εισάγονται στον ακροδέκτη P2.

  • cror(unsigned char val, unsigned char n): Περιστρέψτε χαρακτήρες προς τα δεξιά και περιστρέψτε το val προς τα δεξιά κατά n bit.
  • crol(unsigned char val, unsigned char n): Περιστροφή χαρακτήρων προς τα αριστερά, περιστροφή val προς τα αριστερά κατά n bit
#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;	
				}
			}
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

Επίδειξη κωδικού - Οθόνη ρολογιού χρονοδιακόπτη LCD1602

Αυτός ο κωδικός επίδειξης χρησιμοποιεί τη μονάδα 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);
	}	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75