问题描述:
STC89C52单片机的P1口高4位连接发光二极管,P1口低4位连接开关,P3口的P3.2连接按键开关K2,P3.3连接按键开关K1,接口电路如图5-4所示,请编程实现按键中断以及中断嵌套(外部中断1为高优先级,外部中断0为低优先级),按下按键K1产生外部中断1中断请求信号,中断响应后读取键值去驱动发光二极管点亮,按下按键K2产生外部中断0的中断请求信号,中断响应后驱动发光二极管循环点亮。请编写驱动程序。建议:编程时,为了更好观察二极管亮灭状态,加入适当的延时程序。调试运行时,先按按键K2,执行外部中断0的低级中断;再按按键K1,执行外部中断1的高级中断,观察中断嵌套。
相关电路图:
效果:当按下K2键,发光二极管循环点亮,当按下K1键一次,发一次中断申请,读取P1口低四位键值去驱动相应的发光二极管的亮灭,K2触发低级中断,K1触发高级中断。
C语言代码:
#include <reg52.h>
#include <intrins.h>
sbit K1=P3^3;
sbit K2=P3^2;
void delay(int time)
{
int i;
while(--time!=0)
{
for(i=0;i<125;i++);
}
}
//外部中断0
void exint() interrupt 0
{
unsigned char p1_value;
unsigned int i ,j;
//循环的嵌套,实现循环点亮二极管
for(i=0;i<255;i++)
{
p1_value=0X08;
for(j=0;j<4;j++)
{
p1_value=p1_value<<1;
P1=p1_value;
delay(1000);
}
}
}
//外部中断1
void exint1() interrupt 2
{
unsigned char p1_value=0;
P1=0XFF;
p1_value=P1&0X0F;
p1_value=p1_value<<4; //读取低四位的键值
P1=p1_value;
delay(800);
}
void main()
{
//应题目要求设置中断的开关和优先级
SP=0X50;
EA=1;
EX1=1;
EX0=1;
IT1=1;
IT0=1;
PX0=0;
PX1=1;
while(1)
{
;
}
}
最终仿真效果图: