기술나눔

05: 타이머 인터럽트

2024-07-12

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


1. 중앙처리장치(CPU)가 무언가를 처리 중일 때 외부에서 긴급 요청이 발생하면 CPU는 현재 작업을 일시 중단하고 긴급 이벤트 처리로 전환해야 하며, 처리가 끝나면 원래 중단되었던 곳으로 돌아가 계속 진행한다. 원래는 이러한 프로세스를 중단이라고 했습니다.
2. 일반적으로 인터럽트 소스는 인터럽트 소스의 우선순위에 따라 대기하고 가장 긴급한 이벤트의 인터럽트 요청 소스가 먼저 처리됩니다. 즉, 각 인터럽트 소스는 우선순위 레벨을 갖도록 지정됩니다. CPU는 항상 가장 높은 우선순위로 인터럽트 요청에 응답합니다.
3. C51 마이크로컨트롤러에는 8개의 인터럽트 요청 소스가 있습니다.

여기에 이미지 설명을 삽입하세요.

1. 타이머 T0 인터럽트

여기에 이미지 설명을 삽입하세요.

그림과 같이 인터럽트에도 구성 레지스터가 필요합니다. 첫 번째는 비트 인터럽트 제어 레지스터(IE 및 XICON)이고 두 번째는 우선순위 제어 레지스터입니다. 여기서는 타이머 T0의 인터럽트만 연구합니다.
타이머 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
  • 인터럽트가 활성화되면 주 기능은 10ms마다 점프 아웃되고 인터럽트 기능의 프로그램이 실행됩니다.
  • 처음 10ms의 타이밍에 도달하면 인터럽트 기능을 실행하고 타이머를 10ms 동안 재설정하고 cnt = 1이며 표시등은 여전히 ​​꺼져 있습니다.
  • 타이머의 두 번째 10ms가 도착하면 인터럽트 기능을 실행하고 타이머를 10ms, cnt = 2로 재설정하고 표시등은 여전히 ​​꺼집니다.
  • 타이머의 100번째 10ms가 되면 인터럽트 기능을 실행하고 타이머를 10ms, cnt = 100으로 재설정하면 표시등이 켜집니다.

이러한 방식으로 1초의 켜짐 및 꺼짐 간격이 달성됩니다.