一、设计思路(使用中断)

设置一个变量i,起初为0,按下A键后为1;当i为1进入死循环
设置变量j,按下B,进入中断2,当j大于3,j=j-3;使用j*1000,来空置循环函数的暂停时间。设置bit变量s=0,按下按键C,进入外部中断0,s++,当s=1,j进入循环蜂鸣器响,s=0退出循环。


二、程序编写

#include<reg52.h>
#include<intrins.h>

typedef unsigned int u16;
typedef unsigned char u8;
typedef bit u1;

#define LED P2

sbit K1=P3^0;        //2号开关
sbit K2=P3^3;        //4号开关
sbit K3=P3^2;        //3号开关
sbit BUZ=P1^5;       //蜂鸣器

u8 j=1;              //用于记录K2按键
void delay(u16 i)
{
	while(i--);       
}

void open02()        //打开外部中断0,2
{
	EA=1;              //总中断
	EX0=1;              //打开外部中断0
	IT0=1;             //边沿触发方式
	EX1=1;              //打开外部中断1
	IT1=1;             //边沿触发
}

void pamadeng()                 //控制跑马灯跑动
{ 
	u8 i;
	while(1)
	{
		LED=0XFE;    //1111 1110
    delay((j*20000));
		for(i=0;i<7;i++)
		{
			LED=_crol_(LED,1);   
		 delay((j*20000));
		}
	}
}


void main()
{
	open02();
	while(1)
	{
		if(K1==0)
		{
			delay(1000);
			if(K1==0)
			{
				pamadeng();
			}
    }
	}
}

void key2() interrupt 2    //外部中断1,记录按键2次数
{
	delay(1000);             //消抖
	if(K2==0)
		++j;
	if(j>3)
		j=j-3;
}

void key3() interrupt 0     //外部中断0,跑马灯暂停
{
	delay(1000);                   //消抖
	if(K3==0)
	{
		u1 k=1;              //用于记录K3按键
		BUZ=0;
		while(k)
		{ 
			
			while(K3==1&&k==1)
			{
				if(K3==0)
				{
					delay(1000);           //消抖
					if(K3==0)
					{
						k=~k;BUZ=1;          //关闭蜂鸣器
						while(!K3);          //确认按键松开
					}
				}
			}
		}
	}
}

您已经阅读00:00:00欢迎留言评论,喜欢的话就为作者点个赞或者赏颗糖吧! 分享