学习中断前,我们首先来了解下什么是中断。倘若一个人在屋子里面看书,然后水烧开了,那么他就要停下看书,然后去把烧开的水给处理下,最后再返回来,这么一个过程,就完成了一个中断处理。仔细分析下,可以看到,要想51单片机有完善的中断机制,就必须满足以下几个条件:
- 某中断源发出中断请求;
- cpu开中断,即cpu开总中断,EA=1(也就是说,当水开了,我们得有能力去把烧开的水处理,不能我们在别的地方,那就没办法);
- 申请中断的中断源允许中断(也就是说,是烧开了,允许别人来处理);
- 没有更高优先级别的事情处理(也就是说,水烧开的时候,不能外边发生了更大的事情阻止了处理开水)。
51单片机具有5个中断源,分别是:
- 外部中断0,即为IE0;
- 外部中断1,即为IE1;
- 定时器/计时器0,即为TF0;
- 定时器/计时器1,即为TF1;
- 串口中断T1或R1
下面针对外部中断0进行编程。
- 首先设置总中断为开放,即为EA = 1;
- 设置外部中断0也开放,即为EX0 = 1;
- 设置触发中断方式为低电平触发,即为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板子上正常运行,如有不对,敬请拍砖。
文章的脚注信息由WordPress的wp-posturl插件自动生成