单片机AT89c51——单个按钮控制蜂鸣器和灯

1、题目要求:用单片机读取外部按键K1按下的次数,当K1按下3次时,控制继电器点亮照明灯并使用蜂鸣器。

2、在proteus里面画出电路图如下

3、在Keil里面写下如下代码。

#include

#define uint unsigned int
#define uchar unsigned char

sbit SPEAKER = P1^4;	//控制蜂鸣器
sbit K1 = P1^6;		   //控制按钮
sbit RELAY = P1^0;	    //控制灯
	     
void delay(uint);	    //方法的声明
void speak();

void main(){
	uchar i = 0; bit speakflag = 0;
	SPEAKER = 0; RELAY = 0;	
	while(1){
		K1 = 1;		  
		if(K1==0){	       //判断按钮是否按下,如果按下
			delay(20);	      //延时消除抖动
			while(K1==0);			//循环到按钮弹起
				i++;		     //记按下的次数
				if(i%3==0){		  //如果按下3的倍数次
					speakflag = 1;	    //标志蜂鸣器应该发声	
					RELAY = 1;
				}
				else{
					speakflag = 0;
					RELAY = 0;
				}
		}
	   	if(speakflag==1){	   //判断蜂鸣器标志位
				speak();
			}
	}
}

void speak(){
	SPEAKER = ~SPEAKER;
	delay(1);
}

void delay(uint k){
	uint i,j;
	for(i=k;i>0;i--)
		for(j=110;j>0;j--);
}

4、运行结果,第3次肯定灯会亮,但是第6次,第9次直到后面就时亮时不亮,不知是程序出错,还是仿真有问题。

你可能感兴趣的:(单片机)