Compartilhamento de tecnologia

05: interrupção do temporizador

2024-07-12

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


1. Quando a unidade central de processamento (CPU) está processando algo, ocorre uma solicitação de emergência do mundo externo, exigindo que a CPU suspenda o trabalho atual e passe a processar o evento de emergência. Após o processamento, retorne ao local interrompido original e continue. . Originalmente funcionando, esse processo era chamado de interrupção.
2. Normalmente, a fonte de interrupção é enfileirada de acordo com a prioridade da fonte de interrupção, e a fonte de solicitação de interrupção do evento mais urgente é processada primeiro, ou seja, cada fonte de interrupção é especificada para ter um nível de prioridade. A CPU sempre responde primeiro à solicitação de interrupção com a prioridade mais alta.
3. O microcontrolador C51 possui 8 fontes de solicitação de interrupção:

Insira a descrição da imagem aqui

1. Interrupção do temporizador T0

Insira a descrição da imagem aqui

Conforme mostrado na figura: As interrupções também precisam de registros de configuração. Existem dois tipos de registros. O primeiro é o registro de controle de interrupção de bit (IE e XICON) e o segundo é o registro de controle de prioridade. Aqui estudamos apenas uma interrupção do temporizador T0.
Para usar a interrupção do temporizador T0:

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

Após o tempo definido, execute o programa na função de interrupção. Então, como você sabe qual função é a função de interrupção? — Consultar o número de interrupção (os números de interrupção gerados por diferentes fontes de interrupção são diferentes)
Insira a descrição da imagem aqui

2. Caso: Utilizando a interrupção do temporizador T0 para realizar a luz acendendo e apagando em intervalos de 1s

#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 a interrupção estiver habilitada, a função principal será saltada a cada 10ms e o programa na função de interrupção será executado.
  • Quando chegarem os primeiros 10ms de temporização, execute a função de interrupção, reinicie o cronômetro para 10ms, cnt = 1, e a luz ainda estará apagada.
  • Quando chegarem os segundos 10ms do cronômetro, execute a função de interrupção, reajuste o cronômetro para 10ms, cnt = 2, e a luz ainda estará apagada.
  • Quando chegar o 100º 10ms do temporizador, execute a função de interrupção, reinicie o temporizador para 10ms, cnt = 100, e a luz acende.

Desta forma, os intervalos de ativação e desativação de 1s são alcançados.