Partage de technologie

05 : Interruption de la minuterie

2024-07-12

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


1. Lorsque l'unité centrale de traitement (CPU) traite quelque chose, une demande d'urgence survient du monde extérieur, obligeant la CPU à suspendre le travail en cours et à passer au traitement de l'événement d'urgence. Après le traitement, retournez à l'endroit interrompu d'origine et continuez. . Fonctionnant à l'origine, un tel processus était appelé interruption.
2. Habituellement, la source d'interruption est mise en file d'attente en fonction de la priorité de la source d'interruption et la source de demande d'interruption de l'événement le plus urgent est traitée en premier, c'est-à-dire que chaque source d'interruption est stipulée pour avoir un niveau de priorité. La CPU répond toujours en premier à la demande d'interruption avec la priorité la plus élevée.
3. Le microcontrôleur C51 dispose de 8 sources de requêtes d'interruption :

Insérer la description de l'image ici

1. Interruption du temporisateur T0

Insérer la description de l'image ici

Comme le montre la figure : Les interruptions nécessitent également des registres de configuration. Il existe deux types de registres. Le premier est le registre de contrôle d'interruption de bits (IE et XICON) et le second est le registre de contrôle de priorité. Ici nous étudions uniquement une interruption du temporisateur T0.
Pour utiliser l'interruption du temporisateur T0 :

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

Une fois le temps défini écoulé, exécutez le programme dans la fonction d'interruption. Alors, comment savoir quelle fonction est la fonction d'interruption ? — Interroger le numéro d'interruption (les numéros d'interruption générés par différentes sources d'interruption sont différents)
Insérer la description de l'image ici

2. Cas : Utilisation de l'interruption de la minuterie T0 pour réaliser l'allumage et l'extinction de la lumière à intervalles de 1 s

#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
  • Lorsque l'interruption est activée, la fonction principale sera sautée toutes les 10 ms et le programme de la fonction d'interruption sera exécuté.
  • Lorsque les 10 premières ms de synchronisation arrivent, exécutez la fonction d'interruption, réinitialisez la minuterie pendant 10 ms, cnt = 1, et la lumière est toujours éteinte.
  • Lorsque les secondes 10 ms de la minuterie arrivent, exécutez la fonction d'interruption, réinitialisez la minuterie sur 10 ms, cnt = 2, et la lumière est toujours éteinte.
  • Lorsque la 100ème 10 ms de la minuterie arrive, exécutez la fonction d'interruption, réinitialisez la minuterie pendant 10 ms, cnt = 100 et la lumière s'allume.

De cette façon, les intervalles d'activation et de désactivation de 1 s sont atteints.