外部割り込み - 割り込みネスティング

1.前に最初の外部割り込みが関連するレジスタのいくつかを理解する必要があります理解して**

  • 割り込みは、IEをイネーブルレジスタここに画像を挿入説明

1.EA:CPUグローバル割り込み制御ビットを有効にします。EA = 1、CPUブレークオープン。
2.ET0 / ET1:タイマT0とT1タイマのオーバーフロー割り込みイネーブル・ビット。ET0 / ET1 = 1;割り込みを有効にします。
3.EX0 / EX1:外部割り込み0および外部割り込みイネーブルビット割り込み1。EX0 / ET1 = 1;割り込みを有効にします。

  • タイマ/カウンタ制御レジスタTCON
    ここに画像を挿入説明

関連のトップ4のタイマと外部の関係者のみ最後の4、で、これに記載されていません。
IE0:外部割り込み0要求フラグ、IE0 = 1外部割り込み0 CPU要求割り込み、自動的にハードウェア0でクリア割り込み応答に、
IE1:外部割込み要求フラグ、CPU要求割り込みにIE0 = 1つの外部割込み1、ハードウェア割り込み自動的に0にクリア;
IT0:;低レベル割り込み外部割り込みソース選択ビット0、IT0 = 0を入力割り込み。IT0 = 1;落下トリガー。
IT1:外部割り込み要因割り込みタイプの選択はIT1 = 0、0をビット、低レベルの割り込みを。IT1 = 1;落下トリガー。

  • 割り込みプライオリティレジスタIP
    ここに画像を挿入説明

PS:シリアル割り込み優先制御ビット。
PT1:タイマ1割り込み優先制御ビット。
PX1:外部割り込み1優先制御。
PT0:タイマ0割り込み優先制御ビット。
PX0:外部割り込み0優先制御。

2.外部割り込み0


1.簡単な制御P0外部割り込みを点滅^ 0イーサネットLEDランプ

sbit led=P0^0;
void Init0();
void delayms(unsigned int ms);
int main()
{
	Init0();
	while(1);
}
void delayms(unsigned int ms)//延迟函数
{
	int i,j;
	for(i=0;i<ms;i++)
	 for(j=100;j>0;j--);
}
void Init0()//外部中断0的初始化
{
	IT0=1;//选择跳沿触发方式
	EX0=1;
	EA=1;
}
void Int0() interrupt 0
{
	delayms(5);//按键的消抖
	if(P3^2==0)//外部中断0的管脚在P3^2
	{
		led=~led;
	}

}

3.割り込み優先順位の設定

デフォルトMCU 51(レジスタはこの場合はIPで提供されていない)割り込み優先順位:
外部割り込み0>タイマ/カウンタ0>外部割り込み1>タイマ/カウンタ1>シリアル割り込み;
しかし、これが唯一の論理的優先事項でありますそこにいる間に割り込みが到着したときの優先順位は、いくつかの優先度の高い割り込みが最初にサービスされます。これは実際に優先サービスではなく、ネスティング割り込み優先順位を提供する能力を取得する必要があります同時に、到着割り込みケースの優先順位です。このような優先順位ロジックが優先と呼ばれています。[^ 1]

、優先順位の形でサービス割り込み優先順位の低い割り込み缶割り込み、すなわち高い優先順位を真のネストを実現するために、割り込み優先順位は、IPレジスタを提供することにより、実装する必要があります。これは、物理的な優先順位の優先順位と呼ばれています。


  • 、外部割り込み1が、場合に提供するサービス機能、カウンタ0と割り込み1つの外部割り込み(割り込み優先カウンタ0>外部割り込み1)が同時に到着したとき、それはタイマ0割り込みサービスルーチンを入力します。たとえば、この時点で中断は、その外部割り込み0カウンタ0割り込みを超えるロジック優先順位を含め、それを中断されていません。
    、優先順位の形でサービス割り込み優先順位の低い割り込み缶割り込み、すなわち高い優先順位を真のネストを実現するために、割り込み優先順位は、IPレジスタを提供することにより、実装する必要があります。これは、物理的な優先順位の優先順位と呼ばれています。

- 設定された外部割り込み1つの外部割り込み優先順位が0の優先度よりも大きくなります。外部割り込み0プログラムの動作を中断することができ、外部割り込み0 1つの外部割込みを実行するときに2つの割り込みネスティングは、達成するために。

void Init();
void delayms(unsigned int ms);
int main()
{
	Init();
	while(1);
}
void delayms(unsigned int ms)//延迟函数
{
	int i,j;
	for(i=ms;i>0;i--)
	 for(j=100;j>0;j--);
}
void Init()//外部中断初始化
{
	IT0=1;//选择跳沿触发方式
	EX0=1;//打开外部中断0允许位
	IT1=1;//选择跳沿触发方式
	EX1=1;//打开外部中断1允许位
	EA=1;//打开总中断
    IP=0X01;//设置外部中断0的优先级大于外部中断1
}

void Int0() interrupt 0 using 0//外部中断0的执行程序。
{ 
	unsigned char i;
	delayms(5);
	if(P3^2==0)
	{
		for(i=0;i<8;i++)
		{
			P0=~(0x01<<i);
			delayms(1000);
		}
			
	}

}
void Int1() interrupt 2 using 1//外部中断1的执行程序。using x代表用那个工作区。
{
	unsigned char i;
	delayms(5);
	if(P3^3==0)
	{
			for(i=8;i>0;i--)
		{
			P0=~(0x01<<i);
			delayms(500);
		}
	}
}

- 外部割り込みの主な内容

ここに画像を挿入説明
のは、それが入れ子に中断少し練習をやってみましょう。リンク:リンク
あなたにこの記事は参考になりました場合、それ♥小型のポイントに!

リリース元の2件の記事 ウォンの賞賛5 ビュー186

おすすめ

転載: blog.csdn.net/qq_46292418/article/details/105121876