目录
中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。
一、外部中断控制LED
程序一开始一直在while中执行,每当按下一次按键便会执行一次中断,执行中断中的程序。
1、main.c
#include <REGX52.H>
#include "Delay.h"
sbit Led1 = P2^0;
sbit K3 = P3^2;
void Int0(void)
{
IT0=1; //设置Int0 边沿触发
EX0=1; //开放外部Int0中断允许
EA=1; //开放CPU中断允许;
}
void main(void)
{
Int0(); //中断初始化
while(1);
}
void Timer0_Routine(void) interrupt 0 //中断函数,外部中断0
{
Delay(20);
if(K3 == 0){Delay(20); while(K3 == 0); Led1 =~ Led1;}//延时消抖,检测松手
}
2、Delay.c
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
3、Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
二、外部中断控制数码管加减
51单片机的K3、K4按键分别对应INT0(外部中断0)、INT1(外部中断1)引脚,通过按键向单片机申请中断,每中断一次实现变量加1或减1,并将结果显示在数码管上。
1、main.c
#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
unsigned char Number = 0;
void Int(void)
{
IT0=1; //设置Int0 边沿触发
EX0=1; //开放外部Int0中断允许
IT1=1; //设置Int1 边沿触发
EX1=1; //开放外部Int1中断允许
EA=1; //开放CPU中断允许;
}
void main(void)
{
Int(); //中断初始化
while(1)
{
Nixie(1, Number / 10);//显示十位
Delay(1);
Nixie(2, Number % 10);//显示个位
}
}
void Init0(void) interrupt 0 //中断函数,外部中断0
{
if(Number != 99)
{
Number++;
}
else
{
Number = 0;
}
}
void Init1(void) interrupt 2 //中断函数,外部中断1
{
if(Number != 0)
{
Number--;
}
else
{
Number = 99;
}
}
2、Nieix.c
#include <REGX52.H>
#include "Delay.h"
unsigned char NixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};//阴极数码管段码:0--9
void Nixie(unsigned int Location, Number)//位码
{
switch(Location)
{
case 1: P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
case 2: P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
case 3: P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
case 4: P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
case 5: P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
case 6: P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
case 7: P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
case 8: P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
}
P0 = NixieTable[Number];
Delay(1);//稳定清零
P0 = 0x00;//消影:将上一位数据清零
}
3、Nixie.h
#ifndef __NIXIE_H__
#define __NIXIE_H__
void Nixie(unsigned int Location, Number);
#endif
4、Delay.c
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
5、Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
仿真

此文为个人笔记,如有错漏还请各位看官指正。