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

05: Διακοπή χρονοδιακόπτη

2024-07-12

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


1. Όταν η κεντρική μονάδα επεξεργασίας (CPU) επεξεργάζεται κάτι, εμφανίζεται ένα αίτημα έκτακτης ανάγκης από τον έξω κόσμο, που απαιτεί από τη CPU να αναστείλει την τρέχουσα εργασία και να μεταβεί στην επεξεργασία του συμβάντος έκτακτης ανάγκης Μετά την επεξεργασία, επιστρέψτε στο αρχικό σημείο που διακόπηκε και συνεχίστε Αρχικά λειτουργούσε, μια τέτοια διαδικασία ονομαζόταν διακοπή.
2. Συνήθως, η πηγή διακοπής τοποθετείται στην ουρά σύμφωνα με την προτεραιότητα της πηγής διακοπής και η πηγή αιτήματος διακοπής του πιο επείγοντος συμβάντος επεξεργάζεται πρώτα, δηλαδή, κάθε πηγή διακοπής ορίζεται ότι έχει ένα επίπεδο προτεραιότητας. Η CPU ανταποκρίνεται πάντα στο αίτημα διακοπής πρώτα με την υψηλότερη προτεραιότητα.
3. Ο μικροελεγκτής C51 έχει 8 πηγές αιτήματος διακοπής:

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

1. Διακοπή χρονοδιακόπτη T0

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

Όπως φαίνεται στο σχήμα: Οι διακοπές χρειάζονται επίσης καταχωρητές διαμόρφωσης. Υπάρχουν δύο τύποι καταχωρητών. Εδώ μελετάμε μόνο μια διακοπή του χρονοδιακόπτη T0.
Για να χρησιμοποιήσετε τη διακοπή του χρονοδιακόπτη T0:

ET0 = 1;ET0为定时器T0的中断开关,为1时打开中断
EA = 1;  EA为中断源的总开关。
  • 1
  • 2

Αφού τελειώσει ο καθορισμένος χρόνος, εκτελέστε το πρόγραμμα στη συνάρτηση διακοπής Λοιπόν, πώς γνωρίζετε ποια συνάρτηση είναι η συνάρτηση διακοπής; — Αναζητήστε τον αριθμό διακοπής (οι αριθμοί διακοπών που δημιουργούνται από διαφορετικές πηγές διακοπής είναι διαφορετικοί)
Εισαγάγετε την περιγραφή της εικόνας εδώ

2. Περίπτωση: Χρήση του χρονοδιακόπτη διακοπής T0 για να συνειδητοποιήσετε ότι το φως ανάβει και σβήνει σε διαστήματα 1 δευτερολέπτου

#include <REGX52.H>

sbit LED1 = P3^7;
int cnt = 0;

void Timer0_Init_10ms(void)		//10毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

void Timer0_interrupt_Init(void)//定时器T0中断初始化
{
	ET0 = 1;
	EA = 1;
}

void main(void)
{ 
	LED1 = 1;//先让灯熄灭的状态
	Timer0_Init_10ms();//打开定时器T0
	Timer0_interrupt_Init();//打开定时器T0中断
	while(1)
	{
		
	 }
}

/*定义中断函数*/
void Timer0Hander() interrupt 1
{
	TF0 = 0;//软件清零
	TL0 = 0x00; //重新给初值
	TH0 = 0xDC;
	cnt++;
	if(cnt == 100)//数100次,相当于1s
	{
		cnt = 0;
		LED1 = !LED1;
	}
}
  • 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
  • Όταν η διακοπή είναι ενεργοποιημένη, η κύρια συνάρτηση θα μεταπηδά κάθε 10 ms και το πρόγραμμα στη λειτουργία διακοπής θα εκτελείται.
  • Όταν φτάσουν τα πρώτα 10 ms του χρονισμού, εκτελέστε τη λειτουργία διακοπής, επαναφέρετε το χρονόμετρο για 10 ms, cnt = 1 και η λυχνία είναι ακόμα σβηστή.
  • Όταν φθάσουν τα δεύτερα 10 ms του χρονοδιακόπτη, εκτελέστε τη λειτουργία διακοπής, ρυθμίστε ξανά το χρονόμετρο για 10 ms, cnt = 2 και η λυχνία είναι ακόμα σβηστή.
  • Όταν φτάσει το 100ο 10 ms του χρονοδιακόπτη, εκτελέστε τη λειτουργία διακοπής, επαναφέρετε το χρονόμετρο για 10 ms, cnt = 100 και το φως ανάβει.

Με αυτόν τον τρόπο επιτυγχάνονται τα διαστήματα ενεργοποίησης και απενεργοποίησης των 1 δευτερολέπτων.