1.启动时,两个LED灯熄灭,1秒钟后(定时器实现),LED自动点亮;
2.按键1按下后,通过中断int0把两个LED熄灭5s时间,int0优先级设置为最高(优先级必须设置,设置后才能嵌套,否则即使它是int0,也不能嵌套进int1中)。
3.按键2被按下后,LED闪烁5次,间隔1秒;LED1熄灭。
4.最后效果是,当开始两个LED灯熄灭,一秒后,led点亮。我们按下按键2,LED闪烁,LED1熄灭。此时,按下按键1,LED1和LED2全部熄灭并保持一段时间后,LED1继续未完成的闪烁,直至完成后两个LED灯依旧点亮。
#include"reg52.h"
#define uchar unsigned char //定义字符类型
#define uint unsigned int
sbit led=P2^0; //定义IO口P2.0为led
sbit led1=P2^1;
uchar flag; //定义flag类型
void delay(){ //延时程序
int i,j;
for(i=500;i>0;i--)
for(j=100;j>0;j--);
}
void init()//初始化,即打开各中断开关
{
TMOD=0x01;
TH0=(65536-50000)/256; //定时器0装初值
TL0=(65536-50000)%256; //同上
IT0=1;//外部中断0为跳变沿触发方式
IT1=1;//外部中断1为跳变沿触发方式
EA=1;//开总中断
EX0=1;//打开外部中断0
EX1=1;//打开外部中断1
ET0=1;//打开定时器0中断开关
TR0=1;//打开定时器0运行开关
IP=0x01;//设置int0优先级为高,与PX0=1;等效
}
/*按键1*/
void int0() interrupt 0 using 0//外部中断0的执行程序。
{ //interrupt 0指外部中断0 using 0指第0组寄存器
led=1; //熄灭LED灯
led1=1;
delay();//延时
delay();
delay();
}
void t0() interrupt 1 using 1 //定时器
{
TH0=(65536-50000)/256; //定时器0装初值
TL0=(65536-50000)%256; //同上
flag++; //记录定时器经过的时间
if(flag==20){ //定时1秒后执行,flag=20时约一秒
led=0; //点亮LED灯
led1=0;
flag=0; //重置定时,达到每一秒点亮一次的目的
}
}
/*按键2*/
void int1() interrupt 2 using 2//外部中断1的执行程序。
{
unsigned char i;
led1=1;
for(i=0;i<10;i++)//实现led闪烁五次。
{
led=~led;
delay();
}
}
void main()//主函数
{
init(); //初始化
led=1; //指定LED灯开始的时候是熄灭状态
led1=1;
while(1);
}