《单片机中断嵌套小练习》用最简洁的方式学会中断嵌套。

外部中断是单片机一个比较重要的部分,这次,用最简单的方法让你去实现中断嵌套的功能,通过下面这个小实验,相信你对中断的认识会更加的深刻。如果还对中断这方面不太了解的话,请看这篇文章。
链接: 单片机的外部中断link.

索引

  • 1.功能要求
  • 2.Proteus仿真图
  • 3.程序的编写

1.功能要求

  • 主程序功能:led灯灭,八位共阴数码管熄灭。
  • 功能:利用按键K1,K2触发中断,K1触发使led闪烁8次。K2触发,数码管显示0~F。
  • 要求:K2优先级高于K1,通过Keil和Proteus进行仿真和调试。

数码管的段位编码。

共阳极数码管编码表:
unsigned char shumaguan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

共阴极数码管编码表:

unsigned char shumaguan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

2.Proteus仿真图

《单片机中断嵌套小练习》用最简洁的方式学会中断嵌套。_第1张图片

3.程序的编写

#include"reg51.h"
sbit led=P0^0;
unsigned char shumaguan[]={
     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};	
void delayms(unsigned int ms);
void Init();

void main()
{
     
	Init();
	P2=0x00;//熄灭数码管
	led=1;//熄灭led
	while(1);


}
void Init()//外部中断初始化
{
     
	IT0=1;//选择跳沿触发方式
	EX0=1;//打开外部中断0允许位
	IT1=1;//选择跳沿触发方式
	EX1=1;//打开外部中断1允许位
	EA=1;//打开总中断
    IP=0X04;//设置外部中断1的优先级大于外部中断0
}

void Int0() interrupt 0 using 0//外部中断0的执行程序。
{
      
	unsigned char i;
	delayms(5);
	if(P3^2==0)
	{
     
	  for(i=0;i<16;i++)//实现led闪烁八次。
		{
     
		   led=~led;
		  delayms(1000);
		}
	}

}
void Int1() interrupt 2 using 1//外部中断1的执行程序。
{
     
	unsigned char i;
	delayms(5);
	if(P3^3==0)
	{
     
	  for(i=0;i<16;i++)//数码管从0-F依次显示。
		{
     
			P2=shumaguan[i];
			delayms(500);
		}
		P2=0X00;//数码管到F后熄灭数码管
	}
}

void delayms(unsigned int ms)//延迟函数
{
     
	int i,j;
	for(i=ms;i>0;i--)
	 for(j=100;j>0;j--);
}

♥功能测试:当led闪烁的时候,按下K2键,实现了数码管的显示。说明K2键对应的中断优先级要大于K1键对应的中断优先级。从而能够打断led的闪烁。

如果该篇文章帮助到大家,请推荐给身边的朋友哦!

你可能感兴趣的:(单片机)