51单片机学习3_中断

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 51单片机学习3_中断

学习中断前,我们首先来了解下什么是中断。倘若一个人在屋子里面看书,然后水烧开了,那么他就要停下看书,然后去把烧开的水给处理下,最后再返回来,这么一个过程,就完成了一个中断处理。仔细分析下,可以看到,要想51单片机有完善的中断机制,就必须满足以下几个条件:

  1. 某中断源发出中断请求;
  2. cpu开中断,即cpu开总中断,EA=1(也就是说,当水开了,我们得有能力去把烧开的水处理,不能我们在别的地方,那就没办法);
  3. 申请中断的中断源允许中断(也就是说,是烧开了,允许别人来处理);
  4. 没有更高优先级别的事情处理(也就是说,水烧开的时候,不能外边发生了更大的事情阻止了处理开水)。

51单片机具有5个中断源,分别是:

  1. 外部中断0,即为IE0;
  2. 外部中断1,即为IE1;
  3. 定时器/计时器0,即为TF0;
  4. 定时器/计时器1,即为TF1;
  5. 串口中断T1或R1

下面针对外部中断0进行编程。

  1. 首先设置总中断为开放,即为EA = 1;
  2. 设置外部中断0也开放,即为EX0 = 1;
  3. 设置触发中断方式为低电平触发,即为TCON = 0x01,或者IT0 = 0;

下面进行一个程序,目的是让板子的P3.2口低电平的时候,数码管会停止走动,将第一个发光二极管点亮。测试办法为:当程序运行的时候,拿一根杜邦线,一头接GND接口,一头接P3.2接口,如果数码管停止走动了一会儿,说明中断实现,如果拔掉杜邦线,数码管正常走动,则实验成功。

 

//引入头文件 
#include <reg52.h>
//宏定义 
#define uint unsigned int
#define uchar unsigned char

void init();//初始化函数 
sbit led = P1 ^ 0;//led特殊位,第一个小灯 
sbit dula = P2 ^ 6;//段选,控制数码管显示数目 
sbit wela = P2 ^ 7;//位选,控制哪个数码管亮 
uchar num = 0;
//段选控制的数码管显示1,2,3,4,5,6 
uchar code duantable[] = {
	0x06, 0x5b, 0x4f,
	0x66, 0x6d, 0x7d
};
//位选控制的哪个数码管亮 
uchar code weitable[] = {
	0xfe, 0xfd, 0xfb,
 	0xf7, 0xef, 0xdf
};
//延时函数 
void delay(uint time)
{
	uint x, y;
	for (x = time; x--; x > 0)
		for (y = 110; y--; y > 0);
}

void main()
{
	init();
	while (1) {
          //开始6个数码管间隔500ms的速度依次闪烁 
		for (; num < 6; num++) {
			led = 1;
			wela = 1;
			P0 = weitable[num];
			wela = 0;

			dula = 1;
			P0 = duantable[num];
			dula = 0;
			delay(500);
		}
		num = 0;
	}
}

//定义中断的方法 
void exter0() interrupt 0
{
	led = 0;	
}

//初始化中断 
void init()
{
	EA = 1;//开总中断 
	EX0 = 1;//开外部中断0 
	IT0=0;//外部中断为低电平触发中断 
}

以上程序在TX-1C板子上正常运行,如有不对,敬请拍砖。

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 51单片机学习3_中断

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: