#include <reg52.h>
#define led P1
//设置KEY1为P3_3,即外部中断1
sbit KEY1 = P3^3;
//设置蜂鸣器为P0_7口
sbit buzzer = P0^7;
//延时函数
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned int i=0;
while(xms--)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
char code table[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//灯泡依次点亮的P1口
void keyscan()
{
if(KEY1==0)
{
Delay1ms(10);
buzzer=1; //NPN buzzer = 0就是PNP
}
}
void main()
{
//外部中断1请求
IT1=1;
EA=1 ;
EX1=1;
while(1)
{
//流水灯
char i;
for(i=0; i<8; i++)
{
led = table[i];
Delay1ms(500);
}
}
}
void my_intx1() interrupt 2
{
keyscan();
Delay1ms(5000);
}
这里是基于at89c52版实现摁下KEY1触发中断,停止流水灯,让蜂鸣器叫一会后再执行流水灯。我们这里使用的是NPN模式,即buzzer口处接高电平接通。
原理图如下: