本次的内容是关于51单片机的简单中断的代码。
!!!理解51单片机中断是最为基本的,51单片机中断的简单应用只包括三步:
第一步:设置中断;第二步:允许中断;第三步:判断哪个中断优先允许;
以上三步分别对应三个寄存器区,分别是TCON,IE,和IP,这三类寄存器的定义和内容请查课本或者直接百度,网上有非常多的解释和应用。
下面是代码区:
1.按键K1按下后8个LED灯能够立即呈现全亮状态。
2. 实现按键K1按下不松开的情况下,LED灯持续闪烁。(备注:这里我使用了中断1和按键k2,并没有严格按照要求,但是效果相同);
3. 中断嵌套实验
当独立按键K1和K2都未按下时,P1口的8只LED全亮;仅K1按下一次(按下后立即松开)时,上下各4只LED交替闪烁10次,然后再回到8只LED全亮状态;如果在LED交替闪烁期间按下K2时,LED暂停闪烁,同时蜂鸣器鸣叫,直到K2松开后,蜂鸣器停止鸣叫,且LED继续闪烁。
void main(void)
{
TCON=0x05;//两个外部中断全开
EX1=0;//打开中断0允许
EX0=1; //在主函数初始化处禁止中断1,这是为了满足实验要求,没有特殊含义。
IT1=1;//IT1 IT0是设置触发模式的,1为电平触发。
IT0=1;
PX1=1;//中断优先级设置,为1的是高优先级
PX0=0;//如果不进行设置的画,中断是有默认优先级的
//默认优先级是中断0高于中断1;
EA=1;//打开总中断允许
p1=0xff;
p3=0xff;//p2和p1无所谓要不要赋值0xff,但是p3或者说按键k1和k2一定要设置为输入模式,即0xff
p2=0xff;
while(1)
{
p1=0x00;
}
}
//中断函数设置为 void intn() interrupt1 n using1 x
//interrupt1 后的n为中断号,0-5,0是外部中断0,2是外部中断1,其他为定时器与串行口;
//using1 后的x为寄存器区号,有0-4个区。
/* void int0() interrupt 0 using 0
{
EX0=0;
p1=0x00;
delay(1000);
EX0=1;
}
*/
void int0() interrupt 0 using 0
{
uchar m;
EX0=0;//ban int0
for(m=0;m<5;m++)
{
p1=0x0f;
delay(500);
p1=0xf0;
delay(500);
EX1=1;//保证随时能够在循环中跳出
}
p1=0;
EX1=0;//禁止led闪烁结束后再用中断1跳出
EX0=1;
}
void int1() interrupt 2 using 1
{
EX1=0;
p1=0xff;
delay(10);
while(k2!=1)//按键按住的情况下p2持续闪烁,提供频率给蜂鸣器
{
delay(10);
p2=0;
delay(10);
p2=0xff;
delay(10);
}
EX1=1;
}