双按键控制LED(中断优先级)

发布于:2025-04-15 ⋅ 阅读:(25) ⋅ 点赞:(0)

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);
}


网站公告

今日签到

点亮在社区的每一天
去签到