Teknologian jakaminen

05: ajastimen keskeytys

2024-07-12

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


1. Kun keskusyksikkö (CPU) käsittelee jotain, ulkomaailmasta tulee hätäpyyntö, joka vaatii CPU:n keskeyttämään nykyisen työn ja siirtymään käsittelemään hätätapahtumaa, palaa takaisin alkuperäiseen keskeytettyyn paikkaan ja jatka Alun perin toiminutta prosessia kutsuttiin keskeyttämiseksi.
2. Yleensä keskeytyslähde asetetaan jonoon keskeytyslähteen prioriteetin mukaan ja kiireellisimmän tapahtuman keskeytyspyyntölähde käsitellään ensin, eli jokaiselle keskeytyslähteelle on määritetty prioriteettitaso. CPU vastaa aina keskeytyspyyntöön korkeimmalla prioriteetilla ensin.
3. C51-mikro-ohjaimessa on 8 keskeytyspyyntölähdettä:

Lisää kuvan kuvaus tähän

1. Ajastin T0 keskeytys

Lisää kuvan kuvaus tähän

Kuten kuvasta: Keskeytykset tarvitsevat myös konfigurointirekisterejä. Ensimmäinen on bittikeskeytysrekisteri (IE ja XICON) ja toinen on prioriteettiohjausrekisteri. Tässä tutkitaan vain ajastimen T0 keskeytystä.
Ajastimen T0 keskeytyksen käyttäminen:

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

Kun asetettu aika on kulunut, suorita ohjelma keskeytystoiminnossa. Mistä tiedät, mikä toiminto on keskeytystoiminto? — Pyydä keskeytysnumero (eri keskeytyslähteiden luomat keskeytysnumerot ovat erilaisia)
Lisää kuvan kuvaus tähän

2. Tapaus: Ajastimen T0 keskeytyksen avulla valo syttyy ja sammuu 1 sekunnin välein

#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
  • Kun keskeytys on käytössä, päätoiminto hyppää ulos 10 ms:n välein ja keskeytystoiminnon ohjelma suoritetaan.
  • Kun ensimmäiset 10 ms ajoitusta saapuvat, suorita keskeytystoiminto, nollaa ajastin 10 ms:ksi, cnt = 1, ja valo ei pala.
  • Kun ajastimen toinen 10 ms saapuu, suorita keskeytystoiminto, aseta ajastin uudelleen 10 ms:ksi, cnt = 2, ja valo ei pala.
  • Kun ajastimen 100. 10 ms saapuu, suorita keskeytystoiminto, nollaa ajastin 10 ms:ksi, cnt = 100, ja valo syttyy.

Tällä tavalla saavutetaan 1 sekunnin päälle- ja poiskytkentävälit.