技術共有

05: タイマー割り込み

2024-07-12

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


1. 中央処理装置 (CPU) が何かを処理しているときに、外部から緊急要求が発生すると、CPU は現在の作業を中断し、緊急イベントの処理に切り替える必要があります。処理後、元の中断された場所に戻って続行します。本来は動作していましたが、このようなプロセスは中断と呼ばれていました。
2. 通常、割り込み要因は割り込み要因の優先度に従ってキューイングされ、最も緊急性の高いイベントの割り込み要求要因が最初に処理されます。つまり、各割り込み要因には優先レベルが指定されています。 CPU は常に、最も高い優先順位で割り込み要求に最初に応答します。
3. C51 マイクロコントローラーには 8 つの割り込み要求ソースがあります。

ここに画像の説明を挿入します

1. タイマT0割り込み

ここに画像の説明を挿入します

図に示すように、割り込みにも構成レジスタが必要です。1 つはビット割り込み制御レジスタ (IE および XICON) で、もう 1 つは優先制御レジスタです。ここではタイマー 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
  • 割り込みを有効にすると、main 関数が 10ms ごとに飛び出し、割り込み関数内のプログラムが実行されます。
  • 最初の 10 ミリ秒のタイミングが到着すると、割り込み関数を実行し、タイマーを 10 ミリ秒にリセットします。cnt = 1 になりますが、ライトはまだ消灯しています。
  • タイマーの 2 番目の 10 ミリ秒が経過したら、割り込み関数を実行し、タイマーを 10 ミリ秒に再設定します (cnt = 2)。ライトはまだ消灯しています。
  • タイマーの 100 番目の 10ms に達すると、割り込み関数を実行し、タイマーを 10ms にリセットし、cnt = 100 になり、ライトが点灯します。

このようにして、1 秒のオンとオフの間隔が実現されます。