Compartir tecnología

05: interrupción del temporizador

2024-07-12

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


1. Cuando la unidad central de procesamiento (CPU) está procesando algo, se produce una solicitud de emergencia del mundo exterior, lo que requiere que la CPU suspenda el trabajo actual y cambie al procesamiento del evento de emergencia. Después del procesamiento, regrese al lugar original interrumpido y continúe. Este proceso, que originalmente funcionaba, se llamaba interrupción.
2. Por lo general, la fuente de interrupción se pone en cola de acuerdo con la prioridad de la fuente de interrupción y la fuente de solicitud de interrupción del evento más urgente se procesa primero, es decir, se especifica que cada fuente de interrupción tiene un nivel de prioridad. La CPU siempre responde primero a la solicitud de interrupción con la prioridad más alta.
3. El microcontrolador C51 tiene 8 fuentes de solicitud de interrupción:

Insertar descripción de la imagen aquí

1. Interrupción del temporizador T0

Insertar descripción de la imagen aquí

Como se muestra en la figura: Las interrupciones también necesitan registros de configuración. Hay dos tipos de registros. El primero es el registro de control de interrupción de bits (IE y XICON) y el segundo es el registro de control de prioridad. Aquí sólo estudiamos una interrupción del temporizador T0.
Para utilizar la interrupción del temporizador T0:

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

Una vez transcurrido el tiempo establecido, ejecute el programa en la función de interrupción. Entonces, ¿cómo saber qué función es la función de interrupción? — Consultar el número de interrupción (los números de interrupción generados por diferentes fuentes de interrupción son diferentes)
Insertar descripción de la imagen aquí

2. Caso: Utilizar la interrupción del temporizador T0 para realizar que la luz se encienda y apague a intervalos 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
  • Cuando la interrupción está habilitada, la función principal saltará cada 10 ms y se ejecutará el programa en la función de interrupción.
  • Cuando lleguen los primeros 10 ms de tiempo, ejecute la función de interrupción, reinicie el temporizador durante 10 ms, cnt = 1 y la luz seguirá apagada.
  • Cuando lleguen los segundos 10 ms del temporizador, ejecute la función de interrupción, reinicie el temporizador en 10 ms, cnt = 2 y la luz seguirá apagada.
  • Cuando lleguen los 100 ms del temporizador, ejecute la función de interrupción, reinicie el temporizador durante 10 ms, cnt = 100 y la luz se encenderá.

De esta forma se consiguen los intervalos de encendido y apagado de 1s.