Condivisione della tecnologia

05: interruzione del timer

2024-07-12

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


1. Quando l'unità centrale di elaborazione (CPU) sta elaborando qualcosa, si verifica una richiesta di emergenza dal mondo esterno, che richiede alla CPU di sospendere il lavoro corrente e passare all'elaborazione dell'evento di emergenza. Dopo l'elaborazione, tornare al punto interrotto originale e continuare Originariamente funzionante, tale processo era chiamato interruzione.
2. Di solito, la fonte di interruzione viene accodata in base alla priorità della fonte di interruzione e la fonte di richiesta di interruzione dell'evento più urgente viene elaborata per prima, ovvero a ciascuna fonte di interruzione viene specificato un livello di priorità. Alla richiesta di interruzione la CPU risponde sempre per prima con la priorità più alta.
3. Il microcontrollore C51 ha 8 fonti di richiesta di interruzione:

Inserisci qui la descrizione dell'immagine

1. Interruzione del timer T0

Inserisci qui la descrizione dell'immagine

Come mostrato nella figura: Anche gli interrupt necessitano di registri di configurazione. Esistono due tipi di registri Il primo è il registro di controllo degli interrupt di bit (IE e XICON) e il secondo è il registro di controllo della priorità. Qui studiamo solo un'interruzione del timer T0.
Per utilizzare l'interruzione del timer T0:

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

Allo scadere del tempo impostato, eseguire il programma nella funzione di interruzione. Quindi, come fai a sapere quale è la funzione di interruzione? — Interrogare il numero di interrupt (i numeri di interrupt generati da diverse sorgenti di interrupt sono diversi)
Inserisci qui la descrizione dell'immagine

2. Caso: utilizzo dell'interruzione del timer T0 per realizzare l'accensione e lo spegnimento della luce a intervalli di 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
  • Quando l'interruzione è abilitata, la funzione principale verrà interrotta ogni 10 ms e il programma nella funzione di interruzione verrà eseguito.
  • Quando arrivano i primi 10 ms di temporizzazione, eseguire la funzione di interruzione, reimpostare il timer per 10 ms, cnt = 1, e la luce è ancora spenta.
  • Quando arrivano i secondi 10 ms del timer, eseguire la funzione di interruzione, reimpostare il timer per 10 ms, cnt = 2, e la luce è ancora spenta.
  • Quando arriva il centesimo 10ms del timer, eseguire la funzione di interruzione, reimpostare il timer per 10ms, cnt = 100, e la luce si accende.

In questo modo si ottengono intervalli di accensione e spegnimento di 1 s.