Обмен технологиями

05: Прерывание таймера

2024-07-12

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


1. Когда центральный процессор (ЦП) что-то обрабатывает, возникает экстренный запрос из внешнего мира, требующий от ЦП приостановить текущую работу и переключиться на обработку аварийного события. После обработки вернуться на исходное прерванное место и продолжить работу. Первоначально рабочий такой процесс назывался прерыванием.
2. Обычно источник прерывания ставится в очередь в соответствии с приоритетом источника прерывания, и первым обрабатывается источник запроса прерывания самого срочного события, то есть каждый источник прерывания должен иметь уровень приоритета. ЦП всегда первым отвечает на запрос прерывания с наивысшим приоритетом.
3. Микроконтроллер С51 имеет 8 источников запросов прерываний:

Вставьте сюда описание изображения

1. Прерывание таймера Т0

Вставьте сюда описание изображения

Как показано на рисунке: Прерываниям также необходимы регистры конфигурации. Существует два типа регистров: первый — регистр управления битовыми прерываниями (IE и XICON), а второй — регистр управления приоритетом. Здесь мы изучаем только прерывание таймера Т0.
Чтобы использовать прерывание таймера T0:

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

По истечении установленного времени выполните программу в функции прерывания. Итак, как узнать, какая функция является функцией прерывания? — Запрос номера прерывания (номера прерываний, генерируемые разными источниками прерываний, различны)
Вставьте сюда описание изображения

2. Случай: использование прерывания таймера T0 для включения и выключения света с интервалом 1 с.

#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
  • Когда прерывание разрешено, основная функция будет отключаться каждые 10 мс и программа в функции прерывания будет выполняться.
  • Когда наступят первые 10 мс отсчета времени, выполните функцию прерывания, сбросьте таймер на 10 мс, cnt = 1, и свет все еще погаснет.
  • Когда наступят вторые 10 мс таймера, выполните функцию прерывания, переустановите таймер на 10 мс, cnt = 2, а свет все еще выключен.
  • При наступлении сотой 10мс таймера выполнить функцию прерывания, сбросить таймер на 10мс, cnt=100 и лампочка загорится.

Таким образом достигаются интервалы включения и выключения в 1 с.