基于51单片机的外部中断(嵌套)
选用芯片AT89S52
/***********************************************************
此中断函数功能为:默认上排LED流水灯闪烁,外部中断IT0(点亮下
排全部LED灯)为低级中断,外部中断IT1(蜂鸣器发声)为高级中断。
作者:Crazy Wind
日期:2020.9.25
version:1.0.0
***********************************************************/
#include "reg52.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
u16 i,j,k,x;
sbit k1=P3^2;
sbit k2=P3^3;
sbit beep=P3^6;
void delayms(u16 ms) //毫秒延时
{
for(i=0;i<ms;i++)
{
for(j=115;j>0;j--);
}
}
#define led P0
void liushui() //流水灯
{
led=0xfe;
for(k=0;k<8;k++) //循环左移
{
led=_crol_(led,1);
delayms(300);
}
}
void speaker() //蜂鸣器响
{
beep=0;
delayms(1);
beep=1;
delayms(1);
}
void main()
{
EA=1; //开放总中断
EX0=1; //允许使用外中断0
EX1=1; //允许使用外中断1
IT0=1; //选择负跳变来触发外中断
IT1=1;
PX0=0; //定IT0为低级中断
PX1=1; //定IT1为高级中断
while(1)
{
liushui();
}
}
void int0() interrupt 0 //外中断0的中断编号为0
{
delayms(20); //消抖
if(k1==0)
{
P1=0x00;
delayms(1000);
P1=0xff;
}
}
void int1() interrupt 2 //外中断1的中断编号为2
{
delayms(20); //消抖
if(k2==0)
{
for(x=0;x<100;x++)
{
speaker();
}
}
}